diff --git a/.circleci/config.yml b/.circleci/config.yml index 0b68a27491..0a25e6d68b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,5 +1,25 @@ version: 2.1 commands: + get-solc: + steps: + - run: + name: Get solc + command: | + SOLC_VERSION="0.8.33" + ASSET_URL="https://github.com/argotorg/solidity/releases/download/v${SOLC_VERSION}/solc-static-linux" + echo "Downloading solc version ${SOLC_VERSION} from ${ASSET_URL}" + curl -sSL --output /usr/local/bin/solc ${ASSET_URL} + chmod +x /usr/local/bin/solc + get-resolc: + steps: + - run: + name: Get resolc + command: | + RESOLC_VERSION="0.6.0" + ASSET_URL="https://github.com/paritytech/revive/releases/download/v${RESOLC_VERSION}/resolc-x86_64-unknown-linux-musl" + echo "Downloading resolc version ${RESOLC_VERSION} from ${ASSET_URL}" + curl -sSL --output /usr/local/bin/resolc ${ASSET_URL} + chmod +x /usr/local/bin/resolc setup-sccache: steps: - run: @@ -39,7 +59,7 @@ commands: jobs: lint: docker: - - image: polymeshassociation/rust:debian-nightly-2024-11-14 + - image: polymeshassociation/rust:debian-nightly-2025-08-01 resource_class: small environment: VERBOSE: "1" @@ -53,7 +73,7 @@ jobs: command: ./scripts/check_spec_and_cargo_version.sh check-storage-version: docker: - - image: polymeshassociation/rust:debian-nightly-2024-11-14 + - image: polymeshassociation/rust:debian-nightly-2025-08-01 resource_class: small environment: VERBOSE: "1" @@ -64,7 +84,7 @@ jobs: command: ./scripts/check_storage_versions.sh build: docker: - - image: polymeshassociation/rust:debian-nightly-2024-11-14 + - image: polymeshassociation/rust:debian-nightly-2025-08-01 resource_class: xlarge environment: - VERBOSE: "1" @@ -95,7 +115,7 @@ jobs: - save-sccache-cache build-ci: docker: - - image: polymeshassociation/rust:debian-nightly-2024-11-14 + - image: polymeshassociation/rust:debian-nightly-2025-08-01 resource_class: xlarge environment: - VERBOSE: "1" @@ -124,7 +144,7 @@ jobs: - . build-arm64: docker: - - image: polymeshassociation/rust-arm64:debian-nightly-2024-11-14 + - image: polymeshassociation/rust-arm64:debian-nightly-2025-08-01 resource_class: arm.xlarge environment: - VERBOSE: "1" @@ -151,7 +171,7 @@ jobs: - save-sccache-cache benchmark-build: docker: - - image: polymeshassociation/rust:debian-nightly-2024-11-14 + - image: polymeshassociation/rust:debian-nightly-2025-08-01 resource_class: xlarge environment: - VERBOSE: "1" @@ -161,6 +181,8 @@ jobs: - checkout - setup-sccache - restore-sccache-cache + - get-solc + - get-resolc - run: name: Build binary with runtime-benchmarks command: cargo build --locked --release --features=runtime-benchmarks,running-ci @@ -215,7 +237,7 @@ jobs: description: "Which profile to use with cargo build." build_opts: type: string - default: " " + default: " --features on-chain-release-build " description: "Additional options to pass to cargo build." parachain_pallet_id: type: string @@ -266,6 +288,10 @@ jobs: cp $(echo $JSON | jq -r .runtimes.compressed.wasm) ./assets/polymesh_runtime_<>.compact.compressed.wasm echo "=========================================" } + - store_artifacts: + path: ./assets/<>-srtool-digest.json + - store_artifacts: + path: ./assets/polymesh_runtime_<>.compact.compressed.wasm - persist_to_workspace: root: ./assets paths: @@ -273,7 +299,7 @@ jobs: metadata-tools-build: docker: - - image: polymeshassociation/rust:debian-nightly-2024-11-14 + - image: polymeshassociation/rust:debian-nightly-2025-08-01 resource_class: small steps: - checkout @@ -301,7 +327,7 @@ jobs: - run: name: Start Polymesh dev chain command: >- - ./assets/polymesh --chain dev \ + ./assets/polymesh --dev \ --no-prometheus --no-telemetry --tmp \ --wasm-execution compiled \ --pool-limit 100000 @@ -386,7 +412,7 @@ jobs: no_output_timeout: 30m migration-tests: docker: - - image: polymeshassociation/rust:debian-nightly-2024-11-14 + - image: polymeshassociation/rust:debian-nightly-2025-08-01 resource_class: large environment: - VERBOSE: "1" @@ -403,7 +429,7 @@ jobs: - save-sccache-cache test: docker: - - image: polymeshassociation/rust:debian-nightly-2024-11-14 + - image: polymeshassociation/rust:debian-nightly-2025-08-01 resource_class: large environment: - VERBOSE: "1" @@ -419,21 +445,19 @@ jobs: name: Tests command: >- cargo test - --package pallet-staking + --package pallet-validators --package pallet-group --package pallet-sudo --package pallet-pips --package polymesh-primitives --package node-rpc-runtime-api - --package pallet-transaction-payment --package polymesh-runtime-tests - --package pallet-balances:0.1.0 --package asset-metadata no_output_timeout: 30m - save-sccache-cache coverage: docker: - - image: polymeshassociation/rust:debian-nightly-2024-11-14 + - image: polymeshassociation/rust:debian-nightly-2025-08-01 resource_class: xlarge environment: - VERBOSE: "1" @@ -448,11 +472,12 @@ jobs: - save-sccache-cache rust-integration-test: docker: - - image: polymeshassociation/rust:debian-nightly-2024-11-14 + - image: polymeshassociation/rust:debian-nightly-2025-08-01 resource_class: xlarge environment: - VERBOSE: "1" - RUSTFLAGS: -D warnings + - RUST_BACKTRACE: "1" steps: - checkout - attach_workspace: @@ -461,7 +486,8 @@ jobs: name: Start a Polymesh ci-runtime dev chain using the previous chain version. command: >- ./assets/ci-runtime/polymesh --bob \ - --chain dev:.ci-chain-specs/v7.0.0.json \ + --chain .ci-chain-specs/v7.0.0.json \ + --unsafe-force-node-key-generation \ --no-prometheus --no-telemetry --tmp \ --wasm-execution compiled \ --pool-limit 100000 @@ -502,7 +528,7 @@ jobs: - run: name: run Polymesh ci-runtime dev chain node for integration tests command: >- - ./assets/ci-runtime/polymesh --bob --chain dev \ + ./assets/ci-runtime/polymesh --bob --dev \ --no-prometheus --no-telemetry --tmp \ --wasm-execution compiled \ --pool-limit 100000 @@ -519,7 +545,7 @@ jobs: no_output_timeout: 10m clippy: docker: - - image: polymeshassociation/rust:debian-nightly-2024-11-14 + - image: polymeshassociation/rust:debian-nightly-2025-08-01 resource_class: xlarge environment: - VERBOSE: "1" @@ -805,6 +831,7 @@ workflows: - testnet - staging - develop + - develop_v8 - build-docker-amd64-distroless: requires: - build @@ -815,6 +842,7 @@ workflows: - testnet - staging - develop + - develop_v8 - build-docker-ci-runtime: requires: - build-ci @@ -822,6 +850,7 @@ workflows: branches: only: - develop + - develop_v8 - build-docker-arm64-debian: requires: - build-arm64 @@ -832,6 +861,7 @@ workflows: - testnet - staging - develop + - develop_v8 - build-docker-arm64-distroless: requires: - build-arm64 @@ -842,6 +872,7 @@ workflows: - testnet - staging - develop + - develop_v8 - build-docker-debian: requires: - build-docker-amd64-debian @@ -853,6 +884,7 @@ workflows: - testnet - staging - develop + - develop_v8 - build-docker-distroless: requires: - build-docker-amd64-distroless @@ -864,6 +896,7 @@ workflows: - testnet - staging - develop + - develop_v8 - publish-github-release: requires: - build @@ -884,6 +917,7 @@ workflows: - mainnet - testnet - staging + - develop_v8 chain: testnet package: polymesh-runtime-testnet runtime_dir: pallets/runtime/testnet @@ -896,6 +930,7 @@ workflows: - mainnet - testnet - staging + - develop_v8 chain: mainnet package: polymesh-runtime-mainnet runtime_dir: pallets/runtime/mainnet @@ -906,6 +941,7 @@ workflows: branches: only: - develop + - develop_v8 chain: develop package: polymesh-runtime-develop runtime_dir: pallets/runtime/develop diff --git a/.docker/Dockerfile.debian b/.docker/Dockerfile.debian index 861d1006d1..9b27824a04 100644 --- a/.docker/Dockerfile.debian +++ b/.docker/Dockerfile.debian @@ -16,6 +16,14 @@ RUN ls -a && \ FROM debian:stable-slim +# install tools and dependencies +RUN DEBIAN_FRONTEND=noninteractive apt-get update && \ + apt-get upgrade -y && \ + apt-get install -y --no-install-recommends ca-certificates && \ + apt-get autoremove -y && \ + apt-get clean && \ + find /var/lib/apt/lists/ -type f -not -name lock -delete + COPY --chown=4002:4002 --from=gobuild /opt/health-check/polymesh-health-check /usr/local/bin/check COPY --chown=4002:4002 --from=gobuild /opt/rotate-keys/polymesh-rotate-keys /usr/local/bin/rotate COPY --chown=4001:4001 ./polymesh /usr/local/bin/polymesh @@ -33,4 +41,4 @@ HEALTHCHECK \ --start-period=120s \ --timeout=5s \ --retries=6 \ - CMD /usr/local/bin/check liveness \ No newline at end of file + CMD /usr/local/bin/check liveness diff --git a/.docker/arm64/Dockerfile.debian b/.docker/arm64/Dockerfile.debian index fe0e7f383a..9e622f6905 100644 --- a/.docker/arm64/Dockerfile.debian +++ b/.docker/arm64/Dockerfile.debian @@ -16,6 +16,14 @@ RUN ls -a && \ FROM debian:stable-slim +# install tools and dependencies +RUN DEBIAN_FRONTEND=noninteractive apt-get update && \ + apt-get upgrade -y && \ + apt-get install -y --no-install-recommends ca-certificates && \ + apt-get autoremove -y && \ + apt-get clean && \ + find /var/lib/apt/lists/ -type f -not -name lock -delete + COPY --chown=4002:4002 --from=gobuild /opt/health-check/polymesh-health-check /usr/local/bin/check COPY --chown=4002:4002 --from=gobuild /opt/rotate-keys/polymesh-rotate-keys /usr/local/bin/rotate COPY --chown=4001:4001 ./polymesh-arm64 /usr/local/bin/polymesh diff --git a/.maintain/frame-weight-template.hbs b/.maintain/frame-weight-template.hbs index acca9c4454..423d243b49 100644 --- a/.maintain/frame-weight-template.hbs +++ b/.maintain/frame-weight-template.hbs @@ -48,10 +48,10 @@ impl {{pallet}}::WeightInfo for SubstrateWeight { {{~#if (not c.is_used)}}_{{/if}}{{c.name}}: u32, {{/each~}} ) -> Weight { // Minimum execution time: {{underscore benchmark.min_execution_time}} nanoseconds. - Weight::from_ref_time({{underscore benchmark.base_weight}}) + Weight::from_parts({{underscore benchmark.base_weight}}, 0) {{#each benchmark.component_weight as |cw|}} // Standard Error: {{underscore cw.error}} - .saturating_add(Weight::from_ref_time({{underscore cw.slope}}).saturating_mul({{cw.name}}.into())) + .saturating_add(Weight::from_parts({{underscore cw.slope}}, 0).saturating_mul({{cw.name}}.into())) {{/each}} {{#if (ne benchmark.base_reads "0")}} .saturating_add(DbWeight::get().reads({{benchmark.base_reads}})) diff --git a/Cargo.lock b/Cargo.lock index 8607488ca8..dd1d20a660 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,46 +14,27 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.17.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ - "gimli 0.26.2", + "gimli 0.31.1", ] [[package]] name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli 0.28.1", -] - -[[package]] -name = "adler" -version = "1.0.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aead" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ - "generic-array 0.14.7", + "gimli 0.32.3", ] [[package]] -name = "aead" -version = "0.4.3" +name = "adler2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" -dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", -] +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aead" @@ -67,84 +48,27 @@ dependencies = [ [[package]] name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher 0.2.5", -] - -[[package]] -name = "aes" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" -dependencies = [ - "cfg-if 1.0.0", - "cipher 0.3.0", - "cpufeatures", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aes" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cipher 0.4.4", "cpufeatures", ] -[[package]] -name = "aes-gcm" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" -dependencies = [ - "aead 0.4.3", - "aes 0.7.5", - "cipher 0.3.0", - "ctr 0.8.0", - "ghash 0.4.4", - "subtle", -] - [[package]] name = "aes-gcm" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" dependencies = [ - "aead 0.5.2", - "aes 0.8.3", + "aead", + "aes", "cipher 0.4.4", - "ctr 0.9.2", - "ghash 0.5.0", - "subtle", -] - -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher 0.2.5", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher 0.2.5", - "opaque-debug 0.3.0", + "ctr", + "ghash", + "subtle 2.6.1", ] [[package]] @@ -153,19 +77,19 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.16", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ - "cfg-if 1.0.0", - "getrandom 0.2.11", + "cfg-if", + "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -173,9692 +97,14787 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] -name = "android-tzdata" -version = "0.1.1" +name = "allocator-api2" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] -name = "android_system_properties" -version = "0.1.5" +name = "alloy-consensus" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", +checksum = "41e46a465e50a339a817070ec23f06eb3fc9fbb8af71612868367b875a9d49e3" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "alloy-tx-macros", + "auto_impl", + "borsh", + "c-kzg", + "derive_more 2.1.0", + "either", + "k256", + "once_cell", + "rand 0.8.5", + "secp256k1 0.30.0", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.17", ] [[package]] -name = "ansi_term" -version = "0.12.1" +name = "alloy-core" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +checksum = "9d4087016b0896051dd3d03e0bedda2f4d4d1689af8addc8450288c63a9e5f68" dependencies = [ - "winapi", + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", ] [[package]] -name = "anstream" -version = "0.6.15" +name = "alloy-dyn-abi" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "369f5707b958927176265e8a58627fc6195e5dfa5c55689396e68b241b3a72e6" dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "itoa", + "serde", + "serde_json", + "winnow", ] [[package]] -name = "anstyle" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" - -[[package]] -name = "anstyle-parse" -version = "0.2.3" +name = "alloy-eip2124" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" dependencies = [ - "utf8parse", + "alloy-primitives", + "alloy-rlp", + "crc", + "serde", + "thiserror 2.0.17", ] [[package]] -name = "anstyle-query" -version = "1.0.2" +name = "alloy-eip2930" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "9441120fa82df73e8959ae0e4ab8ade03de2aaae61be313fbf5746277847ce25" dependencies = [ - "windows-sys 0.52.0", + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", ] [[package]] -name = "anstyle-wincon" -version = "3.0.2" +name = "alloy-eip7702" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" dependencies = [ - "anstyle", - "windows-sys 0.52.0", + "alloy-primitives", + "alloy-rlp", + "borsh", + "k256", + "serde", + "thiserror 2.0.17", ] [[package]] -name = "anyhow" -version = "1.0.75" +name = "alloy-eips" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "707337efeb051ddbaece17a73eaec5150945a5a5541112f4146508248edc2e40" +dependencies = [ + "alloy-eip2124", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "auto_impl", + "borsh", + "c-kzg", + "derive_more 2.1.0", + "either", + "serde", + "serde_with", + "sha2 0.10.9", + "thiserror 2.0.17", +] [[package]] -name = "approx" -version = "0.5.1" +name = "alloy-json-abi" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +checksum = "84e3cf01219c966f95a460c95f1d4c30e12f6c18150c21a30b768af2a2a29142" dependencies = [ - "num-traits", + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", ] [[package]] -name = "arc-swap" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" - -[[package]] -name = "array-bytes" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" - -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.5.2" +name = "alloy-primitives" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +checksum = "f6a0fb18dd5fb43ec5f0f6a20be1ce0287c79825827de5744afaa6c957737c33" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.1.0", + "foldhash 0.2.0", + "hashbrown 0.16.1", + "indexmap 2.12.1", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.9.2", + "rapidhash", + "ruint", + "rustc-hash 2.1.1", + "serde", + "sha3", + "tiny-keccak", +] [[package]] -name = "arrayvec" -version = "0.7.4" +name = "alloy-rlp" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +dependencies = [ + "alloy-rlp-derive", + "arrayvec 0.7.6", + "bytes", +] [[package]] -name = "asn1-rs" -version = "0.3.1" +name = "alloy-rlp-derive" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ff05a702273012438132f449575dbc804e27b2f3cbe3069aa237d26c98fa33" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ - "asn1-rs-derive 0.1.0", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror", - "time", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "asn1-rs" -version = "0.5.2" +name = "alloy-serde" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +checksum = "a438ce4cd49ec4bc213868c1fe94f2fe103d4c3f22f6a42073db974f9c0962da" dependencies = [ - "asn1-rs-derive 0.4.0", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror", - "time", + "alloy-primitives", + "serde", + "serde_json", ] [[package]] -name = "asn1-rs-derive" -version = "0.1.0" +name = "alloy-sol-macro" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8b7511298d5b7784b40b092d9e9dcd3a627a5707e4b5e507931ab0d44eeebf" +checksum = "09eb18ce0df92b4277291bbaa0ed70545d78b02948df756bbd3d6214bf39a218" dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", "proc-macro2", "quote", - "syn 1.0.109", - "synstructure", + "syn 2.0.111", ] [[package]] -name = "asn1-rs-derive" -version = "0.4.0" +name = "alloy-sol-macro-expander" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +checksum = "95d9fa2daf21f59aa546d549943f10b5cce1ae59986774019fbedae834ffe01b" dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.12.1", + "proc-macro-error2", "proc-macro2", "quote", - "syn 1.0.109", - "synstructure", + "syn 2.0.111", + "syn-solidity", + "tiny-keccak", ] [[package]] -name = "asn1-rs-impl" -version = "0.1.0" +name = "alloy-sol-macro-input" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +checksum = "9396007fe69c26ee118a19f4dee1f5d1d6be186ea75b3881adf16d87f8444686" dependencies = [ + "const-hex", + "dunce", + "heck 0.5.0", + "macro-string", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.111", + "syn-solidity", ] [[package]] -name = "asn1_der" -version = "0.7.6" +name = "alloy-sol-type-parser" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "155a5a185e42c6b77ac7b88a15143d930a9e9727a5b7b77eed417404ab15c247" +checksum = "af67a0b0dcebe14244fc92002cd8d96ecbf65db4639d479f5fcd5805755a4c27" +dependencies = [ + "serde", + "winnow", +] [[package]] -name = "asset-metadata" -version = "0.1.0" +name = "alloy-sol-types" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09aeea64f09a7483bdcd4193634c7e5cf9fd7775ee767585270cd8ce2d69dc95" dependencies = [ - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "serde", ] [[package]] -name = "async-io" -version = "2.2.2" +name = "alloy-trie" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6afaa937395a620e33dc6a742c593c01aced20aa376ffb0f628121198578ccc7" +checksum = "428aa0f0e0658ff091f8f667c406e034b431cb10abd39de4f507520968acc499" dependencies = [ - "async-lock", - "cfg-if 1.0.0", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix 0.38.28", - "slab", + "alloy-primitives", + "alloy-rlp", + "arrayvec 0.7.6", + "derive_more 2.1.0", + "nybbles", + "serde", + "smallvec", "tracing", - "windows-sys 0.52.0", ] [[package]] -name = "async-lock" -version = "3.2.0" +name = "alloy-tx-macros" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c" +checksum = "99dac443033e83b14f68fac56e8c27e76421f1253729574197ceccd06598f3ef" dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite 0.2.13", + "darling 0.21.3", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "async-trait" -version = "0.1.74" +name = "android_system_properties" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.40", + "libc", ] [[package]] -name = "asynchronous-codec" -version = "0.6.2" +name = "anstream" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4057f2c32adbb2fc158e22fb38433c8e9bbf76b75a4732c7c0cbaf695fb65568" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ - "bytes", - "futures-sink", - "futures-util", - "memchr", - "pin-project-lite 0.2.13", + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", ] [[package]] -name = "atomic-waker" -version = "1.1.2" +name = "anstyle" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] -name = "atty" -version = "0.2.14" +name = "anstyle-parse" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", + "utf8parse", ] [[package]] -name = "autocfg" -version = "1.1.0" +name = "anstyle-query" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] [[package]] -name = "backtrace" -version = "0.3.69" +name = "anstyle-wincon" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ - "addr2line 0.21.0", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide", - "object 0.32.1", - "rustc-demangle", + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", ] [[package]] -name = "base-x" -version = "0.2.11" +name = "anyhow" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] -name = "base16ct" -version = "0.1.1" +name = "approx" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] [[package]] -name = "base58" -version = "0.2.0" +name = "aquamarine" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" +checksum = "21cc1548309245035eb18aa7f0967da6bc65587005170c56e6ef2788a4cf3f4e" +dependencies = [ + "include_dir", + "itertools 0.10.5", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.111", +] [[package]] -name = "base64" -version = "0.13.1" +name = "arbitrary" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] -name = "base64" -version = "0.21.5" +name = "ark-bls12-377" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "fb00293ba84f51ce3bd026bd0de55899c4e68f0a39a5728cebae3a73ffdc0a4f" +dependencies = [ + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] [[package]] -name = "base64ct" -version = "1.6.0" +name = "ark-bls12-381" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", +] [[package]] -name = "beef" -version = "0.5.2" +name = "ark-bls12-381" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" +checksum = "3df4dcc01ff89867cd86b0da835f23c3f02738353aaee7dde7495af71363b8d5" dependencies = [ - "serde", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", ] [[package]] -name = "bincode" -version = "1.3.3" +name = "ark-bn254" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" dependencies = [ - "serde", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-r1cs-std", + "ark-std 0.5.0", ] [[package]] -name = "bindgen" -version = "0.64.0" +name = "ark-ec" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" dependencies = [ - "bitflags 1.3.2", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 1.0.109", + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", ] [[package]] -name = "bitflags" -version = "1.3.2" +name = "ark-ec" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash 0.8.12", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "zeroize", +] [[package]] -name = "bitflags" -version = "2.4.1" +name = "ark-ed-on-bls12-381-bandersnatch" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "1786b2e3832f6f0f7c8d62d5d5a282f6952a1ab99981c54cd52b6ac1d8f02df5" +dependencies = [ + "ark-bls12-381 0.5.0", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-std 0.5.0", +] [[package]] -name = "bitvec" -version = "0.17.4" +name = "ark-ff" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" dependencies = [ - "either", - "radium 0.3.0", + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", ] [[package]] -name = "bitvec" -version = "1.0.1" +name = "ark-ff" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" dependencies = [ - "funty", - "radium 0.7.0", - "tap", - "wyz", + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", ] [[package]] -name = "blake2" -version = "0.10.6" +name = "ark-ff" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec 0.7.6", "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", ] [[package]] -name = "blake2b_simd" -version = "1.0.2" +name = "ark-ff-asm" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" dependencies = [ - "arrayref", - "arrayvec 0.7.4", - "constant_time_eq", + "quote", + "syn 1.0.109", ] [[package]] -name = "blake2s_simd" -version = "1.0.2" +name = "ark-ff-asm" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94230421e395b9920d23df13ea5d77a20e1725331f90fbbf6df6040b33f756ae" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" dependencies = [ - "arrayref", - "arrayvec 0.7.4", - "constant_time_eq", + "quote", + "syn 1.0.109", ] [[package]] -name = "blake3" -version = "1.5.0" +name = "ark-ff-asm" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ - "arrayref", - "arrayvec 0.7.4", - "cc", - "cfg-if 1.0.0", - "constant_time_eq", + "quote", + "syn 2.0.111", ] [[package]] -name = "block-buffer" -version = "0.7.3" +name = "ark-ff-macros" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" dependencies = [ - "block-padding 0.1.5", - "byte-tools", - "byteorder", - "generic-array 0.12.4", + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", ] [[package]] -name = "block-buffer" -version = "0.9.0" +name = "ark-ff-macros" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ - "generic-array 0.14.7", + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "block-buffer" -version = "0.10.4" +name = "ark-ff-macros" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" dependencies = [ - "generic-array 0.14.7", + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "block-modes" -version = "0.7.0" +name = "ark-poly" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" dependencies = [ - "block-padding 0.2.1", - "cipher 0.2.5", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", ] [[package]] -name = "block-padding" -version = "0.1.5" +name = "ark-poly" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" dependencies = [ - "byte-tools", + "ahash 0.8.12", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", ] [[package]] -name = "block-padding" -version = "0.2.1" +name = "ark-r1cs-std" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" +checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-relations", + "ark-std 0.5.0", + "educe", + "num-bigint", + "num-integer", + "num-traits", + "tracing", +] [[package]] -name = "bounded-collections" -version = "0.1.9" +name = "ark-relations" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca548b6163b872067dc5eb82fd130c56881435e30367d2073594a3d9744120dd" +checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" dependencies = [ - "log", - "parity-scale-codec 3.6.9", - "scale-info", - "serde", + "ark-ff 0.5.0", + "ark-std 0.5.0", + "tracing", + "tracing-subscriber 0.2.25", ] [[package]] -name = "bs58" -version = "0.4.0" +name = "ark-serialize" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] [[package]] -name = "bstr" -version = "1.8.0" +name = "ark-serialize" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ - "memchr", - "serde", + "ark-serialize-derive 0.4.2", + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", ] [[package]] -name = "build-helper" -version = "0.1.1" +name = "ark-serialize" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" dependencies = [ - "semver 0.6.0", + "ark-serialize-derive 0.5.0", + "ark-std 0.5.0", + "arrayvec 0.7.6", + "digest 0.10.7", + "num-bigint", ] [[package]] -name = "bumpalo" -version = "3.14.0" +name = "ark-serialize-derive" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] [[package]] -name = "byte-slice-cast" -version = "0.3.5" +name = "ark-serialize-derive" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] [[package]] -name = "byte-slice-cast" -version = "1.2.2" +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] [[package]] -name = "byte-tools" -version = "0.3.1" +name = "ark-std" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] [[package]] -name = "bytemuck" -version = "1.14.0" +name = "ark-transcript" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "47c1c928edb9d8ff24cb5dcb7651d3a98494fff3099eee95c2404cd813a9139f" +dependencies = [ + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "digest 0.10.7", + "rand_core 0.6.4", + "sha3", +] [[package]] -name = "byteorder" -version = "1.5.0" +name = "ark-vrf" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "9501da18569b2afe0eb934fb7afd5a247d238b94116155af4dd068f319adfe6d" +dependencies = [ + "ark-bls12-381 0.5.0", + "ark-ec 0.5.0", + "ark-ed-on-bls12-381-bandersnatch", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "digest 0.10.7", + "rand_chacha 0.3.1", + "sha2 0.10.9", + "w3f-ring-proof", + "zeroize", +] [[package]] -name = "bytes" -version = "1.5.0" +name = "array-bytes" +version = "6.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "5d5dde061bd34119e902bbb2d9b90c5692635cf59fb91d582c2b68043f1b8293" [[package]] -name = "bzip2-sys" -version = "0.1.11+1.0.8" +name = "array-bytes" +version = "9.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +checksum = "27d55334c98d756b32dcceb60248647ab34f027690f87f9a362fd292676ee927" dependencies = [ - "cc", - "libc", - "pkg-config", + "smallvec", + "thiserror 2.0.17", ] [[package]] -name = "camino" -version = "1.1.6" +name = "arrayref" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" -dependencies = [ - "serde", -] +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] -name = "cargo-platform" -version = "0.1.5" +name = "arrayvec" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" +checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" dependencies = [ - "serde", + "nodrop", ] [[package]] -name = "cargo_metadata" -version = "0.15.4" +name = "arrayvec" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.20", "serde", - "serde_json", - "thiserror", ] [[package]] -name = "cc" -version = "1.2.17" +name = "asn1-rs" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" dependencies = [ - "jobserver", - "libc", - "shlex", + "asn1-rs-derive 0.5.1", + "asn1-rs-impl", + "displaydoc", + "nom 7.1.3", + "num-traits", + "rusticata-macros", + "thiserror 1.0.69", + "time", ] [[package]] -name = "ccm" -version = "0.3.0" +name = "asn1-rs" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aca1a8fbc20b50ac9673ff014abfb2b5f4085ee1a850d408f14a159c5853ac7" +checksum = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60" dependencies = [ - "aead 0.3.2", - "cipher 0.2.5", - "subtle", + "asn1-rs-derive 0.6.0", + "asn1-rs-impl", + "displaydoc", + "nom 7.1.3", + "num-traits", + "rusticata-macros", + "thiserror 2.0.17", + "time", ] [[package]] -name = "cexpr" -version = "0.6.0" +name = "asn1-rs-derive" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ - "nom", + "proc-macro2", + "quote", + "syn 2.0.111", + "synstructure 0.13.2", ] [[package]] -name = "cfg-expr" -version = "0.10.3" +name = "asn1-rs-derive" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aacacf4d96c24b2ad6eb8ee6df040e4f27b0d0b39a5710c30091baa830485db" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" dependencies = [ - "smallvec", + "proc-macro2", + "quote", + "syn 2.0.111", + "synstructure 0.13.2", ] [[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - -[[package]] -name = "chacha20" -version = "0.9.1" +name = "asn1-rs-impl" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ - "cfg-if 1.0.0", - "cipher 0.4.4", - "cpufeatures", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "chacha20poly1305" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +name = "asset-metadata" +version = "0.1.0" dependencies = [ - "aead 0.5.2", - "chacha20", - "cipher 0.4.4", - "poly1305", - "zeroize", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", ] [[package]] -name = "chrono" -version = "0.4.31" +name = "async-channel" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "windows-targets 0.48.5", + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", ] [[package]] -name = "cid" -version = "0.8.6" +name = "async-channel" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ed9c8b2d17acb8110c46f1da5bf4a696d745e1474a16db0cd2b49cd0249bf2" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ - "core2", - "multibase", - "multihash 0.16.3", - "serde", - "unsigned-varint", + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", ] [[package]] -name = "cipher" -version = "0.2.5" +name = "async-executor" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" dependencies = [ - "generic-array 0.14.7", + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", ] [[package]] -name = "cipher" -version = "0.3.0" +name = "async-fs" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" dependencies = [ - "generic-array 0.14.7", + "async-lock", + "blocking", + "futures-lite", ] [[package]] -name = "cipher" -version = "0.4.4" +name = "async-io" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ - "crypto-common", - "inout", - "zeroize", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.2", + "slab", + "windows-sys 0.61.2", ] [[package]] -name = "clang-sys" -version = "1.6.1" +name = "async-lock" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ - "glob", - "libc", - "libloading", + "event-listener 5.4.1", + "event-listener-strategy", + "pin-project-lite", ] [[package]] -name = "clap" -version = "4.4.11" +name = "async-net" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" dependencies = [ - "clap_builder", - "clap_derive", + "async-io", + "blocking", + "futures-lite", ] [[package]] -name = "clap_builder" -version = "4.4.11" +name = "async-process" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", + "async-channel 2.5.0", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.1", + "futures-lite", + "rustix 1.1.2", ] [[package]] -name = "clap_derive" -version = "4.4.7" +name = "async-signal" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.40", + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.2", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", ] [[package]] -name = "clap_lex" -version = "0.6.0" +name = "async-task" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] -name = "codespan-reporting" -version = "0.11.1" +name = "async-trait" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ - "termcolor", - "unicode-width", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "colorchoice" -version = "1.0.0" +name = "asynchronous-codec" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "4057f2c32adbb2fc158e22fb38433c8e9bbf76b75a4732c7c0cbaf695fb65568" +dependencies = [ + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite", +] [[package]] -name = "comfy-table" -version = "6.2.0" +name = "asynchronous-codec" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e959d788268e3bf9d35ace83e81b124190378e4c91c9067524675e33394b8ba" +checksum = "a860072022177f903e59730004fb5dc13db9275b79bb2aef7ba8ce831956c233" dependencies = [ - "strum", - "strum_macros", - "unicode-width", + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite", ] [[package]] -name = "concurrent-queue" -version = "2.4.0" +name = "atoi" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" dependencies = [ - "crossbeam-utils", + "num-traits", ] [[package]] -name = "const-oid" -version = "0.9.5" +name = "atomic-take" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +checksum = "a8ab6b55fe97976e46f91ddbed8d147d966475dc29b2032757ba47e02376fbc3" [[package]] -name = "constant_time_eq" -version = "0.3.0" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] -name = "core-foundation" -version = "0.9.4" +name = "attohttpc" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" dependencies = [ - "core-foundation-sys", - "libc", + "http 0.2.12", + "log", + "url", ] [[package]] -name = "core-foundation-sys" -version = "0.8.6" +name = "aurora-engine-modexp" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "518bc5745a6264b5fd7b09dffb9667e400ee9e2bbe18555fac75e1fe9afa0df9" +dependencies = [ + "hex", + "num", +] [[package]] -name = "core2" -version = "0.4.0" +name = "auto_impl" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ - "memchr", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "cpp_demangle" -version = "0.3.5" +name = "autocfg" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" -dependencies = [ - "cfg-if 1.0.0", -] +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] -name = "cpufeatures" -version = "0.2.11" +name = "az" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ + "addr2line 0.25.1", + "cfg-if", "libc", + "miniz_oxide", + "object 0.37.3", + "rustc-demangle", + "windows-link", ] [[package]] -name = "cranelift-bforest" -version = "0.93.2" +name = "base-x" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc42ba2e232e5b20ff7dc299a812d53337dadce9a7e39a238e6a5cb82d2e57b" -dependencies = [ - "cranelift-entity", -] +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" [[package]] -name = "cranelift-codegen" -version = "0.93.2" +name = "base16ct" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "253531aca9b6f56103c9420369db3263e784df39aa1c90685a1f69cfbba0623e" -dependencies = [ - "arrayvec 0.7.4", - "bumpalo", - "cranelift-bforest", - "cranelift-codegen-meta", - "cranelift-codegen-shared", - "cranelift-entity", - "cranelift-isle", - "gimli 0.26.2", - "hashbrown 0.12.3", - "log", - "regalloc2", - "smallvec", - "target-lexicon", -] +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] -name = "cranelift-codegen-meta" -version = "0.93.2" +name = "base256emoji" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f2154365e2bff1b1b8537a7181591fdff50d8e27fa6e40d5c69c3bad0ca7c8" +checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" dependencies = [ - "cranelift-codegen-shared", + "const-str", + "match-lookup", ] [[package]] -name = "cranelift-codegen-shared" -version = "0.93.2" +name = "base58" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687e14e3f5775248930e0d5a84195abef8b829958e9794bf8d525104993612b4" +checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" [[package]] -name = "cranelift-entity" -version = "0.93.2" +name = "base64" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f42ea692c7b450ad18b8c9889661505d51c09ec4380cf1c2d278dbb2da22cae1" -dependencies = [ - "serde", -] +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "cranelift-frontend" -version = "0.93.2" +name = "base64ct" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8483c2db6f45fe9ace984e5adc5d058102227e4c62e5aa2054e16b0275fd3a6e" +checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" + +[[package]] +name = "binary-merkle-tree" +version = "16.1.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "cranelift-codegen", + "hash-db", "log", - "smallvec", - "target-lexicon", + "parity-scale-codec", ] [[package]] -name = "cranelift-isle" -version = "0.93.2" +name = "bindgen" +version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9793158837678902446c411741d87b43f57dadfb944f2440db4287cda8cbd59" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags 2.10.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "proc-macro2", + "quote", + "regex", + "rustc-hash 2.1.1", + "shlex", + "syn 2.0.111", +] [[package]] -name = "cranelift-native" -version = "0.93.2" +name = "bip32" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72668c7755f2b880665cb422c8ad2d56db58a88b9bebfef0b73edc2277c13c49" +checksum = "db40d3dfbeab4e031d78c844642fa0caa0b0db11ce1607ac9d2986dff1405c69" dependencies = [ - "cranelift-codegen", - "libc", - "target-lexicon", + "bs58", + "hmac 0.12.1", + "k256", + "rand_core 0.6.4", + "ripemd", + "secp256k1 0.27.0", + "sha2 0.10.9", + "subtle 2.6.1", + "zeroize", ] [[package]] -name = "cranelift-wasm" -version = "0.93.2" +name = "bip39" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3852ce4b088b44ac4e29459573943009a70d1b192c8d77ef949b4e814f656fc1" +checksum = "90dbd31c98227229239363921e60fcf5e558e43ec69094d46fc4996f08d1d5bc" dependencies = [ - "cranelift-codegen", - "cranelift-entity", - "cranelift-frontend", - "itertools", - "log", - "smallvec", - "wasmparser", - "wasmtime-types", + "bitcoin_hashes", + "rand 0.8.5", + "rand_core 0.6.4", + "serde", + "unicode-normalization", ] [[package]] -name = "crc" -version = "3.0.1" +name = "bit-set" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ - "crc-catalog", + "bit-vec", ] [[package]] -name = "crc-catalog" -version = "2.4.0" +name = "bit-vec" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] -name = "crc32fast" -version = "1.3.2" +name = "bitcoin-io" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if 1.0.0", -] +checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" [[package]] -name = "crossbeam-deque" -version = "0.8.3" +name = "bitcoin_hashes" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "26ec84b80c482df901772e931a9a681e26a1b9ee2302edeff23cb30328745c8b" dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch", - "crossbeam-utils", + "bitcoin-io", + "hex-conservative", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.15" +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ - "autocfg", - "cfg-if 1.0.0", - "crossbeam-utils", - "memoffset 0.9.0", - "scopeguard", + "serde_core", ] [[package]] -name = "crossbeam-utils" -version = "0.8.16" +name = "bitvec" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ - "cfg-if 1.0.0", + "funty", + "radium", + "serde", + "tap", + "wyz", ] [[package]] -name = "crunchy" -version = "0.2.2" +name = "blake2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330" +dependencies = [ + "byte-tools", + "crypto-mac 0.7.0", + "digest 0.8.1", + "opaque-debug 0.2.3", +] [[package]] -name = "crypto-bigint" -version = "0.4.9" +name = "blake2" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "subtle", - "zeroize", + "digest 0.10.7", ] [[package]] -name = "crypto-common" -version = "0.1.6" +name = "blake2-rfc" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "typenum", + "arrayvec 0.4.12", + "constant_time_eq 0.1.5", ] [[package]] -name = "crypto-mac" -version = "0.8.0" +name = "blake2b_simd" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" dependencies = [ - "generic-array 0.14.7", - "subtle", + "arrayref", + "arrayvec 0.7.6", + "constant_time_eq 0.3.1", ] [[package]] -name = "crypto-mac" -version = "0.11.1" +name = "blake3" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ - "generic-array 0.14.7", - "subtle", + "arrayref", + "arrayvec 0.7.6", + "cc", + "cfg-if", + "constant_time_eq 0.3.1", ] [[package]] -name = "ctr" -version = "0.8.0" +name = "block-buffer" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "cipher 0.3.0", + "generic-array 0.14.7", ] [[package]] -name = "ctr" -version = "0.9.2" +name = "block-buffer" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "cipher 0.4.4", + "generic-array 0.14.7", ] [[package]] -name = "curve25519-dalek" -version = "2.1.3" +name = "blocking" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ - "byteorder", - "digest 0.8.1", - "rand_core 0.5.1", - "subtle", - "zeroize", + "async-channel 2.5.0", + "async-task", + "futures-io", + "futures-lite", + "piper", ] [[package]] -name = "curve25519-dalek" -version = "3.2.0" +name = "blst" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", + "cc", + "glob", + "threadpool", "zeroize", ] [[package]] -name = "curve25519-dalek" -version = "4.1.3" +name = "borsh" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "rustc_version 0.4.0", - "subtle", - "zeroize", + "borsh-derive", + "cfg_aliases 0.2.1", ] [[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" +name = "borsh-derive" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" dependencies = [ + "once_cell", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.111", ] [[package]] -name = "cxx" -version = "1.0.110" +name = "bounded-collections" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7129e341034ecb940c9072817cd9007974ea696844fc4dd582dc1653a7fbe2e8" +checksum = "dee8eddd066a8825ec5570528e6880471210fd5d88cb6abbe1cfdd51ca249c33" dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", + "jam-codec", + "log", + "parity-scale-codec", + "scale-info", + "serde", ] [[package]] -name = "cxx-build" -version = "1.0.110" +name = "bounded-vec" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a24f3f5f8eed71936f21e570436f024f5c2e25628f7496aa7ccd03b90109d5" +checksum = "68534a48cbf63a4b1323c433cf21238c9ec23711e0df13b08c33e5c2082663ce" dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn 2.0.40", + "thiserror 1.0.69", ] [[package]] -name = "cxxbridge-flags" -version = "1.0.110" +name = "bs58" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06fdd177fc61050d63f67f5bd6351fac6ab5526694ea8e359cd9cd3b75857f44" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2 0.10.9", + "tinyvec", +] [[package]] -name = "cxxbridge-macro" -version = "1.0.110" +name = "build-helper" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "587663dd5fb3d10932c8aecfe7c844db1bcf0aee93eeab08fac13dc1212c2e7f" +checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.40", + "semver 0.6.0", ] [[package]] -name = "darling" -version = "0.14.4" +name = "bumpalo" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" dependencies = [ - "darling_core", - "darling_macro", + "allocator-api2", ] [[package]] -name = "darling_core" -version = "0.14.4" +name = "byte-slice-cast" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 1.0.109", -] +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] -name = "darling_macro" -version = "0.14.4" +name = "byte-tools" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" -dependencies = [ - "darling_core", - "quote", - "syn 1.0.109", -] +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] -name = "data-encoding" -version = "2.5.0" +name = "bytemuck" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] -name = "data-encoding-macro" -version = "0.1.14" +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c01c06f5f429efdf2bae21eb67c28b3df3cf85b7dd2d8ef09c0838dac5d33e" -dependencies = [ - "data-encoding", - "data-encoding-macro-internal", -] +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] -name = "data-encoding-macro-internal" -version = "0.1.12" +name = "bytes" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0047d07f2c89b17dd631c80450d69841a6b5d7fb17278cbc43d7e4cfcf2576f3" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" dependencies = [ - "data-encoding", - "syn 1.0.109", + "serde", ] [[package]] -name = "der" -version = "0.6.1" +name = "bzip2-sys" +version = "0.1.13+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", + "cc", + "pkg-config", ] [[package]] -name = "der" -version = "0.7.8" +name = "c-kzg" +version = "2.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" dependencies = [ - "const-oid", - "zeroize", + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", ] [[package]] -name = "der-parser" -version = "7.0.0" +name = "c2-chacha" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe398ac75057914d7d07307bf67dc7f3f574a26783b4fc7805a20ffa9f506e82" +checksum = "d27dae93fe7b1e0424dc57179ac396908c26b035a87234809f5c4dfd1b47dc80" dependencies = [ - "asn1-rs 0.3.1", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", + "cipher 0.2.5", + "ppv-lite86", ] [[package]] -name = "der-parser" -version = "8.2.0" +name = "camino" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" dependencies = [ - "asn1-rs 0.5.2", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", + "serde_core", ] [[package]] -name = "deranged" -version = "0.3.10" +name = "cargo-platform" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" dependencies = [ - "powerfmt", + "serde", ] [[package]] -name = "derive-syn-parse" -version = "0.1.5" +name = "cargo_metadata" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" +checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "camino", + "cargo-platform", + "semver 1.0.27", + "serde", + "serde_json", + "thiserror 1.0.69", ] [[package]] -name = "derive_builder" -version = "0.11.2" +name = "cc" +version = "1.2.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07adf7be193b71cc36b193d0f5fe60b918a3a9db4dad0449f57bcfd519704a3" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" dependencies = [ - "derive_builder_macro", + "find-msvc-tools", + "jobserver", + "libc", + "shlex", ] [[package]] -name = "derive_builder_core" -version = "0.11.2" +name = "cesu8" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f91d4cfa921f1c05904dc3c57b4a32c38aed3340cce209f3a6fd1478babafc4" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] -name = "derive_builder_macro" -version = "0.11.2" +name = "cexpr" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f0314b72bed045f3a68671b3c86328386762c93f82d98c65c3cb5e5f573dd68" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" dependencies = [ - "derive_builder_core", - "syn 1.0.109", + "nom 7.1.3", ] [[package]] -name = "derive_more" -version = "0.99.17" +name = "cfg-expr" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "smallvec", ] [[package]] -name = "difflib" -version = "0.4.0" +name = "cfg-if" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] -name = "digest" -version = "0.8.1" +name = "cfg_aliases" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] -name = "digest" -version = "0.9.0" +name = "cfg_aliases" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.7", -] +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] -name = "digest" -version = "0.10.7" +name = "chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "ddf3c081b5fba1e5615640aae998e0fbd10c24cbd897ee39ed754a77601a4862" dependencies = [ - "block-buffer 0.10.4", - "crypto-common", - "subtle", + "byteorder", + "keystream", ] [[package]] -name = "directories" -version = "4.0.1" +name = "chacha20" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ - "dirs-sys", + "cfg-if", + "cipher 0.4.4", + "cpufeatures", ] [[package]] -name = "directories-next" -version = "2.0.0" +name = "chacha20poly1305" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" dependencies = [ - "cfg-if 1.0.0", - "dirs-sys-next", + "aead", + "chacha20", + "cipher 0.4.4", + "poly1305", + "zeroize", ] [[package]] -name = "dirs-sys" -version = "0.3.7" +name = "chrono" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "libc", - "redox_users", - "winapi", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", ] [[package]] -name = "dirs-sys-next" -version = "0.1.2" +name = "cid" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a" dependencies = [ - "libc", - "redox_users", - "winapi", + "core2", + "multibase", + "multihash 0.19.3", + "unsigned-varint 0.8.0", ] [[package]] -name = "displaydoc" -version = "0.2.4" +name = "cipher" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.40", + "generic-array 0.14.7", ] [[package]] -name = "downcast" -version = "0.11.0" +name = "cipher" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] [[package]] -name = "downcast-rs" -version = "1.2.0" +name = "clang-sys" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", +] [[package]] -name = "dtoa" -version = "1.0.9" +name = "clap" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" +dependencies = [ + "clap_builder", + "clap_derive", +] [[package]] -name = "dyn-clonable" -version = "0.9.0" +name = "clap_builder" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ - "dyn-clonable-impl", - "dyn-clone", + "anstream", + "anstyle", + "clap_lex", + "strsim", + "terminal_size", ] [[package]] -name = "dyn-clonable-impl" -version = "0.9.0" +name = "clap_derive" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ + "heck 0.5.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.111", ] [[package]] -name = "dyn-clone" -version = "1.0.16" +name = "clap_lex" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] -name = "ecdsa" -version = "0.14.8" +name = "coarsetime" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +checksum = "91849686042de1b41cd81490edc83afbcb0abe5a9b6f2c4114f23ce8cca1bcf4" dependencies = [ - "der 0.6.1", - "elliptic-curve", - "rfc6979", - "signature 1.6.4", + "libc", + "wasix", + "wasm-bindgen", ] [[package]] -name = "ed25519" -version = "1.5.3" +name = "cobs" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "signature 1.6.4", + "thiserror 2.0.17", ] [[package]] -name = "ed25519" -version = "2.2.3" +name = "codespan-reporting" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" dependencies = [ - "pkcs8 0.10.2", - "signature 2.2.0", + "serde", + "termcolor", + "unicode-width", ] [[package]] -name = "ed25519-dalek" -version = "1.0.1" +name = "colorchoice" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek 3.2.0", - "ed25519 1.5.3", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "zeroize", -] +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] -name = "ed25519-dalek" -version = "2.1.0" +name = "combine" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ - "curve25519-dalek 4.1.3", - "ed25519 2.2.3", - "rand_core 0.6.4", - "serde", - "sha2 0.10.8", - "subtle", - "zeroize", + "bytes", + "memchr", ] [[package]] -name = "ed25519-zebra" -version = "3.1.0" +name = "comfy-table" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +checksum = "b03b7db8e0b4b2fdad6c551e634134e99ec000e5c8c3b6856c65e8bbaded7a3b" dependencies = [ - "curve25519-dalek 3.2.0", - "hashbrown 0.12.3", - "hex", - "rand_core 0.6.4", - "sha2 0.9.9", - "zeroize", + "unicode-segmentation", + "unicode-width", ] [[package]] -name = "either" -version = "1.9.0" +name = "common-path" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" [[package]] -name = "elliptic-curve" -version = "0.12.3" +name = "concurrent-queue" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ - "base16ct", - "crypto-bigint", - "der 0.6.1", - "digest 0.10.7", - "ff", - "generic-array 0.14.7", - "group", - "hkdf", - "pem-rfc7468", - "pkcs8 0.9.0", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", + "crossbeam-utils", ] [[package]] -name = "enum-as-inner" -version = "0.5.1" +name = "console" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 1.0.109", + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", ] [[package]] -name = "env_logger" -version = "0.7.1" +name = "const-crypto" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +checksum = "1c06f1eb05f06cf2e380fdded278fbf056a38974299d77960555a311dcf91a52" dependencies = [ - "atty", - "humantime 1.3.0", - "log", - "regex", - "termcolor", + "keccak-const", + "sha2-const-stable", ] [[package]] -name = "env_logger" -version = "0.10.1" +name = "const-hex" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" +checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" dependencies = [ - "humantime 2.1.0", - "is-terminal", - "log", - "regex", - "termcolor", + "cfg-if", + "cpufeatures", + "proptest", + "serde_core", ] [[package]] -name = "environmental" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" - -[[package]] -name = "equivalent" -version = "1.0.1" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] -name = "errno" -version = "0.3.8" +name = "const-random" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" dependencies = [ - "libc", - "windows-sys 0.52.0", + "const-random-macro", ] [[package]] -name = "event-listener" -version = "4.0.0" +name = "const-random-macro" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770d968249b5d99410d61f5bf89057f3199a077a04d087092f58e7d10692baae" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite 0.2.13", + "getrandom 0.2.16", + "once_cell", + "tiny-keccak", ] [[package]] -name = "event-listener-strategy" -version = "0.4.0" +name = "const-str" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" + +[[package]] +name = "const_format" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" dependencies = [ - "event-listener", - "pin-project-lite 0.2.13", + "const_format_proc_macros", ] [[package]] -name = "exit-future" -version = "0.2.0" +name = "const_format_proc_macros" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" dependencies = [ - "futures", + "proc-macro2", + "quote", + "unicode-xid", ] [[package]] -name = "fake-simd" -version = "0.1.2" +name = "constant_time_eq" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] -name = "fallible-iterator" -version = "0.2.0" +name = "constant_time_eq" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] -name = "fastrand" -version = "2.0.1" +name = "convert_case" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] -name = "fdlimit" -version = "0.2.1" +name = "convert_case" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4c9e43643f5a3be4ca5b67d26b98031ff9db6806c3440ae32e02e3ceac3f1b" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" dependencies = [ - "libc", + "unicode-segmentation", ] [[package]] -name = "ff" -version = "0.12.1" +name = "convert_case" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" dependencies = [ - "rand_core 0.6.4", - "subtle", + "unicode-segmentation", ] [[package]] -name = "fiat-crypto" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" - -[[package]] -name = "file-per-thread-logger" -version = "0.1.6" +name = "core-foundation" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f2e425d9790201ba4af4630191feac6dcc98765b118d4d18e91d23c2353866" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ - "env_logger 0.10.1", - "log", + "core-foundation-sys", + "libc", ] [[package]] -name = "filetime" -version = "0.2.23" +name = "core-foundation" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ - "cfg-if 1.0.0", + "core-foundation-sys", "libc", - "redox_syscall 0.4.1", - "windows-sys 0.52.0", ] [[package]] -name = "finality-grandpa" -version = "0.16.2" +name = "core-foundation-sys" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36530797b9bf31cd4ff126dcfee8170f86b00cfdcea3269d73133cc0415945c3" -dependencies = [ - "either", - "futures", - "futures-timer", - "log", - "num-traits", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "scale-info", -] +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "fixed-hash" -version = "0.8.0" +name = "core2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", + "memchr", ] [[package]] -name = "fixedbitset" -version = "0.4.2" +name = "cpp_demangle" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253" +dependencies = [ + "cfg-if", +] [[package]] -name = "flate2" -version = "1.0.28" +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ - "crc32fast", - "libz-sys", - "miniz_oxide", + "libc", ] [[package]] -name = "float-cmp" -version = "0.9.0" +name = "cranelift-assembler-x64" +version = "0.122.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +checksum = "0ae7b60ec3fd7162427d3b3801520a1908bef7c035b52983cd3ca11b8e7deb51" dependencies = [ - "num-traits", + "cranelift-assembler-x64-meta", ] [[package]] -name = "fnv" -version = "1.0.7" +name = "cranelift-assembler-x64-meta" +version = "0.122.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "fork-tree" -version = "3.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +checksum = "6511c200fed36452697b4b6b161eae57d917a2044e6333b1c1389ed63ccadeee" dependencies = [ - "parity-scale-codec 3.6.9", + "cranelift-srcgen", ] [[package]] -name = "form_urlencoded" -version = "1.2.1" +name = "cranelift-bforest" +version = "0.122.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "5f7086a645aa58bae979312f64e3029ac760ac1b577f5cd2417844842a2ca07f" dependencies = [ - "percent-encoding", + "cranelift-entity", ] [[package]] -name = "fragile" -version = "2.0.0" +name = "cranelift-bitset" +version = "0.122.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" - -[[package]] -name = "frame-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +checksum = "5225b4dec45f3f3dbf383f12560fac5ce8d780f399893607e21406e12e77f491" dependencies = [ - "frame-support", - "frame-support-procedural", - "frame-system", - "linregress", - "log", - "parity-scale-codec 3.6.9", - "paste", - "scale-info", "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-runtime", - "sp-runtime-interface", - "sp-std", - "sp-storage", - "static_assertions", + "serde_derive", ] [[package]] -name = "frame-benchmarking-cli" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "cranelift-codegen" +version = "0.122.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "858fb3331e53492a95979378d6df5208dd1d0d315f19c052be8115f4efc888e0" dependencies = [ - "Inflector", - "array-bytes", - "chrono", - "clap", - "comfy-table", - "frame-benchmarking", - "frame-support", - "frame-system", - "gethostname", - "handlebars", - "itertools", - "lazy_static", - "linked-hash-map", + "bumpalo", + "cranelift-assembler-x64", + "cranelift-bforest", + "cranelift-bitset", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-control", + "cranelift-entity", + "cranelift-isle", + "gimli 0.31.1", + "hashbrown 0.15.5", "log", - "parity-scale-codec 3.6.9", - "rand 0.8.5", - "rand_pcg", - "sc-block-builder", - "sc-cli", - "sc-client-api", - "sc-client-db", - "sc-executor", - "sc-service", - "sc-sysinfo", + "pulley-interpreter", + "regalloc2 0.12.2", + "rustc-hash 2.1.1", "serde", - "serde_json", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-database", - "sp-externalities", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-storage", - "sp-trie", - "thiserror", - "thousands", + "smallvec", + "target-lexicon", + "wasmtime-internal-math", ] [[package]] -name = "frame-election-provider-solution-type" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "cranelift-codegen-meta" +version = "0.122.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456715b9d5f12398f156d5081096e7b5d039f01b9ecc49790a011c8e43e65b5f" dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro2", - "quote", - "syn 1.0.109", + "cranelift-assembler-x64-meta", + "cranelift-codegen-shared", + "cranelift-srcgen", + "pulley-interpreter", ] [[package]] -name = "frame-election-provider-support" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" -dependencies = [ - "frame-election-provider-solution-type", - "frame-support", - "frame-system", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-npos-elections", - "sp-runtime", - "sp-std", -] +name = "cranelift-codegen-shared" +version = "0.122.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0306041099499833f167a0ddb707e1e54100f1a84eab5631bc3dad249708f482" [[package]] -name = "frame-executive" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "cranelift-control" +version = "0.122.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1672945e1f9afc2297f49c92623f5eabc64398e2cb0d824f8f72a2db2df5af23" dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-tracing", + "arbitrary", ] [[package]] -name = "frame-metadata" -version = "15.1.0" +name = "cranelift-entity" +version = "0.122.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" +checksum = "aa3cd55eb5f3825b9ae5de1530887907360a6334caccdc124c52f6d75246c98a" dependencies = [ - "cfg-if 1.0.0", - "parity-scale-codec 3.6.9", - "scale-info", + "cranelift-bitset", "serde", + "serde_derive", ] [[package]] -name = "frame-support" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "cranelift-frontend" +version = "0.122.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781f9905f8139b8de22987b66b522b416fe63eb76d823f0b3a8c02c8fd9500c7" dependencies = [ - "bitflags 1.3.2", - "environmental", - "frame-metadata", - "frame-support-procedural", - "impl-trait-for-tuples", - "k256", + "cranelift-codegen", "log", - "once_cell", - "parity-scale-codec 3.6.9", - "paste", - "scale-info", - "serde", "smallvec", - "sp-api", - "sp-arithmetic", - "sp-core", - "sp-core-hashing-proc-macro", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-state-machine", - "sp-std", - "sp-tracing", - "sp-weights", - "tt-call", + "target-lexicon", ] [[package]] -name = "frame-support-procedural" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "cranelift-isle" +version = "0.122.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a05337a2b02c3df00b4dd9a263a027a07b3dff49f61f7da3b5d195c21eaa633d" + +[[package]] +name = "cranelift-native" +version = "0.122.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eee7a496dd66380082c9c5b6f2d5fa149cec0ec383feec5caf079ca2b3671c2" dependencies = [ - "Inflector", - "cfg-expr", - "derive-syn-parse", - "frame-support-procedural-tools", - "itertools", - "proc-macro2", - "quote", - "syn 1.0.109", + "cranelift-codegen", + "libc", + "target-lexicon", ] [[package]] -name = "frame-support-procedural-tools" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "cranelift-srcgen" +version = "0.122.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b530783809a55cb68d070e0de60cfbb3db0dc94c8850dd5725411422bedcf6bb" + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" dependencies = [ - "frame-support-procedural-tools-derive", - "proc-macro-crate 1.1.3", - "proc-macro2", - "quote", - "syn 1.0.109", + "crc-catalog", ] [[package]] -name = "frame-support-procedural-tools-derive" -version = "3.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] -name = "frame-system" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ - "frame-support", - "log", - "parity-scale-codec 3.6.9", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", - "sp-weights", + "cfg-if", ] [[package]] -name = "frame-system-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std", -] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] -name = "frame-system-rpc-runtime-api" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ - "parity-scale-codec 3.6.9", - "sp-api", + "crossbeam-utils", ] [[package]] -name = "fs2" -version = "0.4.3" +name = "crossbeam-deque" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ - "libc", - "winapi", + "crossbeam-epoch", + "crossbeam-utils", ] [[package]] -name = "fs4" -version = "0.6.6" +name = "crossbeam-epoch" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eeb4ed9e12f43b7fa0baae3f9cdda28352770132ef2e09a23760c29cae8bd47" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "rustix 0.38.28", - "windows-sys 0.48.0", + "crossbeam-utils", ] [[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.29" +name = "crossbeam-queue" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", + "crossbeam-utils", ] [[package]] -name = "futures-channel" -version = "0.3.29" +name = "crossbeam-utils" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" -dependencies = [ - "futures-core", - "futures-sink", -] +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] -name = "futures-core" -version = "0.3.29" +name = "crunchy" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] -name = "futures-executor" -version = "0.3.29" +name = "crypto-bigint" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "futures-core", - "futures-task", - "futures-util", - "num_cpus", + "generic-array 0.14.7", + "rand_core 0.6.4", + "subtle 2.6.1", + "zeroize", ] [[package]] -name = "futures-io" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" - -[[package]] -name = "futures-lite" -version = "2.1.0" +name = "crypto-common" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeee267a1883f7ebef3700f262d2d54de95dfaf38189015a74fdc4e0c7ad8143" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ - "futures-core", - "pin-project-lite 0.2.13", + "generic-array 0.14.7", + "rand_core 0.6.4", + "typenum", ] [[package]] -name = "futures-macro" -version = "0.3.29" +name = "crypto-mac" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.40", + "generic-array 0.12.4", + "subtle 1.0.0", ] [[package]] -name = "futures-rustls" -version = "0.22.2" +name = "crypto-mac" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "futures-io", - "rustls 0.20.9", - "webpki 0.22.4", + "generic-array 0.14.7", + "subtle 2.6.1", ] [[package]] -name = "futures-sink" -version = "0.3.29" +name = "crypto_secretbox" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "b9d6cf87adf719ddf43a805e92c6870a531aedda35ff640442cbaf8674e141e1" +dependencies = [ + "aead", + "cipher 0.4.4", + "generic-array 0.14.7", + "poly1305", + "salsa20", + "subtle 2.6.1", + "zeroize", +] [[package]] -name = "futures-task" -version = "0.3.29" +name = "ctr" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher 0.4.4", +] [[package]] -name = "futures-timer" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" +name = "cumulus-client-parachain-inherent" +version = "0.22.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "async-trait", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "cumulus-relay-chain-interface", + "cumulus-test-relay-sproof-builder", + "parity-scale-codec", + "sc-client-api", + "sc-consensus-babe", + "sc-network-types", + "sp-crypto-hashing", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-storage", + "tracing", +] [[package]] -name = "futures-util" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +name = "cumulus-pallet-parachain-system" +version = "0.25.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite 0.2.13", - "pin-utils", - "slab", + "array-bytes 6.2.3", + "bytes", + "cumulus-pallet-parachain-system-proc-macro", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "cumulus-primitives-proof-size-hostfunction", + "environmental", + "frame-benchmarking", + "frame-support", + "frame-system", + "hashbrown 0.15.5", + "impl-trait-for-tuples", + "log", + "pallet-message-queue", + "parity-scale-codec", + "polkadot-parachain-primitives", + "polkadot-runtime-parachains", + "scale-info", + "sp-consensus-babe", + "sp-core", + "sp-externalities", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", + "sp-version", + "staging-xcm", + "staging-xcm-builder", + "trie-db", ] [[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +name = "cumulus-pallet-parachain-system-proc-macro" +version = "0.7.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "byteorder", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +name = "cumulus-primitives-core" +version = "0.23.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "typenum", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "polkadot-primitives", + "scale-info", + "sp-api", + "sp-runtime", + "sp-trie", + "staging-xcm", + "tracing", ] [[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +name = "cumulus-primitives-parachain-inherent" +version = "0.23.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "typenum", - "version_check", + "async-trait", + "cumulus-primitives-core", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-inherents", + "sp-trie", ] [[package]] -name = "gethostname" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +name = "cumulus-primitives-proof-size-hostfunction" +version = "0.16.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "libc", - "winapi", + "sp-externalities", + "sp-runtime-interface", + "sp-trie", ] [[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +name = "cumulus-relay-chain-interface" +version = "0.28.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", + "async-trait", + "cumulus-primitives-core", + "futures", + "jsonrpsee-core", + "parity-scale-codec", + "polkadot-overseer", + "sc-client-api", + "sc-network", + "sp-api", + "sp-blockchain", + "sp-state-machine", + "sp-version", + "thiserror 1.0.69", ] [[package]] -name = "getrandom" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +name = "cumulus-test-relay-sproof-builder" +version = "0.24.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", + "cumulus-primitives-core", + "parity-scale-codec", + "polkadot-primitives", + "sp-consensus-babe", + "sp-core", + "sp-runtime", + "sp-state-machine", + "sp-trie", ] [[package]] -name = "getrandom" -version = "0.3.2" +name = "curve25519-dalek" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ - "cfg-if 1.0.0", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version 0.4.1", + "subtle 2.6.1", + "zeroize", ] [[package]] -name = "getrandom_or_panic" -version = "0.0.3" +name = "curve25519-dalek-derive" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ - "rand 0.8.5", - "rand_core 0.6.4", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "ghash" -version = "0.4.4" +name = "cxx" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" +checksum = "a7620f6cfc4dcca21f2b085b7a890e16c60fd66f560cd69ee60594908dc72ab1" dependencies = [ - "opaque-debug 0.3.0", - "polyval 0.5.3", + "cc", + "cxx-build", + "cxxbridge-cmd", + "cxxbridge-flags", + "cxxbridge-macro", + "foldhash 0.2.0", + "link-cplusplus", ] [[package]] -name = "ghash" -version = "0.5.0" +name = "cxx-build" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" +checksum = "7a9bc1a22964ff6a355fbec24cf68266a0ed28f8b84c0864c386474ea3d0e479" dependencies = [ - "opaque-debug 0.3.0", - "polyval 0.6.1", + "cc", + "codespan-reporting", + "indexmap 2.12.1", + "proc-macro2", + "quote", + "scratch", + "syn 2.0.111", ] [[package]] -name = "gimli" -version = "0.26.2" +name = "cxxbridge-cmd" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" +checksum = "b1f29a879d35f7906e3c9b77d7a1005a6a0787d330c09dfe4ffb5f617728cb44" dependencies = [ - "fallible-iterator", - "indexmap 1.9.3", - "stable_deref_trait", + "clap", + "codespan-reporting", + "indexmap 2.12.1", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "gimli" -version = "0.28.1" +name = "cxxbridge-flags" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "d67109015f93f683e364085aa6489a5b2118b4a40058482101d699936a7836d6" [[package]] -name = "glob" -version = "0.3.1" +name = "cxxbridge-macro" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "d187e019e7b05a1f3e69a8396b70800ee867aa9fc2ab972761173ccee03742df" +dependencies = [ + "indexmap 2.12.1", + "proc-macro2", + "quote", + "syn 2.0.111", +] [[package]] -name = "globset" -version = "0.4.14" +name = "darling" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "darling_core 0.20.11", + "darling_macro 0.20.11", ] [[package]] -name = "group" -version = "0.12.1" +name = "darling" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", + "darling_core 0.21.3", + "darling_macro 0.21.3", ] [[package]] -name = "h2" -version = "0.3.26" +name = "darling_core" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ - "bytes", "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 2.1.0", - "slab", - "tokio", - "tokio-util", - "tracing", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.111", ] [[package]] -name = "handlebars" -version = "4.5.0" +name = "darling_core" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ - "log", - "pest", - "pest_derive", + "fnv", + "ident_case", + "proc-macro2", + "quote", "serde", - "serde_json", - "thiserror", + "strsim", + "syn 2.0.111", ] [[package]] -name = "hash-db" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" - -[[package]] -name = "hash256-std-hasher" -version = "0.15.2" +name = "darling_macro" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "crunchy", + "darling_core 0.20.11", + "quote", + "syn 2.0.111", ] [[package]] -name = "hashbrown" -version = "0.12.3" +name = "darling_macro" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ - "ahash 0.7.8", + "darling_core 0.21.3", + "quote", + "syn 2.0.111", ] [[package]] -name = "hashbrown" -version = "0.13.2" +name = "dashmap" +version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ - "ahash 0.8.11", + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core 0.9.12", ] [[package]] -name = "hashbrown" -version = "0.14.3" +name = "data-encoding" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] -name = "heck" -version = "0.4.1" +name = "data-encoding-macro" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] [[package]] -name = "hermit-abi" -version = "0.1.19" +name = "data-encoding-macro-internal" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ - "libc", + "data-encoding", + "syn 2.0.111", ] [[package]] -name = "hermit-abi" -version = "0.3.3" +name = "debugid" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "uuid", +] [[package]] -name = "hex" -version = "0.4.3" +name = "der" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] [[package]] -name = "hex-literal" -version = "0.2.2" +name = "der-parser" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d70693199b3cf4552f3fa720b54163927a3ebed2aef240efaf556033ab336a11" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" dependencies = [ - "hex-literal-impl", - "proc-macro-hack", + "asn1-rs 0.6.2", + "displaydoc", + "nom 7.1.3", + "num-bigint", + "num-traits", + "rusticata-macros", ] [[package]] -name = "hex-literal" -version = "0.3.4" +name = "der-parser" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs 0.7.1", + "displaydoc", + "nom 7.1.3", + "num-bigint", + "num-traits", + "rusticata-macros", +] [[package]] -name = "hex-literal-impl" -version = "0.2.3" +name = "deranged" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59448fc2f82a5fb6907f78c3d69d843e82ff5b051923313cc4438cb0c7b745a8" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ - "proc-macro-hack", + "powerfmt", + "serde_core", ] [[package]] -name = "hkdf" -version = "0.12.3" +name = "derivative" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "hmac 0.12.1", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "hmac" -version = "0.8.1" +name = "derive-syn-parse" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "hmac" -version = "0.11.0" +name = "derive-where" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" dependencies = [ - "crypto-mac 0.11.1", - "digest 0.9.0", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "hmac" -version = "0.12.1" +name = "derive_more" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ - "digest 0.10.7", + "convert_case 0.4.0", + "proc-macro2", + "quote", + "rustc_version 0.4.1", + "syn 2.0.111", ] [[package]] -name = "hmac-drbg" -version = "0.3.0" +name = "derive_more" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" dependencies = [ - "digest 0.9.0", - "generic-array 0.14.7", - "hmac 0.8.1", + "derive_more-impl 1.0.0", ] [[package]] -name = "home" -version = "0.5.5" +name = "derive_more" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "10b768e943bed7bf2cab53df09f4bc34bfd217cdb57d971e769874c9a6710618" dependencies = [ - "windows-sys 0.48.0", + "derive_more-impl 2.1.0", ] [[package]] -name = "hostname" -version = "0.3.1" +name = "derive_more-impl" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ - "libc", - "match_cfg", - "winapi", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "http" -version = "0.2.11" +name = "derive_more-impl" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "6d286bfdaf75e988b4a78e013ecd79c581e06399ab53fbacd2d916c2f904f30b" dependencies = [ - "bytes", - "fnv", - "itoa", + "convert_case 0.10.0", + "proc-macro2", + "quote", + "rustc_version 0.4.1", + "syn 2.0.111", + "unicode-xid", ] [[package]] -name = "http-body" -version = "0.4.6" +name = "diff" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http", - "pin-project-lite 0.2.13", -] +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] -name = "http-range-header" -version = "0.3.1" +name = "digest" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] [[package]] -name = "httparse" -version = "1.8.0" +name = "digest" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.7", +] [[package]] -name = "httpdate" -version = "1.0.3" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle 2.6.1", +] [[package]] -name = "humantime" -version = "1.3.0" +name = "directories" +version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" dependencies = [ - "quick-error", + "dirs-sys", ] [[package]] -name = "humantime" -version = "2.1.0" +name = "directories-next" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] [[package]] -name = "hyper" -version = "0.14.27" +name = "dirs" +version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite 0.2.13", - "socket2 0.4.10", - "tokio", - "tower-service", - "tracing", - "want", + "dirs-sys", ] [[package]] -name = "hyper-rustls" -version = "0.23.2" +name = "dirs-sys" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" dependencies = [ - "http", - "hyper", - "log", - "rustls 0.20.9", - "rustls-native-certs", - "tokio", - "tokio-rustls", + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", ] [[package]] -name = "iana-time-zone" -version = "0.1.58" +name = "dirs-sys-next" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", + "libc", + "redox_users", + "winapi", ] [[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" +name = "displaydoc" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "cc", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "docify" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "a772b62b1837c8f060432ddcc10b17aae1453ef17617a99bc07789252d2a5896" +dependencies = [ + "docify_macros", +] [[package]] -name = "idna" -version = "0.2.3" +name = "docify_macros" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "60e6be249b0a462a14784a99b19bf35a667bb5e09de611738bb7362fa4c95ff7" dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", + "common-path", + "derive-syn-parse", + "once_cell", + "proc-macro2", + "quote", + "regex", + "syn 2.0.111", + "termcolor", + "toml 0.8.23", + "walkdir", ] [[package]] -name = "idna" -version = "0.5.0" +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "downcast" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dtoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clonable" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "a36efbb9bfd58e1723780aa04b61aba95ace6a05d9ffabfdb0b43672552f0805" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "dyn-clonable-impl", + "dyn-clone", ] [[package]] -name = "if-addrs" -version = "0.10.2" +name = "dyn-clonable-impl" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cabb0019d51a643781ff15c9c8a3e5dedc365c47211270f4e8f82812fedd8f0a" +checksum = "7e8671d54058979a37a26f3511fbf8d198ba1aa35ffb202c42587d918d77213a" dependencies = [ - "libc", - "windows-sys 0.48.0", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "if-watch" -version = "3.2.0" +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecdsa" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b0422c86d7ce0e97169cc42e04ae643caf278874a7a3c87b8150a220dc7e1e" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "async-io", - "core-foundation", - "fnv", - "futures", - "if-addrs", - "ipnet", - "log", - "rtnetlink", - "system-configuration", - "tokio", - "windows", + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "serdect", + "signature", + "spki", ] [[package]] -name = "impl-codec" -version = "0.6.0" +name = "ed25519" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "parity-scale-codec 3.6.9", + "pkcs8", + "signature", ] [[package]] -name = "impl-serde" -version = "0.4.0" +name = "ed25519-dalek" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core 0.6.4", "serde", + "sha2 0.10.9", + "subtle 2.6.1", + "zeroize", ] [[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" +name = "ed25519-zebra" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0017d969298eec91e3db7a2985a8cab4df6341d86e6f3a6f5878b13fb7846bc9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "hashbrown 0.15.5", + "pkcs8", + "rand_core 0.6.4", + "sha2 0.10.9", + "subtle 2.6.1", + "zeroize", +] + +[[package]] +name = "educe" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" dependencies = [ + "enum-ordinalize", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.111", ] [[package]] -name = "indexmap" -version = "1.9.3" +name = "either" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" dependencies = [ - "autocfg", - "hashbrown 0.12.3", "serde", ] [[package]] -name = "indexmap" -version = "2.1.0" +name = "elliptic-curve" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "equivalent", - "hashbrown 0.14.3", + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array 0.14.7", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "serdect", + "subtle 2.6.1", + "zeroize", ] [[package]] -name = "indexmap-nostd" +name = "embedded-io" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" [[package]] -name = "ink_prelude" -version = "2.1.0" -source = "git+https://github.com/paritytech/ink?tag=v2.1.0#cca31543d338dcd69c7ac922988b91ebf170edb2" -dependencies = [ - "cfg-if 0.1.10", -] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" [[package]] -name = "ink_primitives" -version = "2.1.0" -source = "git+https://github.com/paritytech/ink?tag=v2.1.0#cca31543d338dcd69c7ac922988b91ebf170edb2" -dependencies = [ - "ink_prelude", - "parity-scale-codec 1.3.7", - "tiny-keccak", - "type-metadata", -] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] -name = "inout" -version = "0.1.3" +name = "enum-as-inner" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "generic-array 0.14.7", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "instant" -version = "0.1.12" +name = "enum-display" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "02058bb25d8d0605829af88230427dd5cd50661590bd2b09d1baf7c64c417f24" dependencies = [ - "cfg-if 1.0.0", + "enum-display-macro", ] [[package]] -name = "integer-sqrt" -version = "0.1.5" +name = "enum-display-macro" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +checksum = "d4be2cf2fe7b971b1865febbacd4d8df544aa6bd377cca011a6d69dcf4c60d94" dependencies = [ - "num-traits", + "convert_case 0.6.0", + "quote", + "syn 1.0.109", ] [[package]] -name = "interceptor" -version = "0.8.2" +name = "enum-ordinalize" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e8a11ae2da61704edada656798b61c94b35ecac2c58eb955156987d5e6be90b" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" dependencies = [ - "async-trait", - "bytes", - "log", - "rand 0.8.5", - "rtcp", - "rtp", - "thiserror", - "tokio", - "waitgroup", - "webrtc-srtp", - "webrtc-util", + "enum-ordinalize-derive", ] [[package]] -name = "io-lifetimes" -version = "1.0.11" +name = "enum-ordinalize-derive" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" dependencies = [ - "hermit-abi 0.3.3", - "libc", - "windows-sys 0.48.0", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "ip_network" -version = "0.4.1" +name = "env_filter" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +dependencies = [ + "log", + "regex", +] [[package]] -name = "ipconfig" -version = "0.3.2" +name = "env_logger" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" dependencies = [ - "socket2 0.5.5", - "widestring", - "windows-sys 0.48.0", - "winreg", + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", ] [[package]] -name = "ipnet" -version = "2.9.0" +name = "environmental" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" [[package]] -name = "is-terminal" -version = "0.4.9" +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi 0.3.3", - "rustix 0.38.28", - "windows-sys 0.48.0", -] +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "is_terminal_polyfill" -version = "1.70.1" +name = "errno" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] [[package]] -name = "itertools" -version = "0.10.5" +name = "etcetera" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" dependencies = [ - "either", + "cfg-if", + "home", + "windows-sys 0.48.0", ] [[package]] -name = "itoa" -version = "1.0.10" +name = "ethbloom" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "8c321610643004cf908ec0f5f2aa0d8f1f8e14b540562a2887a1111ff1ecbf7b" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec 0.7.1", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] [[package]] -name = "jobserver" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +name = "ethereum-standards" +version = "0.1.2" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "getrandom 0.3.2", - "libc", + "alloy-core", ] [[package]] -name = "js-sys" -version = "0.3.66" +name = "ethereum-types" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "1ab15ed80916029f878e0267c3a9f92b67df55e79af370bf66199059ae2b4ee3" dependencies = [ - "wasm-bindgen", + "ethbloom", + "fixed-hash", + "impl-codec 0.7.1", + "impl-rlp", + "impl-serde", + "primitive-types 0.13.1", + "scale-info", + "uint 0.10.0", ] [[package]] -name = "jsonrpsee" -version = "0.16.3" +name = "event-listener" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "367a292944c07385839818bb71c8d76611138e2dedb0677d035b8da21d29c78b" -dependencies = [ - "jsonrpsee-core", - "jsonrpsee-proc-macros", - "jsonrpsee-server", - "jsonrpsee-types", - "tracing", -] +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] -name = "jsonrpsee-core" -version = "0.16.3" +name = "event-listener" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5dde66c53d6dcdc8caea1874a45632ec0fcf5b437789f1e45766a1512ce803" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ - "anyhow", - "arrayvec 0.7.4", - "async-trait", - "beef", - "futures-channel", - "futures-util", - "globset", - "hyper", - "jsonrpsee-types", - "parking_lot 0.12.1", - "rand 0.8.5", - "rustc-hash", - "serde", - "serde_json", - "soketto", - "thiserror", - "tokio", - "tracing", + "concurrent-queue", + "parking", + "pin-project-lite", ] [[package]] -name = "jsonrpsee-proc-macros" -version = "0.16.3" +name = "event-listener-strategy" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44e8ab85614a08792b9bff6c8feee23be78c98d0182d4c622c05256ab553892a" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "heck", - "proc-macro-crate 1.1.3", - "proc-macro2", - "quote", - "syn 1.0.109", + "event-listener 5.4.1", + "pin-project-lite", ] [[package]] -name = "jsonrpsee-server" -version = "0.16.3" +name = "exit-future" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4d945a6008c9b03db3354fb3c83ee02d2faa9f2e755ec1dfb69c3551b8f4ba" +checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" dependencies = [ - "futures-channel", - "futures-util", - "http", - "hyper", - "jsonrpsee-core", - "jsonrpsee-types", - "serde", - "serde_json", - "soketto", - "tokio", - "tokio-stream", - "tokio-util", - "tower", - "tracing", + "futures", ] [[package]] -name = "jsonrpsee-types" -version = "0.16.3" +name = "expander" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245ba8e5aa633dd1c1e4fae72bce06e71f42d34c14a2767c6b4d173b57bee5e5" +checksum = "e2c470c71d91ecbd179935b24170459e926382eaaa86b590b78814e180d8a8e2" dependencies = [ - "anyhow", - "beef", - "serde", - "serde_json", - "thiserror", - "tracing", + "blake2 0.10.6", + "file-guard", + "fs-err", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "k256" -version = "0.11.6" +name = "fallible-iterator" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if 1.0.0", - "ecdsa", - "elliptic-curve", - "sha2 0.10.8", -] +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] -name = "keccak" -version = "0.1.4" +name = "fastrand" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", -] +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] -name = "kvdb" -version = "0.13.0" +name = "fastrlp" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d770dcb02bf6835887c3a979b5107a04ff4bbde97a5f0928d27404a155add9" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" dependencies = [ - "smallvec", + "arrayvec 0.7.6", + "auto_impl", + "bytes", ] [[package]] -name = "kvdb-memorydb" -version = "0.13.0" +name = "fastrlp" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7a85fe66f9ff9cd74e169fdd2c94c6e1e74c412c99a73b4df3200b5d3760b2" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" dependencies = [ - "kvdb", - "parking_lot 0.12.1", + "arrayvec 0.7.6", + "auto_impl", + "bytes", ] [[package]] -name = "kvdb-rocksdb" -version = "0.17.0" +name = "fatality" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2182b8219fee6bd83aacaab7344e840179ae079d5216aa4e249b4d704646a844" +checksum = "ec6f82451ff7f0568c6181287189126d492b5654e30a788add08027b6363d019" dependencies = [ - "kvdb", - "num_cpus", - "parking_lot 0.12.1", - "regex", - "rocksdb", - "smallvec", + "fatality-proc-macro", + "thiserror 1.0.69", ] [[package]] -name = "lazy_static" -version = "1.4.0" +name = "fatality-proc-macro" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "eb42427514b063d97ce21d5199f36c0c307d981434a6be32582bc79fe5bd2303" +dependencies = [ + "expander", + "indexmap 2.12.1", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] [[package]] -name = "lazycell" -version = "1.3.0" +name = "fdlimit" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +checksum = "e182f7dbc2ef73d9ef67351c5fbbea084729c48362d3ce9dd44c28e32e277fe5" +dependencies = [ + "libc", + "thiserror 1.0.69", +] [[package]] -name = "leb128" -version = "0.2.5" +name = "ff" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle 2.6.1", +] [[package]] -name = "libc" -version = "0.2.171" +name = "fiat-crypto" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] -name = "libloading" -version = "0.7.4" +name = "file-guard" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +checksum = "21ef72acf95ec3d7dbf61275be556299490a245f017cf084bd23b4f68cf9407c" dependencies = [ - "cfg-if 1.0.0", + "libc", "winapi", ] [[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libp2p" -version = "0.50.1" +name = "filetime" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7b0104790be871edcf97db9bd2356604984e623a08d825c3f27852290266b8" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ - "bytes", - "futures", - "futures-timer", - "getrandom 0.2.11", - "instant", - "libp2p-core 0.38.0", - "libp2p-dns", - "libp2p-identify", - "libp2p-kad", - "libp2p-mdns", - "libp2p-metrics", - "libp2p-mplex", - "libp2p-noise", - "libp2p-ping", - "libp2p-quic", - "libp2p-request-response", - "libp2p-swarm", - "libp2p-tcp", - "libp2p-wasm-ext", - "libp2p-webrtc", - "libp2p-websocket", - "libp2p-yamux", - "multiaddr 0.16.0", - "parking_lot 0.12.1", - "pin-project", - "smallvec", + "cfg-if", + "libc", + "libredox", + "windows-sys 0.60.2", ] [[package]] -name = "libp2p-core" -version = "0.38.0" +name = "finality-grandpa" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a8fcd392ff67af6cc3f03b1426c41f7f26b6b9aff2dc632c1c56dd649e571f" +checksum = "b4f8f43dc520133541781ec03a8cab158ae8b7f7169cdf22e9050aa6cf0fbdfc" dependencies = [ - "asn1_der", - "bs58", - "ed25519-dalek 1.0.1", "either", - "fnv", "futures", "futures-timer", - "instant", "log", - "multiaddr 0.16.0", - "multihash 0.16.3", - "multistream-select", - "once_cell", - "parking_lot 0.12.1", - "pin-project", - "prost", - "prost-build", - "rand 0.8.5", - "rw-stream-sink", - "sec1", - "sha2 0.10.8", - "smallvec", - "thiserror", - "unsigned-varint", - "void", - "zeroize", + "num-traits", + "parity-scale-codec", + "parking_lot 0.12.5", + "scale-info", ] [[package]] -name = "libp2p-core" -version = "0.39.2" +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "finito" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c1df63c0b582aa434fb09b2d86897fa2b419ffeccf934b36f87fcedc8e835c2" +checksum = "2384245d85162258a14b43567a9ee3598f5ae746a1581fb5d3d2cb780f0dbf95" dependencies = [ - "either", - "fnv", - "futures", "futures-timer", - "instant", - "libp2p-identity", - "log", - "multiaddr 0.17.1", - "multihash 0.17.0", - "multistream-select", - "once_cell", - "parking_lot 0.12.1", "pin-project", - "quick-protobuf", - "rand 0.8.5", - "rw-stream-sink", - "smallvec", - "thiserror", - "unsigned-varint", - "void", ] [[package]] -name = "libp2p-dns" -version = "0.38.0" +name = "fixed-hash" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e42a271c1b49f789b92f7fc87749fa79ce5c7bdc88cbdfacb818a4bca47fec5" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ - "futures", - "libp2p-core 0.38.0", - "log", - "parking_lot 0.12.1", - "smallvec", - "trust-dns-resolver", + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", ] [[package]] -name = "libp2p-identify" -version = "0.41.1" +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flume" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c052d0026f4817b44869bfb6810f4e1112f43aec8553f2cb38881c524b563abf" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ - "asynchronous-codec", - "futures", - "futures-timer", - "libp2p-core 0.38.0", - "libp2p-swarm", - "log", - "lru", - "prost", - "prost-build", - "prost-codec", - "smallvec", - "thiserror", - "void", + "futures-core", + "futures-sink", + "spin 0.9.8", ] [[package]] -name = "libp2p-identity" -version = "0.1.3" +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276bb57e7af15d8f100d3c11cbdd32c6752b7eef4ba7a18ecf464972c07abcce" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "fork-tree" +version = "13.0.1" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "bs58", - "ed25519-dalek 2.1.0", - "log", - "multiaddr 0.17.1", - "multihash 0.17.0", - "quick-protobuf", - "rand 0.8.5", - "sha2 0.10.8", - "thiserror", - "zeroize", + "parity-scale-codec", ] [[package]] -name = "libp2p-kad" -version = "0.42.1" +name = "form_urlencoded" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2766dcd2be8c87d5e1f35487deb22d765f49c6ae1251b3633efe3b25698bd3d2" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ - "arrayvec 0.7.4", - "asynchronous-codec", - "bytes", - "either", - "fnv", - "futures", - "futures-timer", - "instant", - "libp2p-core 0.38.0", - "libp2p-swarm", - "log", - "prost", - "prost-build", - "rand 0.8.5", - "sha2 0.10.8", - "smallvec", - "thiserror", - "uint", - "unsigned-varint", - "void", + "percent-encoding", ] [[package]] -name = "libp2p-mdns" -version = "0.42.0" +name = "forwarded-header-value" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f378264aade9872d6ccd315c0accc18be3a35d15fc1b9c36e5b6f983b62b5b" +checksum = "8835f84f38484cc86f110a805655697908257fb9a7af005234060891557198e9" dependencies = [ - "data-encoding", - "futures", - "if-watch", - "libp2p-core 0.38.0", - "libp2p-swarm", - "log", - "rand 0.8.5", - "smallvec", - "socket2 0.4.10", - "tokio", - "trust-dns-proto", - "void", + "nonempty", + "thiserror 1.0.69", ] [[package]] -name = "libp2p-metrics" -version = "0.11.0" +name = "fragile" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad8a64f29da86005c86a4d2728b8a0719e9b192f4092b609fd8790acb9dec55" -dependencies = [ - "libp2p-core 0.38.0", - "libp2p-identify", - "libp2p-kad", - "libp2p-ping", - "libp2p-swarm", - "prometheus-client", -] +checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" [[package]] -name = "libp2p-mplex" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03805b44107aa013e7cbbfa5627b31c36cbedfdfb00603c0311998882bc4bace" +name = "frame-benchmarking" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "asynchronous-codec", - "bytes", - "futures", - "libp2p-core 0.38.0", + "frame-support", + "frame-support-procedural", + "frame-system", + "linregress", "log", - "nohash-hasher", - "parking_lot 0.12.1", - "rand 0.8.5", - "smallvec", - "unsigned-varint", + "parity-scale-codec", + "paste", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-runtime-interface", + "sp-storage", + "static_assertions", ] [[package]] -name = "libp2p-noise" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a978cb57efe82e892ec6f348a536bfbd9fee677adbe5689d7a93ad3a9bffbf2e" +name = "frame-benchmarking-cli" +version = "53.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "bytes", - "curve25519-dalek 3.2.0", - "futures", - "libp2p-core 0.38.0", + "Inflector", + "array-bytes 6.2.3", + "chrono", + "clap", + "comfy-table", + "cumulus-client-parachain-inherent", + "cumulus-primitives-proof-size-hostfunction", + "env_filter", + "frame-benchmarking", + "frame-storage-access-test-runtime", + "frame-support", + "frame-system", + "gethostname", + "handlebars", + "itertools 0.11.0", + "linked-hash-map", "log", - "once_cell", - "prost", - "prost-build", + "parity-scale-codec", + "polkadot-parachain-primitives", + "polkadot-primitives", "rand 0.8.5", - "sha2 0.10.8", - "snow", - "static_assertions", - "thiserror", - "x25519-dalek 1.1.1", - "zeroize", + "rand_pcg", + "sc-block-builder", + "sc-chain-spec", + "sc-cli", + "sc-client-api", + "sc-client-db", + "sc-executor", + "sc-executor-common", + "sc-executor-wasmtime", + "sc-runtime-utilities", + "sc-service", + "sc-sysinfo", + "serde", + "serde_json", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-core", + "sp-database", + "sp-externalities", + "sp-genesis-builder", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-runtime-interface", + "sp-state-machine", + "sp-storage", + "sp-timestamp", + "sp-transaction-pool", + "sp-trie", + "sp-version", + "sp-wasm-interface", + "subxt", + "subxt-signer", + "thiserror 1.0.69", + "thousands", ] [[package]] -name = "libp2p-ping" -version = "0.41.0" +name = "frame-decode" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "929fcace45a112536e22b3dcfd4db538723ef9c3cb79f672b98be2cc8e25f37f" +checksum = "6e56c0e51972d7b26ff76966c4d0f2307030df9daa5ce0885149ece1ab7ca5ad" dependencies = [ - "futures", - "futures-timer", - "instant", - "libp2p-core 0.38.0", - "libp2p-swarm", - "log", - "rand 0.8.5", - "void", + "frame-metadata", + "parity-scale-codec", + "scale-decode", + "scale-info", + "scale-type-resolver", + "sp-crypto-hashing", ] [[package]] -name = "libp2p-quic" -version = "0.7.0-alpha" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01e7c867e95c8130667b24409d236d37598270e6da69b3baf54213ba31ffca59" +name = "frame-election-provider-solution-type" +version = "16.1.1" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "bytes", - "futures", - "futures-timer", - "if-watch", - "libp2p-core 0.38.0", - "libp2p-tls", - "log", - "parking_lot 0.12.1", - "quinn-proto", - "rand 0.8.5", - "rustls 0.20.9", - "thiserror", - "tokio", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "libp2p-request-response" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3236168796727bfcf4927f766393415361e2c644b08bedb6a6b13d957c9a4884" +name = "frame-election-provider-support" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "async-trait", - "bytes", - "futures", - "instant", - "libp2p-core 0.38.0", - "libp2p-swarm", - "log", - "rand 0.8.5", - "smallvec", - "unsigned-varint", + "frame-election-provider-solution-type", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-npos-elections", + "sp-runtime", + "sp-std", ] [[package]] -name = "libp2p-swarm" -version = "0.41.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a35472fe3276b3855c00f1c032ea8413615e030256429ad5349cdf67c6e1a0" +name = "frame-executive" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "either", - "fnv", - "futures", - "futures-timer", - "instant", - "libp2p-core 0.38.0", - "libp2p-swarm-derive", + "aquamarine", + "frame-support", + "frame-system", + "frame-try-runtime", "log", - "pin-project", - "rand 0.8.5", - "smallvec", - "thiserror", - "tokio", - "void", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-tracing", ] [[package]] -name = "libp2p-swarm-derive" -version = "0.31.0" +name = "frame-metadata" +version = "23.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d527d5827582abd44a6d80c07ff8b50b4ee238a8979e05998474179e79dc400" +checksum = "9ba5be0edbdb824843a0f9c6f0906ecfc66c5316218d74457003218b24909ed0" dependencies = [ - "heck", - "quote", - "syn 1.0.109", + "cfg-if", + "parity-scale-codec", + "scale-info", + "serde", ] [[package]] -name = "libp2p-tcp" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b257baf6df8f2df39678b86c578961d48cc8b68642a12f0f763f56c8e5858d" +name = "frame-metadata-hash-extension" +version = "0.13.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "futures", - "futures-timer", - "if-watch", - "libc", - "libp2p-core 0.38.0", + "array-bytes 6.2.3", + "const-hex", + "docify", + "frame-support", + "frame-system", "log", - "socket2 0.4.10", - "tokio", -] - -[[package]] -name = "libp2p-tls" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff08d13d0dc66e5e9ba6279c1de417b84fa0d0adc3b03e5732928c180ec02781" -dependencies = [ - "futures", - "futures-rustls", - "libp2p-core 0.39.2", - "libp2p-identity", - "rcgen 0.10.0", - "ring 0.16.20", - "rustls 0.20.9", - "thiserror", - "webpki 0.22.4", - "x509-parser 0.14.0", - "yasna", + "parity-scale-codec", + "scale-info", + "sp-runtime", ] [[package]] -name = "libp2p-wasm-ext" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb1a35299860e0d4b3c02a3e74e3b293ad35ae0cee8a056363b0c862d082069" +name = "frame-storage-access-test-runtime" +version = "0.6.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "futures", - "js-sys", - "libp2p-core 0.38.0", - "parity-send-wrapper", - "wasm-bindgen", - "wasm-bindgen-futures", + "cumulus-pallet-parachain-system", + "parity-scale-codec", + "sp-core", + "sp-runtime", + "sp-state-machine", + "sp-trie", + "substrate-wasm-builder", ] [[package]] -name = "libp2p-webrtc" -version = "0.4.0-alpha" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb6cd86dd68cba72308ea05de1cebf3ba0ae6e187c40548167955d4e3970f6a" +name = "frame-support" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "async-trait", - "asynchronous-codec", - "bytes", - "futures", - "futures-timer", - "hex", - "if-watch", - "libp2p-core 0.38.0", - "libp2p-noise", + "aquamarine", + "array-bytes 6.2.3", + "binary-merkle-tree", + "bitflags 1.3.2", + "docify", + "environmental", + "frame-metadata", + "frame-support-procedural", + "impl-trait-for-tuples", + "k256", "log", - "multihash 0.16.3", - "prost", - "prost-build", - "prost-codec", - "rand 0.8.5", - "rcgen 0.9.3", + "macro_magic", + "parity-scale-codec", + "paste", + "scale-info", "serde", - "stun", - "thiserror", - "tinytemplate", - "tokio", - "tokio-util", - "webrtc", + "serde_json", + "sp-api", + "sp-arithmetic", + "sp-core", + "sp-crypto-hashing-proc-macro", + "sp-debug-derive", + "sp-genesis-builder", + "sp-inherents", + "sp-io", + "sp-metadata-ir", + "sp-runtime", + "sp-staking", + "sp-state-machine", + "sp-std", + "sp-tracing", + "sp-trie", + "sp-weights", + "tt-call", ] [[package]] -name = "libp2p-websocket" -version = "0.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d705506030d5c0aaf2882437c70dab437605f21c5f9811978f694e6917a3b54" +name = "frame-support-procedural" +version = "36.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "either", - "futures", - "futures-rustls", - "libp2p-core 0.38.0", - "log", - "parking_lot 0.12.1", - "quicksink", - "rw-stream-sink", - "soketto", - "url", - "webpki-roots", + "Inflector", + "cfg-expr", + "derive-syn-parse", + "docify", + "expander", + "frame-support-procedural-tools", + "itertools 0.11.0", + "macro_magic", + "proc-macro-warning", + "proc-macro2", + "quote", + "sp-crypto-hashing", + "syn 2.0.111", ] [[package]] -name = "libp2p-yamux" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f63594a0aa818642d9d4915c791945053877253f08a3626f13416b5cd928a29" +name = "frame-support-procedural-tools" +version = "13.0.1" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "futures", - "libp2p-core 0.38.0", - "log", - "parking_lot 0.12.1", - "thiserror", - "yamux", + "frame-support-procedural-tools-derive", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "libredox" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +name = "frame-support-procedural-tools-derive" +version = "12.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "bitflags 2.4.1", - "libc", - "redox_syscall 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "librocksdb-sys" -version = "0.8.3+7.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "557b255ff04123fcc176162f56ed0c9cd42d8f357cf55b3fabeb60f7413741b3" +name = "frame-system" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "bindgen", - "bzip2-sys", - "cc", - "glob", - "libc", - "libz-sys", - "tikv-jemalloc-sys", + "cfg-if", + "docify", + "frame-support", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-version", + "sp-weights", ] [[package]] -name = "libsecp256k1" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +name = "frame-system-benchmarking" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "arrayref", - "base64 0.13.1", - "digest 0.9.0", - "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand 0.8.5", - "serde", - "sha2 0.9.9", - "typenum", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", ] [[package]] -name = "libsecp256k1-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +name = "frame-system-rpc-runtime-api" +version = "40.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", + "docify", + "parity-scale-codec", + "sp-api", ] [[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +name = "frame-try-runtime" +version = "0.51.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "libsecp256k1-core", + "frame-support", + "parity-scale-codec", + "sp-api", + "sp-runtime", ] [[package]] -name = "libsecp256k1-gen-genmult" -version = "0.3.0" +name = "fs-err" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" dependencies = [ - "libsecp256k1-core", + "autocfg", ] [[package]] -name = "libz-sys" -version = "1.1.12" +name = "fs2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" dependencies = [ - "cc", - "pkg-config", - "vcpkg", + "libc", + "winapi", ] [[package]] -name = "link-cplusplus" -version = "1.0.9" +name = "fs4" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9" +checksum = "29f9df8a11882c4e3335eb2d18a0137c505d9ca927470b0cac9c6f0ae07d28f7" dependencies = [ - "cc", + "rustix 0.38.44", + "windows-sys 0.48.0", ] [[package]] -name = "linked-hash-map" -version = "0.5.6" +name = "funty" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] -name = "linked_hash_set" -version = "0.1.4" +name = "futures" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ - "linked-hash-map", + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", ] [[package]] -name = "linregress" -version = "0.5.3" +name = "futures-bounded" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de04dcecc58d366391f9920245b85ffa684558a5ef6e7736e754347c3aea9c2" +checksum = "91f328e7fb845fc832912fb6a34f40cf6d1888c92f974d1893a54e97b5ff542e" dependencies = [ - "nalgebra", + "futures-timer", + "futures-util", ] [[package]] -name = "linux-raw-sys" -version = "0.1.4" +name = "futures-channel" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] [[package]] -name = "linux-raw-sys" -version = "0.4.12" +name = "futures-core" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] -name = "lock_api" -version = "0.4.11" +name = "futures-executor" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ - "autocfg", - "scopeguard", + "futures-core", + "futures-task", + "futures-util", + "num_cpus", ] [[package]] -name = "log" -version = "0.4.20" +name = "futures-intrusive" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot 0.12.5", +] [[package]] -name = "lru" -version = "0.8.1" +name = "futures-io" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" -dependencies = [ - "hashbrown 0.12.3", -] +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] -name = "lru-cache" -version = "0.1.2" +name = "futures-lite" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ - "linked-hash-map", + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", ] [[package]] -name = "lz4" -version = "1.24.0" +name = "futures-macro" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ - "libc", - "lz4-sys", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "lz4-sys" -version = "1.9.4" +name = "futures-rustls" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" +checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" dependencies = [ - "cc", - "libc", + "futures-io", + "rustls", + "rustls-pki-types", ] [[package]] -name = "mach" -version = "0.3.2" +name = "futures-sink" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" -dependencies = [ - "libc", -] +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] -name = "match_cfg" -version = "0.1.0" +name = "futures-task" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] -name = "matchers" -version = "0.0.1" +name = "futures-timer" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" dependencies = [ - "regex-automata 0.1.10", + "gloo-timers", + "send_wrapper", ] [[package]] -name = "matches" -version = "0.1.10" +name = "futures-util" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] [[package]] -name = "matrixmultiply" -version = "0.3.8" +name = "fxhash" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" dependencies = [ - "autocfg", - "rawpointer", + "byteorder", ] [[package]] -name = "md-5" -version = "0.10.6" +name = "fxprof-processed-profile" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd" dependencies = [ - "cfg-if 1.0.0", - "digest 0.10.7", + "bitflags 2.10.0", + "debugid", + "fxhash", + "serde", + "serde_json", ] [[package]] -name = "memchr" -version = "2.6.4" +name = "generic-array" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] [[package]] -name = "memfd" -version = "0.6.4" +name = "generic-array" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "rustix 0.38.28", + "typenum", + "version_check", + "zeroize", ] [[package]] -name = "memmap2" -version = "0.5.10" +name = "gethostname" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" dependencies = [ "libc", + "winapi", ] [[package]] -name = "memoffset" -version = "0.6.5" +name = "getrandom" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ - "autocfg", + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", ] [[package]] -name = "memoffset" -version = "0.9.0" +name = "getrandom" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ - "autocfg", + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasip2", + "wasm-bindgen", ] [[package]] -name = "memory-db" -version = "0.32.0" +name = "getrandom_or_panic" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" +checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" dependencies = [ - "hash-db", + "rand 0.8.5", + "rand_core 0.6.4", ] [[package]] -name = "memory_units" -version = "0.4.0" +name = "ghash" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug 0.3.1", + "polyval", +] [[package]] -name = "merlin" -version = "2.0.1" +name = "gimli" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" dependencies = [ - "byteorder", - "keccak", - "rand_core 0.5.1", - "zeroize", + "fallible-iterator", + "indexmap 2.12.1", + "stable_deref_trait", ] [[package]] -name = "merlin" -version = "3.0.0" +name = "gimli" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" -dependencies = [ - "byteorder", - "keccak", - "rand_core 0.6.4", - "zeroize", -] +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] -name = "minimal-lexical" -version = "0.2.1" +name = "git2" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +checksum = "3e2b37e2f62729cdada11f0e6b3b6fe383c69c29fc619e391223e12856af308c" +dependencies = [ + "bitflags 2.10.0", + "libc", + "libgit2-sys", + "log", + "url", +] [[package]] -name = "miniz_oxide" -version = "0.7.1" +name = "glob" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] -name = "mio" -version = "1.0.3" +name = "gloo-net" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http 1.4.0", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] -name = "mockall" -version = "0.11.4" +name = "gloo-timers" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" dependencies = [ - "cfg-if 1.0.0", - "downcast", - "fragile", - "lazy_static", - "mockall_derive", - "predicates", - "predicates-tree", + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "mockall_derive" -version = "0.11.4" +name = "gloo-utils" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" dependencies = [ - "cfg-if 1.0.0", - "proc-macro2", - "quote", - "syn 1.0.109", + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", ] [[package]] -name = "multiaddr" -version = "0.16.0" +name = "gmp-mpfr-sys" +version = "1.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aebdb21e90f81d13ed01dc84123320838e53963c2ca94b60b305d3fa64f31e" +checksum = "60f8970a75c006bb2f8ae79c6768a116dd215fa8346a87aed99bf9d82ca43394" dependencies = [ - "arrayref", - "byteorder", - "data-encoding", - "multibase", - "multihash 0.16.3", - "percent-encoding", - "serde", - "static_assertions", - "unsigned-varint", - "url", + "libc", + "windows-sys 0.60.2", ] [[package]] -name = "multiaddr" -version = "0.17.1" +name = "governor" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b36f567c7099511fa8612bbbb52dda2419ce0bdbacf31714e3a5ffdb766d3bd" +checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b" dependencies = [ - "arrayref", - "byteorder", - "data-encoding", - "log", - "multibase", - "multihash 0.17.0", - "percent-encoding", - "serde", - "static_assertions", - "unsigned-varint", - "url", + "cfg-if", + "dashmap", + "futures", + "futures-timer", + "no-std-compat", + "nonzero_ext", + "parking_lot 0.12.5", + "portable-atomic", + "quanta", + "rand 0.8.5", + "smallvec", + "spinning_top", ] [[package]] -name = "multibase" -version = "0.9.1" +name = "group" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "base-x", - "data-encoding", - "data-encoding-macro", + "ff", + "rand_core 0.6.4", + "subtle 2.6.1", ] [[package]] -name = "multihash" -version = "0.16.3" +name = "h2" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c346cf9999c631f002d8f977c4eaeaa0e6386f16007202308d0b3757522c2cc" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ - "blake2b_simd", - "blake2s_simd", - "blake3", - "core2", - "digest 0.10.7", - "multihash-derive", - "sha2 0.10.8", - "sha3", - "unsigned-varint", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.12.1", + "slab", + "tokio", + "tokio-util", + "tracing", ] [[package]] -name = "multihash" -version = "0.17.0" +name = "h2" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835d6ff01d610179fbce3de1694d007e500bf33a7f29689838941d6bf783ae40" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ - "core2", - "multihash-derive", - "unsigned-varint", + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.4.0", + "indexmap 2.12.1", + "slab", + "tokio", + "tokio-util", + "tracing", ] [[package]] -name = "multihash-derive" -version = "0.8.1" +name = "handlebars" +version = "5.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" +checksum = "d08485b96a0e6393e9e4d1b8d48cf74ad6c063cd905eb33f42c1ce3f0377539b" dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure", + "log", + "pest", + "pest_derive", + "serde", + "serde_json", + "thiserror 1.0.69", ] [[package]] -name = "multimap" -version = "0.8.3" +name = "hash-db" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" +checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" [[package]] -name = "multistream-select" -version = "0.12.1" +name = "hash256-std-hasher" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8552ab875c1313b97b8d20cb857b9fd63e2d1d6a0a1b53ce9821e575405f27a" +checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" dependencies = [ - "bytes", - "futures", - "log", - "pin-project", - "smallvec", - "unsigned-varint", + "crunchy", ] [[package]] -name = "nalgebra" -version = "0.32.3" +name = "hashbrown" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307ed9b18cc2423f29e83f84fd23a8e73628727990181f18641a8b5dc2ab1caa" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "approx", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "simba", - "typenum", + "ahash 0.7.8", ] [[package]] -name = "nalgebra-macros" -version = "0.2.1" +name = "hashbrown" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "ahash 0.8.12", ] [[package]] -name = "names" -version = "0.13.0" +name = "hashbrown" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d66043b25d4a6cccb23619d10c19c25304b355a7dccd4a8e11423dd2382146" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "rand 0.8.5", + "ahash 0.8.12", + "allocator-api2", ] [[package]] -name = "netlink-packet-core" -version = "0.4.2" +name = "hashbrown" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "anyhow", - "byteorder", - "libc", - "netlink-packet-utils", + "allocator-api2", + "equivalent", + "foldhash 0.1.5", + "serde", ] [[package]] -name = "netlink-packet-route" -version = "0.12.0" +name = "hashbrown" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ - "anyhow", - "bitflags 1.3.2", - "byteorder", - "libc", - "netlink-packet-core", - "netlink-packet-utils", + "foldhash 0.2.0", + "serde", + "serde_core", ] [[package]] -name = "netlink-packet-utils" -version = "0.5.2" +name = "hashlink" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "anyhow", - "byteorder", - "paste", - "thiserror", + "hashbrown 0.14.5", ] [[package]] -name = "netlink-proto" +name = "hashlink" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "bytes", - "futures", - "log", - "netlink-packet-core", - "netlink-sys", - "thiserror", - "tokio", + "hashbrown 0.15.5", ] [[package]] -name = "netlink-sys" -version = "0.8.5" +name = "heck" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411" -dependencies = [ - "bytes", - "futures", - "libc", - "log", - "tokio", -] +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] -name = "nix" -version = "0.24.3" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" -dependencies = [ - "bitflags 1.3.2", - "cfg-if 1.0.0", - "libc", - "memoffset 0.6.5", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "node-rpc" -version = "0.1.0" -dependencies = [ - "frame-support", - "frame-system", - "jsonrpsee", - "node-rpc-runtime-api", - "pallet-compliance-manager", - "pallet-identity", - "pallet-pips", - "pallet-portfolio", - "pallet-transaction-payment", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-std", - "sp-weights", +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-conservative" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" +dependencies = [ + "arrayvec 0.7.6", ] [[package]] -name = "node-rpc-runtime-api" -version = "0.1.0" +name = "hex-literal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d70693199b3cf4552f3fa720b54163927a3ebed2aef240efaf556033ab336a11" dependencies = [ - "frame-support", - "frame-system", - "pallet-compliance-manager", - "pallet-identity", - "pallet-pips", - "pallet-portfolio", - "pallet-transaction-payment", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "serde", - "serde_json", - "sp-api", - "sp-runtime", - "sp-std", - "sp-weights", + "hex-literal-impl", + "proc-macro-hack", ] [[package]] -name = "nohash-hasher" -version = "0.2.0" +name = "hex-literal" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" [[package]] -name = "nom" -version = "7.1.3" +name = "hex-literal" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hex-literal-impl" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59448fc2f82a5fb6907f78c3d69d843e82ff5b051923313cc4438cb0c7b745a8" dependencies = [ - "memchr", - "minimal-lexical", + "proc-macro-hack", ] [[package]] -name = "normalize-line-endings" -version = "0.3.0" +name = "hickory-proto" +version = "0.24.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" +checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand 0.8.5", + "socket2 0.5.10", + "thiserror 1.0.69", + "tinyvec", + "tokio", + "tracing", + "url", +] [[package]] -name = "num-bigint" -version = "0.4.4" +name = "hickory-proto" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" dependencies = [ - "autocfg", - "num-integer", - "num-traits", + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand 0.9.2", + "ring 0.17.14", + "thiserror 2.0.17", + "tinyvec", + "tokio", + "tracing", + "url", ] [[package]] -name = "num-complex" -version = "0.4.4" +name = "hickory-resolver" +version = "0.24.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" dependencies = [ - "num-traits", + "cfg-if", + "futures-util", + "hickory-proto 0.24.4", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot 0.12.5", + "rand 0.8.5", + "resolv-conf", + "smallvec", + "thiserror 1.0.69", + "tokio", + "tracing", ] [[package]] -name = "num-format" -version = "0.4.4" +name = "hickory-resolver" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" dependencies = [ - "arrayvec 0.7.4", - "itoa", + "cfg-if", + "futures-util", + "hickory-proto 0.25.2", + "ipconfig", + "moka", + "once_cell", + "parking_lot 0.12.5", + "rand 0.9.2", + "resolv-conf", + "smallvec", + "thiserror 2.0.17", + "tokio", + "tracing", ] [[package]] -name = "num-integer" -version = "0.1.45" +name = "hkdf" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "autocfg", - "num-traits", + "hmac 0.12.1", ] [[package]] -name = "num-rational" -version = "0.4.1" +name = "hmac" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", + "crypto-mac 0.8.0", + "digest 0.9.0", ] [[package]] -name = "num-traits" -version = "0.2.17" +name = "hmac" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "autocfg", + "digest 0.10.7", ] [[package]] -name = "num_cpus" -version = "1.16.0" +name = "hmac-drbg" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" dependencies = [ - "hermit-abi 0.3.3", - "libc", + "digest 0.9.0", + "generic-array 0.14.7", + "hmac 0.8.1", ] [[package]] -name = "object" -version = "0.29.0" +name = "home" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "crc32fast", - "hashbrown 0.12.3", - "indexmap 1.9.3", - "memchr", + "windows-sys 0.61.2", ] [[package]] -name = "object" -version = "0.32.1" +name = "http" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ - "memchr", + "bytes", + "fnv", + "itoa", ] [[package]] -name = "oid-registry" -version = "0.4.0" +name = "http" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e20717fa0541f39bd146692035c37bedfa532b3e5071b35761082407546b2a" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ - "asn1-rs 0.3.1", + "bytes", + "itoa", ] [[package]] -name = "oid-registry" -version = "0.6.1" +name = "http-body" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ - "asn1-rs 0.5.2", + "bytes", + "http 0.2.12", + "pin-project-lite", ] [[package]] -name = "once_cell" -version = "1.19.0" +name = "http-body" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.4.0", +] [[package]] -name = "opaque-debug" -version = "0.2.3" +name = "http-body-util" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.4.0", + "http-body 1.0.1", + "pin-project-lite", +] [[package]] -name = "opaque-debug" -version = "0.3.0" +name = "httparse" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] -name = "openssl-probe" -version = "0.1.5" +name = "httpdate" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] -name = "p256" -version = "0.11.1" +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + +[[package]] +name = "humantime-serde" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" +checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" dependencies = [ - "ecdsa", - "elliptic-curve", - "sha2 0.10.8", + "humantime", + "serde", ] [[package]] -name = "p384" -version = "0.11.2" +name = "hyper" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc8c5bf642dde52bb9e87c0ecd8ca5a76faac2eeed98dedb7c717997e1080aa" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ - "ecdsa", - "elliptic-curve", - "sha2 0.10.8", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", ] [[package]] -name = "pallet-asset" -version = "0.1.0" +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ - "arrayvec 0.7.4", - "frame-benchmarking", - "frame-support", - "frame-system", - "hex-literal 0.2.2", + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2 0.4.12", + "http 1.4.0", + "http-body 1.0.1", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http 1.4.0", + "hyper 1.8.1", + "hyper-util", "log", - "pallet-base", - "pallet-external-agents", - "pallet-identity", - "pallet-permissions", - "pallet-portfolio", - "pallet-statistics", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "polymesh-common-utilities", - "polymesh-primitives", - "polymesh-primitives-derive", - "polymesh-runtime-common", - "rustc-hex", - "scale-info", - "serde", - "serde_derive", - "serde_json", - "sp-api", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", ] [[package]] -name = "pallet-authority-discovery" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "hyper-util" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" dependencies = [ - "frame-support", - "frame-system", - "pallet-session", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-application-crypto", - "sp-authority-discovery", - "sp-runtime", - "sp-std", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.4.0", + "http-body 1.0.1", + "hyper 1.8.1", + "libc", + "pin-project-lite", + "socket2 0.6.1", + "tokio", + "tower-service", + "tracing", ] [[package]] -name = "pallet-authorship" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-runtime", - "sp-std", + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", ] [[package]] -name = "pallet-babe" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-session", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-application-crypto", - "sp-consensus-babe", - "sp-consensus-vrf", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", + "cc", ] [[package]] -name = "pallet-balances" -version = "0.1.0" +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-identity", - "pallet-permissions", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", - "serde", - "serde_derive", - "sp-api", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "pallet-balances" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-runtime", - "sp-std", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "pallet-base" -version = "0.1.0" +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", - "serde", - "serde_derive", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", ] [[package]] -name = "pallet-committee" -version = "0.1.0" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-identity", - "pallet-permissions", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", - "serde", - "serde_derive", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", -] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] -name = "pallet-compliance-manager" -version = "0.1.0" +name = "icu_properties" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "either", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-base", - "pallet-external-agents", - "pallet-identity", - "pallet-permissions", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "polymesh-common-utilities", - "polymesh-primitives", - "scale-info", - "serde", - "serde_derive", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", ] [[package]] -name = "pallet-contracts" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "icu_properties_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ - "bitflags 1.3.2", - "frame-benchmarking", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-contracts-primitives", - "pallet-contracts-proc-macro", - "parity-scale-codec 3.6.9", - "rand 0.8.5", - "rand_pcg", - "scale-info", - "serde", - "smallvec", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "wasm-instrument 0.4.0", - "wasmi 0.20.0", - "wasmparser-nostd", + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", ] [[package]] -name = "pallet-contracts-primitives" -version = "7.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ - "bitflags 1.3.2", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-runtime", - "sp-std", - "sp-weights", + "idna_adapter", + "smallvec", + "utf8_iter", ] [[package]] -name = "pallet-contracts-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "icu_normalizer", + "icu_properties", ] [[package]] -name = "pallet-corporate-actions" -version = "0.1.0" +name = "if-addrs" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cabb0019d51a643781ff15c9c8a3e5dedc365c47211270f4e8f82812fedd8f0a" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-asset", - "pallet-base", - "pallet-compliance-manager", - "pallet-external-agents", - "pallet-identity", - "pallet-portfolio", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "polymesh-common-utilities", - "polymesh-primitives", - "polymesh-primitives-derive", - "scale-info", - "serde", - "serde_derive", - "sp-api", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", + "libc", + "windows-sys 0.48.0", ] [[package]] -name = "pallet-election-provider-multi-phase" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "if-watch" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf9d64cfcf380606e64f9a0bcf493616b65331199f984151a6fa11a7b3cde38" dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", + "async-io", + "core-foundation 0.9.4", + "fnv", + "futures", + "if-addrs", + "ipnet", "log", - "pallet-election-provider-support-benchmarking", - "parity-scale-codec 3.6.9", - "rand 0.8.5", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-npos-elections", - "sp-runtime", - "sp-std", - "strum", + "netlink-packet-core", + "netlink-packet-route", + "netlink-proto", + "netlink-sys", + "rtnetlink", + "system-configuration", + "tokio", + "windows 0.53.0", ] [[package]] -name = "pallet-election-provider-support-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "igd-next" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064d90fec10d541084e7b39ead8875a5a80d9114a2b18791565253bae25f49e4" dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-system", - "parity-scale-codec 3.6.9", - "sp-npos-elections", - "sp-runtime", + "async-trait", + "attohttpc", + "bytes", + "futures", + "http 0.2.12", + "hyper 0.14.32", + "log", + "rand 0.8.5", + "tokio", + "url", + "xmltree", ] [[package]] -name = "pallet-external-agents" -version = "0.1.0" +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-base", - "pallet-identity", - "pallet-permissions", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "polymesh-primitives-derive", - "scale-info", - "serde", - "serde_derive", - "sp-runtime", - "sp-std", + "parity-scale-codec", ] [[package]] -name = "pallet-grandpa" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "impl-codec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d40b9d5e17727407e55028eafc22b2dc68781786e6d7eb8a21103f5058e3a14" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-session", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-application-crypto", - "sp-consensus-grandpa", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", + "parity-scale-codec", ] [[package]] -name = "pallet-group" -version = "0.1.0" +name = "impl-num-traits" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "803d15461ab0dcc56706adf266158acbc44ccf719bf7d0af30705f58b90a4b8c" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-identity", - "pallet-permissions", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", - "serde", - "serde_derive", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", + "integer-sqrt", + "num-traits", + "uint 0.10.0", ] [[package]] -name = "pallet-group-rpc" -version = "2.0.0" +name = "impl-rlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54ed8ad1f3877f7e775b8cbf30ed1bd3209a95401817f19a0eb4402d13f8cf90" dependencies = [ - "frame-support", - "frame-system", - "jsonrpsee", - "node-rpc", - "pallet-group-rpc-runtime-api", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-std", + "rlp 0.6.1", ] [[package]] -name = "pallet-group-rpc-runtime-api" -version = "2.0.0" +name = "impl-serde" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a143eada6a1ec4aefa5049037a26a6d597bfd64f8c026d07b77133e02b7dd0b" dependencies = [ - "parity-scale-codec 3.6.9", - "polymesh-primitives", "serde", - "sp-api", - "sp-std", ] [[package]] -name = "pallet-identity" -version = "0.1.0" +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ - "either", - "frame-benchmarking", - "frame-support", - "frame-system", - "hex", - "hex-literal 0.3.4", - "log", - "pallet-base", - "pallet-permissions", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "polymesh-common-utilities", - "polymesh-primitives", - "scale-info", - "schnorrkel 0.11.4", - "serde", - "serde_derive", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "pallet-im-online" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std", + "include_dir_macros", ] [[package]] -name = "pallet-indices" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-core", - "sp-io", - "sp-keyring", - "sp-runtime", - "sp-std", + "proc-macro2", + "quote", ] [[package]] -name = "pallet-insecure-randomness-collective-flip" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec 3.6.9", - "safe-mix", - "scale-info", - "sp-runtime", - "sp-std", + "autocfg", + "hashbrown 0.12.3", + "serde", ] [[package]] -name = "pallet-multisig" -version = "0.1.0" +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-identity", - "pallet-permissions", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", + "equivalent", + "hashbrown 0.16.1", "serde", - "sp-core", - "sp-runtime", - "sp-std", - "sp-version", + "serde_core", ] [[package]] -name = "pallet-nft" -version = "0.1.0" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-asset", - "pallet-base", - "pallet-external-agents", - "pallet-identity", - "pallet-portfolio", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", - "sp-runtime", - "sp-std", -] +name = "indexmap-nostd" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" [[package]] -name = "pallet-offences" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ - "frame-support", - "frame-system", - "log", - "pallet-balances 4.0.0-dev", - "parity-scale-codec 3.6.9", - "scale-info", - "serde", - "sp-runtime", - "sp-staking", - "sp-std", + "generic-array 0.14.7", ] [[package]] -name = "pallet-permissions" -version = "0.1.0" +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", - "serde", - "sp-runtime", - "sp-std", + "cfg-if", ] [[package]] -name = "pallet-pips" -version = "0.1.0" +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-balances 0.1.0", - "pallet-base", - "pallet-committee", - "pallet-group", - "pallet-identity", - "pallet-permissions", - "pallet-timestamp", - "pallet-treasury", - "parity-scale-codec 3.6.9", - "polymesh-common-utilities", - "polymesh-primitives", - "polymesh-primitives-derive", - "polymesh-runtime-common", - "rand 0.8.5", - "rand_chacha 0.3.1", - "scale-info", - "serde", - "serde_derive", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", + "num-traits", ] [[package]] -name = "pallet-portfolio" -version = "0.1.0" +name = "ip_network" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1" + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-base", - "pallet-identity", - "pallet-permissions", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", - "serde", - "sp-arithmetic", - "sp-runtime", - "sp-std", + "socket2 0.5.10", + "widestring", + "windows-sys 0.48.0", + "winreg", ] [[package]] -name = "pallet-preimage" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "is-terminal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "hermit-abi", + "libc", + "windows-sys 0.61.2", ] [[package]] -name = "pallet-protocol-fee" -version = "0.1.0" +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-identity", - "parity-scale-codec 3.6.9", - "polymesh-common-utilities", - "polymesh-primitives", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "either", ] [[package]] -name = "pallet-protocol-fee-rpc" -version = "0.1.0" +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" dependencies = [ - "frame-support", - "frame-system", - "jsonrpsee", - "node-rpc", - "pallet-protocol-fee-rpc-runtime-api", - "parity-scale-codec 3.6.9", - "polymesh-common-utilities", - "polymesh-primitives", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-std", + "either", ] [[package]] -name = "pallet-protocol-fee-rpc-runtime-api" -version = "0.1.0" +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ - "parity-scale-codec 3.6.9", - "polymesh-common-utilities", - "polymesh-primitives", - "serde", - "sp-api", - "sp-runtime", + "either", ] [[package]] -name = "pallet-relayer" -version = "0.1.0" +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-identity", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", - "sp-runtime", - "sp-std", + "either", ] [[package]] -name = "pallet-scheduler" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std", - "sp-weights", + "either", ] [[package]] -name = "pallet-session" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "ittapi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b996fe614c41395cdaedf3cf408a9534851090959d90d54a535f675550b64b1" dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", + "anyhow", + "ittapi-sys", "log", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-trie", ] [[package]] -name = "pallet-settlement" -version = "0.1.0" +name = "ittapi-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f5385394064fa2c886205dba02598013ce83d3e92d33dbdc0c52fe0e7bf4fc" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "hex", - "hex-literal 0.2.2", - "log", - "pallet-asset", - "pallet-base", - "pallet-compliance-manager", - "pallet-external-agents", - "pallet-identity", - "pallet-nft", - "pallet-permissions", - "pallet-scheduler", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "polymesh-primitives-derive", - "scale-info", - "serde", - "serde_derive", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", + "cc", ] [[package]] -name = "pallet-staking" -version = "2.0.0" +name = "jam-codec" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb948eace373d99de60501a02fb17125d30ac632570de20dccc74370cdd611b9" dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-babe", - "pallet-identity", - "pallet-session", - "pallet-staking-reward-curve", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "rand_chacha 0.2.2", - "scale-info", + "arrayvec 0.7.6", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "jam-codec-derive", + "rustversion", "serde", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-npos-elections", - "sp-runtime", - "sp-staking", - "sp-std", - "sp-tracing", - "static_assertions", ] [[package]] -name = "pallet-staking-reward-curve" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "jam-codec-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "319af585c4c8a6b5552a52b7787a1ab3e4d59df7614190b1f85b9b842488789d" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.111", ] [[package]] -name = "pallet-staking-rpc" -version = "2.0.0" +name = "jiff" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67e8da4c49d6d9909fe03361f9b620f58898859f5c7aded68351e85e71ecf50" dependencies = [ - "frame-support", - "frame-system", - "jsonrpsee", - "node-rpc", - "pallet-staking-rpc-runtime-api", - "parity-scale-codec 3.6.9", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-std", + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", ] [[package]] -name = "pallet-staking-rpc-runtime-api" -version = "2.0.0" +name = "jiff-static" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c84ee7f197eca9a86c6fd6cb771e55eb991632f15f2bc3ca6ec838929e6e78" dependencies = [ - "frame-support", - "sp-api", - "sp-runtime", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "pallet-statistics" -version = "0.1.0" +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "lazy_static", + "cesu8", + "cfg-if", + "combine", + "jni-sys", "log", - "pallet-external-agents", - "pallet-identity", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", - "serde", - "serde_derive", - "sp-api", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", ] [[package]] -name = "pallet-sto" -version = "0.1.0" +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-asset", - "pallet-balances 0.1.0", - "pallet-base", - "pallet-compliance-manager", - "pallet-external-agents", - "pallet-identity", - "pallet-permissions", - "pallet-portfolio", - "pallet-settlement", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "polymesh-primitives-derive", - "scale-info", - "serde", - "serde_derive", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", + "getrandom 0.3.4", + "libc", ] [[package]] -name = "pallet-sudo" -version = "2.0.0" +name = "js-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "once_cell", + "wasm-bindgen", ] [[package]] -name = "pallet-timestamp" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "jsonrpsee" +version = "0.24.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e281ae70cc3b98dac15fced3366a880949e65fc66e345ce857a5682d152f3e62" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec 3.6.9", - "scale-info", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-std", - "sp-timestamp", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-http-client", + "jsonrpsee-proc-macros", + "jsonrpsee-server", + "jsonrpsee-types", + "jsonrpsee-wasm-client", + "jsonrpsee-ws-client", + "tokio", + "tracing", ] [[package]] -name = "pallet-transaction-payment" -version = "2.0.0" +name = "jsonrpsee-client-transport" +version = "0.24.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4280b709ac3bb5e16cf3bad5056a0ec8df55fa89edfe996361219aadc2c7ea" dependencies = [ - "frame-support", - "frame-system", - "pallet-timestamp", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", - "serde", - "serde_json", - "sp-api", - "sp-io", - "sp-runtime", - "sp-std", + "base64", + "futures-channel", + "futures-util", + "gloo-net", + "http 1.4.0", + "jsonrpsee-core", + "pin-project", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "soketto", + "thiserror 1.0.69", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "url", ] [[package]] -name = "pallet-treasury" -version = "0.1.0" +name = "jsonrpsee-core" +version = "0.24.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "348ee569eaed52926b5e740aae20863762b16596476e943c9e415a6479021622" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-balances 0.1.0", - "pallet-identity", - "pallet-permissions", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", + "async-trait", + "bytes", + "futures-timer", + "futures-util", + "http 1.4.0", + "http-body 1.0.1", + "http-body-util", + "jsonrpsee-types", + "parking_lot 0.12.5", + "pin-project", + "rand 0.8.5", + "rustc-hash 2.1.1", "serde", - "serde_derive", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tokio-stream", + "tracing", + "wasm-bindgen-futures", ] [[package]] -name = "pallet-utility" -version = "0.1.0" +name = "jsonrpsee-http-client" +version = "0.24.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f50c389d6e6a52eb7c3548a6600c90cf74d9b71cb5912209833f00a5479e9a01" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-balances 0.1.0", - "pallet-identity", - "pallet-permissions", - "parity-scale-codec 3.6.9", - "polymesh-common-utilities", - "polymesh-primitives", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", + "async-trait", + "base64", + "http-body 1.0.1", + "hyper 1.8.1", + "hyper-rustls", + "hyper-util", + "jsonrpsee-core", + "jsonrpsee-types", + "rustls", + "rustls-platform-verifier", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tower", + "tracing", + "url", ] [[package]] -name = "parity-db" -version = "0.4.12" +name = "jsonrpsee-proc-macros" +version = "0.24.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e9ab494af9e6e813c72170f0d3c1de1500990d62c97cc05cc7576f91aa402f" +checksum = "7398cddf5013cca4702862a2692b66c48a3bd6cf6ec681a47453c93d63cf8de5" dependencies = [ - "blake2", - "crc32fast", - "fs2", - "hex", - "libc", - "log", - "lz4", - "memmap2", - "parking_lot 0.12.1", - "rand 0.8.5", - "siphasher", - "snap", + "heck 0.5.0", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "parity-scale-codec" -version = "1.3.7" +name = "jsonrpsee-server" +version = "0.24.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b26b16c7687c3075982af47719e481815df30bc544f7a6690763a25ca16e9d" +checksum = "21429bcdda37dcf2d43b68621b994adede0e28061f816b038b0f18c70c143d51" dependencies = [ - "arrayvec 0.5.2", - "bitvec 0.17.4", - "byte-slice-cast 0.3.5", - "parity-scale-codec-derive 1.2.3", + "futures-util", + "http 1.4.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.8.1", + "hyper-util", + "jsonrpsee-core", + "jsonrpsee-types", + "pin-project", + "route-recognizer", "serde", + "serde_json", + "soketto", + "thiserror 1.0.69", + "tokio", + "tokio-stream", + "tokio-util", + "tower", + "tracing", ] [[package]] -name = "parity-scale-codec" -version = "3.6.9" +name = "jsonrpsee-types" +version = "0.24.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" +checksum = "b0f05e0028e55b15dbd2107163b3c744cd3bb4474f193f95d9708acbf5677e44" dependencies = [ - "arrayvec 0.7.4", - "bitvec 1.0.1", - "byte-slice-cast 1.2.2", - "bytes", - "impl-trait-for-tuples", - "parity-scale-codec-derive 3.6.9", + "http 1.4.0", "serde", + "serde_json", + "thiserror 1.0.69", ] [[package]] -name = "parity-scale-codec-derive" -version = "1.2.3" +name = "jsonrpsee-wasm-client" +version = "0.24.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41512944b1faff334a5f1b9447611bf4ef40638ccb6328173dacefb338e878c" +checksum = "e9d745e4f543fc10fc0e2b11aa1f3be506b1e475d412167e7191a65ecd239f1c" dependencies = [ - "proc-macro-crate 0.1.5", - "proc-macro2", - "quote", - "syn 1.0.109", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", ] [[package]] -name = "parity-scale-codec-derive" -version = "3.6.9" +name = "jsonrpsee-ws-client" +version = "0.24.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" +checksum = "78fc744f17e7926d57f478cf9ca6e1ee5d8332bf0514860b1a3cdf1742e614cc" dependencies = [ - "proc-macro-crate 2.0.1", - "proc-macro2", - "quote", - "syn 1.0.109", + "http 1.4.0", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", + "url", ] [[package]] -name = "parity-send-wrapper" -version = "0.1.0" +name = "k256" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "serdect", + "sha2 0.10.9", +] [[package]] -name = "parity-wasm" -version = "0.45.0" +name = "keccak" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] [[package]] -name = "parking" -version = "2.2.0" +name = "keccak-asm" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] [[package]] -name = "parking_lot" -version = "0.11.2" +name = "keccak-const" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] +checksum = "57d8d8ce877200136358e0bbff3a77965875db3af755a11e1fa6b1b3e2df13ea" [[package]] -name = "parking_lot" -version = "0.12.1" +name = "keccak-hash" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "3e1b8590eb6148af2ea2d75f38e7d29f5ca970d5a4df456b3ef19b8b415d0264" dependencies = [ - "lock_api", - "parking_lot_core 0.9.9", + "primitive-types 0.13.1", + "tiny-keccak", ] [[package]] -name = "parking_lot_core" -version = "0.8.6" +name = "keystream" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", -] +checksum = "c33070833c9ee02266356de0c43f723152bd38bd96ddf52c82b3af10c9138b28" [[package]] -name = "parking_lot_core" -version = "0.9.9" +name = "kvdb" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "e7d770dcb02bf6835887c3a979b5107a04ff4bbde97a5f0928d27404a155add9" dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall 0.4.1", "smallvec", - "windows-targets 0.48.5", ] [[package]] -name = "paste" -version = "1.0.14" +name = "kvdb-memorydb" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "bf7a85fe66f9ff9cd74e169fdd2c94c6e1e74c412c99a73b4df3200b5d3760b2" +dependencies = [ + "kvdb", + "parking_lot 0.12.5", +] [[package]] -name = "pbkdf2" -version = "0.8.0" +name = "kvdb-rocksdb" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +checksum = "739ac938a308a9a8b6772fd1d840fd9c0078f9c74fe294feaf32faae727102cc" dependencies = [ - "crypto-mac 0.11.1", + "kvdb", + "num_cpus", + "parking_lot 0.12.5", + "regex", + "rocksdb", ] [[package]] -name = "pbkdf2" -version = "0.11.0" +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "digest 0.10.7", + "spin 0.9.8", ] [[package]] -name = "peeking_take_while" -version = "0.1.2" +name = "leb128fmt" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] -name = "pem" -version = "1.1.1" +name = "libc" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] -name = "pem-rfc7468" -version = "0.6.0" +name = "libgit2-sys" +version = "0.18.3+1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" +checksum = "c9b3acc4b91781bb0b3386669d325163746af5f6e4f73e6d2d630e09a35f3487" dependencies = [ - "base64ct", + "cc", + "libc", + "libz-sys", + "pkg-config", ] [[package]] -name = "percent-encoding" -version = "2.3.1" +name = "libm" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] -name = "pest" -version = "2.7.5" +name = "libp2p" +version = "0.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" +checksum = "bbbe80f9c7e00526cd6b838075b9c171919404a4732cb2fa8ece0a093223bfc4" dependencies = [ - "memchr", - "thiserror", - "ucd-trie", + "bytes", + "either", + "futures", + "futures-timer", + "getrandom 0.2.16", + "libp2p-allow-block-list", + "libp2p-connection-limits", + "libp2p-core", + "libp2p-dns", + "libp2p-identify", + "libp2p-identity", + "libp2p-kad", + "libp2p-mdns", + "libp2p-metrics", + "libp2p-noise", + "libp2p-ping", + "libp2p-quic", + "libp2p-request-response", + "libp2p-swarm", + "libp2p-tcp", + "libp2p-upnp", + "libp2p-websocket", + "libp2p-yamux", + "multiaddr 0.18.2", + "pin-project", + "rw-stream-sink", + "thiserror 1.0.69", ] [[package]] -name = "pest_derive" -version = "2.7.5" +name = "libp2p-allow-block-list" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" +checksum = "d1027ccf8d70320ed77e984f273bc8ce952f623762cb9bf2d126df73caef8041" dependencies = [ - "pest", - "pest_generator", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", ] [[package]] -name = "pest_generator" -version = "2.7.5" +name = "libp2p-connection-limits" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" +checksum = "8d003540ee8baef0d254f7b6bfd79bac3ddf774662ca0abf69186d517ef82ad8" dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.40", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", ] [[package]] -name = "pest_meta" -version = "2.7.5" +name = "libp2p-core" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" +checksum = "a61f26c83ed111104cd820fe9bc3aaabbac5f1652a1d213ed6e900b7918a1298" dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "libp2p-identity", + "multiaddr 0.18.2", + "multihash 0.19.3", + "multistream-select", "once_cell", - "pest", - "sha2 0.10.8", + "parking_lot 0.12.5", + "pin-project", + "quick-protobuf", + "rand 0.8.5", + "rw-stream-sink", + "smallvec", + "thiserror 1.0.69", + "tracing", + "unsigned-varint 0.8.0", + "void", + "web-time", ] [[package]] -name = "petgraph" -version = "0.6.4" +name = "libp2p-dns" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "97f37f30d5c7275db282ecd86e54f29dd2176bd3ac656f06abf43bedb21eb8bd" dependencies = [ - "fixedbitset", - "indexmap 2.1.0", + "async-trait", + "futures", + "hickory-resolver 0.24.4", + "libp2p-core", + "libp2p-identity", + "parking_lot 0.12.5", + "smallvec", + "tracing", ] [[package]] -name = "pin-project" -version = "1.1.3" +name = "libp2p-identify" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "1711b004a273be4f30202778856368683bd9a83c4c7dcc8f848847606831a4e3" dependencies = [ - "pin-project-internal", + "asynchronous-codec 0.7.0", + "either", + "futures", + "futures-bounded", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "lru 0.12.5", + "quick-protobuf", + "quick-protobuf-codec", + "smallvec", + "thiserror 1.0.69", + "tracing", + "void", ] [[package]] -name = "pin-project-internal" -version = "1.1.3" +name = "libp2p-identity" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "3104e13b51e4711ff5738caa1fb54467c8604c2e94d607e27745bcf709068774" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.40", + "bs58", + "ed25519-dalek", + "hkdf", + "multihash 0.19.3", + "quick-protobuf", + "rand 0.8.5", + "sha2 0.10.9", + "thiserror 2.0.17", + "tracing", + "zeroize", ] [[package]] -name = "pin-project-lite" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pin-utils" -version = "0.1.0" +name = "libp2p-kad" +version = "0.46.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "ced237d0bd84bbebb7c2cad4c073160dacb4fe40534963c32ed6d4c6bb7702a3" +dependencies = [ + "arrayvec 0.7.6", + "asynchronous-codec 0.7.0", + "bytes", + "either", + "fnv", + "futures", + "futures-bounded", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec", + "rand 0.8.5", + "sha2 0.10.9", + "smallvec", + "thiserror 1.0.69", + "tracing", + "uint 0.9.5", + "void", + "web-time", +] [[package]] -name = "pkcs8" -version = "0.9.0" +name = "libp2p-mdns" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +checksum = "14b8546b6644032565eb29046b42744aee1e9f261ed99671b2c93fb140dba417" dependencies = [ - "der 0.6.1", - "spki 0.6.0", + "data-encoding", + "futures", + "hickory-proto 0.24.4", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand 0.8.5", + "smallvec", + "socket2 0.5.10", + "tokio", + "tracing", + "void", ] [[package]] -name = "pkcs8" -version = "0.10.2" +name = "libp2p-metrics" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +checksum = "77ebafa94a717c8442d8db8d3ae5d1c6a15e30f2d347e0cd31d057ca72e42566" dependencies = [ - "der 0.7.8", - "spki 0.7.3", + "futures", + "libp2p-core", + "libp2p-identify", + "libp2p-identity", + "libp2p-kad", + "libp2p-ping", + "libp2p-swarm", + "pin-project", + "prometheus-client", + "web-time", ] [[package]] -name = "pkg-config" -version = "0.3.27" +name = "libp2p-noise" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "36b137cb1ae86ee39f8e5d6245a296518912014eaa87427d24e6ff58cfc1b28c" +dependencies = [ + "asynchronous-codec 0.7.0", + "bytes", + "curve25519-dalek", + "futures", + "libp2p-core", + "libp2p-identity", + "multiaddr 0.18.2", + "multihash 0.19.3", + "once_cell", + "quick-protobuf", + "rand 0.8.5", + "sha2 0.10.9", + "snow", + "static_assertions", + "thiserror 1.0.69", + "tracing", + "x25519-dalek", + "zeroize", +] [[package]] -name = "platforms" -version = "2.0.0" +name = "libp2p-ping" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d0eef3571242013a0d5dc84861c3ae4a652e56e12adf8bdc26ff5f8cb34c94" +checksum = "005a34420359223b974ee344457095f027e51346e992d1e0dcd35173f4cdd422" +dependencies = [ + "either", + "futures", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand 0.8.5", + "tracing", + "void", + "web-time", +] [[package]] -name = "polling" -version = "3.3.1" +name = "libp2p-quic" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" +checksum = "46352ac5cd040c70e88e7ff8257a2ae2f891a4076abad2c439584a31c15fd24e" dependencies = [ - "cfg-if 1.0.0", - "concurrent-queue", - "pin-project-lite 0.2.13", - "rustix 0.38.28", + "bytes", + "futures", + "futures-timer", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-tls", + "parking_lot 0.12.5", + "quinn", + "rand 0.8.5", + "ring 0.17.14", + "rustls", + "socket2 0.5.10", + "thiserror 1.0.69", + "tokio", "tracing", - "windows-sys 0.52.0", ] [[package]] -name = "poly1305" -version = "0.8.0" +name = "libp2p-request-response" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +checksum = "1356c9e376a94a75ae830c42cdaea3d4fe1290ba409a22c809033d1b7dcab0a6" dependencies = [ - "cpufeatures", - "opaque-debug 0.3.0", - "universal-hash 0.5.1", + "async-trait", + "futures", + "futures-bounded", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand 0.8.5", + "smallvec", + "tracing", + "void", + "web-time", ] [[package]] -name = "polymesh" -version = "7.4.0" +name = "libp2p-swarm" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7dd6741793d2c1fb2088f67f82cf07261f25272ebe3c0b0c311e0c6b50e851a" dependencies = [ - "clap", - "frame-benchmarking", - "frame-benchmarking-cli", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", + "either", + "fnv", "futures", - "jsonrpsee", - "log", - "node-rpc", - "node-rpc-runtime-api", - "pallet-asset", - "pallet-babe", - "pallet-balances 0.1.0", - "pallet-committee", - "pallet-corporate-actions", - "pallet-external-agents", - "pallet-group", - "pallet-group-rpc", - "pallet-group-rpc-runtime-api", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-multisig", - "pallet-permissions", - "pallet-pips", - "pallet-protocol-fee", - "pallet-protocol-fee-rpc", - "pallet-protocol-fee-rpc-runtime-api", - "pallet-session", - "pallet-staking", - "pallet-staking-rpc-runtime-api", - "pallet-sudo", - "pallet-transaction-payment", - "parity-scale-codec 3.6.9", - "polymesh-common-utilities", - "polymesh-contracts", - "polymesh-node-rpc", - "polymesh-primitives", - "polymesh-runtime-common", - "polymesh-runtime-develop", - "polymesh-runtime-mainnet", - "polymesh-runtime-testnet", - "rustc-hex", - "sc-authority-discovery", - "sc-basic-authorship", - "sc-chain-spec", - "sc-cli", - "sc-client-api", - "sc-client-db", - "sc-consensus", - "sc-consensus-babe", - "sc-consensus-grandpa", - "sc-consensus-slots", - "sc-executor", - "sc-network", - "sc-network-common", - "sc-rpc", - "sc-service", - "sc-sync-state-rpc", - "sc-telemetry", - "sc-transaction-pool", - "serde", - "serde_json", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-keyring", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-timestamp", - "sp-transaction-pool", - "sp-transaction-storage-proof", - "substrate-build-script-utils", - "substrate-prometheus-endpoint", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm-derive", + "lru 0.12.5", + "multistream-select", + "once_cell", + "rand 0.8.5", + "smallvec", + "tokio", + "tracing", + "void", + "web-time", ] [[package]] -name = "polymesh-build-tool" -version = "0.1.0" +name = "libp2p-swarm-derive" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206e0aa0ebe004d778d79fb0966aa0de996c19894e2c0605ba2f8524dd4443d8" dependencies = [ - "substrate-wasm-builder", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "polymesh-common-utilities" -version = "0.1.0" +name = "libp2p-tcp" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad964f312c59dcfcac840acd8c555de8403e295d39edf96f5240048b5fcaa314" dependencies = [ - "frame-support", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", - "serde", - "sp-core", - "sp-std", + "futures", + "futures-timer", + "if-watch", + "libc", + "libp2p-core", + "libp2p-identity", + "socket2 0.5.10", + "tokio", + "tracing", ] [[package]] -name = "polymesh-contracts" -version = "0.1.0" +name = "libp2p-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b23dddc2b9c355f73c1e36eb0c3ae86f7dc964a3715f0731cfad352db4d847" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-base", - "pallet-contracts", - "pallet-contracts-primitives", - "pallet-identity", - "pallet-permissions", - "parity-scale-codec 3.6.9", - "polymesh-primitives", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "wasm-instrument 0.3.0", + "futures", + "futures-rustls", + "libp2p-core", + "libp2p-identity", + "rcgen", + "ring 0.17.14", + "rustls", + "rustls-webpki 0.101.7", + "thiserror 1.0.69", + "x509-parser 0.16.0", + "yasna", ] [[package]] -name = "polymesh-exec-macro" -version = "1.0.0" +name = "libp2p-upnp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01bf2d1b772bd3abca049214a3304615e6a36fa6ffc742bdd1ba774486200b8f" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "futures", + "futures-timer", + "igd-next", + "libp2p-core", + "libp2p-swarm", + "tokio", + "tracing", + "void", ] [[package]] -name = "polymesh-node-rpc" -version = "0.1.0" +name = "libp2p-websocket" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "888b2ff2e5d8dcef97283daab35ad1043d18952b65e05279eecbe02af4c6e347" dependencies = [ - "jsonrpsee", - "node-rpc", - "pallet-group-rpc", - "pallet-protocol-fee-rpc", - "pallet-staking-rpc", - "polymesh-primitives", - "sc-chain-spec", - "sc-client-api", - "sc-consensus-babe", - "sc-consensus-babe-rpc", - "sc-consensus-epochs", - "sc-consensus-grandpa", - "sc-consensus-grandpa-rpc", - "sc-rpc", - "sc-rpc-api", - "sc-rpc-spec-v2", - "sc-sync-state-rpc", - "sc-transaction-pool-api", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-keystore", - "sp-runtime", - "substrate-frame-rpc-system", + "either", + "futures", + "futures-rustls", + "libp2p-core", + "libp2p-identity", + "parking_lot 0.12.5", + "pin-project-lite", + "rw-stream-sink", + "soketto", + "thiserror 1.0.69", + "tracing", + "url", + "webpki-roots", ] [[package]] -name = "polymesh-primitives" -version = "5.0.0" +name = "libp2p-yamux" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "788b61c80789dba9760d8c669a5bedb642c8267555c803fabd8396e4ca5c5882" dependencies = [ - "chrono", "either", - "frame-support", - "frame-system", - "hex", - "libsecp256k1", - "log", - "parity-scale-codec 3.6.9", - "polymesh-primitives-derive", - "rand 0.8.5", - "rand_core 0.6.4", - "rustc-hex", - "scale-info", - "schnorrkel 0.11.4", - "serde", - "serde_bytes", - "serde_json", - "sp-application-crypto", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-runtime-interface", - "sp-std", - "sp-version", + "futures", + "libp2p-core", + "thiserror 1.0.69", + "tracing", + "yamux 0.12.1", + "yamux 0.13.8", ] [[package]] -name = "polymesh-primitives-derive" -version = "0.1.0" +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "bitflags 2.10.0", + "libc", + "redox_syscall 0.5.18", ] [[package]] -name = "polymesh-runtime-common" -version = "1.0.0" +name = "librocksdb-sys" +version = "0.17.3+10.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cef2a00ee60fe526157c9023edab23943fae1ce2ab6f4abb2a807c1746835de9" dependencies = [ - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-balances 0.1.0", - "pallet-committee", - "pallet-election-provider-multi-phase", - "pallet-group-rpc-runtime-api", - "pallet-identity", - "pallet-multisig", - "pallet-relayer", - "parity-scale-codec 3.6.9", - "polymesh-common-utilities", - "polymesh-primitives", - "smallvec", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] + "bindgen", + "bzip2-sys", + "cc", + "libc", + "libz-sys", +] + +[[package]] +name = "libsecp256k1" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79019718125edc905a079a70cfa5f3820bc76139fc91d6f9abc27ea2a887139" +dependencies = [ + "arrayref", + "base64", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.8.5", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle 2.6.1", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82" +dependencies = [ + "cc", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linked_hash_set" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "984fb35d06508d1e69fc91050cceba9c0b748f983e6739fa2c7a9237154c52c8" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "linregress" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9eda9dcf4f2a99787827661f312ac3219292549c2ee992bf9a6248ffb066bf7" +dependencies = [ + "nalgebra", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "lioness" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae926706ba42c425c9457121178330d75e273df2e82e28b758faf3de3a9acb9" +dependencies = [ + "arrayref", + "blake2 0.8.1", + "chacha", + "keystream", +] + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "litep2p" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d903b21d57fae0e8d184c6ea0107fb5303fcab7cd2acaf5d2d9beb2807194b4a" +dependencies = [ + "async-trait", + "bs58", + "bytes", + "cid", + "ed25519-dalek", + "enum-display", + "futures", + "futures-timer", + "hickory-resolver 0.25.2", + "indexmap 2.12.1", + "libc", + "mockall", + "multiaddr 0.17.1", + "multihash 0.17.0", + "network-interface", + "parking_lot 0.12.5", + "pin-project", + "prost 0.13.5", + "prost-build 0.14.1", + "rand 0.8.5", + "ring 0.17.14", + "serde", + "sha2 0.10.9", + "simple-dns", + "smallvec", + "snow", + "socket2 0.5.10", + "thiserror 2.0.17", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tokio-util", + "tracing", + "uint 0.10.0", + "unsigned-varint 0.8.0", + "url", + "x25519-dalek", + "x509-parser 0.17.0", + "yamux 0.13.8", + "yasna", + "zeroize", +] + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lru" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +dependencies = [ + "hashbrown 0.12.3", +] + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "lz4" +version = "1.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" +dependencies = [ + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.11.1+lz4-1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "macro_magic" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d" +dependencies = [ + "macro_magic_core", + "macro_magic_macros", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "macro_magic_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1687dc887e42f352865a393acae7cf79d98fab6351cde1f58e9e057da89bf150" +dependencies = [ + "const-random", + "derive-syn-parse", + "macro_magic_core_macros", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "macro_magic_core_macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "macro_magic_macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" +dependencies = [ + "macro_magic_core", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "match-lookup" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "memfd" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" +dependencies = [ + "rustix 1.1.2", +] + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +dependencies = [ + "libc", +] + +[[package]] +name = "memory-db" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e300c54e3239a86f9c61cc63ab0f03862eb40b1c6e065dc6fd6ceaeff6da93d" +dependencies = [ + "foldhash 0.1.5", + "hash-db", + "hashbrown 0.15.5", +] + +[[package]] +name = "merkleized-metadata" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3e3e3f549d27d2dc054372f320ddf68045a833fab490563ff70d4cf1b9d91ea" +dependencies = [ + "array-bytes 9.3.0", + "blake3", + "frame-metadata", + "parity-scale-codec", + "scale-decode", + "scale-info", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "mixnet" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa3eb39495d8e2e2947a1d862852c90cc6a4a8845f8b41c8829cb9fcc047f4a" +dependencies = [ + "arrayref", + "arrayvec 0.7.6", + "bitflags 1.3.2", + "blake2 0.10.6", + "c2-chacha", + "curve25519-dalek", + "either", + "hashlink 0.8.4", + "lioness", + "log", + "parking_lot 0.12.5", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_distr", + "subtle 2.6.1", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "mmr-gadget" +version = "50.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "futures", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-offchain", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-consensus-beefy", + "sp-core", + "sp-mmr-primitives", + "sp-runtime", +] + +[[package]] +name = "mmr-rpc" +version = "44.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "jsonrpsee", + "parity-scale-codec", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-mmr-primitives", + "sp-runtime", +] + +[[package]] +name = "mockall" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39a6bfcc6c8c7eed5ee98b9c3e33adc726054389233e201c95dab2d41a3839d2" +dependencies = [ + "cfg-if", + "downcast", + "fragile", + "mockall_derive", + "predicates", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ca3004c2efe9011bd4e461bd8256445052b9615405b4f7ea43fc8ca5c20898" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "moka" +version = "0.12.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "parking_lot 0.12.5", + "portable-atomic", + "rustc_version 0.4.1", + "smallvec", + "tagptr", + "uuid", +] + +[[package]] +name = "multi-stash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685a9ac4b61f4e728e1d2c6a7844609c16527aeb5e6c865915c08e619c16410f" + +[[package]] +name = "multiaddr" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b36f567c7099511fa8612bbbb52dda2419ce0bdbacf31714e3a5ffdb766d3bd" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "log", + "multibase", + "multihash 0.17.0", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint 0.7.2", + "url", +] + +[[package]] +name = "multiaddr" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6351f60b488e04c1d21bc69e56b89cb3f5e8f5d22557d6e8031bdfd79b6961" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "libp2p-identity", + "multibase", + "multihash 0.19.3", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint 0.8.0", + "url", +] + +[[package]] +name = "multibase" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" +dependencies = [ + "base-x", + "base256emoji", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835d6ff01d610179fbce3de1694d007e500bf33a7f29689838941d6bf783ae40" +dependencies = [ + "blake2b_simd", + "core2", + "digest 0.10.7", + "multihash-derive", + "sha2 0.10.9", + "unsigned-varint 0.7.2", +] + +[[package]] +name = "multihash" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" +dependencies = [ + "core2", + "unsigned-varint 0.8.0", +] + +[[package]] +name = "multihash-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" +dependencies = [ + "proc-macro-crate 1.1.3", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", +] + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "multistream-select" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea0df8e5eec2298a62b326ee4f0d7fe1a6b90a09dfcf9df37b38f947a8c42f19" +dependencies = [ + "bytes", + "futures", + "log", + "pin-project", + "smallvec", + "unsigned-varint 0.7.2", +] + +[[package]] +name = "nalgebra" +version = "0.33.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" +dependencies = [ + "approx", + "matrixmultiply", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "names" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bddcd3bf5144b6392de80e04c347cd7fab2508f6df16a85fc496ecd5cec39bc" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" + +[[package]] +name = "netlink-packet-core" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4" +dependencies = [ + "anyhow", + "byteorder", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053998cea5a306971f88580d0829e90f270f940befd7cf928da179d4187a5a66" +dependencies = [ + "anyhow", + "bitflags 1.3.2", + "byteorder", + "libc", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-utils" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror 1.0.69", +] + +[[package]] +name = "netlink-proto" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72452e012c2f8d612410d89eea01e2d9b56205274abb35d53f60200b2ec41d60" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror 2.0.17", +] + +[[package]] +name = "netlink-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16c903aa70590cb93691bf97a767c8d1d6122d2cc9070433deb3bbf36ce8bd23" +dependencies = [ + "bytes", + "futures", + "libc", + "log", + "tokio", +] + +[[package]] +name = "network-interface" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07709a6d4eba90ab10ec170a0530b3aafc81cb8a2d380e4423ae41fc55fe5745" +dependencies = [ + "cc", + "libc", + "thiserror 2.0.17", + "winapi", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "no-std-compat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" + +[[package]] +name = "node-rpc" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "jsonrpsee", + "node-rpc-runtime-api", + "pallet-compliance-manager", + "pallet-identity", + "pallet-pips", + "pallet-portfolio", + "pallet-transaction-payment", + "parity-scale-codec", + "polymesh-primitives", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-std", + "sp-weights", +] + +[[package]] +name = "node-rpc-runtime-api" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "pallet-compliance-manager", + "pallet-identity", + "pallet-pips", + "pallet-portfolio", + "pallet-transaction-payment", + "parity-scale-codec", + "polymesh-primitives", + "serde", + "serde_json", + "sp-api", + "sp-runtime", + "sp-std", + "sp-weights", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "nonempty" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e591e719385e6ebaeb5ce5d3887f7d5676fceca6411d1925ccc95745f3d6f7" + +[[package]] +name = "nonzero_ext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +dependencies = [ + "arrayvec 0.7.6", + "itoa", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "nybbles" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5676b5c379cf5b03da1df2b3061c4a4e2aa691086a56ac923e08c143f53f59" +dependencies = [ + "alloy-rlp", + "cfg-if", + "proptest", + "ruint", + "serde", + "smallvec", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "crc32fast", + "hashbrown 0.15.5", + "indexmap 2.12.1", + "memchr", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "oid-registry" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" +dependencies = [ + "asn1-rs 0.6.2", +] + +[[package]] +name = "oid-registry" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" +dependencies = [ + "asn1-rs 0.7.1", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +dependencies = [ + "critical-section", + "portable-atomic", +] + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "orchestra" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19051f0b0512402f5d52d6776999f55996f01887396278aeeccbbdfbc83eef2d" +dependencies = [ + "async-trait", + "dyn-clonable", + "futures", + "futures-timer", + "orchestra-proc-macro", + "pin-project", + "prioritized-metered-channel", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "orchestra-proc-macro" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43dfaf083aef571385fccfdc3a2f8ede8d0a1863160455d4f2b014d8f7d04a3f" +dependencies = [ + "expander", + "indexmap 2.12.1", + "itertools 0.11.0", + "petgraph 0.6.5", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.9", +] + +[[package]] +name = "pallet-asset" +version = "0.1.0" +dependencies = [ + "arrayvec 0.7.6", + "frame-benchmarking", + "frame-support", + "frame-system", + "hex-literal 0.2.2", + "log", + "pallet-base", + "pallet-external-agents", + "pallet-identity", + "pallet-permissions", + "pallet-portfolio", + "pallet-statistics", + "pallet-timestamp", + "parity-scale-codec", + "polymesh-common-utilities", + "polymesh-primitives", + "polymesh-primitives-derive", + "polymesh-runtime-common", + "rustc-hex", + "scale-info", + "serde", + "serde_derive", + "serde_json", + "sp-api", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", +] + +[[package]] +name = "pallet-asset-conversion" +version = "27.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", +] + +[[package]] +name = "pallet-authority-discovery" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-support", + "frame-system", + "pallet-session", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-authority-discovery", + "sp-runtime", +] + +[[package]] +name = "pallet-authorship" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-runtime", +] + +[[package]] +name = "pallet-babe" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-consensus-babe", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", +] + +[[package]] +name = "pallet-balances" +version = "46.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "pallet-base" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "serde", + "serde_derive", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", +] + +[[package]] +name = "pallet-beefy" +version = "46.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sp-consensus-beefy", + "sp-runtime", + "sp-session", + "sp-staking", +] + +[[package]] +name = "pallet-beefy-mmr" +version = "46.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "array-bytes 6.2.3", + "binary-merkle-tree", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-beefy", + "pallet-mmr", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-consensus-beefy", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", +] + +[[package]] +name = "pallet-broker" +version = "0.24.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "bitvec", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-arithmetic", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "pallet-committee" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-identity", + "pallet-permissions", + "pallet-timestamp", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "serde", + "serde_derive", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", +] + +[[package]] +name = "pallet-compliance-manager" +version = "0.1.0" +dependencies = [ + "either", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-base", + "pallet-external-agents", + "pallet-identity", + "pallet-permissions", + "pallet-timestamp", + "parity-scale-codec", + "polymesh-common-utilities", + "polymesh-primitives", + "scale-info", + "serde", + "serde_derive", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", +] + +[[package]] +name = "pallet-contracts" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "environmental", + "frame-benchmarking", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-balances", + "pallet-contracts-proc-macro", + "pallet-contracts-uapi", + "parity-scale-codec", + "paste", + "rand 0.8.5", + "rand_pcg", + "scale-info", + "serde", + "smallvec", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "staging-xcm", + "staging-xcm-builder", + "wasm-instrument 0.4.0", + "wasmi 0.32.3", +] + +[[package]] +name = "pallet-contracts-proc-macro" +version = "23.0.3" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "pallet-contracts-uapi" +version = "14.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "bitflags 1.3.2", + "parity-scale-codec", + "paste", + "scale-info", +] + +[[package]] +name = "pallet-corporate-actions" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-asset", + "pallet-base", + "pallet-compliance-manager", + "pallet-external-agents", + "pallet-identity", + "pallet-portfolio", + "pallet-timestamp", + "parity-scale-codec", + "polymesh-common-utilities", + "polymesh-primitives", + "polymesh-primitives-derive", + "scale-info", + "serde", + "serde_derive", + "sp-api", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", +] + +[[package]] +name = "pallet-election-provider-multi-phase" +version = "44.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "rand 0.8.5", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "strum 0.26.3", +] + +[[package]] +name = "pallet-external-agents" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-base", + "pallet-identity", + "pallet-permissions", + "parity-scale-codec", + "polymesh-primitives", + "polymesh-primitives-derive", + "scale-info", + "serde", + "serde_derive", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-grandpa" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-consensus-grandpa", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", +] + +[[package]] +name = "pallet-group" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-identity", + "pallet-permissions", + "pallet-timestamp", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "serde", + "serde_derive", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", +] + +[[package]] +name = "pallet-group-rpc" +version = "2.0.0" +dependencies = [ + "frame-support", + "frame-system", + "jsonrpsee", + "node-rpc", + "pallet-group-rpc-runtime-api", + "parity-scale-codec", + "polymesh-primitives", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-group-rpc-runtime-api" +version = "2.0.0" +dependencies = [ + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "serde", + "sp-api", + "sp-std", +] + +[[package]] +name = "pallet-identity" +version = "0.1.0" +dependencies = [ + "either", + "frame-benchmarking", + "frame-support", + "frame-system", + "hex", + "hex-literal 0.3.4", + "log", + "pallet-base", + "pallet-permissions", + "pallet-timestamp", + "parity-scale-codec", + "polymesh-common-utilities", + "polymesh-primitives", + "scale-info", + "schnorrkel", + "serde", + "serde_derive", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", +] + +[[package]] +name = "pallet-im-online" +version = "44.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-staking", +] + +[[package]] +name = "pallet-indices" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", +] + +[[package]] +name = "pallet-message-queue" +version = "48.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "environmental", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-weights", +] + +[[package]] +name = "pallet-mmr" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "log", + "parity-scale-codec", + "polkadot-sdk-frame", + "scale-info", + "sp-mmr-primitives", +] + +[[package]] +name = "pallet-multisig" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-identity", + "pallet-permissions", + "pallet-timestamp", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std", + "sp-version", +] + +[[package]] +name = "pallet-nft" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-asset", + "pallet-base", + "pallet-external-agents", + "pallet-identity", + "pallet-portfolio", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-offences" +version = "44.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-runtime", + "sp-staking", +] + +[[package]] +name = "pallet-permissions" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "serde", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-pips" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "pallet-base", + "pallet-committee", + "pallet-group", + "pallet-identity", + "pallet-permissions", + "pallet-timestamp", + "pallet-treasury", + "parity-scale-codec", + "polymesh-common-utilities", + "polymesh-primitives", + "polymesh-primitives-derive", + "polymesh-runtime-common", + "rand 0.8.5", + "rand_chacha 0.3.1", + "scale-info", + "serde", + "serde_derive", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", +] + +[[package]] +name = "pallet-portfolio" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-base", + "pallet-identity", + "pallet-permissions", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "serde", + "sp-arithmetic", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-preimage" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", +] + +[[package]] +name = "pallet-protocol-fee" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-identity", + "parity-scale-codec", + "polymesh-common-utilities", + "polymesh-primitives", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-protocol-fee-rpc" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "jsonrpsee", + "node-rpc", + "pallet-protocol-fee-rpc-runtime-api", + "parity-scale-codec", + "polymesh-common-utilities", + "polymesh-primitives", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-protocol-fee-rpc-runtime-api" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "polymesh-common-utilities", + "polymesh-primitives", + "scale-info", + "serde", + "sp-api", + "sp-runtime", +] + +[[package]] +name = "pallet-relayer" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-identity", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-revive" +version = "0.12.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "alloy-consensus", + "alloy-core", + "alloy-trie", + "derive_more 0.99.20", + "environmental", + "ethereum-standards", + "ethereum-types", + "frame-benchmarking", + "frame-support", + "frame-system", + "hex-literal 0.4.1", + "humantime-serde", + "impl-trait-for-tuples", + "k256", + "log", + "num-bigint", + "num-integer", + "num-traits", + "pallet-revive-fixtures", + "pallet-revive-proc-macro", + "pallet-revive-uapi", + "pallet-transaction-payment", + "parity-scale-codec", + "paste", + "polkavm", + "polkavm-common", + "rand 0.8.5", + "rand_pcg", + "revm", + "ripemd", + "rlp 0.6.1", + "scale-info", + "serde", + "serde_json", + "sp-api", + "sp-arithmetic", + "sp-consensus-aura", + "sp-consensus-babe", + "sp-consensus-slots", + "sp-core", + "sp-io", + "sp-runtime", + "sp-version", + "substrate-bn", + "subxt-signer", +] + +[[package]] +name = "pallet-revive-eth-rpc" +version = "0.12.0" +dependencies = [ + "anyhow", + "clap", + "env_logger", + "futures", + "git2", + "hex", + "jsonrpsee", + "log", + "pallet-revive", + "pallet-revive-fixtures", + "parity-scale-codec", + "polymesh", + "polymesh-runtime-develop", + "pretty_assertions", + "rlp 0.6.1", + "sc-cli", + "sc-rpc", + "sc-rpc-api", + "sc-service", + "serde", + "serde_json", + "sp-arithmetic", + "sp-core", + "sp-crypto-hashing", + "sp-io", + "sp-rpc", + "sp-runtime", + "sp-timestamp", + "sp-weights", + "sqlx", + "substrate-prometheus-endpoint", + "subxt", + "subxt-signer", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "pallet-revive-fixtures" +version = "0.9.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "alloy-core", + "anyhow", + "cargo_metadata", + "hex", + "pallet-revive-uapi", + "polkavm-linker", + "serde_json", + "sp-core", + "sp-io", + "toml 0.8.23", +] + +[[package]] +name = "pallet-revive-proc-macro" +version = "0.7.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "pallet-revive-uapi" +version = "0.10.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "alloy-core", + "bitflags 1.3.2", + "const-crypto", + "hex-literal 0.4.1", + "pallet-revive-proc-macro", + "parity-scale-codec", + "polkavm-derive", + "scale-info", +] + +[[package]] +name = "pallet-scheduler" +version = "46.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-weights", +] + +[[package]] +name = "pallet-session" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-balances", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-state-machine", + "sp-trie", +] + +[[package]] +name = "pallet-settlement" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "hex", + "hex-literal 0.2.2", + "log", + "pallet-asset", + "pallet-base", + "pallet-compliance-manager", + "pallet-external-agents", + "pallet-identity", + "pallet-nft", + "pallet-permissions", + "pallet-scheduler", + "pallet-timestamp", + "parity-scale-codec", + "polymesh-primitives", + "polymesh-primitives-derive", + "scale-info", + "serde", + "serde_derive", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", +] + +[[package]] +name = "pallet-staking" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "rand_chacha 0.3.1", + "scale-info", + "serde", + "sp-application-crypto", + "sp-io", + "sp-runtime", + "sp-staking", +] + +[[package]] +name = "pallet-staking-reward-curve" +version = "12.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "pallet-staking-runtime-api" +version = "30.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "parity-scale-codec", + "sp-api", + "sp-staking", +] + +[[package]] +name = "pallet-statistics" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "lazy_static", + "log", + "pallet-external-agents", + "pallet-identity", + "pallet-timestamp", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "serde", + "serde_derive", + "sp-api", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-sto" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-asset", + "pallet-balances", + "pallet-base", + "pallet-compliance-manager", + "pallet-external-agents", + "pallet-identity", + "pallet-permissions", + "pallet-portfolio", + "pallet-settlement", + "pallet-timestamp", + "parity-scale-codec", + "polymesh-primitives", + "polymesh-primitives-derive", + "scale-info", + "serde", + "serde_derive", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", +] + +[[package]] +name = "pallet-sudo" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", +] + +[[package]] +name = "pallet-timestamp" +version = "44.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-inherents", + "sp-runtime", + "sp-storage", + "sp-timestamp", +] + +[[package]] +name = "pallet-transaction-payment" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-io", + "sp-runtime", +] + +[[package]] +name = "pallet-treasury" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-balances", + "pallet-identity", + "pallet-permissions", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "serde", + "serde_derive", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", +] + +[[package]] +name = "pallet-utility" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-balances", + "pallet-identity", + "pallet-permissions", + "parity-scale-codec", + "polymesh-common-utilities", + "polymesh-primitives", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-validators" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-identity", + "pallet-session", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-timestamp", + "parity-scale-codec", + "polymesh-primitives", + "rand_chacha 0.2.2", + "rand_chacha 0.3.1", + "scale-info", + "serde", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "sp-staking", + "sp-std", + "sp-tracing", + "static_assertions", + "substrate-test-utils", +] + +[[package]] +name = "parity-db" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "592a28a24b09c9dc20ac8afaa6839abc417c720afe42c12e1e4a9d6aa2508d2e" +dependencies = [ + "blake2 0.10.6", + "crc32fast", + "fs2", + "hex", + "libc", + "log", + "lz4", + "memmap2 0.5.10", + "parking_lot 0.12.5", + "rand 0.8.5", + "siphasher 0.3.11", + "snap", + "winapi", +] + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec 0.7.6", + "bitvec", + "byte-slice-cast", + "bytes", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "parity-wasm" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.12", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "partial_sort" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7924d1d0ad836f665c9065e26d016c673ece3993f30d340068b16f282afc1156" + +[[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 2.6.1", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac 0.12.1", + "password-hash", +] + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pest" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f72981ade67b1ca6adc26ec221be9f463f2b5839c7508998daa17c23d94d7f" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee9efd8cdb50d719a80088b76f81aec7c41ed6d522ee750178f83883d271625" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "pest_meta" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf1d70880e76bdc13ba52eafa6239ce793d85c8e43896507e43dd8984ff05b82" +dependencies = [ + "pest", + "sha2 0.10.9", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset 0.4.2", + "indexmap 2.12.1", +] + +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset 0.5.7", + "indexmap 2.12.1", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.1", +] + +[[package]] +name = "picosimd" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af35c838647fef3d6d052e27006ef88ea162336eee33063c50a63f163c18cdeb" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "polkadot-ckb-merkle-mountain-range" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "221c71b432b38e494a0fdedb5f720e4cb974edf03a0af09e5b2238dbac7e6947" +dependencies = [ + "cfg-if", + "itertools 0.10.5", +] + +[[package]] +name = "polkadot-core-primitives" +version = "21.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "polkadot-node-metrics" +version = "28.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "bs58", + "futures", + "futures-timer", + "parity-scale-codec", + "polkadot-primitives", + "prioritized-metered-channel", + "sc-cli", + "sc-service", + "sc-tracing", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "polkadot-node-network-protocol" +version = "28.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "async-channel 1.9.0", + "async-trait", + "bitvec", + "derive_more 0.99.20", + "fatality", + "futures", + "hex", + "parity-scale-codec", + "polkadot-node-primitives", + "polkadot-primitives", + "rand 0.8.5", + "sc-authority-discovery", + "sc-network", + "sc-network-types", + "sp-runtime", + "strum 0.26.3", + "thiserror 1.0.69", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-primitives" +version = "23.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "bitvec", + "bounded-vec", + "futures", + "futures-timer", + "parity-scale-codec", + "polkadot-parachain-primitives", + "polkadot-primitives", + "sc-keystore", + "schnorrkel", + "serde", + "sp-application-crypto", + "sp-consensus-babe", + "sp-consensus-slots", + "sp-keystore", + "sp-maybe-compressed-blob", + "thiserror 1.0.69", + "zstd 0.12.4", +] + +[[package]] +name = "polkadot-node-subsystem-types" +version = "28.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "async-trait", + "derive_more 0.99.20", + "fatality", + "futures", + "orchestra", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-primitives", + "polkadot-statement-table", + "sc-client-api", + "sc-network", + "sc-network-types", + "sc-transaction-pool-api", + "smallvec", + "sp-api", + "sp-authority-discovery", + "sp-blockchain", + "sp-consensus-babe", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror 1.0.69", +] + +[[package]] +name = "polkadot-overseer" +version = "28.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "orchestra", + "polkadot-node-metrics", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem-types", + "polkadot-primitives", + "sc-client-api", + "sp-core", + "tikv-jemalloc-ctl", + "tracing-gum", +] + +[[package]] +name = "polkadot-parachain-primitives" +version = "20.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "array-bytes 6.2.3", + "bounded-collections", + "derive_more 0.99.20", + "parity-scale-codec", + "polkadot-core-primitives", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-weights", +] + +[[package]] +name = "polkadot-primitives" +version = "22.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "bitvec", + "bounded-collections", + "hex-literal 0.4.1", + "log", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-authority-discovery", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-staking", + "sp-std", + "thiserror 1.0.69", +] + +[[package]] +name = "polkadot-runtime-metrics" +version = "25.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "bs58", + "frame-benchmarking", + "parity-scale-codec", + "polkadot-primitives", + "sp-tracing", +] + +[[package]] +name = "polkadot-runtime-parachains" +version = "24.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "bitflags 1.3.2", + "bitvec", + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-broker", + "pallet-message-queue", + "pallet-mmr", + "pallet-session", + "pallet-staking", + "pallet-timestamp", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "polkadot-primitives", + "polkadot-runtime-metrics", + "rand 0.8.5", + "rand_chacha 0.3.1", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "staging-xcm", + "staging-xcm-executor", + "static_assertions", +] + +[[package]] +name = "polkadot-sdk-frame" +version = "0.14.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-arithmetic", + "sp-block-builder", + "sp-consensus-aura", + "sp-consensus-grandpa", + "sp-core", + "sp-genesis-builder", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-storage", + "sp-transaction-pool", + "sp-version", +] + +[[package]] +name = "polkadot-statement-table" +version = "23.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "parity-scale-codec", + "polkadot-primitives", + "tracing-gum", +] + +[[package]] +name = "polkavm" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4323d016144b2852da47cee55ca5fc33dfe7517be1f52395759f247ecc5695f6" +dependencies = [ + "libc", + "log", + "picosimd", + "polkavm-assembler", + "polkavm-common", + "polkavm-linux-raw", +] + +[[package]] +name = "polkavm-assembler" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a873fa7ace058d6507debf5fccb1d06bd3279f5b35dbaf70dc7fe94a6c415c" +dependencies = [ + "log", +] + +[[package]] +name = "polkavm-common" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed1b408db93d4f49f5c651a7844682b9d7a561827b4dc6202c10356076c055c9" +dependencies = [ + "blake3", + "log", + "picosimd", + "polkavm-assembler", +] + +[[package]] +name = "polkavm-derive" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acb4463fb0b9dbfafdc1d1a1183df4bf7afa3350d124f29d5700c6bee54556b5" +dependencies = [ + "polkavm-derive-impl-macro", +] + +[[package]] +name = "polkavm-derive-impl" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993ff45b972e09babe68adce7062c3c38a84b9f50f07b7caf393a023eaa6c74a" +dependencies = [ + "polkavm-common", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "polkavm-derive-impl-macro" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a4f5352e13c1ca5f0e4d7b4a804fbb85b0e02c45cae435d101fe71081bc8ed8" +dependencies = [ + "polkavm-derive-impl", + "syn 2.0.111", +] + +[[package]] +name = "polkavm-linker" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6739125c4f8f44b4282b6531d765d599f20514e9b608737c6c3544594d08f995" +dependencies = [ + "dirs", + "gimli 0.31.1", + "hashbrown 0.14.5", + "log", + "object 0.36.7", + "polkavm-common", + "regalloc2 0.9.3", + "rustc-demangle", +] + +[[package]] +name = "polkavm-linux-raw" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604b23cdb201979304449f53d21bfd5fb1724c03e3ea889067c9a3bf7ae33862" + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug 0.3.1", + "universal-hash", +] + +[[package]] +name = "polymesh" +version = "8.0.0" +dependencies = [ + "array-bytes 6.2.3", + "clap", + "frame-benchmarking", + "frame-benchmarking-cli", + "frame-metadata-hash-extension", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", + "futures", + "jsonrpsee", + "log", + "mmr-gadget", + "mmr-rpc", + "node-rpc", + "node-rpc-runtime-api", + "pallet-asset", + "pallet-babe", + "pallet-balances", + "pallet-committee", + "pallet-corporate-actions", + "pallet-external-agents", + "pallet-group", + "pallet-group-rpc", + "pallet-group-rpc-runtime-api", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-multisig", + "pallet-permissions", + "pallet-pips", + "pallet-protocol-fee", + "pallet-protocol-fee-rpc", + "pallet-protocol-fee-rpc-runtime-api", + "pallet-revive", + "pallet-session", + "pallet-staking", + "pallet-staking-runtime-api", + "pallet-sudo", + "pallet-transaction-payment", + "pallet-validators", + "parity-scale-codec", + "polymesh-common-utilities", + "polymesh-contracts", + "polymesh-node-rpc", + "polymesh-primitives", + "polymesh-runtime-common", + "polymesh-runtime-develop", + "polymesh-runtime-mainnet", + "polymesh-runtime-testnet", + "polymesh-transaction-payment", + "rustc-hex", + "sc-authority-discovery", + "sc-basic-authorship", + "sc-chain-spec", + "sc-cli", + "sc-client-api", + "sc-client-db", + "sc-consensus", + "sc-consensus-babe", + "sc-consensus-beefy", + "sc-consensus-grandpa", + "sc-consensus-slots", + "sc-executor", + "sc-network", + "sc-network-common", + "sc-network-sync", + "sc-offchain", + "sc-rpc", + "sc-service", + "sc-storage-monitor", + "sc-sync-state-rpc", + "sc-sysinfo", + "sc-telemetry", + "sc-transaction-pool", + "sc-transaction-pool-api", + "serde", + "serde_json", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-consensus-slots", + "sp-core", + "sp-genesis-builder", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-mmr-primitives", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-timestamp", + "sp-transaction-pool", + "sp-transaction-storage-proof", + "substrate-build-script-utils", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "polymesh-build-tool" +version = "0.1.0" +dependencies = [ + "substrate-wasm-builder", +] + +[[package]] +name = "polymesh-common-utilities" +version = "0.1.0" +dependencies = [ + "frame-support", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "serde", + "sp-core", + "sp-std", +] + +[[package]] +name = "polymesh-contracts" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-base", + "pallet-contracts", + "pallet-identity", + "pallet-permissions", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "wasm-instrument 0.3.0", +] + +[[package]] +name = "polymesh-exec-macro" +version = "1.0.0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "polymesh-node-rpc" +version = "0.1.0" +dependencies = [ + "jsonrpsee", + "mmr-gadget", + "mmr-rpc", + "node-rpc", + "pallet-group-rpc", + "pallet-protocol-fee-rpc", + "polymesh-primitives", + "sc-chain-spec", + "sc-client-api", + "sc-consensus-babe", + "sc-consensus-babe-rpc", + "sc-consensus-beefy", + "sc-consensus-beefy-rpc", + "sc-consensus-grandpa", + "sc-consensus-grandpa-rpc", + "sc-rpc", + "sc-rpc-api", + "sc-rpc-spec-v2", + "sc-sync-state-rpc", + "sc-transaction-pool-api", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-keystore", + "sp-runtime", + "substrate-frame-rpc-system", +] + +[[package]] +name = "polymesh-primitives" +version = "5.0.0" +dependencies = [ + "chrono", + "either", + "frame-support", + "frame-system", + "hex", + "libsecp256k1", + "log", + "parity-scale-codec", + "polymesh-primitives-derive", + "rand 0.8.5", + "rand_core 0.6.4", + "rustc-hex", + "scale-info", + "schnorrkel", + "serde", + "serde_bytes", + "serde_json", + "sp-application-crypto", + "sp-arithmetic", + "sp-core", + "sp-debug-derive", + "sp-io", + "sp-runtime", + "sp-runtime-interface", + "sp-std", + "sp-version", +] + +[[package]] +name = "polymesh-primitives-derive" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "polymesh-runtime-common" +version = "1.0.0" +dependencies = [ + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-balances", + "pallet-committee", + "pallet-election-provider-multi-phase", + "pallet-group-rpc-runtime-api", + "pallet-identity", + "pallet-multisig", + "pallet-relayer", + "pallet-transaction-payment", + "parity-scale-codec", + "polymesh-common-utilities", + "polymesh-primitives", + "smallvec", + "sp-genesis-builder", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] name = "polymesh-runtime-develop" version = "0.1.0" dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "getrandom 0.2.11", - "hex-literal 0.3.4", - "log", - "node-rpc-runtime-api", - "pallet-asset", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-balances 0.1.0", - "pallet-base", - "pallet-committee", - "pallet-compliance-manager", - "pallet-contracts", - "pallet-contracts-primitives", - "pallet-corporate-actions", - "pallet-election-provider-multi-phase", - "pallet-external-agents", - "pallet-grandpa", - "pallet-group", - "pallet-group-rpc-runtime-api", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-insecure-randomness-collective-flip", - "pallet-multisig", - "pallet-nft", - "pallet-offences", - "pallet-permissions", - "pallet-pips", - "pallet-portfolio", - "pallet-preimage", - "pallet-protocol-fee", - "pallet-protocol-fee-rpc-runtime-api", - "pallet-relayer", - "pallet-scheduler", - "pallet-session", - "pallet-settlement", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-staking-rpc-runtime-api", - "pallet-statistics", - "pallet-sto", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-treasury", - "pallet-utility", - "parity-scale-codec 3.6.9", - "polymesh-build-tool", - "polymesh-common-utilities", - "polymesh-contracts", - "polymesh-primitives", - "polymesh-runtime-common", - "polymesh-weights", - "scale-info", - "serde", - "sp-api", - "sp-arithmetic", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-grandpa", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", + "frame-benchmarking", + "frame-election-provider-support", + "frame-executive", + "frame-metadata-hash-extension", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "hex-literal 0.3.4", + "log", + "node-rpc-runtime-api", + "pallet-asset", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-base", + "pallet-beefy", + "pallet-beefy-mmr", + "pallet-committee", + "pallet-compliance-manager", + "pallet-contracts", + "pallet-corporate-actions", + "pallet-election-provider-multi-phase", + "pallet-external-agents", + "pallet-grandpa", + "pallet-group", + "pallet-group-rpc-runtime-api", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-mmr", + "pallet-multisig", + "pallet-nft", + "pallet-offences", + "pallet-permissions", + "pallet-pips", + "pallet-portfolio", + "pallet-preimage", + "pallet-protocol-fee", + "pallet-protocol-fee-rpc-runtime-api", + "pallet-relayer", + "pallet-revive", + "pallet-scheduler", + "pallet-session", + "pallet-settlement", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-staking-runtime-api", + "pallet-statistics", + "pallet-sto", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-treasury", + "pallet-utility", + "pallet-validators", + "parity-scale-codec", + "polymesh-build-tool", + "polymesh-common-utilities", + "polymesh-contracts", + "polymesh-primitives", + "polymesh-runtime-common", + "polymesh-stable-api-precompiles", + "polymesh-transaction-payment", + "polymesh-weights", + "scale-info", + "serde", + "sp-api", + "sp-arithmetic", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-consensus-grandpa", + "sp-core", + "sp-genesis-builder", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", +] + +[[package]] +name = "polymesh-runtime-mainnet" +version = "0.1.0" +dependencies = [ + "frame-election-provider-support", + "frame-executive", + "frame-metadata-hash-extension", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", + "log", + "node-rpc-runtime-api", + "pallet-asset", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-base", + "pallet-beefy", + "pallet-beefy-mmr", + "pallet-committee", + "pallet-compliance-manager", + "pallet-contracts", + "pallet-corporate-actions", + "pallet-election-provider-multi-phase", + "pallet-external-agents", + "pallet-grandpa", + "pallet-group", + "pallet-group-rpc-runtime-api", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-mmr", + "pallet-multisig", + "pallet-nft", + "pallet-offences", + "pallet-permissions", + "pallet-pips", + "pallet-portfolio", + "pallet-preimage", + "pallet-protocol-fee", + "pallet-protocol-fee-rpc-runtime-api", + "pallet-relayer", + "pallet-revive", + "pallet-scheduler", + "pallet-session", + "pallet-settlement", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-staking-runtime-api", + "pallet-statistics", + "pallet-sto", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-treasury", + "pallet-utility", + "pallet-validators", + "parity-scale-codec", + "polymesh-build-tool", + "polymesh-common-utilities", + "polymesh-contracts", + "polymesh-primitives", + "polymesh-runtime-common", + "polymesh-stable-api-precompiles", + "polymesh-transaction-payment", + "polymesh-weights", + "scale-info", + "serde", + "serde_derive", + "smallvec", + "sp-api", + "sp-arithmetic", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-consensus-grandpa", + "sp-core", + "sp-genesis-builder", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", +] + +[[package]] +name = "polymesh-runtime-testnet" +version = "0.1.0" +dependencies = [ + "frame-election-provider-support", + "frame-executive", + "frame-metadata-hash-extension", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", + "log", + "node-rpc-runtime-api", + "pallet-asset", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-base", + "pallet-beefy", + "pallet-beefy-mmr", + "pallet-committee", + "pallet-compliance-manager", + "pallet-contracts", + "pallet-corporate-actions", + "pallet-election-provider-multi-phase", + "pallet-external-agents", + "pallet-grandpa", + "pallet-group", + "pallet-group-rpc-runtime-api", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-mmr", + "pallet-multisig", + "pallet-nft", + "pallet-offences", + "pallet-permissions", + "pallet-pips", + "pallet-portfolio", + "pallet-preimage", + "pallet-protocol-fee", + "pallet-protocol-fee-rpc-runtime-api", + "pallet-relayer", + "pallet-revive", + "pallet-scheduler", + "pallet-session", + "pallet-settlement", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-staking-runtime-api", + "pallet-statistics", + "pallet-sto", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-treasury", + "pallet-utility", + "pallet-validators", + "parity-scale-codec", + "polymesh-build-tool", + "polymesh-common-utilities", + "polymesh-contracts", + "polymesh-primitives", + "polymesh-runtime-common", + "polymesh-stable-api-precompiles", + "polymesh-transaction-payment", + "polymesh-weights", + "scale-info", + "serde", + "serde_derive", + "smallvec", + "sp-api", + "sp-arithmetic", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-consensus-grandpa", + "sp-core", + "sp-genesis-builder", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", +] + +[[package]] +name = "polymesh-runtime-tests" +version = "1.0.0" +dependencies = [ + "chrono", + "frame-election-provider-support", + "frame-executive", + "frame-metadata-hash-extension", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", + "lazy_static", + "log", + "node-rpc-runtime-api", + "pallet-asset", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-base", + "pallet-beefy", + "pallet-beefy-mmr", + "pallet-committee", + "pallet-compliance-manager", + "pallet-contracts", + "pallet-corporate-actions", + "pallet-election-provider-multi-phase", + "pallet-external-agents", + "pallet-grandpa", + "pallet-group", + "pallet-group-rpc-runtime-api", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-mmr", + "pallet-multisig", + "pallet-nft", + "pallet-offences", + "pallet-permissions", + "pallet-pips", + "pallet-portfolio", + "pallet-preimage", + "pallet-protocol-fee", + "pallet-protocol-fee-rpc-runtime-api", + "pallet-relayer", + "pallet-revive", + "pallet-scheduler", + "pallet-session", + "pallet-settlement", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-staking-runtime-api", + "pallet-statistics", + "pallet-sto", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-treasury", + "pallet-utility", + "pallet-validators", + "parity-scale-codec", + "polymesh-common-utilities", + "polymesh-contracts", + "polymesh-exec-macro", + "polymesh-primitives", + "polymesh-runtime-common", + "polymesh-runtime-develop", + "polymesh-stable-api-precompiles", + "polymesh-transaction-payment", + "polymesh-weights", + "rand 0.8.5", + "scale-info", + "serde", + "sp-api", + "sp-arithmetic", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-consensus-beefy", + "sp-consensus-grandpa", + "sp-core", + "sp-genesis-builder", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-npos-elections", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-tracing", + "sp-transaction-pool", + "sp-version", + "substrate-test-utils", + "wat", +] + +[[package]] +name = "polymesh-stable-api-precompiles" +version = "0.1.0" +dependencies = [ + "log", + "pallet-asset", + "pallet-corporate-actions", + "pallet-identity", + "pallet-nft", + "pallet-portfolio", + "pallet-revive", + "pallet-settlement", + "polymesh-primitives", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "polymesh-transaction-payment" +version = "2.0.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-timestamp", + "pallet-transaction-payment", + "parity-scale-codec", + "polymesh-primitives", + "scale-info", + "serde", + "serde_json", + "sp-api", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "polymesh-weights" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "pallet-asset", + "pallet-babe", + "pallet-balances", + "pallet-committee", + "pallet-compliance-manager", + "pallet-contracts", + "pallet-corporate-actions", + "pallet-external-agents", + "pallet-grandpa", + "pallet-group", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-multisig", + "pallet-nft", + "pallet-pips", + "pallet-portfolio", + "pallet-preimage", + "pallet-protocol-fee", + "pallet-relayer", + "pallet-scheduler", + "pallet-session", + "pallet-settlement", + "pallet-staking", + "pallet-statistics", + "pallet-sto", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-treasury", + "pallet-utility", + "pallet-validators", + "polymesh-contracts", + "polymesh-primitives", + "polymesh-transaction-payment", + "sp-std", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug 0.3.1", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "predicates" +version = "3.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" +dependencies = [ + "anstyle", + "predicates-core", +] + +[[package]] +name = "predicates-core" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" + +[[package]] +name = "predicates-tree" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" +dependencies = [ + "predicates-core", + "termtree", +] + +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.111", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec 0.6.0", + "uint 0.9.5", +] + +[[package]] +name = "primitive-types" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d15600a7d856470b7d278b3fe0e311fe28c2526348549f8ef2ff7db3299c87f5" +dependencies = [ + "fixed-hash", + "impl-codec 0.7.1", + "impl-num-traits", + "impl-rlp", + "impl-serde", + "scale-info", + "uint 0.10.0", +] + +[[package]] +name = "prioritized-metered-channel" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a172e6cc603231f2cf004232eabcecccc0da53ba576ab286ef7baa0cfc7927ad" +dependencies = [ + "coarsetime", + "crossbeam-queue", + "derive_more 0.99.20", + "futures", + "futures-timer", + "nanorand", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "proc-macro-crate" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +dependencies = [ + "thiserror 1.0.69", + "toml 0.5.11", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit 0.23.9", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro-warning" +version = "1.84.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75eea531cfcd120e0851a3f8aed42c4841f78c889eefafd96339c72677ae42c3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prometheus" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "memchr", + "parking_lot 0.12.5", + "thiserror 1.0.69", +] + +[[package]] +name = "prometheus-client" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "504ee9ff529add891127c4827eb481bd69dc0ebc72e9a682e187db4caa60c3ca" +dependencies = [ + "dtoa", + "itoa", + "parking_lot 0.12.5", + "prometheus-client-derive-encode", +] + +[[package]] +name = "prometheus-client-derive-encode" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "proptest" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.10.0", + "num-traits", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive 0.12.6", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive 0.13.5", +] + +[[package]] +name = "prost" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" +dependencies = [ + "bytes", + "prost-derive 0.14.1", +] + +[[package]] +name = "prost-build" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +dependencies = [ + "heck 0.5.0", + "itertools 0.14.0", + "log", + "multimap", + "once_cell", + "petgraph 0.7.1", + "prettyplease", + "prost 0.13.5", + "prost-types 0.13.5", + "regex", + "syn 2.0.111", + "tempfile", +] + +[[package]] +name = "prost-build" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac6c3320f9abac597dcbc668774ef006702672474aad53c6d596b62e487b40b1" +dependencies = [ + "heck 0.5.0", + "itertools 0.14.0", + "log", + "multimap", + "once_cell", + "petgraph 0.7.1", + "prettyplease", + "prost 0.14.1", + "prost-types 0.14.1", + "regex", + "syn 2.0.111", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "prost-derive" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "prost-types" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +dependencies = [ + "prost 0.13.5", +] + +[[package]] +name = "prost-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9b4db3d6da204ed77bb26ba83b6122a73aeb2e87e25fbf7ad2e84c4ccbf8f72" +dependencies = [ + "prost 0.14.1", +] + +[[package]] +name = "pulley-interpreter" +version = "35.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b89c4319786b16c1a6a38ee04788d32c669b61ba4b69da2162c868c18be99c1b" +dependencies = [ + "cranelift-bitset", + "log", + "pulley-macros", + "wasmtime-internal-math", +] + +[[package]] +name = "pulley-macros" +version = "35.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "938543690519c20c3a480d20a8efcc8e69abeb44093ab1df4e7c1f81f26c677a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "quanta" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi", + "web-sys", + "winapi", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-protobuf" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" +dependencies = [ + "byteorder", +] + +[[package]] +name = "quick-protobuf-codec" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15a0580ab32b169745d7a39db2ba969226ca16738931be152a3209b409de2474" +dependencies = [ + "asynchronous-codec 0.7.0", + "bytes", + "quick-protobuf", + "thiserror 1.0.69", + "unsigned-varint 0.8.0", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases 0.2.1", + "futures-io", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.1", + "rustls", + "socket2 0.6.1", + "thiserror 2.0.17", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring 0.17.14", + "rustc-hash 2.1.1", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.17", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases 0.2.1", + "libc", + "once_cell", + "socket2 0.6.1", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "serde", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", + "serde", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "rand_pcg" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.3", +] + +[[package]] +name = "rapidhash" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2988730ee014541157f48ce4dcc603940e00915edc3c7f9a8d78092256bb2493" +dependencies = [ + "rustversion", +] + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rcgen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c4f3084aa3bc7dfbba4eff4fab2a54db4324965d8872ab933565e6fbd83bc6" +dependencies = [ + "pem", + "ring 0.16.20", + "time", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", ] [[package]] -name = "polymesh-runtime-mainnet" -version = "0.1.0" +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", - "lazy_static", - "log", - "node-rpc-runtime-api", - "pallet-asset", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-balances 0.1.0", - "pallet-base", - "pallet-committee", - "pallet-compliance-manager", - "pallet-contracts", - "pallet-contracts-primitives", - "pallet-corporate-actions", - "pallet-election-provider-multi-phase", - "pallet-external-agents", - "pallet-grandpa", - "pallet-group", - "pallet-group-rpc-runtime-api", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-insecure-randomness-collective-flip", - "pallet-multisig", - "pallet-nft", - "pallet-offences", - "pallet-permissions", - "pallet-pips", - "pallet-portfolio", - "pallet-preimage", - "pallet-protocol-fee", - "pallet-protocol-fee-rpc-runtime-api", - "pallet-relayer", - "pallet-scheduler", - "pallet-session", - "pallet-settlement", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-staking-rpc-runtime-api", - "pallet-statistics", - "pallet-sto", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-treasury", - "pallet-utility", - "parity-scale-codec 3.6.9", - "polymesh-build-tool", - "polymesh-common-utilities", - "polymesh-contracts", - "polymesh-primitives", - "polymesh-runtime-common", - "polymesh-weights", - "scale-info", - "serde", - "serde_derive", - "smallvec", - "sp-api", - "sp-arithmetic", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-grandpa", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", + "bitflags 2.10.0", ] [[package]] -name = "polymesh-runtime-testnet" -version = "0.1.0" +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", - "lazy_static", + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "regalloc2" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" +dependencies = [ + "hashbrown 0.13.2", "log", - "node-rpc-runtime-api", - "pallet-asset", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-balances 0.1.0", - "pallet-base", - "pallet-committee", - "pallet-compliance-manager", - "pallet-contracts", - "pallet-contracts-primitives", - "pallet-corporate-actions", - "pallet-election-provider-multi-phase", - "pallet-external-agents", - "pallet-grandpa", - "pallet-group", - "pallet-group-rpc-runtime-api", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-insecure-randomness-collective-flip", - "pallet-multisig", - "pallet-nft", - "pallet-offences", - "pallet-permissions", - "pallet-pips", - "pallet-portfolio", - "pallet-preimage", - "pallet-protocol-fee", - "pallet-protocol-fee-rpc-runtime-api", - "pallet-relayer", - "pallet-scheduler", - "pallet-session", - "pallet-settlement", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-staking-rpc-runtime-api", - "pallet-statistics", - "pallet-sto", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-treasury", - "pallet-utility", - "parity-scale-codec 3.6.9", - "polymesh-build-tool", - "polymesh-common-utilities", - "polymesh-contracts", - "polymesh-primitives", - "polymesh-runtime-common", - "polymesh-weights", - "scale-info", - "serde", - "serde_derive", - "smallvec", - "sp-api", - "sp-arithmetic", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-grandpa", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", + "rustc-hash 1.1.0", + "slice-group-by", + "smallvec", ] [[package]] -name = "polymesh-runtime-tests" -version = "1.0.0" +name = "regalloc2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5216b1837de2149f8bc8e6d5f88a9326b63b8c836ed58ce4a0a29ec736a59734" dependencies = [ - "chrono", - "env_logger 0.7.1", - "frame-benchmarking", - "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", - "hex-literal 0.3.4", - "ink_primitives", - "lazy_static", - "libsecp256k1", + "allocator-api2", + "bumpalo", + "hashbrown 0.15.5", "log", - "node-rpc-runtime-api", - "pallet-asset", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-balances 0.1.0", - "pallet-base", - "pallet-committee", - "pallet-compliance-manager", - "pallet-contracts", - "pallet-contracts-primitives", - "pallet-corporate-actions", - "pallet-election-provider-multi-phase", - "pallet-external-agents", - "pallet-grandpa", - "pallet-group", - "pallet-group-rpc-runtime-api", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-insecure-randomness-collective-flip", - "pallet-multisig", - "pallet-nft", - "pallet-offences", - "pallet-permissions", - "pallet-pips", - "pallet-portfolio", - "pallet-preimage", - "pallet-protocol-fee", - "pallet-protocol-fee-rpc-runtime-api", - "pallet-relayer", - "pallet-scheduler", - "pallet-session", - "pallet-settlement", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-staking-rpc-runtime-api", - "pallet-statistics", - "pallet-sto", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-treasury", - "pallet-utility", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "polymesh-common-utilities", - "polymesh-contracts", - "polymesh-exec-macro", - "polymesh-primitives", - "polymesh-runtime-common", - "polymesh-runtime-develop", - "polymesh-weights", - "rand 0.7.3", - "scale-info", - "serde", - "serde_json", + "rustc-hash 2.1.1", "smallvec", - "sp-api", - "sp-arithmetic", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-grandpa", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keyring", - "sp-npos-elections", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-tracing", - "sp-transaction-pool", - "sp-version", - "substrate-test-utils", - "wat", ] [[package]] -name = "polymesh-weights" -version = "0.1.0" +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ - "frame-support", - "frame-system", - "pallet-asset", - "pallet-babe", - "pallet-balances 0.1.0", - "pallet-committee", - "pallet-compliance-manager", - "pallet-contracts", - "pallet-corporate-actions", - "pallet-external-agents", - "pallet-grandpa", - "pallet-group", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-multisig", - "pallet-nft", - "pallet-pips", - "pallet-portfolio", - "pallet-preimage", - "pallet-protocol-fee", - "pallet-relayer", - "pallet-scheduler", - "pallet-session", - "pallet-settlement", - "pallet-staking", - "pallet-statistics", - "pallet-sto", - "pallet-timestamp", - "pallet-treasury", - "pallet-utility", - "polymesh-contracts", - "polymesh-primitives", - "sp-std", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] -name = "polyval" -version = "0.5.3" +name = "regex-automata" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "opaque-debug 0.3.0", - "universal-hash 0.4.1", + "aho-corasick", + "memchr", + "regex-syntax", ] [[package]] -name = "polyval" -version = "0.6.1" +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "resolv-conf" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" + +[[package]] +name = "revm" +version = "27.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" +checksum = "5e6bf82101a1ad8a2b637363a37aef27f88b4efc8a6e24c72bf5f64923dc5532" dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "opaque-debug 0.3.0", - "universal-hash 0.5.1", + "revm-bytecode", + "revm-context", + "revm-context-interface", + "revm-database", + "revm-database-interface", + "revm-handler", + "revm-inspector", + "revm-interpreter", + "revm-precompile", + "revm-primitives", + "revm-state", ] [[package]] -name = "powerfmt" -version = "0.2.0" +name = "revm-bytecode" +version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "66c52031b73cae95d84cd1b07725808b5fd1500da3e5e24574a3b2dc13d9f16d" +dependencies = [ + "bitvec", + "phf", + "revm-primitives", + "serde", +] [[package]] -name = "ppv-lite86" -version = "0.2.17" +name = "revm-context" +version = "8.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "9cd508416a35a4d8a9feaf5ccd06ac6d6661cd31ee2dc0252f9f7316455d71f9" +dependencies = [ + "cfg-if", + "derive-where", + "revm-bytecode", + "revm-context-interface", + "revm-database-interface", + "revm-primitives", + "revm-state", + "serde", +] [[package]] -name = "predicates" -version = "2.1.5" +name = "revm-context-interface" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +checksum = "dc90302642d21c8f93e0876e201f3c5f7913c4fcb66fb465b0fd7b707dfe1c79" dependencies = [ - "difflib", - "float-cmp", - "itertools", - "normalize-line-endings", - "predicates-core", - "regex", + "alloy-eip2930", + "alloy-eip7702", + "auto_impl", + "either", + "revm-database-interface", + "revm-primitives", + "revm-state", + "serde", ] [[package]] -name = "predicates-core" -version = "1.0.6" +name = "revm-database" +version = "7.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" +checksum = "39a276ed142b4718dcf64bc9624f474373ed82ef20611025045c3fb23edbef9c" +dependencies = [ + "alloy-eips", + "revm-bytecode", + "revm-database-interface", + "revm-primitives", + "revm-state", + "serde", +] [[package]] -name = "predicates-tree" -version = "1.0.9" +name = "revm-database-interface" +version = "7.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +checksum = "8c523c77e74eeedbac5d6f7c092e3851dbe9c7fec6f418b85992bd79229db361" dependencies = [ - "predicates-core", - "termtree", + "auto_impl", + "either", + "revm-primitives", + "revm-state", + "serde", ] [[package]] -name = "prettyplease" -version = "0.1.25" +name = "revm-handler" +version = "8.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +checksum = "1529c8050e663be64010e80ec92bf480315d21b1f2dbf65540028653a621b27d" dependencies = [ - "proc-macro2", - "syn 1.0.109", + "auto_impl", + "derive-where", + "revm-bytecode", + "revm-context", + "revm-context-interface", + "revm-database-interface", + "revm-interpreter", + "revm-precompile", + "revm-primitives", + "revm-state", + "serde", ] [[package]] -name = "primitive-types" -version = "0.12.2" +name = "revm-inspector" +version = "8.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +checksum = "f78db140e332489094ef314eaeb0bd1849d6d01172c113ab0eb6ea8ab9372926" dependencies = [ - "fixed-hash", - "impl-codec", - "impl-serde", - "scale-info", - "uint", + "auto_impl", + "either", + "revm-context", + "revm-database-interface", + "revm-handler", + "revm-interpreter", + "revm-primitives", + "revm-state", + "serde", + "serde_json", ] [[package]] -name = "proc-macro-crate" -version = "0.1.5" +name = "revm-interpreter" +version = "24.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff9d7d9d71e8a33740b277b602165b6e3d25fff091ba3d7b5a8d373bf55f28a7" +dependencies = [ + "revm-bytecode", + "revm-context-interface", + "revm-primitives", + "serde", +] + +[[package]] +name = "revm-precompile" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +checksum = "4cee3f336b83621294b4cfe84d817e3eef6f3d0fce00951973364cc7f860424d" dependencies = [ - "toml", + "ark-bls12-381 0.5.0", + "ark-bn254", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "arrayref", + "aurora-engine-modexp", + "c-kzg", + "cfg-if", + "k256", + "libsecp256k1", + "once_cell", + "p256", + "revm-primitives", + "ripemd", + "rug", + "secp256k1 0.31.1", + "sha2 0.10.9", ] [[package]] -name = "proc-macro-crate" -version = "1.1.3" +name = "revm-primitives" +version = "20.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +checksum = "5aa29d9da06fe03b249b6419b33968ecdf92ad6428e2f012dc57bcd619b5d94e" dependencies = [ - "thiserror", - "toml", + "alloy-primitives", + "num_enum", + "once_cell", + "serde", ] [[package]] -name = "proc-macro-crate" -version = "2.0.1" +name = "revm-state" +version = "7.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a" +checksum = "1f64fbacb86008394aaebd3454f9643b7d5a782bd251135e17c5b33da592d84d" dependencies = [ - "toml_datetime", - "toml_edit", + "bitflags 2.10.0", + "revm-bytecode", + "revm-primitives", + "serde", ] [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "rfc6979" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", + "hmac 0.12.1", + "subtle 2.6.1", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "ring" +version = "0.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" dependencies = [ - "proc-macro2", - "quote", - "version_check", + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", ] [[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.7", +] [[package]] -name = "proc-macro2" -version = "1.0.70" +name = "rlp" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ - "unicode-ident", + "bytes", + "rustc-hex", ] [[package]] -name = "prometheus" -version = "0.13.3" +name = "rlp" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" +checksum = "fa24e92bb2a83198bb76d661a71df9f7076b8c420b8696e4d3d97d50d94479e3" dependencies = [ - "cfg-if 1.0.0", - "fnv", - "lazy_static", - "memchr", - "parking_lot 0.12.1", - "thiserror", + "bytes", + "rustc-hex", ] [[package]] -name = "prometheus-client" -version = "0.18.1" +name = "rocksdb" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83cd1b99916654a69008fd66b4f9397fbe08e6e51dfe23d4417acf5d3b8cb87c" +checksum = "ddb7af00d2b17dbd07d82c0063e25411959748ff03e8d4f96134c2ff41fce34f" dependencies = [ - "dtoa", - "itoa", - "parking_lot 0.12.1", - "prometheus-client-derive-text-encode", + "libc", + "librocksdb-sys", ] [[package]] -name = "prometheus-client-derive-text-encode" -version = "0.3.0" +name = "route-recognizer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" + +[[package]] +name = "rpassword" +version = "7.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a455fbcb954c1a7decf3c586e860fd7889cddf4b8e164be736dbac95a953cd" +checksum = "66d4c8b64f049c6721ec8ccec37ddfc3d641c4a7fca57e8f2a89de509c73df39" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "libc", + "rtoolbox", + "windows-sys 0.59.0", ] [[package]] -name = "prost" -version = "0.11.9" +name = "rsa" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ - "bytes", - "prost-derive", + "const-oid", + "digest 0.10.7", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle 2.6.1", + "zeroize", ] [[package]] -name = "prost-build" -version = "0.11.9" +name = "rtnetlink" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +checksum = "7a552eb82d19f38c3beed3f786bd23aa434ceb9ac43ab44419ca6d67a7e186c0" dependencies = [ - "bytes", - "heck", - "itertools", - "lazy_static", + "futures", "log", - "multimap", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn 1.0.109", - "tempfile", - "which", + "netlink-packet-core", + "netlink-packet-route", + "netlink-packet-utils", + "netlink-proto", + "netlink-sys", + "nix", + "thiserror 1.0.69", + "tokio", ] [[package]] -name = "prost-codec" -version = "0.3.0" +name = "rtoolbox" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc34979ff898b6e141106178981ce2596c387ea6e62533facfc61a37fc879c0" +checksum = "a7cc970b249fbe527d6e02e0a227762c9108b2f49d81094fe357ffc6d14d7f6f" dependencies = [ - "asynchronous-codec", - "bytes", - "prost", - "thiserror", - "unsigned-varint", + "libc", + "windows-sys 0.52.0", ] [[package]] -name = "prost-derive" -version = "0.11.9" +name = "rug" +version = "1.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +checksum = "58ad2e973fe3c3214251a840a621812a4f40468da814b1a3d6947d433c2af11f" dependencies = [ - "anyhow", - "itertools", - "proc-macro2", - "quote", - "syn 1.0.109", + "az", + "gmp-mpfr-sys", + "libc", + "libm", ] [[package]] -name = "prost-types" -version = "0.11.9" +name = "ruint" +version = "1.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" dependencies = [ - "prost", + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "ark-ff 0.5.0", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types 0.12.2", + "proptest", + "rand 0.8.5", + "rand 0.9.2", + "rlp 0.5.2", + "ruint-macro", + "serde_core", + "valuable", + "zeroize", ] [[package]] -name = "psm" -version = "0.1.21" +name = "ruint-macro" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" -dependencies = [ - "cc", -] +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] -name = "quick-error" -version = "1.2.3" +name = "rustc-demangle" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] -name = "quick-protobuf" -version = "0.8.1" +name = "rustc-hash" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" -dependencies = [ - "byteorder", -] +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] -name = "quicksink" -version = "0.1.2" +name = "rustc-hash" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77de3c815e5a160b1539c6592796801df2043ae35e123b46d73380cfa57af858" -dependencies = [ - "futures-core", - "futures-sink", - "pin-project-lite 0.1.12", -] +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] -name = "quinn-proto" -version = "0.9.6" +name = "rustc-hex" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b0b33c13a79f669c85defaf4c275dc86a0c0372807d0ca3d78e0bb87274863" -dependencies = [ - "bytes", - "rand 0.8.5", - "ring 0.16.20", - "rustc-hash", - "rustls 0.20.9", - "slab", - "thiserror", - "tinyvec", - "tracing", - "webpki 0.22.4", -] +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" [[package]] -name = "quote" -version = "1.0.33" +name = "rustc_version" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" dependencies = [ - "proc-macro2", + "semver 0.11.0", ] [[package]] -name = "r-efi" -version = "5.2.0" +name = "rustc_version" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.27", +] [[package]] -name = "radium" -version = "0.3.0" +name = "rusticata-macros" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom 7.1.3", +] [[package]] -name = "radium" -version = "0.7.0" +name = "rustix" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] [[package]] -name = "rand" -version = "0.7.3" +name = "rustix" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "getrandom 0.1.16", + "bitflags 2.10.0", + "errno", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", ] [[package]] -name = "rand" -version = "0.8.5" +name = "rustls" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "log", + "once_cell", + "ring 0.17.14", + "rustls-pki-types", + "rustls-webpki 0.103.8", + "subtle 2.6.1", + "zeroize", ] [[package]] -name = "rand_chacha" -version = "0.2.2" +name = "rustls-native-certs" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", ] [[package]] -name = "rand_chacha" -version = "0.3.1" +name = "rustls-pki-types" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", + "web-time", + "zeroize", ] [[package]] -name = "rand_core" -version = "0.5.1" +name = "rustls-platform-verifier" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" dependencies = [ - "getrandom 0.1.16", + "core-foundation 0.10.1", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki 0.103.8", + "security-framework", + "security-framework-sys", + "webpki-root-certs 0.26.11", + "windows-sys 0.59.0", ] [[package]] -name = "rand_core" -version = "0.6.4" +name = "rustls-platform-verifier-android" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "getrandom 0.2.11", + "ring 0.17.14", + "untrusted 0.9.0", ] [[package]] -name = "rand_hc" -version = "0.2.0" +name = "rustls-webpki" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ - "rand_core 0.5.1", + "ring 0.17.14", + "rustls-pki-types", + "untrusted 0.9.0", ] [[package]] -name = "rand_pcg" +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "rusty-fork" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" dependencies = [ - "rand_core 0.6.4", + "fnv", + "quick-error", + "tempfile", + "wait-timeout", ] [[package]] -name = "rawpointer" -version = "0.2.1" +name = "ruzstd" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" +checksum = "e5ff0cc5e135c8870a775d3320910cd9b564ec036b4dc0b8741629020be63f01" [[package]] -name = "rayon" -version = "1.8.0" +name = "rw-stream-sink" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "d8c9026ff5d2f23da5e45bbc283f156383001bfb09c4e44256d02c1a685fe9a1" dependencies = [ - "either", - "rayon-core", + "futures", + "pin-project", + "static_assertions", ] [[package]] -name = "rayon-core" -version = "1.12.0" +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "safe_arch" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "bytemuck", ] [[package]] -name = "rcgen" -version = "0.9.3" +name = "salsa20" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" dependencies = [ - "pem", - "ring 0.16.20", - "time", - "x509-parser 0.13.2", - "yasna", + "cipher 0.4.4", ] [[package]] -name = "rcgen" -version = "0.10.0" +name = "same-file" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ - "pem", - "ring 0.16.20", - "time", - "yasna", + "winapi-util", +] + +[[package]] +name = "sc-allocator" +version = "35.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "log", + "sp-core", + "sp-wasm-interface", + "thiserror 1.0.69", ] [[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +name = "sc-authority-discovery" +version = "0.55.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "bitflags 1.3.2", + "async-trait", + "futures", + "futures-timer", + "ip_network", + "linked_hash_set", + "log", + "parity-scale-codec", + "prost 0.12.6", + "prost-build 0.13.5", + "rand 0.8.5", + "sc-client-api", + "sc-network", + "sc-network-types", + "sc-service", + "serde", + "serde_json", + "sp-api", + "sp-authority-discovery", + "sp-blockchain", + "sp-core", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror 1.0.69", + "tokio", ] [[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +name = "sc-basic-authorship" +version = "0.53.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "bitflags 1.3.2", + "futures", + "log", + "parity-scale-codec", + "sc-block-builder", + "sc-proposer-metrics", + "sc-telemetry", + "sc-transaction-pool-api", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-trie", + "substrate-prometheus-endpoint", ] [[package]] -name = "redox_users" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +name = "sc-block-builder" +version = "0.48.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "getrandom 0.2.11", - "libredox", - "thiserror", + "parity-scale-codec", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-trie", ] [[package]] -name = "ref-cast" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acde58d073e9c79da00f2b5b84eed919c8326832648a5b109b3fce1bb1175280" +name = "sc-chain-spec" +version = "48.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "ref-cast-impl", + "array-bytes 6.2.3", + "docify", + "memmap2 0.9.9", + "parity-scale-codec", + "sc-chain-spec-derive", + "sc-client-api", + "sc-executor", + "sc-network", + "sc-telemetry", + "serde", + "serde_json", + "sp-blockchain", + "sp-core", + "sp-crypto-hashing", + "sp-genesis-builder", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-tracing", ] [[package]] -name = "ref-cast-impl" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" +name = "sc-chain-spec-derive" +version = "12.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.111", ] [[package]] -name = "regalloc2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" +name = "sc-cli" +version = "0.57.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "fxhash", + "array-bytes 6.2.3", + "bip39", + "chrono", + "clap", + "fdlimit", + "futures", + "itertools 0.11.0", + "libp2p-identity", "log", - "slice-group-by", - "smallvec", + "names", + "parity-scale-codec", + "rand 0.8.5", + "regex", + "rpassword", + "sc-client-api", + "sc-client-db", + "sc-keystore", + "sc-mixnet", + "sc-network", + "sc-service", + "sc-telemetry", + "sc-tracing", + "sc-transaction-pool", + "sc-utils", + "serde", + "serde_json", + "sp-blockchain", + "sp-core", + "sp-keyring", + "sp-keystore", + "sp-panic-handler", + "sp-runtime", + "sp-version", + "thiserror 1.0.69", + "tokio", ] [[package]] -name = "regex" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +name = "sc-client-api" +version = "44.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "fnv", + "futures", + "log", + "parity-scale-codec", + "parking_lot 0.12.5", + "sc-executor", + "sc-transaction-pool-api", + "sc-utils", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-database", + "sp-externalities", + "sp-runtime", + "sp-state-machine", + "sp-storage", + "sp-trie", + "substrate-prometheus-endpoint", ] [[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +name = "sc-client-db" +version = "0.51.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "regex-syntax 0.6.29", + "hash-db", + "kvdb", + "kvdb-memorydb", + "kvdb-rocksdb", + "linked-hash-map", + "log", + "parity-db", + "parity-scale-codec", + "parking_lot 0.12.5", + "sc-client-api", + "sc-state-db", + "schnellru", + "sp-arithmetic", + "sp-blockchain", + "sp-core", + "sp-database", + "sp-runtime", + "sp-state-machine", + "sp-trie", + "substrate-prometheus-endpoint", + "sysinfo", ] [[package]] -name = "regex-automata" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +name = "sc-consensus" +version = "0.54.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.2", + "async-trait", + "futures", + "log", + "mockall", + "parking_lot 0.12.5", + "sc-client-api", + "sc-network-types", + "sc-utils", + "serde", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "sp-state-machine", + "substrate-prometheus-endpoint", + "thiserror 1.0.69", ] [[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +name = "sc-consensus-babe" +version = "0.55.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "async-trait", + "fork-tree", + "futures", + "log", + "num-bigint", + "num-rational", + "num-traits", + "parity-scale-codec", + "parking_lot 0.12.5", + "sc-client-api", + "sc-consensus", + "sc-consensus-epochs", + "sc-consensus-slots", + "sc-telemetry", + "sc-transaction-pool-api", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-consensus-slots", + "sp-core", + "sp-crypto-hashing", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-timestamp", + "substrate-prometheus-endpoint", + "thiserror 1.0.69", +] [[package]] -name = "regex-syntax" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +name = "sc-consensus-babe-rpc" +version = "0.55.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "futures", + "jsonrpsee", + "sc-consensus-babe", + "sc-consensus-epochs", + "sc-rpc-api", + "serde", + "sp-api", + "sp-application-crypto", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-keystore", + "sp-runtime", + "thiserror 1.0.69", +] [[package]] -name = "region" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" +name = "sc-consensus-beefy" +version = "34.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "bitflags 1.3.2", - "libc", - "mach", - "winapi", + "array-bytes 6.2.3", + "async-channel 1.9.0", + "async-trait", + "futures", + "log", + "parity-scale-codec", + "parking_lot 0.12.5", + "sc-client-api", + "sc-consensus", + "sc-network", + "sc-network-gossip", + "sc-network-sync", + "sc-network-types", + "sc-utils", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-beefy", + "sp-core", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror 1.0.69", + "tokio", + "wasm-timer", ] [[package]] -name = "resolv-conf" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +name = "sc-consensus-beefy-rpc" +version = "34.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "hostname", - "quick-error", + "futures", + "jsonrpsee", + "log", + "parity-scale-codec", + "parking_lot 0.12.5", + "sc-consensus-beefy", + "sc-rpc", + "serde", + "sp-application-crypto", + "sp-consensus-beefy", + "sp-core", + "sp-runtime", + "thiserror 1.0.69", ] [[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +name = "sc-consensus-epochs" +version = "0.54.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "crypto-bigint", - "hmac 0.12.1", - "zeroize", + "fork-tree", + "parity-scale-codec", + "sc-client-api", + "sc-consensus", + "sp-blockchain", + "sp-runtime", ] [[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +name = "sc-consensus-grandpa" +version = "0.40.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", + "ahash 0.8.12", + "array-bytes 6.2.3", + "async-trait", + "dyn-clone", + "finality-grandpa", + "fork-tree", + "futures", + "futures-timer", + "log", + "parity-scale-codec", + "parking_lot 0.12.5", + "rand 0.8.5", + "sc-block-builder", + "sc-chain-spec", + "sc-client-api", + "sc-consensus", + "sc-network", + "sc-network-common", + "sc-network-gossip", + "sc-network-sync", + "sc-network-types", + "sc-telemetry", + "sc-transaction-pool-api", + "sc-utils", + "serde_json", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-grandpa", + "sp-core", + "sp-crypto-hashing", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror 1.0.69", ] [[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +name = "sc-consensus-grandpa-rpc" +version = "0.40.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "cc", - "cfg-if 1.0.0", - "getrandom 0.2.11", - "libc", - "untrusted 0.9.0", - "windows-sys 0.52.0", + "finality-grandpa", + "futures", + "jsonrpsee", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-consensus-grandpa", + "sc-rpc", + "serde", + "sp-blockchain", + "sp-core", + "sp-runtime", + "thiserror 1.0.69", ] [[package]] -name = "rocksdb" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9562ea1d70c0cc63a34a22d977753b50cca91cc6b6527750463bd5dd8697bc" +name = "sc-consensus-slots" +version = "0.54.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "libc", - "librocksdb-sys", + "async-trait", + "futures", + "futures-timer", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-consensus", + "sc-telemetry", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", ] [[package]] -name = "rpassword" -version = "7.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" +name = "sc-executor" +version = "0.47.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "libc", - "rtoolbox", - "windows-sys 0.48.0", + "parity-scale-codec", + "parking_lot 0.12.5", + "sc-executor-common", + "sc-executor-polkavm", + "sc-executor-wasmtime", + "schnellru", + "sp-api", + "sp-core", + "sp-externalities", + "sp-io", + "sp-panic-handler", + "sp-runtime-interface", + "sp-trie", + "sp-version", + "sp-wasm-interface", + "tracing", ] [[package]] -name = "rtcp" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1919efd6d4a6a85d13388f9487549bb8e359f17198cc03ffd72f79b553873691" +name = "sc-executor-common" +version = "0.43.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "bytes", - "thiserror", - "webrtc-util", + "polkavm", + "sc-allocator", + "sp-maybe-compressed-blob", + "sp-wasm-interface", + "thiserror 1.0.69", + "wasm-instrument 0.4.0", ] [[package]] -name = "rtnetlink" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" +name = "sc-executor-polkavm" +version = "0.40.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "futures", "log", - "netlink-packet-route", - "netlink-proto", - "nix", - "thiserror", - "tokio", + "polkavm", + "sc-executor-common", + "sp-wasm-interface", ] [[package]] -name = "rtoolbox" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +name = "sc-executor-wasmtime" +version = "0.43.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "libc", - "windows-sys 0.48.0", + "anyhow", + "log", + "parking_lot 0.12.5", + "rustix 1.1.2", + "sc-allocator", + "sc-executor-common", + "sp-runtime-interface", + "sp-wasm-interface", + "wasmtime", ] [[package]] -name = "rtp" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a095411ff00eed7b12e4c6a118ba984d113e1079582570d56a5ee723f11f80" +name = "sc-informant" +version = "0.54.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "async-trait", - "bytes", - "rand 0.8.5", - "serde", - "thiserror", - "webrtc-util", + "console", + "futures", + "futures-timer", + "log", + "sc-client-api", + "sc-network", + "sc-network-sync", + "sp-blockchain", + "sp-runtime", ] [[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc-hash" -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.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +name = "sc-keystore" +version = "39.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "semver 0.9.0", + "array-bytes 6.2.3", + "parking_lot 0.12.5", + "serde_json", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "thiserror 1.0.69", ] [[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +name = "sc-mixnet" +version = "0.25.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "semver 1.0.20", + "array-bytes 6.2.3", + "arrayvec 0.7.6", + "blake2 0.10.6", + "bytes", + "futures", + "futures-timer", + "log", + "mixnet", + "parity-scale-codec", + "parking_lot 0.12.5", + "sc-client-api", + "sc-network", + "sc-network-types", + "sc-transaction-pool-api", + "sp-api", + "sp-consensus", + "sp-core", + "sp-keystore", + "sp-mixnet", + "sp-runtime", + "thiserror 1.0.69", ] [[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +name = "sc-network" +version = "0.55.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "nom", + "array-bytes 6.2.3", + "async-channel 1.9.0", + "async-trait", + "asynchronous-codec 0.6.2", + "bytes", + "either", + "fnv", + "futures", + "futures-timer", + "ip_network", + "libp2p", + "linked_hash_set", + "litep2p", + "log", + "mockall", + "parity-scale-codec", + "parking_lot 0.12.5", + "partial_sort", + "pin-project", + "prost 0.12.6", + "prost-build 0.13.5", + "rand 0.8.5", + "sc-client-api", + "sc-network-common", + "sc-network-types", + "sc-utils", + "schnellru", + "serde", + "serde_json", + "smallvec", + "sp-arithmetic", + "sp-blockchain", + "sp-core", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror 1.0.69", + "tokio", + "tokio-stream", + "unsigned-varint 0.7.2", + "void", + "wasm-timer", + "zeroize", ] [[package]] -name = "rustix" -version = "0.36.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305efbd14fde4139eb501df5f136994bb520b033fa9fbdce287507dc23b8c7ed" +name = "sc-network-common" +version = "0.52.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.1.4", - "windows-sys 0.45.0", + "parity-scale-codec", + "sp-runtime", ] [[package]] -name = "rustix" -version = "0.38.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +name = "sc-network-gossip" +version = "0.55.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "bitflags 2.4.1", - "errno", - "libc", - "linux-raw-sys 0.4.12", - "windows-sys 0.52.0", + "ahash 0.8.12", + "futures", + "futures-timer", + "log", + "sc-network", + "sc-network-common", + "sc-network-sync", + "sc-network-types", + "schnellru", + "sp-runtime", + "substrate-prometheus-endpoint", + "tracing", ] [[package]] -name = "rustls" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +name = "sc-network-light" +version = "0.54.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "base64 0.13.1", + "array-bytes 6.2.3", + "async-channel 1.9.0", + "futures", "log", - "ring 0.16.20", - "sct 0.6.1", - "webpki 0.21.4", + "parity-scale-codec", + "prost 0.12.6", + "prost-build 0.13.5", + "sc-client-api", + "sc-network", + "sc-network-types", + "sp-blockchain", + "sp-core", + "sp-runtime", + "thiserror 1.0.69", ] [[package]] -name = "rustls" -version = "0.20.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" +name = "sc-network-sync" +version = "0.54.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ + "array-bytes 6.2.3", + "async-channel 1.9.0", + "async-trait", + "fork-tree", + "futures", "log", - "ring 0.16.20", - "sct 0.7.1", - "webpki 0.22.4", + "mockall", + "parity-scale-codec", + "prost 0.12.6", + "prost-build 0.13.5", + "sc-client-api", + "sc-consensus", + "sc-network", + "sc-network-common", + "sc-network-types", + "sc-utils", + "schnellru", + "smallvec", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror 1.0.69", + "tokio", + "tokio-stream", ] [[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +name = "sc-network-transactions" +version = "0.54.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "openssl-probe", - "rustls-pemfile", - "schannel", - "security-framework", + "array-bytes 6.2.3", + "futures", + "log", + "parity-scale-codec", + "sc-network", + "sc-network-common", + "sc-network-sync", + "sc-network-types", + "sc-utils", + "sp-consensus", + "sp-runtime", + "substrate-prometheus-endpoint", ] [[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +name = "sc-network-types" +version = "0.20.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "base64 0.21.5", + "bs58", + "bytes", + "ed25519-dalek", + "libp2p-identity", + "libp2p-kad", + "litep2p", + "log", + "multiaddr 0.18.2", + "multihash 0.19.3", + "rand 0.8.5", + "serde", + "serde_with", + "thiserror 1.0.69", + "zeroize", ] [[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "rw-stream-sink" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26338f5e09bb721b85b135ea05af7767c90b52f6de4f087d4f4a3a9d64e7dc04" +name = "sc-offchain" +version = "50.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ + "bytes", + "fnv", "futures", - "pin-project", - "static_assertions", + "futures-timer", + "http-body-util", + "hyper 1.8.1", + "hyper-rustls", + "hyper-util", + "num_cpus", + "once_cell", + "parity-scale-codec", + "parking_lot 0.12.5", + "rand 0.8.5", + "rustls", + "sc-client-api", + "sc-network", + "sc-network-types", + "sc-transaction-pool-api", + "sc-utils", + "sp-api", + "sp-core", + "sp-externalities", + "sp-keystore", + "sp-offchain", + "sp-runtime", + "threadpool", + "tracing", ] [[package]] -name = "ryu" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" - -[[package]] -name = "safe-mix" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d3d055a2582e6b00ed7a31c1524040aa391092bf636328350813f3a0605215c" +name = "sc-proposer-metrics" +version = "0.20.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "rustc_version 0.2.3", + "log", + "substrate-prometheus-endpoint", ] [[package]] -name = "safe_arch" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" +name = "sc-rpc" +version = "50.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "bytemuck", + "futures", + "jsonrpsee", + "log", + "parity-scale-codec", + "parking_lot 0.12.5", + "sc-block-builder", + "sc-chain-spec", + "sc-client-api", + "sc-mixnet", + "sc-rpc-api", + "sc-tracing", + "sc-transaction-pool-api", + "sc-utils", + "serde_json", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-keystore", + "sp-offchain", + "sp-rpc", + "sp-runtime", + "sp-session", + "sp-statement-store", + "sp-version", + "tokio", ] [[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +name = "sc-rpc-api" +version = "0.54.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "winapi-util", + "jsonrpsee", + "parity-scale-codec", + "sc-chain-spec", + "sc-mixnet", + "sc-transaction-pool-api", + "scale-info", + "serde", + "serde_json", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-version", + "thiserror 1.0.69", ] [[package]] -name = "sc-allocator" -version = "4.1.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sc-rpc-server" +version = "27.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ + "dyn-clone", + "forwarded-header-value", + "futures", + "governor", + "http 1.4.0", + "http-body-util", + "hyper 1.8.1", + "ip_network", + "jsonrpsee", "log", - "sp-core", - "sp-wasm-interface", - "thiserror", + "sc-rpc-api", + "serde", + "serde_json", + "substrate-prometheus-endpoint", + "tokio", + "tower", + "tower-http", ] [[package]] -name = "sc-authority-discovery" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sc-rpc-spec-v2" +version = "0.55.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "async-trait", + "array-bytes 6.2.3", "futures", - "futures-timer", - "ip_network", - "libp2p", + "futures-util", + "hex", + "itertools 0.11.0", + "jsonrpsee", "log", - "parity-scale-codec 3.6.9", - "prost", - "prost-build", + "parity-scale-codec", + "parking_lot 0.12.5", "rand 0.8.5", + "sc-chain-spec", "sc-client-api", - "sc-network-common", + "sc-rpc", + "sc-transaction-pool-api", + "schnellru", + "serde", "sp-api", - "sp-authority-discovery", "sp-blockchain", "sp-core", - "sp-keystore", + "sp-rpc", "sp-runtime", + "sp-version", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", + "tokio", + "tokio-stream", ] [[package]] -name = "sc-basic-authorship" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sc-runtime-utilities" +version = "0.7.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "parity-scale-codec", + "sc-executor", + "sc-executor-common", + "sp-core", + "sp-crypto-hashing", + "sp-state-machine", + "sp-wasm-interface", + "thiserror 1.0.69", +] + +[[package]] +name = "sc-service" +version = "0.56.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ + "async-trait", + "directories", + "exit-future", "futures", "futures-timer", + "jsonrpsee", "log", - "parity-scale-codec 3.6.9", - "sc-block-builder", + "parity-scale-codec", + "parking_lot 0.12.5", + "pin-project", + "rand 0.8.5", + "sc-chain-spec", "sc-client-api", - "sc-proposer-metrics", + "sc-client-db", + "sc-consensus", + "sc-executor", + "sc-informant", + "sc-keystore", + "sc-network", + "sc-network-common", + "sc-network-light", + "sc-network-sync", + "sc-network-transactions", + "sc-network-types", + "sc-rpc", + "sc-rpc-server", + "sc-rpc-spec-v2", + "sc-sysinfo", "sc-telemetry", + "sc-tracing", + "sc-transaction-pool", "sc-transaction-pool-api", + "sc-utils", + "schnellru", + "serde", + "serde_json", "sp-api", "sp-blockchain", "sp-consensus", "sp-core", - "sp-inherents", - "sp-runtime", - "substrate-prometheus-endpoint", + "sp-externalities", + "sp-keystore", + "sp-runtime", + "sp-session", + "sp-state-machine", + "sp-storage", + "sp-transaction-pool", + "sp-transaction-storage-proof", + "sp-trie", + "sp-version", + "static_init", + "substrate-prometheus-endpoint", + "tempfile", + "thiserror 1.0.69", + "tokio", + "tracing", + "tracing-futures", +] + +[[package]] +name = "sc-state-db" +version = "0.41.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "log", + "parity-scale-codec", + "parking_lot 0.12.5", + "sp-core", ] [[package]] -name = "sc-block-builder" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sc-storage-monitor" +version = "0.27.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "parity-scale-codec 3.6.9", - "sc-client-api", - "sp-api", - "sp-block-builder", - "sp-blockchain", + "clap", + "fs4", + "log", "sp-core", - "sp-inherents", - "sp-runtime", + "thiserror 1.0.69", + "tokio", ] [[package]] -name = "sc-chain-spec" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sc-sync-state-rpc" +version = "0.55.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "memmap2", - "sc-chain-spec-derive", + "jsonrpsee", + "parity-scale-codec", + "sc-chain-spec", "sc-client-api", - "sc-executor", - "sc-network-common", - "sc-telemetry", + "sc-consensus-babe", + "sc-consensus-epochs", + "sc-consensus-grandpa", "serde", "serde_json", "sp-blockchain", - "sp-core", "sp-runtime", - "sp-state-machine", + "thiserror 1.0.69", ] [[package]] -name = "sc-chain-spec-derive" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sc-sysinfo" +version = "46.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro2", - "quote", - "syn 1.0.109", + "derive_more 0.99.20", + "futures", + "libc", + "log", + "rand 0.8.5", + "rand_pcg", + "regex", + "sc-telemetry", + "serde", + "serde_json", + "sp-core", + "sp-crypto-hashing", + "sp-io", ] [[package]] -name = "sc-cli" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sc-telemetry" +version = "30.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "array-bytes", "chrono", - "clap", - "fdlimit", "futures", "libp2p", "log", - "names", - "parity-scale-codec 3.6.9", + "parking_lot 0.12.5", + "pin-project", "rand 0.8.5", - "regex", - "rpassword", - "sc-client-api", - "sc-client-db", - "sc-keystore", - "sc-network", - "sc-network-common", - "sc-service", - "sc-telemetry", - "sc-tracing", "sc-utils", "serde", "serde_json", - "sp-blockchain", - "sp-core", - "sp-keyring", - "sp-keystore", - "sp-panic-handler", - "sp-runtime", - "sp-version", - "thiserror", - "tiny-bip39", - "tokio", + "thiserror 1.0.69", + "wasm-timer", ] [[package]] -name = "sc-client-api" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sc-tracing" +version = "44.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "fnv", - "futures", + "chrono", + "console", + "is-terminal", + "libc", "log", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "sc-executor", - "sc-transaction-pool-api", - "sc-utils", + "parity-scale-codec", + "parking_lot 0.12.5", + "rustc-hash 1.1.0", + "sc-client-api", + "sc-tracing-proc-macro", + "serde", "sp-api", "sp-blockchain", - "sp-consensus", "sp-core", - "sp-database", - "sp-externalities", - "sp-keystore", + "sp-rpc", "sp-runtime", - "sp-state-machine", - "sp-storage", - "substrate-prometheus-endpoint", + "sp-tracing", + "thiserror 1.0.69", + "tracing", + "tracing-log", + "tracing-subscriber 0.3.22", ] [[package]] -name = "sc-client-db" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sc-tracing-proc-macro" +version = "11.1.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "hash-db", - "kvdb", - "kvdb-memorydb", - "kvdb-rocksdb", - "linked-hash-map", - "log", - "parity-db", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "sc-client-api", - "sc-state-db", - "schnellru", - "sp-arithmetic", - "sp-blockchain", - "sp-core", - "sp-database", - "sp-runtime", - "sp-state-machine", - "sp-trie", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "sc-consensus" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sc-transaction-pool" +version = "44.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ "async-trait", "futures", "futures-timer", - "libp2p", - "log", - "mockall", - "parking_lot 0.12.1", + "indexmap 2.12.1", + "itertools 0.11.0", + "linked-hash-map", + "parity-scale-codec", + "parking_lot 0.12.5", "sc-client-api", + "sc-transaction-pool-api", "sc-utils", "serde", "sp-api", "sp-blockchain", - "sp-consensus", "sp-core", + "sp-crypto-hashing", "sp-runtime", - "sp-state-machine", + "sp-tracing", + "sp-transaction-pool", + "strum 0.26.3", "substrate-prometheus-endpoint", - "thiserror", + "thiserror 1.0.69", + "tokio", + "tokio-stream", + "tracing", ] [[package]] -name = "sc-consensus-babe" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sc-transaction-pool-api" +version = "43.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ "async-trait", - "fork-tree", "futures", + "indexmap 2.12.1", "log", - "merlin 2.0.1", - "num-bigint", - "num-rational", - "num-traits", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "sc-client-api", - "sc-consensus", - "sc-consensus-epochs", - "sc-consensus-slots", - "sc-keystore", - "sc-telemetry", - "scale-info", - "schnorrkel 0.9.1", - "sp-api", - "sp-application-crypto", - "sp-block-builder", + "parity-scale-codec", + "serde", "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-consensus-slots", - "sp-consensus-vrf", "sp-core", - "sp-inherents", - "sp-keystore", "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", + "strum 0.26.3", + "thiserror 1.0.69", ] [[package]] -name = "sc-consensus-babe-rpc" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sc-utils" +version = "20.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ + "async-channel 1.9.0", "futures", - "jsonrpsee", - "sc-consensus-babe", - "sc-consensus-epochs", - "sc-rpc-api", + "futures-timer", + "log", + "parking_lot 0.12.5", + "prometheus", + "sp-arithmetic", +] + +[[package]] +name = "scale-bits" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27243ab0d2d6235072b017839c5f0cd1a3b1ce45c0f7a715363b0c7d36c76c94" +dependencies = [ + "parity-scale-codec", + "scale-info", + "scale-type-resolver", "serde", - "sp-api", - "sp-application-crypto", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-core", - "sp-keystore", - "sp-runtime", - "thiserror", ] [[package]] -name = "sc-consensus-epochs" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "scale-decode" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d6ed61699ad4d54101ab5a817169259b5b0efc08152f8632e61482d8a27ca3d" +dependencies = [ + "parity-scale-codec", + "primitive-types 0.13.1", + "scale-bits", + "scale-decode-derive", + "scale-type-resolver", + "smallvec", + "thiserror 2.0.17", +] + +[[package]] +name = "scale-decode-derive" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65cb245f7fdb489e7ba43a616cbd34427fe3ba6fe0edc1d0d250085e6c84f3ec" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "scale-encode" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64901733157f9d25ef86843bd783eda439fac7efb0ad5a615d12d2cf3a29464b" +dependencies = [ + "parity-scale-codec", + "primitive-types 0.13.1", + "scale-bits", + "scale-encode-derive", + "scale-type-resolver", + "smallvec", + "thiserror 2.0.17", +] + +[[package]] +name = "scale-encode-derive" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78a3993a13b4eafa89350604672c8757b7ea84c7c5947d4b3691e3169c96379b" +dependencies = [ + "darling 0.20.11", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "scale-info" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" +dependencies = [ + "bitvec", + "cfg-if", + "derive_more 1.0.0", + "parity-scale-codec", + "scale-info-derive", + "serde", +] + +[[package]] +name = "scale-info-derive" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "scale-type-resolver" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0cded6518aa0bd6c1be2b88ac81bf7044992f0f154bfbabd5ad34f43512abcb" +dependencies = [ + "scale-info", + "smallvec", +] + +[[package]] +name = "scale-typegen" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c61b6b706a3eaad63b506ab50a1d2319f817ae01cf753adcc3f055f9f0fcd6" +dependencies = [ + "proc-macro2", + "quote", + "scale-info", + "syn 2.0.111", + "thiserror 2.0.17", +] + +[[package]] +name = "scale-value" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884aab179aba344c67ddcd1d7dd8e3f8fee202f2e570d97ec34ec8688442a5b3" +dependencies = [ + "base58", + "blake2 0.10.6", + "either", + "parity-scale-codec", + "scale-bits", + "scale-decode", + "scale-encode", + "scale-type-resolver", + "serde", + "thiserror 2.0.17", + "yap", +] + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "fork-tree", - "parity-scale-codec 3.6.9", - "sc-client-api", - "sc-consensus", - "sp-blockchain", - "sp-runtime", + "windows-sys 0.61.2", ] [[package]] -name = "sc-consensus-grandpa" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" dependencies = [ - "ahash 0.8.11", - "array-bytes", - "async-trait", "dyn-clone", - "finality-grandpa", - "fork-tree", - "futures", - "futures-timer", - "log", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "rand 0.8.5", - "sc-block-builder", - "sc-chain-spec", - "sc-client-api", - "sc-consensus", - "sc-network", - "sc-network-common", - "sc-network-gossip", - "sc-telemetry", - "sc-utils", + "ref-cast", + "serde", "serde_json", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-consensus-grandpa", - "sp-core", - "sp-keystore", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", ] [[package]] -name = "sc-consensus-grandpa-rpc" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "schemars" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" dependencies = [ - "finality-grandpa", - "futures", - "jsonrpsee", - "log", - "parity-scale-codec 3.6.9", - "sc-client-api", - "sc-consensus-grandpa", - "sc-rpc", + "dyn-clone", + "ref-cast", "serde", - "sp-blockchain", - "sp-core", - "sp-runtime", - "thiserror", + "serde_json", ] [[package]] -name = "sc-consensus-slots" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "schnellru" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" dependencies = [ - "async-trait", - "futures", - "futures-timer", - "log", - "parity-scale-codec 3.6.9", - "sc-client-api", - "sc-consensus", - "sc-telemetry", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", + "ahash 0.8.12", + "cfg-if", + "hashbrown 0.13.2", ] [[package]] -name = "sc-executor" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "schnorrkel" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9fcb6c2e176e86ec703e22560d99d65a5ee9056ae45a08e13e84ebf796296f" dependencies = [ - "lru", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "sc-executor-common", - "sc-executor-wasmi", - "sc-executor-wasmtime", - "sp-api", - "sp-core", - "sp-externalities", - "sp-io", - "sp-panic-handler", - "sp-runtime-interface", - "sp-trie", - "sp-version", - "sp-wasm-interface", - "tracing", - "wasmi 0.13.2", + "aead", + "arrayref", + "arrayvec 0.7.6", + "curve25519-dalek", + "getrandom_or_panic", + "merlin", + "rand_core 0.6.4", + "serde_bytes", + "sha2 0.10.9", + "subtle 2.6.1", + "zeroize", ] [[package]] -name = "sc-executor-common" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" -dependencies = [ - "sc-allocator", - "sp-maybe-compressed-blob", - "sp-wasm-interface", - "thiserror", - "wasm-instrument 0.3.0", - "wasmi 0.13.2", -] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "sc-executor-wasmi" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" -dependencies = [ - "log", - "sc-allocator", - "sc-executor-common", - "sp-runtime-interface", - "sp-wasm-interface", - "wasmi 0.13.2", -] +name = "scratch" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" [[package]] -name = "sc-executor-wasmtime" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "scrypt" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" dependencies = [ - "anyhow", - "cfg-if 1.0.0", - "libc", - "log", - "once_cell", - "rustix 0.36.17", - "sc-allocator", - "sc-executor-common", - "sp-runtime-interface", - "sp-wasm-interface", - "wasmtime", + "password-hash", + "pbkdf2", + "salsa20", + "sha2 0.10.9", ] [[package]] -name = "sc-informant" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "ansi_term", - "futures", - "futures-timer", - "log", - "sc-client-api", - "sc-network-common", - "sp-blockchain", - "sp-runtime", + "base16ct", + "der", + "generic-array 0.14.7", + "pkcs8", + "serdect", + "subtle 2.6.1", + "zeroize", ] [[package]] -name = "sc-keystore" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" dependencies = [ - "array-bytes", - "async-trait", - "parking_lot 0.12.1", - "serde_json", - "sp-application-crypto", - "sp-core", - "sp-keystore", - "thiserror", + "secp256k1-sys 0.8.2", ] [[package]] -name = "sc-network" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "secp256k1" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" dependencies = [ - "array-bytes", - "async-trait", - "asynchronous-codec", - "backtrace", - "bytes", - "either", - "fnv", - "futures", - "futures-timer", - "ip_network", - "libp2p", - "log", - "lru", - "mockall", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "pin-project", - "rand 0.8.5", - "sc-block-builder", - "sc-client-api", - "sc-consensus", - "sc-network-common", - "sc-peerset", - "sc-utils", - "serde", - "serde_json", - "smallvec", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", - "unsigned-varint", - "zeroize", + "secp256k1-sys 0.9.2", ] [[package]] -name = "sc-network-bitswap" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ - "cid", - "futures", - "libp2p", - "log", - "prost", - "prost-build", - "sc-client-api", - "sc-network-common", - "sp-blockchain", - "sp-runtime", - "thiserror", - "unsigned-varint", + "bitcoin_hashes", + "rand 0.8.5", + "secp256k1-sys 0.10.1", + "serde", ] [[package]] -name = "sc-network-common" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "secp256k1" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" dependencies = [ - "async-trait", - "bitflags 1.3.2", - "bytes", - "futures", - "futures-timer", - "libp2p", - "linked_hash_set", - "parity-scale-codec 3.6.9", - "prost-build", - "sc-consensus", - "sc-peerset", - "serde", - "smallvec", - "sp-blockchain", - "sp-consensus", - "sp-consensus-grandpa", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", + "bitcoin_hashes", + "rand 0.9.2", + "secp256k1-sys 0.11.0", ] [[package]] -name = "sc-network-gossip" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "secp256k1-sys" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4473013577ec77b4ee3668179ef1186df3146e2cf2d927bd200974c6fe60fd99" dependencies = [ - "ahash 0.8.11", - "futures", - "futures-timer", - "libp2p", - "log", - "lru", - "sc-network-common", - "sc-peerset", - "sp-runtime", - "substrate-prometheus-endpoint", - "tracing", + "cc", ] [[package]] -name = "sc-network-light" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "secp256k1-sys" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb" dependencies = [ - "array-bytes", - "futures", - "libp2p", - "log", - "parity-scale-codec 3.6.9", - "prost", - "prost-build", - "sc-client-api", - "sc-network-common", - "sc-peerset", - "sp-blockchain", - "sp-core", - "sp-runtime", - "thiserror", + "cc", ] [[package]] -name = "sc-network-sync" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" dependencies = [ - "array-bytes", - "async-trait", - "fork-tree", - "futures", - "libp2p", - "log", - "lru", - "mockall", - "parity-scale-codec 3.6.9", - "prost", - "prost-build", - "sc-client-api", - "sc-consensus", - "sc-network-common", - "sc-peerset", - "sc-utils", - "smallvec", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", + "cc", ] [[package]] -name = "sc-network-transactions" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "secp256k1-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb913707158fadaf0d8702c2db0e857de66eb003ccfdda5924b5f5ac98efb38" dependencies = [ - "array-bytes", - "futures", - "libp2p", - "log", - "parity-scale-codec 3.6.9", - "pin-project", - "sc-network-common", - "sc-peerset", - "sc-utils", - "sp-consensus", - "sp-runtime", - "substrate-prometheus-endpoint", + "cc", ] [[package]] -name = "sc-offchain" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" dependencies = [ - "array-bytes", - "bytes", - "fnv", - "futures", - "futures-timer", - "hyper", - "hyper-rustls", - "libp2p", - "num_cpus", - "once_cell", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "rand 0.8.5", - "sc-client-api", - "sc-network-common", - "sc-peerset", - "sc-utils", - "sp-api", - "sp-core", - "sp-offchain", - "sp-runtime", - "threadpool", - "tracing", + "zeroize", ] [[package]] -name = "sc-peerset" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "secrecy" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" dependencies = [ - "futures", - "libp2p", - "log", - "sc-utils", - "serde_json", - "wasm-timer", + "zeroize", ] [[package]] -name = "sc-proposer-metrics" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "log", - "substrate-prometheus-endpoint", + "bitflags 2.10.0", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", ] [[package]] -name = "sc-rpc" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ - "futures", - "jsonrpsee", - "log", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "sc-block-builder", - "sc-chain-spec", - "sc-client-api", - "sc-rpc-api", - "sc-tracing", - "sc-transaction-pool-api", - "sc-utils", - "serde_json", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-keystore", - "sp-offchain", - "sp-rpc", - "sp-runtime", - "sp-session", - "sp-version", - "tokio", + "core-foundation-sys", + "libc", ] [[package]] -name = "sc-rpc-api" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "semver" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" dependencies = [ - "jsonrpsee", - "parity-scale-codec 3.6.9", - "sc-chain-spec", - "sc-transaction-pool-api", - "scale-info", - "serde", - "serde_json", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-version", - "thiserror", + "semver-parser 0.7.0", ] [[package]] -name = "sc-rpc-server" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" dependencies = [ - "http", - "jsonrpsee", - "log", - "serde_json", - "substrate-prometheus-endpoint", - "tokio", - "tower", - "tower-http", + "semver-parser 0.10.3", ] [[package]] -name = "sc-rpc-spec-v2" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ - "array-bytes", - "futures", - "futures-util", - "hex", - "jsonrpsee", - "log", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "sc-chain-spec", - "sc-client-api", - "sc-transaction-pool-api", "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-version", - "thiserror", - "tokio-stream", + "serde_core", ] [[package]] -name = "sc-service" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" dependencies = [ - "async-trait", - "directories", - "exit-future", - "futures", - "futures-timer", - "jsonrpsee", - "log", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "pin-project", - "rand 0.8.5", - "sc-block-builder", - "sc-chain-spec", - "sc-client-api", - "sc-client-db", - "sc-consensus", - "sc-executor", - "sc-informant", - "sc-keystore", - "sc-network", - "sc-network-bitswap", - "sc-network-common", - "sc-network-light", - "sc-network-sync", - "sc-network-transactions", - "sc-offchain", - "sc-rpc", - "sc-rpc-server", - "sc-rpc-spec-v2", - "sc-storage-monitor", - "sc-sysinfo", - "sc-telemetry", - "sc-tracing", - "sc-transaction-pool", - "sc-transaction-pool-api", - "sc-utils", - "serde", - "serde_json", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-externalities", - "sp-keystore", - "sp-runtime", - "sp-session", - "sp-state-machine", - "sp-storage", - "sp-transaction-pool", - "sp-transaction-storage-proof", - "sp-trie", - "sp-version", - "static_init", - "substrate-prometheus-endpoint", - "tempfile", - "thiserror", - "tokio", - "tracing", - "tracing-futures", + "pest", ] [[package]] -name = "sc-state-db" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ - "log", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "sp-core", + "serde_core", + "serde_derive", ] [[package]] -name = "sc-storage-monitor" -version = "0.1.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ - "clap", - "fs4", - "futures", - "log", - "sc-client-db", - "sc-utils", - "sp-core", - "thiserror", - "tokio", + "serde", + "serde_core", ] [[package]] -name = "sc-sync-state-rpc" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ - "jsonrpsee", - "parity-scale-codec 3.6.9", - "sc-chain-spec", - "sc-client-api", - "sc-consensus-babe", - "sc-consensus-epochs", - "sc-consensus-grandpa", - "serde", - "serde_json", - "sp-blockchain", - "sp-runtime", - "thiserror", + "serde_derive", ] [[package]] -name = "sc-sysinfo" -version = "6.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "indexmap 2.12.1", + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ - "futures", - "libc", - "log", - "rand 0.8.5", - "rand_pcg", - "regex", - "sc-telemetry", "serde", - "serde_json", - "sp-core", - "sp-io", - "sp-std", ] [[package]] -name = "sc-telemetry" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ - "chrono", - "futures", - "libp2p", - "log", - "parking_lot 0.12.1", - "pin-project", - "rand 0.8.5", - "sc-utils", + "form_urlencoded", + "itoa", + "ryu", "serde", - "serde_json", - "thiserror", - "wasm-timer", ] [[package]] -name = "sc-tracing" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "serde_with" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" dependencies = [ - "ansi_term", - "atty", + "base64", "chrono", - "lazy_static", - "libc", - "log", - "once_cell", - "parking_lot 0.12.1", - "regex", - "rustc-hash", - "sc-client-api", - "sc-rpc-server", - "sc-tracing-proc-macro", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-tracing", - "thiserror", - "tracing", - "tracing-log", - "tracing-subscriber", + "hex", + "indexmap 1.9.3", + "indexmap 2.12.1", + "schemars 0.9.0", + "schemars 1.2.0", + "serde_core", + "serde_json", + "serde_with_macros", + "time", ] [[package]] -name = "sc-tracing-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "serde_with_macros" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" dependencies = [ - "proc-macro-crate 1.1.3", + "darling 0.21.3", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.111", ] [[package]] -name = "sc-transaction-pool" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" dependencies = [ - "async-trait", - "futures", - "futures-timer", - "linked-hash-map", - "log", - "num-traits", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "sc-client-api", - "sc-transaction-pool-api", - "sc-utils", + "base16ct", "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-tracing", - "sp-transaction-pool", - "substrate-prometheus-endpoint", - "thiserror", ] [[package]] -name = "sc-transaction-pool-api" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "async-trait", - "futures", - "log", - "serde", - "sp-blockchain", - "sp-runtime", - "thiserror", + "cfg-if", + "cpufeatures", + "digest 0.10.7", ] [[package]] -name = "sc-utils" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ - "backtrace", - "futures", - "futures-timer", - "lazy_static", - "log", - "parking_lot 0.12.1", - "prometheus", + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.1", ] [[package]] -name = "scale-info" -version = "2.10.0" +name = "sha2" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ - "bitvec 1.0.1", - "cfg-if 1.0.0", - "derive_more", - "parity-scale-codec 3.6.9", - "scale-info-derive", - "serde", + "cfg-if", + "cpufeatures", + "digest 0.10.7", ] [[package]] -name = "scale-info-derive" -version = "2.10.0" +name = "sha2-const-stable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" + +[[package]] +name = "sha3" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro2", - "quote", - "syn 1.0.109", + "digest 0.10.7", + "keccak", ] [[package]] -name = "schannel" -version = "0.1.22" +name = "sha3-asm" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" dependencies = [ - "windows-sys 0.48.0", + "cc", + "cfg-if", ] [[package]] -name = "schnellru" -version = "0.2.1" +name = "sharded-slab" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ - "ahash 0.8.11", - "cfg-if 1.0.0", - "hashbrown 0.13.2", + "lazy_static", ] [[package]] -name = "schnorrkel" -version = "0.9.1" +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "curve25519-dalek 2.1.3", - "getrandom 0.1.16", - "merlin 2.0.1", - "rand 0.7.3", - "rand_core 0.5.1", - "sha2 0.8.2", - "subtle", - "zeroize", + "libc", ] [[package]] -name = "schnorrkel" -version = "0.11.4" +name = "signature" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de18f6d8ba0aad7045f5feae07ec29899c1112584a38509a84ad7b04451eaa0" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "aead 0.5.2", - "arrayref", - "arrayvec 0.7.4", - "curve25519-dalek 4.1.3", - "getrandom_or_panic", - "merlin 3.0.0", + "digest 0.10.7", "rand_core 0.6.4", - "serde_bytes", - "sha2 0.10.8", - "subtle", - "zeroize", ] [[package]] -name = "scopeguard" -version = "1.2.0" +name = "simba" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] [[package]] -name = "scratch" -version = "1.0.7" +name = "simple-dns" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" +checksum = "f8cba3b4c122239e3b4473674cb7c79ad2693f008f0746bfe2fc3fe1ffcd936a" +dependencies = [ + "bitflags 2.10.0", +] [[package]] -name = "sct" -version = "0.6.1" +name = "simple-mermaid" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] +checksum = "620a1d43d70e142b1d46a929af51d44f383db9c7a2ec122de2cd992ccfcf3c18" [[package]] -name = "sct" -version = "0.7.1" +name = "siphasher" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] -name = "sdp" -version = "0.5.3" +name = "siphasher" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d22a5ef407871893fd72b4562ee15e4742269b173959db4b8df6f538c414e13" -dependencies = [ - "rand 0.8.5", - "substring", - "thiserror", - "url", -] +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] -name = "sec1" -version = "0.3.0" +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + +[[package]] +name = "smallvec" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" dependencies = [ - "base16ct", - "der 0.6.1", - "generic-array 0.14.7", - "pkcs8 0.9.0", - "subtle", - "zeroize", + "serde", ] [[package]] -name = "secp256k1" -version = "0.24.3" +name = "smol" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" +checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" dependencies = [ - "secp256k1-sys", + "async-channel 2.5.0", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-net", + "async-process", + "blocking", + "futures-lite", ] [[package]] -name = "secp256k1-sys" -version = "0.6.1" +name = "smoldot" +version = "0.19.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" +checksum = "e16e5723359f0048bf64bfdfba64e5732a56847d42c4fd3fe56f18280c813413" dependencies = [ - "cc", + "arrayvec 0.7.6", + "async-lock", + "atomic-take", + "base64", + "bip39", + "blake2-rfc", + "bs58", + "chacha20", + "crossbeam-queue", + "derive_more 2.1.0", + "ed25519-zebra", + "either", + "event-listener 5.4.1", + "fnv", + "futures-lite", + "futures-util", + "hashbrown 0.15.5", + "hex", + "hmac 0.12.1", + "itertools 0.14.0", + "libm", + "libsecp256k1", + "merlin", + "nom 8.0.0", + "num-bigint", + "num-rational", + "num-traits", + "pbkdf2", + "pin-project", + "poly1305", + "rand 0.8.5", + "rand_chacha 0.3.1", + "ruzstd", + "schnorrkel", + "serde", + "serde_json", + "sha2 0.10.9", + "sha3", + "siphasher 1.0.1", + "slab", + "smallvec", + "soketto", + "twox-hash 2.1.2", + "wasmi 0.40.0", + "x25519-dalek", + "zeroize", ] [[package]] -name = "secrecy" -version = "0.8.0" +name = "smoldot-light" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +checksum = "f1bba9e591716567d704a8252feeb2f1261a286e1e2cbdd4e49e9197c34a14e2" dependencies = [ + "async-channel 2.5.0", + "async-lock", + "base64", + "blake2-rfc", + "bs58", + "derive_more 2.1.0", + "either", + "event-listener 5.4.1", + "fnv", + "futures-channel", + "futures-lite", + "futures-util", + "hashbrown 0.15.5", + "hex", + "itertools 0.14.0", + "log", + "lru 0.12.5", + "parking_lot 0.12.5", + "pin-project", + "rand 0.8.5", + "rand_chacha 0.3.1", + "serde", + "serde_json", + "siphasher 1.0.1", + "slab", + "smol", + "smoldot", "zeroize", ] [[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.1" +name = "snap" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] +checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] -name = "semver" -version = "0.6.0" +name = "snow" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" +checksum = "850948bee068e713b8ab860fe1adc4d109676ab4c3b621fd8147f06b261f2f85" dependencies = [ - "semver-parser", + "aes-gcm", + "blake2 0.10.6", + "chacha20poly1305", + "curve25519-dalek", + "rand_core 0.6.4", + "ring 0.17.14", + "rustc_version 0.4.1", + "sha2 0.10.9", + "subtle 2.6.1", ] [[package]] -name = "semver" -version = "0.9.0" +name = "socket2" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ - "semver-parser", + "libc", + "windows-sys 0.52.0", ] [[package]] -name = "semver" -version = "1.0.20" +name = "socket2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ - "serde", + "libc", + "windows-sys 0.60.2", ] [[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "serde" -version = "1.0.193" +name = "soketto" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" dependencies = [ - "serde_derive", + "base64", + "bytes", + "futures", + "http 1.4.0", + "httparse", + "log", + "rand 0.8.5", + "sha1", ] [[package]] -name = "serde_bytes" -version = "0.11.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +name = "sp-api" +version = "40.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "serde", + "docify", + "hash-db", + "log", + "parity-scale-codec", + "scale-info", + "sp-api-proc-macro", + "sp-core", + "sp-externalities", + "sp-metadata-ir", + "sp-runtime", + "sp-runtime-interface", + "sp-state-machine", + "sp-trie", + "sp-version", + "thiserror 1.0.69", ] [[package]] -name = "serde_derive" -version = "1.0.193" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +name = "sp-api-proc-macro" +version = "26.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ + "Inflector", + "blake2 0.10.6", + "expander", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.111", ] [[package]] -name = "serde_json" -version = "1.0.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +name = "sp-application-crypto" +version = "44.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "itoa", - "ryu", + "parity-scale-codec", + "scale-info", "serde", + "sp-core", + "sp-io", ] [[package]] -name = "sha-1" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +name = "sp-arithmetic" +version = "28.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", + "docify", + "integer-sqrt", + "num-traits", + "parity-scale-codec", + "scale-info", + "serde", + "static_assertions", ] [[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +name = "sp-authority-discovery" +version = "40.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.7", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-runtime", ] [[package]] -name = "sha2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +name = "sp-block-builder" +version = "40.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", + "sp-api", + "sp-inherents", + "sp-runtime", ] [[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +name = "sp-blockchain" +version = "43.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", + "futures", + "parity-scale-codec", + "parking_lot 0.12.5", + "schnellru", + "sp-api", + "sp-consensus", + "sp-core", + "sp-database", + "sp-runtime", + "sp-state-machine", + "thiserror 1.0.69", + "tracing", ] [[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +name = "sp-consensus" +version = "0.46.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.7", + "async-trait", + "futures", + "log", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "thiserror 1.0.69", ] [[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +name = "sp-consensus-aura" +version = "0.46.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "digest 0.10.7", - "keccak", + "async-trait", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-consensus-slots", + "sp-inherents", + "sp-runtime", + "sp-timestamp", ] [[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +name = "sp-consensus-babe" +version = "0.46.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "lazy_static", + "async-trait", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-timestamp", ] [[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +name = "sp-consensus-beefy" +version = "28.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "libc", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-crypto-hashing", + "sp-io", + "sp-keystore", + "sp-mmr-primitives", + "sp-runtime", + "sp-weights", + "strum 0.26.3", ] [[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +name = "sp-consensus-grandpa" +version = "27.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", + "finality-grandpa", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "sp-runtime", ] [[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +name = "sp-consensus-slots" +version = "0.46.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "rand_core 0.6.4", + "parity-scale-codec", + "scale-info", + "serde", + "sp-timestamp", ] [[package]] -name = "simba" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" +name = "sp-core" +version = "39.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "approx", - "num-complex", - "num-traits", + "ark-vrf", + "array-bytes 6.2.3", + "bip39", + "bitflags 1.3.2", + "blake2 0.10.6", + "bounded-collections", + "bs58", + "dyn-clone", + "ed25519-zebra", + "futures", + "hash-db", + "hash256-std-hasher", + "impl-serde", + "itertools 0.11.0", + "k256", + "libsecp256k1", + "log", + "merlin", + "parity-scale-codec", + "parking_lot 0.12.5", "paste", - "wide", + "primitive-types 0.13.1", + "rand 0.8.5", + "scale-info", + "schnorrkel", + "secp256k1 0.28.2", + "secrecy 0.8.0", + "serde", + "sha2 0.10.9", + "sp-crypto-hashing", + "sp-debug-derive", + "sp-externalities", + "sp-std", + "sp-storage", + "ss58-registry", + "substrate-bip39", + "thiserror 1.0.69", + "tracing", + "w3f-bls", + "zeroize", ] [[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +name = "sp-crypto-hashing" +version = "0.1.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "blake2b_simd", + "byteorder", + "digest 0.10.7", + "sha2 0.10.9", + "sha3", + "twox-hash 1.6.3", +] [[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +name = "sp-crypto-hashing-proc-macro" +version = "0.1.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "autocfg", + "quote", + "sp-crypto-hashing", + "syn 2.0.111", ] [[package]] -name = "slice-group-by" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" - -[[package]] -name = "smallvec" -version = "1.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +name = "sp-database" +version = "10.0.1" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "kvdb", + "kvdb-rocksdb", + "parking_lot 0.12.5", +] [[package]] -name = "snap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" +name = "sp-debug-derive" +version = "14.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] [[package]] -name = "snow" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "850948bee068e713b8ab860fe1adc4d109676ab4c3b621fd8147f06b261f2f85" +name = "sp-externalities" +version = "0.31.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "aes-gcm 0.10.3", - "blake2", - "chacha20poly1305", - "curve25519-dalek 4.1.3", - "rand_core 0.6.4", - "ring 0.17.14", - "rustc_version 0.4.0", - "sha2 0.10.8", - "subtle", + "environmental", + "parity-scale-codec", + "sp-storage", ] [[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +name = "sp-genesis-builder" +version = "0.21.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "libc", - "winapi", + "parity-scale-codec", + "scale-info", + "serde_json", + "sp-api", + "sp-runtime", ] [[package]] -name = "socket2" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +name = "sp-inherents" +version = "40.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "libc", - "windows-sys 0.48.0", + "async-trait", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "thiserror 1.0.69", ] [[package]] -name = "soketto" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +name = "sp-io" +version = "44.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "base64 0.13.1", "bytes", - "flate2", - "futures", - "http", - "httparse", + "docify", + "ed25519-dalek", + "libsecp256k1", "log", - "rand 0.8.5", - "sha-1", + "parity-scale-codec", + "polkavm-derive", + "rustversion", + "secp256k1 0.28.2", + "sp-core", + "sp-crypto-hashing", + "sp-externalities", + "sp-keystore", + "sp-runtime-interface", + "sp-state-machine", + "sp-tracing", + "sp-trie", + "tracing", + "tracing-core", ] [[package]] -name = "sp-api" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-keyring" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "hash-db", - "log", - "parity-scale-codec 3.6.9", - "sp-api-proc-macro", "sp-core", "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-trie", - "sp-version", - "thiserror", + "strum 0.26.3", ] [[package]] -name = "sp-api-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-keystore" +version = "0.45.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "blake2", - "proc-macro-crate 1.1.3", - "proc-macro2", - "quote", - "syn 1.0.109", + "parity-scale-codec", + "parking_lot 0.12.5", + "sp-core", + "sp-externalities", ] [[package]] -name = "sp-application-crypto" -version = "7.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-maybe-compressed-blob" +version = "11.1.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "parity-scale-codec 3.6.9", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-std", + "thiserror 1.0.69", + "zstd 0.12.4", ] [[package]] -name = "sp-arithmetic" -version = "6.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-metadata-ir" +version = "0.12.1" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "integer-sqrt", - "num-traits", - "parity-scale-codec 3.6.9", + "frame-metadata", + "parity-scale-codec", "scale-info", - "serde", - "sp-std", - "static_assertions", ] [[package]] -name = "sp-authority-discovery" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-mixnet" +version = "0.18.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "parity-scale-codec 3.6.9", + "parity-scale-codec", "scale-info", "sp-api", "sp-application-crypto", - "sp-runtime", - "sp-std", ] [[package]] -name = "sp-block-builder" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-mmr-primitives" +version = "40.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "parity-scale-codec 3.6.9", + "log", + "parity-scale-codec", + "polkadot-ckb-merkle-mountain-range", + "scale-info", + "serde", "sp-api", - "sp-inherents", + "sp-core", + "sp-debug-derive", "sp-runtime", - "sp-std", + "thiserror 1.0.69", ] [[package]] -name = "sp-blockchain" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-npos-elections" +version = "40.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "futures", - "log", - "lru", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "sp-api", - "sp-consensus", - "sp-database", + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", + "sp-core", "sp-runtime", - "sp-state-machine", - "thiserror", ] [[package]] -name = "sp-consensus" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-offchain" +version = "40.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "async-trait", - "futures", - "log", - "parity-scale-codec 3.6.9", + "sp-api", "sp-core", - "sp-inherents", "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-version", - "thiserror", ] [[package]] -name = "sp-consensus-babe" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-panic-handler" +version = "13.0.2" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "async-trait", - "merlin 2.0.1", - "parity-scale-codec 3.6.9", - "scale-info", + "backtrace", + "regex", +] + +[[package]] +name = "sp-rpc" +version = "37.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "rustc-hash 1.1.0", "serde", - "sp-api", - "sp-application-crypto", - "sp-consensus", - "sp-consensus-slots", - "sp-consensus-vrf", "sp-core", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "sp-std", - "sp-timestamp", ] [[package]] -name = "sp-consensus-grandpa" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-runtime" +version = "45.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "finality-grandpa", + "binary-merkle-tree", + "bytes", + "docify", + "either", + "hash256-std-hasher", + "impl-trait-for-tuples", "log", - "parity-scale-codec 3.6.9", + "num-traits", + "parity-scale-codec", + "paste", + "rand 0.8.5", "scale-info", "serde", - "sp-api", + "simple-mermaid", "sp-application-crypto", + "sp-arithmetic", "sp-core", - "sp-keystore", - "sp-runtime", + "sp-io", "sp-std", + "sp-trie", + "sp-weights", + "strum 0.26.3", + "tracing", + "tuplex", ] [[package]] -name = "sp-consensus-slots" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-runtime-interface" +version = "33.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "parity-scale-codec 3.6.9", - "scale-info", - "serde", + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec", + "polkavm-derive", + "sp-externalities", + "sp-runtime-interface-proc-macro", "sp-std", - "sp-timestamp", + "sp-storage", + "sp-tracing", + "sp-wasm-interface", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "20.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "Inflector", + "expander", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "sp-consensus-vrf" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-session" +version = "42.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "parity-scale-codec 3.6.9", + "parity-scale-codec", "scale-info", - "schnorrkel 0.9.1", + "sp-api", "sp-core", + "sp-keystore", "sp-runtime", - "sp-std", + "sp-staking", ] [[package]] -name = "sp-core" -version = "7.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-staking" +version = "42.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "sp-state-machine" +version = "0.49.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "array-bytes", - "base58", - "bitflags 1.3.2", - "blake2", - "bounded-collections", - "dyn-clonable", - "ed25519-zebra", - "futures", "hash-db", - "hash256-std-hasher", - "impl-serde", - "lazy_static", - "libsecp256k1", "log", - "merlin 2.0.1", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "primitive-types", + "parity-scale-codec", + "parking_lot 0.12.5", "rand 0.8.5", - "regex", - "scale-info", - "schnorrkel 0.9.1", - "secp256k1", - "secrecy", - "serde", - "sp-core-hashing", - "sp-debug-derive", + "smallvec", + "sp-core", "sp-externalities", - "sp-runtime-interface", - "sp-std", - "sp-storage", - "ss58-registry", - "substrate-bip39", - "thiserror", - "tiny-bip39", - "zeroize", + "sp-panic-handler", + "sp-trie", + "thiserror 1.0.69", + "tracing", + "trie-db", ] [[package]] -name = "sp-core-hashing" -version = "5.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-statement-store" +version = "24.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "blake2", - "byteorder", - "digest 0.10.7", - "sha2 0.10.8", - "sha3", - "sp-std", - "twox-hash", + "aes-gcm", + "curve25519-dalek", + "ed25519-dalek", + "hkdf", + "parity-scale-codec", + "rand 0.8.5", + "scale-info", + "sha2 0.10.9", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-crypto-hashing", + "sp-externalities", + "sp-runtime", + "sp-runtime-interface", + "thiserror 1.0.69", + "x25519-dalek", ] [[package]] -name = "sp-core-hashing-proc-macro" -version = "5.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-std" +version = "14.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" + +[[package]] +name = "sp-storage" +version = "22.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "proc-macro2", - "quote", - "sp-core-hashing", - "syn 1.0.109", + "impl-serde", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive", ] [[package]] -name = "sp-database" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-timestamp" +version = "40.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "kvdb", - "parking_lot 0.12.1", + "async-trait", + "parity-scale-codec", + "sp-inherents", + "sp-runtime", + "thiserror 1.0.69", ] [[package]] -name = "sp-debug-derive" -version = "5.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-tracing" +version = "19.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "parity-scale-codec", + "regex", + "tracing", + "tracing-core", + "tracing-subscriber 0.3.22", ] [[package]] -name = "sp-externalities" -version = "0.13.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-transaction-pool" +version = "40.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "environmental", - "parity-scale-codec 3.6.9", - "sp-std", - "sp-storage", + "sp-api", + "sp-runtime", ] [[package]] -name = "sp-inherents" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-transaction-storage-proof" +version = "40.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ "async-trait", - "impl-trait-for-tuples", - "parity-scale-codec 3.6.9", + "parity-scale-codec", "scale-info", "sp-core", + "sp-inherents", "sp-runtime", - "sp-std", - "thiserror", + "sp-trie", ] [[package]] -name = "sp-io" -version = "7.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-trie" +version = "42.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "bytes", - "ed25519 1.5.3", - "ed25519-dalek 1.0.1", - "futures", - "libsecp256k1", - "log", - "parity-scale-codec 3.6.9", - "secp256k1", + "ahash 0.8.12", + "foldhash 0.1.5", + "hash-db", + "hashbrown 0.15.5", + "memory-db", + "nohash-hasher", + "parity-scale-codec", + "parking_lot 0.12.5", + "rand 0.8.5", + "scale-info", + "schnellru", "sp-core", "sp-externalities", - "sp-keystore", - "sp-runtime-interface", - "sp-state-machine", - "sp-std", - "sp-tracing", - "sp-trie", + "substrate-prometheus-endpoint", + "thiserror 1.0.69", "tracing", - "tracing-core", + "trie-db", + "trie-root", ] [[package]] -name = "sp-keyring" -version = "7.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-version" +version = "43.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "lazy_static", - "sp-core", + "impl-serde", + "parity-scale-codec", + "parity-wasm", + "scale-info", + "serde", + "sp-crypto-hashing-proc-macro", "sp-runtime", - "strum", + "sp-std", + "sp-version-proc-macro", + "thiserror 1.0.69", ] [[package]] -name = "sp-keystore" -version = "0.13.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-version-proc-macro" +version = "15.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "async-trait", - "futures", - "merlin 2.0.1", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", - "schnorrkel 0.9.1", - "serde", - "sp-core", - "sp-externalities", - "thiserror", + "parity-scale-codec", + "proc-macro-warning", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "sp-maybe-compressed-blob" -version = "4.1.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-wasm-interface" +version = "24.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "thiserror", - "zstd", + "anyhow", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "wasmtime", ] [[package]] -name = "sp-npos-elections" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sp-weights" +version = "33.2.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "parity-scale-codec 3.6.9", + "bounded-collections", + "parity-scale-codec", "scale-info", "serde", + "smallvec", "sp-arithmetic", - "sp-core", - "sp-runtime", - "sp-std", + "sp-debug-derive", ] [[package]] -name = "sp-offchain" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" dependencies = [ - "sp-api", - "sp-core", - "sp-runtime", + "lock_api", ] [[package]] -name = "sp-panic-handler" -version = "5.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "spinning_top" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" dependencies = [ - "backtrace", - "lazy_static", - "regex", + "lock_api", ] [[package]] -name = "sp-rpc" -version = "6.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ - "rustc-hash", - "serde", - "sp-core", + "base64ct", + "der", ] [[package]] -name = "sp-runtime" -version = "7.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sqlx" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" dependencies = [ - "either", - "hash256-std-hasher", - "impl-trait-for-tuples", - "log", - "parity-scale-codec 3.6.9", - "paste", - "rand 0.8.5", - "scale-info", - "serde", - "sp-application-crypto", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-std", - "sp-weights", + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", ] [[package]] -name = "sp-runtime-interface" -version = "7.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sqlx-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" dependencies = [ + "base64", "bytes", - "impl-trait-for-tuples", - "parity-scale-codec 3.6.9", - "primitive-types", - "sp-externalities", - "sp-runtime-interface-proc-macro", - "sp-std", - "sp-storage", - "sp-tracing", - "sp-wasm-interface", - "static_assertions", + "crc", + "crossbeam-queue", + "either", + "event-listener 5.4.1", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.15.5", + "hashlink 0.10.0", + "indexmap 2.12.1", + "log", + "memchr", + "once_cell", + "percent-encoding", + "serde", + "serde_json", + "sha2 0.10.9", + "smallvec", + "thiserror 2.0.17", + "tokio", + "tokio-stream", + "tracing", + "url", ] [[package]] -name = "sp-runtime-interface-proc-macro" -version = "6.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sqlx-macros" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" dependencies = [ - "Inflector", - "proc-macro-crate 1.1.3", "proc-macro2", "quote", - "syn 1.0.109", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.111", ] [[package]] -name = "sp-session" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sqlx-macros-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" dependencies = [ - "parity-scale-codec 3.6.9", - "scale-info", - "sp-api", - "sp-core", - "sp-runtime", - "sp-staking", - "sp-std", + "dotenvy", + "either", + "heck 0.5.0", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2 0.10.9", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.111", + "tokio", + "url", ] [[package]] -name = "sp-staking" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sqlx-mysql" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ - "parity-scale-codec 3.6.9", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std", + "atoi", + "base64", + "bitflags 2.10.0", + "byteorder", + "bytes", + "crc", + "digest 0.10.7", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array 0.14.7", + "hex", + "hkdf", + "hmac 0.12.1", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand 0.8.5", + "rsa", + "serde", + "sha1", + "sha2 0.10.9", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.17", + "tracing", + "whoami", ] [[package]] -name = "sp-state-machine" -version = "0.13.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sqlx-postgres" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ - "hash-db", + "atoi", + "base64", + "bitflags 2.10.0", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac 0.12.1", + "home", + "itoa", "log", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", + "md-5", + "memchr", + "once_cell", "rand 0.8.5", - "smallvec", - "sp-core", - "sp-externalities", - "sp-panic-handler", - "sp-std", - "sp-trie", - "thiserror", + "serde", + "serde_json", + "sha2 0.10.9", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.17", "tracing", + "whoami", ] [[package]] -name = "sp-std" -version = "5.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" - -[[package]] -name = "sp-storage" -version = "7.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "sqlx-sqlite" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" dependencies = [ - "impl-serde", - "parity-scale-codec 3.6.9", - "ref-cast", + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", "serde", - "sp-debug-derive", - "sp-std", + "serde_urlencoded", + "sqlx-core", + "thiserror 2.0.17", + "tracing", + "url", ] [[package]] -name = "sp-timestamp" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "ss58-registry" +version = "1.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19409f13998e55816d1c728395af0b52ec066206341d939e22e7766df9b494b8" dependencies = [ - "async-trait", - "futures-timer", - "log", - "parity-scale-codec 3.6.9", - "sp-inherents", - "sp-runtime", - "sp-std", - "thiserror", + "Inflector", + "num-format", + "proc-macro2", + "quote", + "serde", + "serde_json", + "unicode-xid", ] [[package]] -name = "sp-tracing" -version = "6.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" -dependencies = [ - "parity-scale-codec 3.6.9", - "sp-std", - "tracing", - "tracing-core", - "tracing-subscriber", -] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] -name = "sp-transaction-pool" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "staging-xcm" +version = "21.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "sp-api", + "array-bytes 6.2.3", + "bounded-collections", + "derive-where", + "environmental", + "frame-support", + "hex-literal 0.4.1", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "serde", "sp-runtime", + "sp-weights", + "tracing", + "xcm-procedural", ] [[package]] -name = "sp-transaction-storage-proof" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "staging-xcm-builder" +version = "25.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "async-trait", - "log", - "parity-scale-codec 3.6.9", + "environmental", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "pallet-asset-conversion", + "pallet-transaction-payment", + "parity-scale-codec", + "polkadot-parachain-primitives", "scale-info", + "sp-arithmetic", "sp-core", - "sp-inherents", + "sp-io", "sp-runtime", - "sp-std", - "sp-trie", + "sp-weights", + "staging-xcm", + "staging-xcm-executor", + "tracing", ] [[package]] -name = "sp-trie" -version = "7.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "staging-xcm-executor" +version = "24.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "ahash 0.8.11", - "hash-db", - "hashbrown 0.12.3", - "lazy_static", - "memory-db", - "nohash-hasher", - "parity-scale-codec 3.6.9", - "parking_lot 0.12.1", + "environmental", + "frame-benchmarking", + "frame-support", + "impl-trait-for-tuples", + "parity-scale-codec", "scale-info", - "schnellru", + "sp-arithmetic", "sp-core", - "sp-std", - "thiserror", + "sp-io", + "sp-runtime", + "sp-weights", + "staging-xcm", "tracing", - "trie-db", - "trie-root", ] [[package]] -name = "sp-version" -version = "5.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "static_init" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bae1df58c5fea7502e8e352ec26b5579f6178e1fdb311e088580c980dee25ed" dependencies = [ - "impl-serde", - "parity-scale-codec 3.6.9", - "parity-wasm", - "scale-info", - "serde", - "sp-core-hashing-proc-macro", - "sp-runtime", - "sp-std", - "sp-version-proc-macro", - "thiserror", + "bitflags 1.3.2", + "cfg_aliases 0.2.1", + "libc", + "parking_lot 0.12.5", + "parking_lot_core 0.9.12", + "static_init_macro", + "winapi", ] [[package]] -name = "sp-version-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "static_init_macro" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1389c88ddd739ec6d3f8f83343764a0e944cd23cfbf126a9796a714b0b6edd6f" dependencies = [ - "parity-scale-codec 3.6.9", + "cfg_aliases 0.1.1", + "memchr", "proc-macro2", "quote", "syn 1.0.109", ] [[package]] -name = "sp-wasm-interface" -version = "7.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "string-interner" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c6a0d765f5807e98a091107bae0a56ea3799f66a5de47b2c84c94a39c09974e" dependencies = [ - "anyhow", - "impl-trait-for-tuples", - "log", - "parity-scale-codec 3.6.9", - "sp-std", - "wasmi 0.13.2", - "wasmtime", + "cfg-if", + "hashbrown 0.14.5", + "serde", ] [[package]] -name = "sp-weights" -version = "4.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" dependencies = [ - "parity-scale-codec 3.6.9", - "scale-info", - "serde", - "smallvec", - "sp-arithmetic", - "sp-core", - "sp-debug-derive", - "sp-std", + "unicode-bidi", + "unicode-normalization", + "unicode-properties", ] [[package]] -name = "spin" -version = "0.5.2" +name = "strsim" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] -name = "spin" -version = "0.9.8" +name = "strum" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" [[package]] -name = "spki" -version = "0.6.0" +name = "strum" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "base64ct", - "der 0.6.1", + "strum_macros 0.26.4", ] [[package]] -name = "spki" -version = "0.7.3" +name = "strum_macros" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "base64ct", - "der 0.7.8", + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", ] [[package]] -name = "ss58-registry" -version = "1.44.0" +name = "strum_macros" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35935738370302d5e33963665b77541e4b990a3e919ec904c837a56cfc891de1" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "Inflector", - "num-format", + "heck 0.5.0", "proc-macro2", "quote", - "serde", - "serde_json", - "unicode-xid", + "rustversion", + "syn 2.0.111", ] [[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +name = "substrate-bip39" +version = "0.6.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "hmac 0.12.1", + "pbkdf2", + "schnorrkel", + "sha2 0.10.9", + "zeroize", +] [[package]] -name = "static_assertions" -version = "1.1.0" +name = "substrate-bn" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "72b5bbfa79abbae15dd642ea8176a21a635ff3c00059961d1ea27ad04e5b441c" +dependencies = [ + "byteorder", + "crunchy", + "lazy_static", + "rand 0.8.5", + "rustc-hex", +] [[package]] -name = "static_init" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2a1c578e98c1c16fc3b8ec1328f7659a500737d7a0c6d625e73e830ff9c1f6" +name = "substrate-build-script-utils" +version = "11.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" + +[[package]] +name = "substrate-frame-rpc-system" +version = "49.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "bitflags 1.3.2", - "cfg_aliases", - "libc", - "parking_lot 0.11.2", - "parking_lot_core 0.8.6", - "static_init_macro", - "winapi", + "docify", + "frame-system-rpc-runtime-api", + "futures", + "jsonrpsee", + "log", + "parity-scale-codec", + "sc-rpc-api", + "sc-transaction-pool-api", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-core", + "sp-runtime", ] [[package]] -name = "static_init_macro" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a2595fc3aa78f2d0e45dd425b22282dd863273761cc77780914b2cf3003acf" +name = "substrate-prometheus-endpoint" +version = "0.17.7" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "cfg_aliases", - "memchr", - "proc-macro2", - "quote", - "syn 1.0.109", + "http-body-util", + "hyper 1.8.1", + "hyper-util", + "log", + "prometheus", + "thiserror 1.0.69", + "tokio", ] [[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +name = "substrate-test-utils" +version = "3.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" [[package]] -name = "strum" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +name = "substrate-wasm-builder" +version = "31.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" dependencies = [ - "strum_macros", + "array-bytes 6.2.3", + "build-helper", + "cargo_metadata", + "console", + "filetime", + "frame-metadata", + "jobserver", + "merkleized-metadata", + "parity-scale-codec", + "parity-wasm", + "polkavm-linker", + "sc-executor", + "shlex", + "sp-core", + "sp-io", + "sp-maybe-compressed-blob", + "sp-tracing", + "sp-version", + "strum 0.26.3", + "tempfile", + "toml 0.8.23", + "walkdir", + "wasm-opt", ] [[package]] -name = "strum_macros" -version = "0.24.3" +name = "subtle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" + +[[package]] +name = "subtle" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", -] +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] -name = "stun" -version = "0.4.4" +name = "subxt" +version = "0.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e94b1ec00bad60e6410e058b52f1c66de3dc5fe4d62d09b3e52bb7d3b73e25" +checksum = "f8c6dc0f90e23c521465b8f7e026af04a48cc6f00c51d88a8d313d33096149de" dependencies = [ - "base64 0.13.1", - "crc", - "lazy_static", - "md-5", - "rand 0.8.5", - "ring 0.16.20", - "subtle", - "thiserror", + "async-trait", + "derive-where", + "either", + "frame-metadata", + "futures", + "hex", + "jsonrpsee", + "parity-scale-codec", + "primitive-types 0.13.1", + "scale-bits", + "scale-decode", + "scale-encode", + "scale-info", + "scale-value", + "serde", + "serde_json", + "sp-crypto-hashing", + "subxt-core", + "subxt-lightclient", + "subxt-macro", + "subxt-metadata", + "subxt-rpcs", + "thiserror 2.0.17", "tokio", + "tokio-util", + "tracing", "url", - "webrtc-util", + "wasm-bindgen-futures", + "web-time", ] [[package]] -name = "substrate-bip39" -version = "0.4.5" +name = "subxt-codegen" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e620c7098893ba667438b47169c00aacdd9e7c10e042250ce2b60b087ec97328" +checksum = "1728caecd9700391e78cc30dc298221d6f5ca0ea28258a452aa76b0b7c229842" dependencies = [ - "hmac 0.11.0", - "pbkdf2 0.8.0", - "schnorrkel 0.9.1", - "sha2 0.9.9", - "zeroize", + "heck 0.5.0", + "parity-scale-codec", + "proc-macro2", + "quote", + "scale-info", + "scale-typegen", + "subxt-metadata", + "syn 2.0.111", + "thiserror 2.0.17", ] [[package]] -name = "substrate-build-script-utils" -version = "3.0.0" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "subxt-core" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25338dd11ae34293b8d0c5807064f2e00194ba1bd84cccfa694030c8d185b941" dependencies = [ - "platforms", + "base58", + "blake2 0.10.6", + "derive-where", + "frame-decode", + "frame-metadata", + "hashbrown 0.14.5", + "hex", + "impl-serde", + "keccak-hash", + "parity-scale-codec", + "primitive-types 0.13.1", + "scale-bits", + "scale-decode", + "scale-encode", + "scale-info", + "scale-value", + "serde", + "serde_json", + "sp-crypto-hashing", + "subxt-metadata", + "thiserror 2.0.17", + "tracing", ] [[package]] -name = "substrate-frame-rpc-system" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "subxt-lightclient" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9097ef356e534ce0b6a50b95233512afc394347b971a4f929c4830adc52bbc6f" dependencies = [ - "frame-system-rpc-runtime-api", "futures", - "jsonrpsee", - "log", - "parity-scale-codec 3.6.9", - "sc-rpc-api", - "sc-transaction-pool-api", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "substrate-prometheus-endpoint" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" -dependencies = [ - "hyper", - "log", - "prometheus", - "thiserror", + "futures-util", + "serde", + "serde_json", + "smoldot-light", + "thiserror 2.0.17", "tokio", + "tokio-stream", + "tracing", ] [[package]] -name = "substrate-test-utils" -version = "4.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "subxt-macro" +version = "0.43.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c269228a2e5de4c0c61ed872b701967ee761df0f167d5b91ecec1185bca65793" dependencies = [ - "futures", - "substrate-test-utils-derive", - "tokio", + "darling 0.20.11", + "parity-scale-codec", + "proc-macro-error2", + "quote", + "scale-typegen", + "subxt-codegen", + "subxt-metadata", + "subxt-utils-fetchmetadata", + "syn 2.0.111", ] [[package]] -name = "substrate-test-utils-derive" -version = "0.10.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "subxt-metadata" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c134068711c0c46906abc0e6e4911204420331530738e18ca903a5469364d9f" dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro2", - "quote", - "syn 1.0.109", + "frame-decode", + "frame-metadata", + "hashbrown 0.14.5", + "parity-scale-codec", + "scale-info", + "sp-crypto-hashing", + "thiserror 2.0.17", ] [[package]] -name = "substrate-wasm-builder" -version = "5.0.0-dev" -source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v6-monthly-2023-03#74ef745933703849d756dc16d41d938157d6943a" +name = "subxt-rpcs" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25de7727144780d780a6a7d78bbfd28414b8adbab68b05e87329c367d7705be4" dependencies = [ - "ansi_term", - "build-helper", - "cargo_metadata", - "filetime", - "sp-maybe-compressed-blob", - "strum", - "tempfile", - "toml", - "walkdir", - "wasm-opt", + "derive-where", + "finito", + "frame-metadata", + "futures", + "hex", + "impl-serde", + "jsonrpsee", + "parity-scale-codec", + "primitive-types 0.13.1", + "serde", + "serde_json", + "subxt-core", + "subxt-lightclient", + "thiserror 2.0.17", + "tokio", + "tokio-util", + "tracing", + "url", ] [[package]] -name = "substring" -version = "1.4.5" +name = "subxt-signer" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" +checksum = "9a9bd240ae819f64ac6898d7ec99a88c8b838dba2fb9d83b843feb70e77e34c8" dependencies = [ - "autocfg", + "base64", + "bip32", + "bip39", + "cfg-if", + "crypto_secretbox", + "hex", + "hmac 0.12.1", + "keccak-hash", + "parity-scale-codec", + "pbkdf2", + "regex", + "schnorrkel", + "scrypt", + "secp256k1 0.30.0", + "secrecy 0.10.3", + "serde", + "serde_json", + "sha2 0.10.9", + "sp-crypto-hashing", + "subxt-core", + "thiserror 2.0.17", + "zeroize", ] [[package]] -name = "subtle" -version = "2.4.1" +name = "subxt-utils-fetchmetadata" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "8c4fb8fd6b16ecd3537a29d70699f329a68c1e47f70ed1a46d64f76719146563" +dependencies = [ + "hex", + "parity-scale-codec", + "thiserror 2.0.17", +] [[package]] name = "syn" @@ -9873,15 +14892,27 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.40" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13fa70a4ee923979ffb522cacce59d34421ebdea5625e1073c4326ef9d2dd42e" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f92d01b5de07eaf324f7fca61cc6bd3d82bbc1de5b6c963e6fe79e86f36580d" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "synstructure" version = "0.12.6" @@ -9894,27 +14925,59 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "sysinfo" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "rayon", + "windows 0.52.0", +] + [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", - "core-foundation", + "bitflags 2.10.0", + "core-foundation 0.9.4", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "tap" version = "1.0.1" @@ -9923,56 +14986,86 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "target-lexicon" -version = "0.12.12" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" +checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" [[package]] name = "tempfile" -version = "3.8.1" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ - "cfg-if 1.0.0", "fastrand", - "redox_syscall 0.4.1", - "rustix 0.38.28", - "windows-sys 0.48.0", + "getrandom 0.3.4", + "once_cell", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] name = "termcolor" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] +[[package]] +name = "terminal_size" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" +dependencies = [ + "rustix 1.1.2", + "windows-sys 0.60.2", +] + [[package]] name = "termtree" -version = "0.4.1" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" + +[[package]] +name = "thiserror" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] [[package]] name = "thiserror" -version = "1.0.50" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.111", ] [[package]] @@ -9983,12 +15076,11 @@ checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ - "cfg-if 1.0.0", - "once_cell", + "cfg-if", ] [[package]] @@ -10000,11 +15092,22 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "tikv-jemalloc-ctl" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "661f1f6a57b3a36dc9174a2c10f19513b4866816e13425d3e418b11cc37bc24c" +dependencies = [ + "libc", + "paste", + "tikv-jemalloc-sys", +] + [[package]] name = "tikv-jemalloc-sys" -version = "0.5.4+5.3.0-patched" +version = "0.6.1+5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9402443cb8fd499b6f327e40565234ff34dbda27460c5b47db0db77443dd85d1" +checksum = "cd8aa5b2ab86a2cefa406d889139c162cbb230092f7d1d7cbc1716405d852a3b" dependencies = [ "cc", "libc", @@ -10012,12 +15115,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.30" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -10026,38 +15130,20 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ + "num-conv", "time-core", ] -[[package]] -name = "tiny-bip39" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" -dependencies = [ - "anyhow", - "hmac 0.12.1", - "once_cell", - "pbkdf2 0.11.0", - "rand 0.8.5", - "rustc-hash", - "sha2 0.10.8", - "thiserror", - "unicode-normalization", - "wasm-bindgen", - "zeroize", -] - [[package]] name = "tiny-keccak" version = "2.0.2" @@ -10068,20 +15154,20 @@ dependencies = [ ] [[package]] -name = "tinytemplate" -version = "1.2.1" +name = "tinystr" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ - "serde", - "serde_json", + "displaydoc", + "zerovec", ] [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -10094,103 +15180,174 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.2" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", "libc", "mio", - "parking_lot 0.12.1", - "pin-project-lite 0.2.13", + "parking_lot 0.12.5", + "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2 0.6.1", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.111", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "489a59b6730eda1b0171fcfda8b121f4bee2b35cba8645ca35c5f7ba3eb736c1" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", ] [[package]] -name = "tokio-rustls" -version = "0.23.4" +name = "toml" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ - "rustls 0.20.9", - "tokio", - "webpki 0.22.4", + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", ] [[package]] -name = "tokio-stream" -version = "0.1.14" +name = "toml_datetime" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ - "futures-core", - "pin-project-lite 0.2.13", - "tokio", - "tokio-util", + "serde", ] [[package]] -name = "tokio-util" -version = "0.7.10" +name = "toml_datetime" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "pin-project-lite 0.2.13", - "tokio", - "tracing", + "serde_core", ] [[package]] -name = "toml" -version = "0.5.11" +name = "toml_edit" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ + "indexmap 2.12.1", "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_write", + "winnow", ] [[package]] -name = "toml_datetime" -version = "0.6.3" +name = "toml_edit" +version = "0.23.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "5d7cbc3b4b49633d57a0509303158ca50de80ae32c265093b24c414705807832" +dependencies = [ + "indexmap 2.12.1", + "toml_datetime 0.7.3", + "toml_parser", + "winnow", +] [[package]] -name = "toml_edit" -version = "0.20.2" +name = "toml_parser" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ - "indexmap 2.1.0", - "toml_datetime", "winnow", ] +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "tower" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", "tower-layer", "tower-service", "tracing", @@ -10198,62 +15355,60 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.3.5" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.10.0", "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-range-header", - "pin-project-lite 0.2.13", + "http 1.4.0", + "http-body 1.0.1", + "http-body-util", + "pin-project-lite", "tower-layer", "tower-service", ] [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" dependencies = [ "log", - "pin-project-lite 0.2.13", + "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.111", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ "once_cell", "valuable", @@ -10269,58 +15424,78 @@ dependencies = [ "tracing", ] +[[package]] +name = "tracing-gum" +version = "23.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "coarsetime", + "polkadot-primitives", + "tracing", + "tracing-gum-proc-macro", +] + +[[package]] +name = "tracing-gum-proc-macro" +version = "5.0.0" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "expander", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "tracing-log" -version = "0.1.4" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ + "ahash 0.7.8", "log", + "lru 0.7.8", "once_cell", "tracing-core", ] [[package]] -name = "tracing-serde" -version = "0.1.3" +name = "tracing-subscriber" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" dependencies = [ - "serde", "tracing-core", ] [[package]] name = "tracing-subscriber" -version = "0.2.25" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ - "ansi_term", - "chrono", - "lazy_static", "matchers", - "parking_lot 0.11.2", - "regex", - "serde", - "serde_json", + "nu-ansi-term", + "once_cell", + "parking_lot 0.12.5", + "regex-automata", "sharded-slab", "smallvec", "thread_local", + "time", "tracing", "tracing-core", "tracing-log", - "tracing-serde", ] [[package]] name = "trie-db" -version = "0.27.1" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "767abe6ffed88a1889671a102c2861ae742726f52e0a5a425b92c9fbfa7e9c85" +checksum = "6c0670ab45a6b7002c7df369fee950a27cf29ae0474343fd3a15aa15f691e7a6" dependencies = [ "hash-db", - "hashbrown 0.13.2", "log", "rustc-hex", "smallvec", @@ -10335,52 +15510,6 @@ dependencies = [ "hash-db", ] -[[package]] -name = "trust-dns-proto" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" -dependencies = [ - "async-trait", - "cfg-if 1.0.0", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna 0.2.3", - "ipnet", - "lazy_static", - "rand 0.8.5", - "smallvec", - "socket2 0.4.10", - "thiserror", - "tinyvec", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "trust-dns-resolver" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" -dependencies = [ - "cfg-if 1.0.0", - "futures-util", - "ipconfig", - "lazy_static", - "lru-cache", - "parking_lot 0.12.1", - "resolv-conf", - "smallvec", - "thiserror", - "tokio", - "tracing", - "trust-dns-proto", -] - [[package]] name = "try-lock" version = "0.2.5" @@ -10394,67 +15523,60 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f195fd851901624eee5a58c4bb2b4f06399148fcd0ed336e6f1cb60a9881df" [[package]] -name = "turn" -version = "0.6.1" +name = "tungstenite" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4712ee30d123ec7ae26d1e1b218395a16c87cdbaf4b3925d170d684af62ea5e8" +checksum = "eadc29d668c91fcc564941132e17b28a7ceb2f3ebf0b9dae3e03fd7a6748eb0d" dependencies = [ - "async-trait", - "base64 0.13.1", - "futures", + "bytes", + "data-encoding", + "http 1.4.0", + "httparse", "log", - "md-5", - "rand 0.8.5", - "ring 0.16.20", - "stun", - "thiserror", - "tokio", - "webrtc-util", + "rand 0.9.2", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.17", + "url", + "utf-8", ] +[[package]] +name = "tuplex" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "676ac81d5454c4dcf37955d34fa8626ede3490f744b86ca14a7b90168d2a08aa" + [[package]] name = "twox-hash" version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ - "cfg-if 0.1.10", + "cfg-if", "digest 0.10.7", "rand 0.8.5", "static_assertions", ] [[package]] -name = "type-metadata" -version = "0.1.0" -source = "git+https://github.com/type-metadata/type-metadata.git?rev=02eae9f35c40c943b56af5b60616219f2b72b47d#02eae9f35c40c943b56af5b60616219f2b72b47d" -dependencies = [ - "derive_more", - "serde", - "type-metadata-derive", -] - -[[package]] -name = "type-metadata-derive" -version = "0.1.0" -source = "git+https://github.com/type-metadata/type-metadata.git?rev=02eae9f35c40c943b56af5b60616219f2b72b47d#02eae9f35c40c943b56af5b60616219f2b72b47d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +name = "twox-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -10468,48 +15590,68 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "uint" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909988d098b2f738727b161a106cfc7cab00c539c2687a8836f8e565976fb53e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-bidi" -version = "0.3.14" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ "tinyvec", ] [[package]] -name = "unicode-width" -version = "0.1.11" +name = "unicode-properties" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] -name = "unicode-xid" -version = "0.2.4" +name = "unicode-segmentation" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] -name = "universal-hash" -version = "0.4.1" +name = "unicode-width" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" -dependencies = [ - "generic-array 0.14.7", - "subtle", -] +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "universal-hash" @@ -10518,7 +15660,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", - "subtle", + "subtle 2.6.1", ] [[package]] @@ -10527,12 +15669,22 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" dependencies = [ - "asynchronous-codec", + "asynchronous-codec 0.6.2", "bytes", "futures-io", "futures-util", ] +[[package]] +name = "unsigned-varint" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" +dependencies = [ + "bytes", + "tokio-util", +] + [[package]] name = "untrusted" version = "0.7.1" @@ -10547,35 +15699,50 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", - "idna 0.5.0", + "idna", "percent-encoding", + "serde", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.6.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.3.4", + "js-sys", + "wasm-bindgen", ] [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" @@ -10585,9 +15752,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "void" @@ -10596,19 +15763,87 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] -name = "waitgroup" -version = "0.1.2" +name = "w3f-bls" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292" +checksum = "e6bfb937b3d12077654a9e43e32a4e9c20177dd9fea0f3aba673e7840bb54f32" dependencies = [ - "atomic-waker", + "ark-bls12-377", + "ark-bls12-381 0.4.0", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-serialize-derive 0.4.2", + "arrayref", + "digest 0.10.7", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "sha2 0.10.9", + "sha3", + "zeroize", +] + +[[package]] +name = "w3f-pcs" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbe7a8d5c914b69392ab3b267f679a2e546fe29afaddce47981772ac71bd02e1" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "merlin", +] + +[[package]] +name = "w3f-plonk-common" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aca389e494fe08c5c108b512e2328309036ee1c0bc7bdfdb743fef54d448c8c" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "getrandom_or_panic", + "rand_core 0.6.4", + "w3f-pcs", +] + +[[package]] +name = "w3f-ring-proof" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a639379402ad51504575dbd258740383291ac8147d3b15859bdf1ea48c677de" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "ark-transcript", + "w3f-pcs", + "w3f-plonk-common", +] + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", ] [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -10621,71 +15856,69 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ "try-lock", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +] [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen" -version = "0.2.89" +name = "wasite" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasix" +version = "0.12.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1fbb4ef9bbca0c1170e0b00dd28abc9e3b68669821600cad1caaed606583c6d" dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", + "wasi", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.89" +name = "wasm-bindgen" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ - "bumpalo", - "log", + "cfg-if", "once_cell", - "proc-macro2", - "quote", - "syn 2.0.40", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.39" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -10693,30 +15926,44 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.40", - "wasm-bindgen-backend", + "syn 2.0.111", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.235.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "b3bc393c395cb621367ff02d854179882b9a351b4e0c93d1397e6090b53a5c2a" +dependencies = [ + "leb128fmt", + "wasmparser 0.235.0", +] [[package]] name = "wasm-encoder" -version = "0.38.1" +version = "0.243.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" +checksum = "c55db9c896d70bd9fa535ce83cd4e1f2ec3726b0edd2142079f594fc3be1cb35" dependencies = [ - "leb128", + "leb128fmt", + "wasmparser 0.243.0", ] [[package]] @@ -10739,25 +15986,25 @@ dependencies = [ [[package]] name = "wasm-opt" -version = "0.111.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a303793cbc01fb96551badfc7367db6007396bba6bac97936b3c8b6f7fdb41" +checksum = "2fd87a4c135535ffed86123b6fb0f0a5a0bc89e50416c942c5f0662c645f679c" dependencies = [ "anyhow", "libc", - "strum", - "strum_macros", + "strum 0.24.1", + "strum_macros 0.24.3", "tempfile", - "thiserror", + "thiserror 1.0.69", "wasm-opt-cxx-sys", "wasm-opt-sys", ] [[package]] name = "wasm-opt-cxx-sys" -version = "0.111.0" +version = "0.116.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c9deb56f8a9f2ec177b3bd642a8205621835944ed5da55f2388ef216aca5a4" +checksum = "8c57b28207aa724318fcec6575fe74803c23f6f266fce10cbc9f3f116762f12e" dependencies = [ "anyhow", "cxx", @@ -10767,15 +16014,14 @@ dependencies = [ [[package]] name = "wasm-opt-sys" -version = "0.111.0" +version = "0.116.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4432e28b542738a9776cedf92e8a99d8991c7b4667ee2c7ccddfb479dd2856a7" +checksum = "8a1cce564dc768dacbdb718fc29df2dba80bd21cb47d8f77ae7e3d95ceb98cbe" dependencies = [ "anyhow", "cc", "cxx", "cxx-build", - "regex", ] [[package]] @@ -10795,624 +16041,611 @@ dependencies = [ [[package]] name = "wasmi" -version = "0.13.2" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c326c93fbf86419608361a2c925a31754cf109da1b8b55737070b4d6669422" +checksum = "50386c99b9c32bd2ed71a55b6dd4040af2580530fae8bdb9a6576571a80d0cca" dependencies = [ - "parity-wasm", - "wasmi-validation", - "wasmi_core 0.2.1", + "arrayvec 0.7.6", + "multi-stash", + "num-derive", + "num-traits", + "smallvec", + "spin 0.9.8", + "wasmi_collections 0.32.3", + "wasmi_core 0.32.3", + "wasmparser-nostd", ] [[package]] name = "wasmi" -version = "0.20.0" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01bf50edb2ea9d922aa75a7bf3c15e26a6c9e2d18c56e862b49737a582901729" +checksum = "a19af97fcb96045dd1d6b4d23e2b4abdbbe81723dbc5c9f016eb52145b320063" dependencies = [ + "arrayvec 0.7.6", + "multi-stash", + "smallvec", "spin 0.9.8", - "wasmi_arena", - "wasmi_core 0.5.0", - "wasmparser-nostd", + "wasmi_collections 0.40.0", + "wasmi_core 0.40.0", + "wasmi_ir", + "wasmparser 0.221.3", ] [[package]] -name = "wasmi-validation" -version = "0.5.0" +name = "wasmi_collections" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ff416ad1ff0c42e5a926ed5d5fab74c0f098749aa0ad8b2a34b982ce0e867b" +checksum = "9c128c039340ffd50d4195c3f8ce31aac357f06804cfc494c8b9508d4b30dca4" dependencies = [ - "parity-wasm", + "ahash 0.8.12", + "hashbrown 0.14.5", + "string-interner", ] [[package]] -name = "wasmi_arena" -version = "0.1.0" +name = "wasmi_collections" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ea379cbb0b41f3a9f0bf7b47036d036aae7f43383d8cc487d4deccf40dee0a" +checksum = "e80d6b275b1c922021939d561574bf376613493ae2b61c6963b15db0e8813562" [[package]] name = "wasmi_core" -version = "0.2.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d20cb3c59b788653d99541c646c561c9dd26506f25c0cebfe810659c54c6d7" +checksum = "a23b3a7f6c8c3ceeec6b83531ee61f0013c56e51cbf2b14b0f213548b23a4b41" dependencies = [ "downcast-rs", "libm", - "memory_units", - "num-rational", "num-traits", - "region", + "paste", ] [[package]] name = "wasmi_core" -version = "0.5.0" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5bf998ab792be85e20e771fe14182b4295571ad1d4f89d3da521c1bef5f597a" +checksum = "3a8c51482cc32d31c2c7ff211cd2bedd73c5bd057ba16a2ed0110e7a96097c33" dependencies = [ "downcast-rs", "libm", - "num-traits", +] + +[[package]] +name = "wasmi_ir" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e431a14c186db59212a88516788bd68ed51f87aa1e08d1df742522867b5289a" +dependencies = [ + "wasmi_core 0.40.0", ] [[package]] name = "wasmparser" -version = "0.100.0" +version = "0.221.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b20236ab624147dfbb62cf12a19aaf66af0e41b8398838b66e997d07d269d4" +checksum = "d06bfa36ab3ac2be0dee563380147a5b81ba10dd8885d7fbbc9eb574be67d185" dependencies = [ - "indexmap 1.9.3", - "url", + "bitflags 2.10.0", +] + +[[package]] +name = "wasmparser" +version = "0.235.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "161296c618fa2d63f6ed5fffd1112937e803cb9ec71b32b01a76321555660917" +dependencies = [ + "bitflags 2.10.0", + "hashbrown 0.15.5", + "indexmap 2.12.1", + "semver 1.0.27", + "serde", +] + +[[package]] +name = "wasmparser" +version = "0.243.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6d8db401b0528ec316dfbe579e6ab4152d61739cfe076706d2009127970159d" +dependencies = [ + "bitflags 2.10.0", + "indexmap 2.12.1", + "semver 1.0.27", ] [[package]] name = "wasmparser-nostd" -version = "0.91.0" +version = "0.100.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c37f310b5a62bfd5ae7c0f1d8e6f98af16a5d6d84ba764e9c36439ec14e318b" +checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" dependencies = [ "indexmap-nostd", ] +[[package]] +name = "wasmprinter" +version = "0.235.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75aa8e9076de6b9544e6dab4badada518cca0bf4966d35b131bbd057aed8fa0a" +dependencies = [ + "anyhow", + "termcolor", + "wasmparser 0.235.0", +] + [[package]] name = "wasmtime" -version = "6.0.2" +version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a222f5fa1e14b2cefc286f1b68494d7a965f4bf57ec04c59bb62673d639af6" +checksum = "b6fe976922a16af3b0d67172c473d1fd4f1aa5d0af9c8ba6538c741f3af686f4" dependencies = [ + "addr2line 0.24.2", "anyhow", - "bincode", - "cfg-if 1.0.0", - "indexmap 1.9.3", + "bitflags 2.10.0", + "bumpalo", + "cc", + "cfg-if", + "fxprof-processed-profile", + "gimli 0.31.1", + "hashbrown 0.15.5", + "indexmap 2.12.1", + "ittapi", "libc", "log", - "object 0.29.0", + "mach2", + "memfd", + "object 0.36.7", "once_cell", - "paste", - "psm", + "postcard", + "pulley-interpreter", "rayon", + "rustix 1.1.2", "serde", + "serde_derive", + "serde_json", + "smallvec", "target-lexicon", - "wasmparser", - "wasmtime-cache", - "wasmtime-cranelift", + "wasmparser 0.235.0", "wasmtime-environ", - "wasmtime-jit", - "wasmtime-runtime", - "windows-sys 0.42.0", + "wasmtime-internal-asm-macros", + "wasmtime-internal-cache", + "wasmtime-internal-cranelift", + "wasmtime-internal-fiber", + "wasmtime-internal-jit-debug", + "wasmtime-internal-jit-icache-coherence", + "wasmtime-internal-math", + "wasmtime-internal-slab", + "wasmtime-internal-unwinder", + "wasmtime-internal-versioned-export-macros", + "wasmtime-internal-winch", + "windows-sys 0.59.0", +] + +[[package]] +name = "wasmtime-environ" +version = "35.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44b6264a78d806924abbc76bbc75eac24976bc83bdfb938e5074ae551242436f" +dependencies = [ + "anyhow", + "cpp_demangle", + "cranelift-bitset", + "cranelift-entity", + "gimli 0.31.1", + "indexmap 2.12.1", + "log", + "object 0.36.7", + "postcard", + "rustc-demangle", + "serde", + "serde_derive", + "smallvec", + "target-lexicon", + "wasm-encoder 0.235.0", + "wasmparser 0.235.0", + "wasmprinter", ] [[package]] -name = "wasmtime-asm-macros" -version = "6.0.2" +name = "wasmtime-internal-asm-macros" +version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4407a7246e7d2f3d8fb1cf0c72fda8dbafdb6dd34d555ae8bea0e5ae031089cc" +checksum = "6775a9b516559716e5710e95a8014ca0adcc81e5bf4d3ad7899d89ae40094d1a" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] -name = "wasmtime-cache" -version = "6.0.2" +name = "wasmtime-internal-cache" +version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ceb3adf61d654be0be67fffdce42447b0880481348785be5fe40b5dd7663a4c" +checksum = "138e33ad4bd120f3b1c77d6d0dcdce0de8239555495befcda89393a40ba5e324" dependencies = [ "anyhow", - "base64 0.13.1", - "bincode", + "base64", "directories-next", - "file-per-thread-logger", "log", - "rustix 0.36.17", + "postcard", + "rustix 1.1.2", "serde", - "sha2 0.10.8", - "toml", - "windows-sys 0.42.0", - "zstd", + "serde_derive", + "sha2 0.10.9", + "toml 0.8.23", + "windows-sys 0.59.0", + "zstd 0.13.3", ] [[package]] -name = "wasmtime-cranelift" -version = "6.0.2" +name = "wasmtime-internal-cranelift" +version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c366bb8647e01fd08cb5589976284b00abfded5529b33d7e7f3f086c68304a4" +checksum = "7ec9ad7565e6a8de7cb95484e230ff689db74a4a085219e0da0cbd637a29c01c" dependencies = [ "anyhow", + "cfg-if", "cranelift-codegen", + "cranelift-control", "cranelift-entity", "cranelift-frontend", "cranelift-native", - "cranelift-wasm", - "gimli 0.26.2", + "gimli 0.31.1", + "itertools 0.14.0", "log", - "object 0.29.0", + "object 0.36.7", + "pulley-interpreter", + "smallvec", "target-lexicon", - "thiserror", - "wasmparser", + "thiserror 2.0.17", + "wasmparser 0.235.0", "wasmtime-environ", + "wasmtime-internal-math", + "wasmtime-internal-versioned-export-macros", ] [[package]] -name = "wasmtime-environ" -version = "6.0.2" +name = "wasmtime-internal-fiber" +version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b8b50962eae38ee319f7b24900b7cf371f03eebdc17400c1dc8575fc10c9a7" +checksum = "8b636ff8b220ebaf29dfe3b23770e4b2bad317b9683e3bf7345e162387385b39" dependencies = [ "anyhow", - "cranelift-entity", - "gimli 0.26.2", - "indexmap 1.9.3", - "log", - "object 0.29.0", - "serde", - "target-lexicon", - "thiserror", - "wasmparser", - "wasmtime-types", + "cc", + "cfg-if", + "libc", + "rustix 1.1.2", + "wasmtime-internal-asm-macros", + "wasmtime-internal-versioned-export-macros", + "windows-sys 0.59.0", ] [[package]] -name = "wasmtime-jit" -version = "6.0.2" +name = "wasmtime-internal-jit-debug" +version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffaed4f9a234ba5225d8e64eac7b4a5d13b994aeb37353cde2cbeb3febda9eaa" +checksum = "61d8693995ab3df48e88777b6ee3b2f441f2c4f895ab938996cdac3db26f256c" dependencies = [ - "addr2line 0.17.0", - "anyhow", - "bincode", - "cfg-if 1.0.0", - "cpp_demangle", - "gimli 0.26.2", - "log", - "object 0.29.0", - "rustc-demangle", - "serde", - "target-lexicon", - "wasmtime-environ", - "wasmtime-jit-debug", - "wasmtime-jit-icache-coherence", - "wasmtime-runtime", - "windows-sys 0.42.0", + "cc", + "object 0.36.7", + "rustix 1.1.2", + "wasmtime-internal-versioned-export-macros", ] [[package]] -name = "wasmtime-jit-debug" -version = "6.0.2" +name = "wasmtime-internal-jit-icache-coherence" +version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed41cbcbf74ce3ff6f1d07d1b707888166dc408d1a880f651268f4f7c9194b2" +checksum = "4417e06b7f80baff87d9770852c757a39b8d7f11d78b2620ca992b8725f16f50" dependencies = [ - "object 0.29.0", - "once_cell", - "rustix 0.36.17", + "anyhow", + "cfg-if", + "libc", + "windows-sys 0.59.0", ] [[package]] -name = "wasmtime-jit-icache-coherence" -version = "6.0.2" +name = "wasmtime-internal-math" +version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a28ae1e648461bfdbb79db3efdaee1bca5b940872e4175390f465593a2e54c" +checksum = "7710d5c4ecdaa772927fd11e5dc30a9a62d1fc8fe933e11ad5576ad596ab6612" dependencies = [ - "cfg-if 1.0.0", - "libc", - "windows-sys 0.42.0", + "libm", ] [[package]] -name = "wasmtime-runtime" -version = "6.0.2" +name = "wasmtime-internal-slab" +version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e704b126e4252788ccfc3526d4d4511d4b23c521bf123e447ac726c14545217b" +checksum = "e6ab22fabe1eed27ab01fd47cd89deacf43ad222ed7fd169ba6f4dd1fbddc53b" + +[[package]] +name = "wasmtime-internal-unwinder" +version = "35.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "307708f302f5dcf19c1bbbfb3d9f2cbc837dd18088a7988747b043a46ba38ecc" dependencies = [ "anyhow", - "cc", - "cfg-if 1.0.0", - "indexmap 1.9.3", - "libc", + "cfg-if", + "cranelift-codegen", "log", - "mach", - "memfd", - "memoffset 0.6.5", - "paste", - "rand 0.8.5", - "rustix 0.36.17", - "wasmtime-asm-macros", - "wasmtime-environ", - "wasmtime-jit-debug", - "windows-sys 0.42.0", + "object 0.36.7", ] [[package]] -name = "wasmtime-types" -version = "6.0.2" +name = "wasmtime-internal-versioned-export-macros" +version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e5572c5727c1ee7e8f28717aaa8400e4d22dcbd714ea5457d85b5005206568" +checksum = "342b0466f92b7217a4de9e114175fedee1907028567d2548bcd42f71a8b5b016" dependencies = [ - "cranelift-entity", - "serde", - "thiserror", - "wasmparser", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "wasmtime-internal-winch" +version = "35.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2012e7384c25b91aab2f1b6a1e1cbab9d0f199bbea06cc873597a3f047f05730" +dependencies = [ + "anyhow", + "cranelift-codegen", + "gimli 0.31.1", + "object 0.36.7", + "target-lexicon", + "wasmparser 0.235.0", + "wasmtime-environ", + "wasmtime-internal-cranelift", + "winch-codegen", ] [[package]] name = "wast" -version = "69.0.1" +version = "243.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ee37317321afde358e4d7593745942c48d6d17e0e6e943704de9bbee121e7a" +checksum = "df21d01c2d91e46cb7a221d79e58a2d210ea02020d57c092e79255cc2999ca7f" dependencies = [ - "leb128", + "bumpalo", + "leb128fmt", "memchr", "unicode-width", - "wasm-encoder", + "wasm-encoder 0.243.0", ] [[package]] name = "wat" -version = "1.0.82" +version = "1.243.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb338ee8dee4d4cd05e6426683f21c5087dc7cfc8903e839ccf48d43332da3c" +checksum = "226a9a91cd80a50449312fef0c75c23478fcecfcc4092bdebe1dc8e760ef521b" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.66" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] -name = "webpki" -version = "0.21.4" +name = "web-time" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "webpki" -version = "0.22.4" +name = "webpki-root-certs" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" +checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", + "webpki-root-certs 1.0.4", ] [[package]] -name = "webpki-roots" -version = "0.22.6" +name = "webpki-root-certs" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +checksum = "ee3e3b5f5e80bc89f30ce8d0343bf4e5f12341c51f3e26cbeecbc7c85443e85b" dependencies = [ - "webpki 0.22.4", + "rustls-pki-types", ] [[package]] -name = "webrtc" -version = "0.6.0" +name = "webpki-roots" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3bc9049bdb2cea52f5fd4f6f728184225bdb867ed0dc2410eab6df5bdd67bb" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "hex", - "interceptor", - "lazy_static", - "log", - "rand 0.8.5", - "rcgen 0.9.3", - "regex", - "ring 0.16.20", - "rtcp", - "rtp", - "rustls 0.19.1", - "sdp", - "serde", - "serde_json", - "sha2 0.10.8", - "stun", - "thiserror", - "time", - "tokio", - "turn", - "url", - "waitgroup", - "webrtc-data", - "webrtc-dtls", - "webrtc-ice", - "webrtc-mdns", - "webrtc-media", - "webrtc-sctp", - "webrtc-srtp", - "webrtc-util", -] +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] -name = "webrtc-data" -version = "0.6.0" +name = "whoami" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef36a4d12baa6e842582fe9ec16a57184ba35e1a09308307b67d43ec8883100" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" dependencies = [ - "bytes", - "derive_builder", - "log", - "thiserror", - "tokio", - "webrtc-sctp", - "webrtc-util", + "libredox", + "wasite", ] [[package]] -name = "webrtc-dtls" -version = "0.7.2" +name = "wide" +version = "0.7.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a00f4242f2db33307347bd5be53263c52a0331c96c14292118c9a6bb48d267" +checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" dependencies = [ - "aes 0.6.0", - "aes-gcm 0.10.3", - "async-trait", - "bincode", - "block-modes", - "byteorder", - "ccm", - "curve25519-dalek 3.2.0", - "der-parser 8.2.0", - "elliptic-curve", - "hkdf", - "hmac 0.12.1", - "log", - "p256", - "p384", - "rand 0.8.5", - "rand_core 0.6.4", - "rcgen 0.10.0", - "ring 0.16.20", - "rustls 0.19.1", - "sec1", - "serde", - "sha1", - "sha2 0.10.8", - "signature 1.6.4", - "subtle", - "thiserror", - "tokio", - "webpki 0.21.4", - "webrtc-util", - "x25519-dalek 2.0.0", - "x509-parser 0.13.2", + "bytemuck", + "safe_arch", ] [[package]] -name = "webrtc-ice" -version = "0.9.1" +name = "widestring" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465a03cc11e9a7d7b4f9f99870558fe37a102b65b93f8045392fef7c67b39e80" -dependencies = [ - "arc-swap", - "async-trait", - "crc", - "log", - "rand 0.8.5", - "serde", - "serde_json", - "stun", - "thiserror", - "tokio", - "turn", - "url", - "uuid", - "waitgroup", - "webrtc-mdns", - "webrtc-util", -] +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" [[package]] -name = "webrtc-mdns" -version = "0.5.2" +name = "winapi" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f08dfd7a6e3987e255c4dbe710dde5d94d0f0574f8a21afa95d171376c143106" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ - "log", - "socket2 0.4.10", - "thiserror", - "tokio", - "webrtc-util", + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", ] [[package]] -name = "webrtc-media" -version = "0.5.1" +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f72e1650a8ae006017d1a5280efb49e2610c19ccc3c0905b03b648aee9554991" -dependencies = [ - "byteorder", - "bytes", - "rand 0.8.5", - "rtp", - "thiserror", -] +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] -name = "webrtc-sctp" -version = "0.7.0" +name = "winapi-util" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d47adcd9427eb3ede33d5a7f3424038f63c965491beafcc20bc650a2f6679c0" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "crc", - "log", - "rand 0.8.5", - "thiserror", - "tokio", - "webrtc-util", + "windows-sys 0.61.2", ] [[package]] -name = "webrtc-srtp" -version = "0.9.1" +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "winch-codegen" +version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6183edc4c1c6c0175f8812eefdce84dfa0aea9c3ece71c2bf6ddd3c964de3da5" +checksum = "839a334ef7c62d8368dbd427e767a6fbb1ba08cc12ecce19cbb666c10613b585" dependencies = [ - "aead 0.4.3", - "aes 0.7.5", - "aes-gcm 0.9.4", - "async-trait", - "byteorder", - "bytes", - "ctr 0.8.0", - "hmac 0.11.0", - "log", - "rtcp", - "rtp", - "sha-1", - "subtle", - "thiserror", - "tokio", - "webrtc-util", + "anyhow", + "cranelift-assembler-x64", + "cranelift-codegen", + "gimli 0.31.1", + "regalloc2 0.12.2", + "smallvec", + "target-lexicon", + "thiserror 2.0.17", + "wasmparser 0.235.0", + "wasmtime-environ", + "wasmtime-internal-cranelift", + "wasmtime-internal-math", ] [[package]] -name = "webrtc-util" -version = "0.7.0" +name = "windows" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f1db1727772c05cf7a2cfece52c3aca8045ca1e176cd517d323489aa3c6d87" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "async-trait", - "bitflags 1.3.2", - "bytes", - "cc", - "ipnet", - "lazy_static", - "libc", - "log", - "nix", - "rand 0.8.5", - "thiserror", - "tokio", - "winapi", + "windows-core 0.52.0", + "windows-targets 0.52.6", ] [[package]] -name = "which" -version = "4.4.2" +name = "windows" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +checksum = "efc5cf48f83140dcaab716eeaea345f9e93d0018fb81162753a3f76c3397b538" dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.28", + "windows-core 0.53.0", + "windows-targets 0.52.6", ] [[package]] -name = "wide" -version = "0.7.13" +name = "windows-core" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "bytemuck", - "safe_arch", + "windows-targets 0.52.6", ] [[package]] -name = "widestring" -version = "1.0.2" +name = "windows-core" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "9dcc5b895a6377f1ab9fa55acedab1fd5ac0db66ad1e6c7f47e28a22e446a5dd" +dependencies = [ + "windows-result 0.1.2", + "windows-targets 0.52.6", +] [[package]] -name = "winapi" -version = "0.3.9" +name = "windows-core" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result 0.4.1", + "windows-strings", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "windows-implement" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] [[package]] -name = "winapi-util" -version = "0.1.6" +name = "windows-interface" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ - "winapi", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "windows-link" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] -name = "windows" -version = "0.51.1" +name = "windows-result" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ - "windows-core", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] -name = "windows-core" -version = "0.51.1" +name = "windows-result" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-targets 0.48.5", + "windows-link", ] [[package]] -name = "windows-sys" -version = "0.42.0" +name = "windows-strings" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-link", ] [[package]] @@ -11439,7 +16672,34 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", ] [[package]] @@ -11474,17 +16734,35 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -11501,9 +16779,15 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -11519,9 +16803,15 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -11537,9 +16827,27 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -11555,9 +16863,15 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -11573,9 +16887,15 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -11591,9 +16911,15 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -11609,15 +16935,21 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.5.27" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb877ca3232bec99a6472ed63f7241de2a250165260908b2d24c09d867907a85" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] @@ -11628,18 +16960,21 @@ version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "windows-sys 0.48.0", ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.4.1", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "wyz" @@ -11652,22 +16987,11 @@ dependencies = [ [[package]] name = "x25519-dalek" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f" -dependencies = [ - "curve25519-dalek 3.2.0", - "rand_core 0.5.1", - "zeroize", -] - -[[package]] -name = "x25519-dalek" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ - "curve25519-dalek 4.1.3", + "curve25519-dalek", "rand_core 0.6.4", "serde", "zeroize", @@ -11675,55 +16999,107 @@ dependencies = [ [[package]] name = "x509-parser" -version = "0.13.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9bace5b5589ffead1afb76e43e34cff39cd0f3ce7e170ae0c29e53b88eb1c" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" dependencies = [ - "asn1-rs 0.3.1", - "base64 0.13.1", + "asn1-rs 0.6.2", "data-encoding", - "der-parser 7.0.0", + "der-parser 9.0.0", "lazy_static", - "nom", - "oid-registry 0.4.0", - "ring 0.16.20", + "nom 7.1.3", + "oid-registry 0.7.1", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] [[package]] name = "x509-parser" -version = "0.14.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +checksum = "4569f339c0c402346d4a75a9e39cf8dad310e287eef1ff56d4c68e5067f53460" dependencies = [ - "asn1-rs 0.5.2", - "base64 0.13.1", + "asn1-rs 0.7.1", "data-encoding", - "der-parser 8.2.0", + "der-parser 10.0.0", "lazy_static", - "nom", - "oid-registry 0.6.1", + "nom 7.1.3", + "oid-registry 0.8.1", "rusticata-macros", - "thiserror", + "thiserror 2.0.17", "time", ] +[[package]] +name = "xcm-procedural" +version = "11.0.2" +source = "git+https://github.com/PolymeshAssociation/polkadot-sdk?branch=polymesh-v8-stable2512#243b7f18cb166790d2481a8d6657ec4b79be791f" +dependencies = [ + "Inflector", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "xml-rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" + +[[package]] +name = "xmltree" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" +dependencies = [ + "xml-rs", +] + [[package]] name = "yamux" -version = "0.10.2" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d9ba232399af1783a58d8eb26f6b5006fbefe2dc9ef36bd283324792d03ea5" +checksum = "9ed0164ae619f2dc144909a9f082187ebb5893693d8c0196e8085283ccd4b776" dependencies = [ "futures", "log", "nohash-hasher", - "parking_lot 0.12.1", + "parking_lot 0.12.5", + "pin-project", "rand 0.8.5", "static_assertions", ] +[[package]] +name = "yamux" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deab71f2e20691b4728b349c6cee8fc7223880fa67b6b4f92225ec32225447e5" +dependencies = [ + "futures", + "log", + "nohash-hasher", + "parking_lot 0.12.5", + "pin-project", + "rand 0.9.2", + "static_assertions", + "web-time", +] + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yap" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe269e7b803a5e8e20cbd97860e136529cd83bf2c9c6d37b142467e7e1f051f" + [[package]] name = "yasna" version = "0.5.2" @@ -11733,31 +17109,75 @@ dependencies = [ "time", ] +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", + "synstructure 0.13.2", +] + [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.111", + "synstructure 0.13.2", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] @@ -11770,33 +17190,84 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.111", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "zstd" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" +dependencies = [ + "zstd-safe 6.0.6", ] [[package]] name = "zstd" -version = "0.11.2+zstd.1.5.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ - "zstd-safe", + "zstd-safe 7.2.4", ] [[package]] name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" +version = "6.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" dependencies = [ "libc", "zstd-sys", ] +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index c822f009a7..b425927f73 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,111 +1,23 @@ [package] name = "polymesh" -version = "7.4.0" +version = "8.0.0" authors = ["PolymeshAssociation"] build = "build.rs" edition = "2021" [[bin]] name = "polymesh" -path = "src/main.rs" +path = "src/bin/main.rs" -# Path build to use our Substrate version from github, `branch = "polymesh-v6-monthly-2023-03"`. [patch.crates-io] -frame-benchmarking = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -frame-benchmarking-cli = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -frame-executive = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -frame-support = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -frame-election-provider-support = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -frame-system = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -frame-system-benchmarking = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -frame-system-rpc-runtime-api = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-authority-discovery = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-authorship = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-babe = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-balances = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-contracts = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-contracts-primitives = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-election-provider-multi-phase = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-grandpa = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-im-online = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-indices = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-offences = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-preimage = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-insecure-randomness-collective-flip = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-scheduler = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-session = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-staking-reward-curve = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -pallet-timestamp = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-authority-discovery = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-basic-authorship = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-block-builder = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-chain-spec = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-cli = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-client-api = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-client-db = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-consensus = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-consensus-babe = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-consensus-babe-rpc = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-consensus-epochs = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-consensus-slots = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-executor = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-consensus-grandpa = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-consensus-grandpa-rpc = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-keystore = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-network = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-network-common = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-rpc = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-rpc-api = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-rpc-spec-v2 = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-service = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-telemetry = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-transaction-pool = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-transaction-pool-api = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sc-sync-state-rpc = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-api = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-application-crypto = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-arithmetic = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-authority-discovery = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-block-builder = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-blockchain = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-consensus = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-consensus-babe = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-consensus-slots = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-core = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-externalities = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-consensus-grandpa = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-inherents = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-io = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-keystore = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-keyring = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-npos-elections = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-offchain = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-rpc = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-runtime = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-weights = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-runtime-interface = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-session = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-staking = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-state-machine = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-std = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-storage = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-timestamp = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-tracing = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-transaction-pool = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-transaction-storage-proof = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-trie = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -sp-version = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -substrate-frame-rpc-system = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -substrate-prometheus-endpoint = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -substrate-build-script-utils = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -substrate-wasm-builder = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } -substrate-test-utils = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v6-monthly-2023-03" } +# Patch this to avoid duplicate deps (subxt uses this dep). +sp-crypto-hashing = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } [workspace] members = [ + "eth-rpc", "node-rpc", "pallets/asset", - "pallets/balances", "pallets/base", "pallets/committee", "pallets/compliance-manager", @@ -123,6 +35,7 @@ members = [ "pallets/protocol-fee/rpc", "pallets/protocol-fee/rpc/runtime-api", "pallets/relayer", + "pallets/stable-api-precompiles", "pallets/runtime/common", "pallets/runtime/develop", "pallets/runtime/mainnet", @@ -130,11 +43,9 @@ members = [ "pallets/runtime/tests", "pallets/runtime/tests/exec_macro", "pallets/settlement", - "pallets/staking", - "pallets/staking/rpc", - "pallets/staking/rpc/runtime-api", "pallets/statistics", "pallets/sto", + "pallets/validators", "pallets/transaction-payment", "pallets/treasury", "pallets/utility", @@ -152,11 +63,17 @@ exclude = [ "metadata-tools" ] +[workspace.package] +version = "8.0.0" +authors = ["PolymeshAssociation"] +edition = "2021" +repository = "https://github.com/PolymeshAssociation/Polymesh" +homepage = "https://github.com/PolymeshAssociation/Polymesh" + ## Keep common dependencies here. [workspace.dependencies] # Our pallets pallet-asset = { path = "pallets/asset", default-features = false } -pallet-balances = { path = "pallets/balances", default-features = false } pallet-base = { path = "pallets/base", default-features = false } pallet-committee = { path = "pallets/committee", default-features = false } pallet-compliance-manager = { path = "pallets/compliance-manager", default-features = false } @@ -173,13 +90,13 @@ pallet-protocol-fee = { path = "pallets/protocol-fee", default-features = false pallet-relayer = { path = "pallets/relayer", default-features = false } pallet-sto = { path = "pallets/sto", default-features = false } pallet-settlement = { path = "pallets/settlement", default-features = false } -pallet-staking = { path = "pallets/staking", default-features = false } +pallet-validators = { path = "pallets/validators", default-features = false } pallet-statistics = { path = "pallets/statistics", default-features = false } -pallet-transaction-payment = { path = "pallets/transaction-payment", default-features = false } +polymesh-transaction-payment = { path = "pallets/transaction-payment", default-features = false } pallet-treasury = { path = "pallets/treasury", default-features = false } pallet-utility = { path = "pallets/utility", default-features = false } -pallet-sudo = { path = "pallets/sudo", default-features = false } polymesh-contracts = { path = "pallets/contracts", default-features = false } +polymesh-stable-api-precompiles = { path = "pallets/stable-api-precompiles", default-features = false } # Common polymesh-runtime-common = { path = "pallets/runtime/common", default-features = false } @@ -195,7 +112,6 @@ pallet-group-rpc = { path = "pallets/group/rpc", default-features = false } pallet-group-rpc-runtime-api = { path = "pallets/group/rpc/runtime-api", default-features = false } pallet-protocol-fee-rpc = { path = "pallets/protocol-fee/rpc", default-features = false } pallet-protocol-fee-rpc-runtime-api = { path = "pallets/protocol-fee/rpc/runtime-api", default-features = false } -pallet-staking-rpc-runtime-api = { path = "pallets/staking/rpc/runtime-api", default-features = false } polymesh-node-rpc = { path = "node-rpc", default-features = false } # Runtimes @@ -206,52 +122,124 @@ polymesh-runtime-testnet = { path = "pallets/runtime/testnet" } # Build tool polymesh-build-tool = { path = "pallets/runtime/build_tool", default-features = false } -# Substrate -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false } -pallet-authority-discovery = { version = "4.0.0-dev", default-features = false } -pallet-authorship = { version = "4.0.0-dev", default-features = false } -pallet-babe = { version = "4.0.0-dev", default-features = false } -pallet-contracts = { version = "4.0.0-dev", default-features = false } -pallet-contracts-primitives = { version = "7.0.0", default-features = false} -pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false } -pallet-executive = { package = "frame-executive", version = "4.0.0-dev", default-features = false } -pallet-grandpa = { version = "4.0.0-dev", default-features = false } -pallet-im-online = { version = "4.0.0-dev", default-features = false } -pallet-indices = { version = "4.0.0-dev", default-features = false } -pallet-offences = { version = "4.0.0-dev", default-features = false } -pallet-preimage = { version = "4.0.0-dev", default-features = false } -pallet-insecure-randomness-collective-flip = { version = "4.0.0-dev", default-features = false } -pallet-scheduler = { version = "4.0.0-dev", default-features = false } -pallet-session = { version = "4.0.0-dev", default-features = false } -pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-arithmetic = { version = "6.0.0", default-features = false } -sp-authority-discovery = { version = "4.0.0-dev", default-features = false } -sp-block-builder = { version = "4.0.0-dev", default-features = false } -sp-blockchain = { version = "4.0.0-dev", default-features = false } -sp-consensus = { version = "0.10.0-dev", default-features = false } -sp-consensus-babe = { version = "0.10.0-dev", default-features = false } -sp-consensus-slots = { version = "0.10.0-dev", default-features = false } -sp-consensus-grandpa = { version = "4.0.0-dev", default-features = false } -sp-keyring = { version = "7.0.0", default-features = false } -sp-core = { version = "7.0.0", default-features = false } -sp-inherents = { version = "4.0.0-dev", default-features = false } -sp-transaction-storage-proof = { version = "4.0.0-dev", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-offchain = { version = "4.0.0-dev", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-runtime-interface = { version = "7.0.0", default-features = false } -sp-timestamp = { version = "4.0.0-dev", default-features = false } -sp-session = { version = "4.0.0-dev", default-features = false } -sp-staking = { version = "4.0.0-dev", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-transaction-pool = { version = "4.0.0-dev", default-features = false } -sp-version = { version = "5.0.0", default-features = false } +# SCALE Codec deps. +codec = { package = "parity-scale-codec", version = "3.7.4", default-features = false, features = ["derive", "max-encoded-len"] } +scale-info = { version = "2.11.6", default-features = false, features = ["derive"] } + +# Substrate pallet/runtime deps. +frame-benchmarking = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +frame-benchmarking-cli = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +frame-executive = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +frame-metadata-hash-extension = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +frame-support = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +frame-election-provider-support = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +frame-system = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +frame-system-benchmarking = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +frame-system-rpc-runtime-api = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +mmr-gadget = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +mmr-rpc = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-authority-discovery = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-authorship = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-babe = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-balances = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false, features = ['insecure_zero_ed'] } +pallet-beefy = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-beefy-mmr = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-contracts = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-election-provider-multi-phase = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-grandpa = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-im-online = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-indices = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-mmr = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-offences = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-preimage = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-revive = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-revive-fixtures = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-scheduler = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-session = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-staking = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-staking-runtime-api = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-staking-reward-curve = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-sudo = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-transaction-payment = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +pallet-timestamp = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-api = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-application-crypto = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-arithmetic = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-authority-discovery = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-block-builder = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-blockchain = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-consensus = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-consensus-babe = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-consensus-beefy = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-consensus-slots = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-core = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-crypto-hashing = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sp-debug-derive = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-externalities = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-consensus-grandpa = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-genesis-builder = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-inherents = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-io = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-keystore = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-keyring = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-mmr-primitives = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-npos-elections = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-offchain = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-rpc = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-runtime = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-weights = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-runtime-interface = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-session = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-staking = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-state-machine = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-std = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-storage = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-timestamp = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-tracing = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-transaction-pool = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-transaction-storage-proof = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-trie = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sp-version = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } + +# Substrate client/node deps. +sc-authority-discovery = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-basic-authorship = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-block-builder = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-chain-spec = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-cli = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-client-api = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-client-db = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +sc-consensus = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-consensus-babe = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-consensus-babe-rpc = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-consensus-beefy = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-consensus-beefy-rpc = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-consensus-epochs = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-consensus-slots = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-executor = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-consensus-grandpa = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-consensus-grandpa-rpc = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-keystore = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-network = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-network-common = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-network-sync = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-rpc = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-rpc-api = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-rpc-spec-v2 = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-service = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-storage-monitor = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-sync-state-rpc = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-sysinfo = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-telemetry = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-transaction-pool = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-transaction-pool-api = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +sc-offchain = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +substrate-frame-rpc-system = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +substrate-prometheus-endpoint = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +substrate-wasm-builder = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +substrate-test-utils = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +substrate-build-script-utils = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512" } # Crypto rand = { version = "0.8", default-features = false } @@ -260,7 +248,6 @@ rand_chacha = { version = "0.3", default-features = false } [dependencies] pallet-asset = { workspace = true } -pallet-balances = { workspace = true, default-features = false } pallet-committee = { workspace = true, default-features = false } pallet-corporate-actions = { workspace = true, default-features = false } pallet-external-agents = { workspace = true, default-features = false } @@ -270,9 +257,8 @@ pallet-multisig = { workspace = true, default-features = false } pallet-permissions = { workspace = true, default-features = false } pallet-pips = { workspace = true, default-features = false } pallet-protocol-fee = { workspace = true, default-features = false } -pallet-staking = { workspace = true, default-features = false } -pallet-sudo = { workspace = true, default-features = false } -pallet-transaction-payment = { workspace = true, default-features = false } +pallet-validators = { workspace = true, default-features = false } +polymesh-transaction-payment = { workspace = true, default-features = false } polymesh-contracts = { workspace = true, default-features = false } polymesh-common-utilities = { workspace = true, default-features = false } polymesh-primitives = { workspace = true, default-features = false } @@ -285,7 +271,6 @@ pallet-group-rpc = { workspace = true } pallet-group-rpc-runtime-api = { workspace = true } pallet-protocol-fee-rpc = { workspace = true } pallet-protocol-fee-rpc-runtime-api = { workspace = true } -pallet-staking-rpc-runtime-api = { workspace = true } polymesh-node-rpc = { workspace = true } # Runtimes @@ -295,53 +280,73 @@ polymesh-runtime-testnet = { workspace = true } ## General futures = "0.3.21" -jsonrpsee = { version = "0.16.2", features = ["server"] } +jsonrpsee = { version = "0.24.9", features = ["server"] } log = "0.4" -serde = { version = "1.0.136", default-features = false } +serde = { version = "1.0.136", default-features = false, features = ["alloc", "derive"] } serde_json = { version = "1.0", features = ["arbitrary_precision"] } clap = { version = "4.0.9", features = ["derive"] } rustc-hex = "2.1.0" +array-bytes = { version = "6.2.2", default-features = false } # Substrate client deps. -sc-authority-discovery = "0.10.0-dev" -sc-basic-authorship = "0.10.0-dev" -sc-chain-spec = "4.0.0-dev" -sc-cli = { version = "0.10.0-dev" } -sc-client-api = "4.0.0-dev" -sc-client-db = { version = "0.10.0-dev", default-features = false } -sc-consensus = "0.10.0-dev" -sc-consensus-babe = "0.10.0-dev" -sc-consensus-slots = "0.10.0-dev" -sc-executor = { version = "0.10.0-dev" } -sc-network = "0.10.0-dev" -sc-network-common = { version = "0.10.0-dev" } -sc-rpc = "4.0.0-dev" -sc-service = { version = "0.10.0-dev" } -sc-telemetry = "4.0.0-dev" -sc-transaction-pool = "4.0.0-dev" -sc-sync-state-rpc = { version = "0.10.0-dev" } -grandpa = { package = "sc-consensus-grandpa", version = "0.10.0-dev" } +mmr-gadget = { workspace = true } +mmr-rpc = { workspace = true } +sc-authority-discovery = { workspace = true } +sc-basic-authorship = { workspace = true } +sc-chain-spec = { workspace = true } +sc-cli = { workspace = true } +sc-client-api = { workspace = true } +sc-client-db = { workspace = true, default-features = false } +sc-consensus = { workspace = true } +sc-consensus-babe = { workspace = true } +sc-consensus-beefy = { workspace = true } +sc-consensus-grandpa = { workspace = true } +sc-consensus-slots = { workspace = true } +sc-executor = { workspace = true } +sc-network = { workspace = true } +sc-network-common = { workspace = true } +sc-network-sync = { workspace = true } +sc-rpc = { workspace = true } +sc-service = { workspace = true } +sc-storage-monitor = { workspace = true } +sc-sync-state-rpc = { workspace = true } +sc-sysinfo = { workspace = true } +sc-telemetry = { workspace = true } +sc-transaction-pool = { workspace = true } +sc-transaction-pool-api = { workspace = true } +sc-offchain = { workspace = true } # Substrate -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } +codec = { package = "parity-scale-codec", version = "3.7.4", default-features = false, features = ["derive", "max-encoded-len"] } +frame-metadata-hash-extension = { workspace = true, default-features = false } frame-support = { workspace = true } frame-system = { workspace = true } frame-system-rpc-runtime-api = { workspace = true } pallet-babe = { workspace = true } +pallet-balances = { workspace = true, default-features = false, features = ["insecure_zero_ed"] } pallet-im-online = { workspace = true } pallet-indices = { workspace = true } +pallet-revive = { workspace = true } pallet-session = { workspace = true } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.10.0-dev" } +pallet-staking = { workspace = true, default-features = false } +pallet-staking-runtime-api = { workspace = true, default-features = false } +pallet-transaction-payment = { workspace = true, default-features = false } +pallet-sudo = { workspace = true, default-features = false } +prometheus-endpoint = { workspace = true, default-features = false } sp-api = { workspace = true } sp-authority-discovery = { workspace = true } sp-block-builder = { workspace = true } sp-blockchain = { workspace = true } sp-consensus = { workspace = true } sp-consensus-babe = { workspace = true } +sp-consensus-beefy = { workspace = true } sp-consensus-slots = { workspace = true } sp-keyring = { workspace = true } sp-core = { workspace = true } +sp-genesis-builder = { workspace = true } sp-inherents = { workspace = true } +sp-io = { workspace = true } +sp-mmr-primitives = { workspace = true } sp-transaction-storage-proof = { workspace = true } sp-offchain = { workspace = true } sp-runtime = { workspace = true } @@ -350,16 +355,16 @@ sp-session = { workspace = true } sp-transaction-pool = { workspace = true } # These dependencies are used for runtime benchmarking -frame-benchmarking = "4.0.0-dev" -frame-benchmarking-cli = "4.0.0-dev" +frame-benchmarking = { workspace = true } +frame-benchmarking-cli = { workspace = true } [build-dependencies] -substrate-build-script-utils = { version = "3.0.0" } +substrate-build-script-utils = { workspace = true } [features] default = ["std"] disable_fees = [ - "pallet-transaction-payment/disable_fees", + "polymesh-transaction-payment/disable_fees", "polymesh-runtime-develop/disable_fees", "polymesh-runtime-mainnet/disable_fees", "polymesh-runtime-testnet/disable_fees", @@ -370,11 +375,17 @@ runtime-benchmarks = [ "frame-benchmarking-cli/runtime-benchmarks", "sc-client-db/runtime-benchmarks", "polymesh-runtime-develop/runtime-benchmarks", + "polymesh-runtime-testnet/runtime-benchmarks", + "polymesh-runtime-mainnet/runtime-benchmarks", ] # Only build a "ci" runtime. ci-runtime = [ "polymesh-runtime-develop/ci-runtime" ] -std = [ - "serde/std" +metadata-hash = [ + "polymesh-runtime-develop/metadata-hash", + "polymesh-runtime-mainnet/metadata-hash", + "polymesh-runtime-testnet/metadata-hash", ] + +std = ["serde/std"] diff --git a/eth-rpc/.sqlx/query-2348bd412ca114197996e4395fd68c427245f94b80d37ec3aef04cd96fb36298.json b/eth-rpc/.sqlx/query-2348bd412ca114197996e4395fd68c427245f94b80d37ec3aef04cd96fb36298.json new file mode 100644 index 0000000000..507564cd05 --- /dev/null +++ b/eth-rpc/.sqlx/query-2348bd412ca114197996e4395fd68c427245f94b80d37ec3aef04cd96fb36298.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "\n SELECT COUNT(*) as count\n FROM transaction_hashes\n WHERE block_hash = $1\n ", + "describe": { + "columns": [ + { + "name": "count", + "ordinal": 0, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "2348bd412ca114197996e4395fd68c427245f94b80d37ec3aef04cd96fb36298" +} diff --git a/eth-rpc/.sqlx/query-29af64347f700919dc2ee12463f332be50096d4e37be04ed8b6f46ac5c242043.json b/eth-rpc/.sqlx/query-29af64347f700919dc2ee12463f332be50096d4e37be04ed8b6f46ac5c242043.json new file mode 100644 index 0000000000..b125d2401d --- /dev/null +++ b/eth-rpc/.sqlx/query-29af64347f700919dc2ee12463f332be50096d4e37be04ed8b6f46ac5c242043.json @@ -0,0 +1,26 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\tSELECT block_hash, transaction_index\n\t\t\tFROM transaction_hashes\n\t\t\tWHERE transaction_hash = $1\n\t\t\t", + "describe": { + "columns": [ + { + "name": "block_hash", + "ordinal": 0, + "type_info": "Blob" + }, + { + "name": "transaction_index", + "ordinal": 1, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false + ] + }, + "hash": "29af64347f700919dc2ee12463f332be50096d4e37be04ed8b6f46ac5c242043" +} diff --git a/eth-rpc/.sqlx/query-2fcbf357b3993c0065141859e5ad8c11bd7800e3e6d22e8383ab9ac8bbec25b1.json b/eth-rpc/.sqlx/query-2fcbf357b3993c0065141859e5ad8c11bd7800e3e6d22e8383ab9ac8bbec25b1.json new file mode 100644 index 0000000000..07e69b7d8f --- /dev/null +++ b/eth-rpc/.sqlx/query-2fcbf357b3993c0065141859e5ad8c11bd7800e3e6d22e8383ab9ac8bbec25b1.json @@ -0,0 +1,26 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t SELECT transaction_index, transaction_hash\n\t\t FROM transaction_hashes\n\t\t WHERE block_hash = $1\n\t\t ", + "describe": { + "columns": [ + { + "name": "transaction_index", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "transaction_hash", + "ordinal": 1, + "type_info": "Blob" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false + ] + }, + "hash": "2fcbf357b3993c0065141859e5ad8c11bd7800e3e6d22e8383ab9ac8bbec25b1" +} diff --git a/eth-rpc/.sqlx/query-3de332f45edf5ee4592bd0061956305983861ccaea79eec44518e1bca5233920.json b/eth-rpc/.sqlx/query-3de332f45edf5ee4592bd0061956305983861ccaea79eec44518e1bca5233920.json new file mode 100644 index 0000000000..672d9fbac5 --- /dev/null +++ b/eth-rpc/.sqlx/query-3de332f45edf5ee4592bd0061956305983861ccaea79eec44518e1bca5233920.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\t\t\t\tINSERT INTO logs(\n\t\t\t\t\t\t\tblock_hash,\n\t\t\t\t\t\t\ttransaction_index,\n\t\t\t\t\t\t\tlog_index,\n\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t\tblock_number,\n\t\t\t\t\t\t\ttransaction_hash,\n\t\t\t\t\t\t\ttopic_0, topic_1, topic_2, topic_3,\n\t\t\t\t\t\t\tdata)\n\t\t\t\t\t\tVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)\n\t\t\t\t\t\t", + "describe": { + "columns": [], + "parameters": { + "Right": 11 + }, + "nullable": [] + }, + "hash": "3de332f45edf5ee4592bd0061956305983861ccaea79eec44518e1bca5233920" +} diff --git a/eth-rpc/.sqlx/query-47b830cef6768ed5b119c74037482baef86a7c3d3469873a205805ef342ba031.json b/eth-rpc/.sqlx/query-47b830cef6768ed5b119c74037482baef86a7c3d3469873a205805ef342ba031.json new file mode 100644 index 0000000000..bc7541d529 --- /dev/null +++ b/eth-rpc/.sqlx/query-47b830cef6768ed5b119c74037482baef86a7c3d3469873a205805ef342ba031.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\tSELECT substrate_block_hash\n\t\t\tFROM eth_to_substrate_blocks\n\t\t\tWHERE ethereum_block_hash = $1\n\t\t\t", + "describe": { + "columns": [ + { + "name": "substrate_block_hash", + "ordinal": 0, + "type_info": "Blob" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "47b830cef6768ed5b119c74037482baef86a7c3d3469873a205805ef342ba031" +} diff --git a/eth-rpc/.sqlx/query-5c0ea8efbd2591e3ede3833acfcadf2d552140a20d84edbf90583da4619bcf2a.json b/eth-rpc/.sqlx/query-5c0ea8efbd2591e3ede3833acfcadf2d552140a20d84edbf90583da4619bcf2a.json new file mode 100644 index 0000000000..a3d8e82365 --- /dev/null +++ b/eth-rpc/.sqlx/query-5c0ea8efbd2591e3ede3833acfcadf2d552140a20d84edbf90583da4619bcf2a.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\t\t\tINSERT INTO transaction_hashes (transaction_hash, block_hash, transaction_index)\n\t\t\t\t\tVALUES ($1, $2, $3)\n\t\t\t\t\t", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "5c0ea8efbd2591e3ede3833acfcadf2d552140a20d84edbf90583da4619bcf2a" +} diff --git a/eth-rpc/.sqlx/query-7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2.json b/eth-rpc/.sqlx/query-7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2.json new file mode 100644 index 0000000000..d012a83ef5 --- /dev/null +++ b/eth-rpc/.sqlx/query-7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\tSELECT ethereum_block_hash\n\t\t\tFROM eth_to_substrate_blocks\n\t\t\tWHERE substrate_block_hash = $1\n\t\t\t", + "describe": { + "columns": [ + { + "name": "ethereum_block_hash", + "ordinal": 0, + "type_info": "Blob" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2" +} diff --git a/eth-rpc/.sqlx/query-cf515b47790a2ac4b3802c29e36a07ace0c67849e5b20c92532d7a77861ebf80.json b/eth-rpc/.sqlx/query-cf515b47790a2ac4b3802c29e36a07ace0c67849e5b20c92532d7a77861ebf80.json new file mode 100644 index 0000000000..ad5b093ce9 --- /dev/null +++ b/eth-rpc/.sqlx/query-cf515b47790a2ac4b3802c29e36a07ace0c67849e5b20c92532d7a77861ebf80.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\tINSERT OR REPLACE INTO eth_to_substrate_blocks (ethereum_block_hash, substrate_block_hash)\n\t\t\tVALUES ($1, $2)\n\t\t\t", + "describe": { + "columns": [], + "parameters": { + "Right": 2 + }, + "nullable": [] + }, + "hash": "cf515b47790a2ac4b3802c29e36a07ace0c67849e5b20c92532d7a77861ebf80" +} diff --git a/eth-rpc/.sqlx/query-e712acbeb712c0a61fc2a47f966abae1ae43ffba0920a9d209d01dcfce44c5e0.json b/eth-rpc/.sqlx/query-e712acbeb712c0a61fc2a47f966abae1ae43ffba0920a9d209d01dcfce44c5e0.json new file mode 100644 index 0000000000..a342fcaf8c --- /dev/null +++ b/eth-rpc/.sqlx/query-e712acbeb712c0a61fc2a47f966abae1ae43ffba0920a9d209d01dcfce44c5e0.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "SELECT EXISTS(SELECT 1 FROM eth_to_substrate_blocks WHERE substrate_block_hash = $1) AS \"exists!:bool\"", + "describe": { + "columns": [ + { + "name": "exists!:bool", + "ordinal": 0, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "e712acbeb712c0a61fc2a47f966abae1ae43ffba0920a9d209d01dcfce44c5e0" +} diff --git a/eth-rpc/Cargo.toml b/eth-rpc/Cargo.toml new file mode 100644 index 0000000000..2e963b6ee6 --- /dev/null +++ b/eth-rpc/Cargo.toml @@ -0,0 +1,78 @@ +[package] +name = "pallet-revive-eth-rpc" +version = "0.12.0" +authors.workspace = true +edition = "2021" +license = "Apache-2.0" +homepage.workspace = true +repository.workspace = true +description = "An Ethereum JSON-RPC server for pallet-revive." +default-run = "eth-rpc" + +#[lints] +#workspace = true + +[package.metadata.polkadot-sdk] +exclude-from-umbrella = true + +[[bin]] +name = "eth-rpc" +path = "src/main.rs" + +[dependencies] +anyhow = { version = "1.0.81", default-features = false } +clap = { version = "4.5.13", features = ["derive", "env"] } +codec = { workspace = true, features = ["derive"] } +futures = { version = "0.3.31", features = ["thread-pool"] } +hex = { version = "0.4.3", default-features = false } +jsonrpsee = { version = "0.24.10", features = ["full"] } +log = { version = "0.4.22", default-features = false } +pallet-revive.default-features = true +pallet-revive.workspace = true +prometheus-endpoint.default-features = true +prometheus-endpoint.workspace = true +rlp = { version = "0.6.1", default-features = false } +sc-cli.default-features = true +sc-cli.workspace = true +sc-rpc.default-features = true +sc-rpc.workspace = true +sc-rpc-api.default-features = true +sc-rpc-api.workspace = true +sc-service.default-features = true +sc-service.workspace = true +serde = { version = "1.0.214", default-features = false, features = ["alloc", "derive"] } +serde_json = { version = "1.0.132", default-features = false } +sp-arithmetic.default-features = true +sp-arithmetic.workspace = true +sp-core.default-features = true +sp-core.workspace = true +sp-crypto-hashing.workspace = true +sp-rpc.default-features = true +sp-rpc.workspace = true +sp-runtime.default-features = true +sp-runtime.workspace = true +sp-timestamp.workspace = true +sp-weights.default-features = true +sp-weights.workspace = true +sqlx = { version = "0.8.2", features = ["macros", "runtime-tokio", "sqlite"] } +subxt = { version = "0.43", default-features = true, features = ["reconnecting-rpc-client"] } +subxt-signer = { version = "0.43", features = ["unstable-eth"] } +thiserror = { version = "1.0.64" } +tokio = { version = "1.45.0", default-features = false, features = ["full"] } + +[dev-dependencies] +env_logger = { version = "0.11.2" } +pallet-revive-fixtures = { default-features = true, workspace = true } +pretty_assertions = { version = "1.3.0" } +#revive-dev-node = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = false } +polymesh = { path = "../", default-features = true } +sp-io = { default-features = true, workspace = true } + +[build-dependencies] +git2 = { version = "0.20.0", default-features = false } +#revive-dev-runtime = { git = "https://github.com/PolymeshAssociation/polkadot-sdk", branch = "polymesh-v8-stable2512", default-features = true } +polymesh-runtime-develop = { workspace = true, default-features = true } +sp-io.default-features = true +sp-io.workspace = true +sp-runtime.default-features = true +sp-runtime.workspace = true diff --git a/eth-rpc/build.rs b/eth-rpc/build.rs new file mode 100644 index 0000000000..6f71eecab8 --- /dev/null +++ b/eth-rpc/build.rs @@ -0,0 +1,62 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use std::{fs, process::Command}; + +fn main() { + generate_git_revision(); + generate_metadata_file(); +} + +fn generate_git_revision() { + let output = Command::new("rustc") + .arg("--version") + .output() + .expect("cannot get the current rustc version"); + // Exports the default rustc --version output: + // e.g. rustc 1.83.0 (90b35a623 2024-11-26) + // into the usual Ethereum web3_clientVersion format + // e.g. rustc1.83.0 + let rustc_version = String::from_utf8_lossy(&output.stdout) + .split_whitespace() + .take(2) + .collect::>() + .join(""); + let target = std::env::var("TARGET").unwrap_or_else(|_| "unknown".to_string()); + + let (branch, id) = if let Ok(repo) = git2::Repository::open("../../../..") { + let head = repo.head().expect("should have head"); + let commit = head.peel_to_commit().expect("should have commit"); + let branch = head.shorthand().unwrap_or("unknown").to_string(); + let id = &commit.id().to_string()[..7]; + (branch, id.to_string()) + } else { + ("unknown".to_string(), "unknown".to_string()) + }; + + println!("cargo:rustc-env=RUSTC_VERSION={rustc_version}"); + println!("cargo:rustc-env=TARGET={target}"); + println!("cargo:rustc-env=GIT_REVISION={branch}-{id}"); +} + +fn generate_metadata_file() { + let mut ext = sp_io::TestExternalities::new(Default::default()); + ext.execute_with(|| { + let metadata = polymesh_runtime_develop::Runtime::metadata_at_version(16).unwrap(); + let bytes: &[u8] = &metadata; + fs::write("revive_chain.scale", bytes).unwrap(); + }); +} diff --git a/eth-rpc/examples/README.md b/eth-rpc/examples/README.md new file mode 100644 index 0000000000..ceed155ab1 --- /dev/null +++ b/eth-rpc/examples/README.md @@ -0,0 +1,48 @@ +## Start the node + +Start the kitchensink node: + +```bash +RUST_LOG="error,evm=debug,sc_rpc_server=info,runtime::revive=debug" cargo run --bin substrate-node -- --dev +``` + +## Start a zombienet network + +Alternatively, you can start a zombienet network with the westend Asset Hub parachain: + +Prerequisites for running a local network: +- download latest [zombienet release](https://github.com/paritytech/zombienet/releases); +- build Polkadot binary by running `cargo build -p polkadot --release --features fast-runtime` command in the + [`polkadot-sdk`](https://github.com/paritytech/polkadot-sdk) repository clone; +- build Polkadot Parachain binary by running `cargo build -p polkadot-parachain-bin --release` command in the + [`polkadot-sdk`](https://github.com/paritytech/polkadot-sdk) repository clone; + +```bash +zombienet spawn --provider native westend_local_network.toml +``` + +## Start the RPC server + +This command starts the Ethereum JSON-RPC server, which runs on `localhost:8545` by default: + +```bash +RUST_LOG="info,eth-rpc=debug" cargo run -p pallet-revive-eth-rpc -- --dev +``` + +## Rust examples + +Run one of the examples from the `examples` directory to send a transaction to the node: + +```bash +RUST_LOG="info,eth-rpc=debug" cargo run -p pallet-revive-eth-rpc --example deploy +``` + +## JS examples + +JS examples have been moved to the [evm-test-suite](https://github.com/paritytech/evm-test-suite) repository. + +### Configure MetaMask + +See the doc [here](https://contracts.polkadot.io/work-with-a-local-node#metemask-configuration) for more +information on how to configure MetaMask. + diff --git a/eth-rpc/examples/deploy.rs b/eth-rpc/examples/deploy.rs new file mode 100644 index 0000000000..1f8f9c8a5c --- /dev/null +++ b/eth-rpc/examples/deploy.rs @@ -0,0 +1,98 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use jsonrpsee::http_client::HttpClientBuilder; +use pallet_revive::{ + create1, + evm::{Account, BlockTag, ReceiptInfo, U256}, +}; +use pallet_revive_eth_rpc::{example::TransactionBuilder, EthRpcClient}; +use std::sync::Arc; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + env_logger::init(); + let account = Account::default(); + + let data = vec![]; + let (bytes, _) = pallet_revive_fixtures::compile_module("dummy")?; + let input = bytes.into_iter().chain(data.clone()).collect::>(); + + println!("Account:"); + println!("- address: {:?}", account.address()); + println!("- substrate: {}", account.substrate_account()); + let client = Arc::new(HttpClientBuilder::default().build("http://localhost:8545")?); + + println!("\n\n=== Deploying contract ===\n\n"); + + let nonce = client + .get_transaction_count(account.address(), BlockTag::Latest.into()) + .await?; + let tx = TransactionBuilder::new(&client) + .value(5_000_000_000_000u128.into()) + .input(input) + .send() + .await?; + + println!("Deploy Tx hash: {:?}", tx.hash()); + let ReceiptInfo { + block_number, + gas_used, + contract_address, + .. + } = tx.wait_for_receipt().await?; + + let contract_address = contract_address.unwrap(); + assert_eq!( + contract_address, + create1(&account.address(), nonce.try_into().unwrap()) + ); + + println!("Receipt:"); + println!("- Block number: {block_number}"); + println!("- Gas estimated: {}", tx.gas()); + println!("- Gas used: {gas_used}"); + println!("- Contract address: {contract_address:?}"); + let balance = client + .get_balance(contract_address, BlockTag::Latest.into()) + .await?; + println!("- Contract balance: {balance:?}"); + + if std::env::var("SKIP_CALL").is_ok() { + return Ok(()); + } + + println!("\n\n=== Calling contract ===\n\n"); + let tx = TransactionBuilder::new(&client) + .value(U256::from(1_000_000u32)) + .to(contract_address) + .send() + .await?; + + println!("Contract call tx hash: {:?}", tx.hash()); + let ReceiptInfo { + block_number, + gas_used, + to, + .. + } = tx.wait_for_receipt().await?; + println!("Receipt:"); + println!("- Block number: {block_number}"); + println!("- Gas used: {gas_used}"); + println!("- Gas estimated: {}", tx.gas()); + println!("- To: {to:?}"); + Ok(()) +} diff --git a/eth-rpc/examples/eth-remark-call.rs b/eth-rpc/examples/eth-remark-call.rs new file mode 100644 index 0000000000..4fd4e66069 --- /dev/null +++ b/eth-rpc/examples/eth-remark-call.rs @@ -0,0 +1,60 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use jsonrpsee::http_client::HttpClientBuilder; +use pallet_revive::evm::{Account, ReceiptInfo}; +use pallet_revive_eth_rpc::example::TransactionBuilder; +use sp_core::H160; +use std::sync::Arc; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let tx_payload: Vec = vec![ + 0x00, // System pallet index. + 0x07, // Remark With Event call index. + 0x10, // Compact-encoded length of the remark (16). + 0x54, 0x45, 0x53, 0x54, // Remark 'T', 'E', 'S', 'T' + ]; + + let client = Arc::new(HttpClientBuilder::default().build("http://localhost:8545")?); + + let alith = Account::default(); + // Revive pallet address. + let dest = H160::from_slice(&hex::decode("6d6f646c70792f70616464720000000000000000")?); + + println!("\n\n=== Eth calling System.Remark ===\n\n"); + + let tx = TransactionBuilder::new(&client) + .signer(alith) + .input(tx_payload) + .to(dest) + .send() + .await?; + println!("Transaction hash: {:?}", tx.hash()); + + let ReceiptInfo { + block_number, + gas_used, + status, + .. + } = tx.wait_for_receipt().await?; + println!("Receipt: "); + println!("- Block number: {block_number}"); + println!("- Gas used: {gas_used}"); + println!("- Success: {status:?}"); + + Ok(()) +} diff --git a/eth-rpc/examples/eth-rpc-tester.rs b/eth-rpc/examples/eth-rpc-tester.rs new file mode 100644 index 0000000000..b1c28efe6e --- /dev/null +++ b/eth-rpc/examples/eth-rpc-tester.rs @@ -0,0 +1,201 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use clap::Parser; +use jsonrpsee::http_client::HttpClientBuilder; +use pallet_revive::evm::{Account, BlockTag, ReceiptInfo}; +use pallet_revive_eth_rpc::{example::TransactionBuilder, EthRpcClient}; +use std::sync::Arc; +use tokio::{ + io::{AsyncBufReadExt, BufReader}, + process::{Child, ChildStderr, Command}, + signal::unix::{signal, SignalKind}, +}; + +const DOCKER_CONTAINER_NAME: &str = "eth-rpc-test"; + +#[derive(Parser, Debug)] +#[clap(author, about, version)] +pub struct CliCommand { + /// The eth-rpc url to connect to + #[clap(long, default_value = "http://127.0.0.1:8545")] + pub rpc_url: String, + + /// The parity docker image e.g eth-rpc:master-fb2e414f + /// When not specified, no eth-rpc docker image is started + /// and the test runs against the provided `rpc_url` directly. + #[clap(long)] + docker_image: Option, + + /// The docker binary + /// Either docker or podman + #[clap(long, default_value = "docker")] + docker_bin: String, +} + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let CliCommand { + docker_bin, + rpc_url, + docker_image, + .. + } = CliCommand::parse(); + + let Some(docker_image) = docker_image else { + println!("Docker image not specified, using: {rpc_url:?}"); + return test_eth_rpc(&rpc_url).await; + }; + + let mut docker_process = start_docker(&docker_bin, &docker_image)?; + let stderr = docker_process.stderr.take().unwrap(); + + tokio::select! { + result = docker_process.wait() => { + println!("docker failed: {result:?}"); + } + _ = interrupt() => { + kill_docker().await?; + } + _ = wait_and_test_eth_rpc(stderr, &rpc_url) => { + kill_docker().await?; + } + } + + Ok(()) +} + +async fn interrupt() { + let mut sigint = signal(SignalKind::interrupt()).expect("failed to listen for SIGINT"); + let mut sigterm = signal(SignalKind::terminate()).expect("failed to listen for SIGTERM"); + + tokio::select! { + _ = sigint.recv() => {}, + _ = sigterm.recv() => {}, + } +} + +fn start_docker(docker_bin: &str, docker_image: &str) -> anyhow::Result { + let docker_process = Command::new(docker_bin) + .args([ + "run", + "--name", + DOCKER_CONTAINER_NAME, + "--rm", + "-p", + "8545:8545", + &format!("docker.io/paritypr/{docker_image}"), + "--node-rpc-url", + "wss://westend-asset-hub-rpc.polkadot.io", + "--rpc-cors", + "all", + "--unsafe-rpc-external", + "--log=sc_rpc_server:info", + ]) + .stderr(std::process::Stdio::piped()) + .kill_on_drop(true) + .spawn()?; + + Ok(docker_process) +} + +async fn kill_docker() -> anyhow::Result<()> { + Command::new("docker") + .args(["kill", DOCKER_CONTAINER_NAME]) + .output() + .await?; + Ok(()) +} + +async fn wait_and_test_eth_rpc(stderr: ChildStderr, rpc_url: &str) -> anyhow::Result<()> { + let mut reader = BufReader::new(stderr).lines(); + while let Some(line) = reader.next_line().await? { + println!("{line}"); + if line.contains("Running JSON-RPC server") { + break; + } + } + + test_eth_rpc(rpc_url).await +} + +async fn test_eth_rpc(rpc_url: &str) -> anyhow::Result<()> { + let account = Account::default(); + let data = vec![]; + let (bytes, _) = pallet_revive_fixtures::compile_module("dummy")?; + let input = bytes.into_iter().chain(data).collect::>(); + + println!("Account:"); + println!("- address: {:?}", account.address()); + println!("- substrate address: {}", account.substrate_account()); + let client = Arc::new(HttpClientBuilder::default().build(rpc_url)?); + + let nonce = client + .get_transaction_count(account.address(), BlockTag::Latest.into()) + .await?; + let balance = client + .get_balance(account.address(), BlockTag::Latest.into()) + .await?; + println!("- nonce: {nonce:?}"); + println!("- balance: {balance:?}"); + + println!("\n\n=== Deploying dummy contract ===\n\n"); + let tx = TransactionBuilder::new(&client).input(input).send().await?; + + println!("Hash: {:?}", tx.hash()); + println!("Waiting for receipt..."); + let ReceiptInfo { + block_number, + gas_used, + contract_address, + .. + } = tx.wait_for_receipt().await?; + + let contract_address = contract_address.unwrap(); + println!("\nReceipt:"); + println!( + "Block explorer: https://westend-asset-hub-eth-explorer.parity.io/{:?}", + tx.hash() + ); + println!("- Block number: {block_number}"); + println!("- Gas used: {gas_used}"); + println!("- Address: {contract_address:?}"); + + println!("\n\n=== Calling dummy contract ===\n\n"); + let tx = TransactionBuilder::new(&client) + .to(contract_address) + .send() + .await?; + + println!("Hash: {:?}", tx.hash()); + println!("Waiting for receipt..."); + + let ReceiptInfo { + block_number, + gas_used, + to, + .. + } = tx.wait_for_receipt().await?; + println!("\nReceipt:"); + println!( + "Block explorer: https://westend-asset-hub-eth-explorer.parity.io/{:?}", + tx.hash() + ); + println!("- Block number: {block_number}"); + println!("- Gas used: {gas_used}"); + println!("- To: {to:?}"); + Ok(()) +} diff --git a/eth-rpc/examples/extrinsic.rs b/eth-rpc/examples/extrinsic.rs new file mode 100644 index 0000000000..f5533bf985 --- /dev/null +++ b/eth-rpc/examples/extrinsic.rs @@ -0,0 +1,54 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use pallet_revive_eth_rpc::subxt_client::{ + self, revive::calls::types::InstantiateWithCode, SrcChainConfig, +}; +use sp_weights::Weight; +use subxt::OnlineClient; +use subxt_signer::sr25519::dev; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let client = OnlineClient::::new().await?; + + let (bytes, _) = pallet_revive_fixtures::compile_module("dummy")?; + + let tx_payload = subxt_client::tx().revive().instantiate_with_code( + 0u32.into(), + Weight::from_parts(100_000, 0).into(), + 3_000_000_000_000_000_000, + bytes, + vec![], + None, + ); + + let res = client + .tx() + .sign_and_submit_then_watch_default(&tx_payload, &dev::alice()) + .await? + .wait_for_finalized() + .await?; + println!("Transaction finalized: {:?}", res.extrinsic_hash()); + + let block_hash = res.block_hash(); + + let block = client.blocks().at(block_hash).await.unwrap(); + let extrinsics = block.extrinsics().await.unwrap(); + extrinsics.find_first::()?; + + Ok(()) +} diff --git a/eth-rpc/examples/remark-extrinsic.rs b/eth-rpc/examples/remark-extrinsic.rs new file mode 100644 index 0000000000..8a8f54f4d9 --- /dev/null +++ b/eth-rpc/examples/remark-extrinsic.rs @@ -0,0 +1,43 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use pallet_revive_eth_rpc::subxt_client::{self, system::calls::types::Remark, SrcChainConfig}; +use subxt::OnlineClient; +use subxt_signer::sr25519::dev; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let client = OnlineClient::::new().await?; + let tx_payload = subxt_client::tx().system().remark(b"bonjour".to_vec()); + let res = client + .tx() + .sign_and_submit_then_watch_default(&tx_payload, &dev::alice()) + .await? + .wait_for_finalized() + .await?; + + println!("Transaction finalized: {:?}", res.extrinsic_hash()); + let block_hash = res.block_hash(); + let block = client.blocks().at(block_hash).await.unwrap(); + let extrinsics = block.extrinsics().await.unwrap(); + let remarks = extrinsics + .find::() + .map(|remark| remark.unwrap().value) + .collect::>(); + + dbg!(remarks); + Ok(()) +} diff --git a/eth-rpc/examples/rpc-playground.rs b/eth-rpc/examples/rpc-playground.rs new file mode 100644 index 0000000000..a785546282 --- /dev/null +++ b/eth-rpc/examples/rpc-playground.rs @@ -0,0 +1,48 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use jsonrpsee::http_client::HttpClientBuilder; +use pallet_revive::evm::{Account, BlockTag}; +use pallet_revive_eth_rpc::EthRpcClient; +use std::sync::Arc; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let account = Account::default(); + println!("Account address: {:?}", account.address()); + + let client = Arc::new(HttpClientBuilder::default().build("http://localhost:8545")?); + + let block = client + .get_block_by_number(BlockTag::Latest.into(), false) + .await?; + println!("Latest block: {block:#?}"); + + let nonce = client + .get_transaction_count(account.address(), BlockTag::Latest.into()) + .await?; + println!("Account nonce: {nonce:?}"); + + let balance = client + .get_balance(account.address(), BlockTag::Latest.into()) + .await?; + println!("Account balance: {balance:?}"); + + let sync_state = client.syncing().await?; + println!("Sync state: {sync_state:?}"); + + Ok(()) +} diff --git a/eth-rpc/examples/transfer.rs b/eth-rpc/examples/transfer.rs new file mode 100644 index 0000000000..1b609b02b2 --- /dev/null +++ b/eth-rpc/examples/transfer.rs @@ -0,0 +1,67 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use jsonrpsee::http_client::HttpClientBuilder; +use pallet_revive::evm::{Account, BlockTag, ReceiptInfo}; +use pallet_revive_eth_rpc::{example::TransactionBuilder, EthRpcClient}; +use std::sync::Arc; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let client = Arc::new(HttpClientBuilder::default().build("http://localhost:8545")?); + + let alith = Account::default(); + let alith_address = alith.address(); + let ethan = Account::from(subxt_signer::eth::dev::ethan()); + let value = 1_000_000_000_000_000_000_000u128.into(); + + let print_balance = || async { + let balance = client + .get_balance(alith_address, BlockTag::Latest.into()) + .await?; + println!("Alith {alith_address:?} balance: {balance:?}"); + let balance = client + .get_balance(ethan.address(), BlockTag::Latest.into()) + .await?; + println!("ethan {:?} balance: {balance:?}", ethan.address()); + anyhow::Result::<()>::Ok(()) + }; + + print_balance().await?; + println!("\n\n=== Transferring ===\n\n"); + + let tx = TransactionBuilder::new(&client) + .signer(alith) + .value(value) + .to(ethan.address()) + .send() + .await?; + println!("Transaction hash: {:?}", tx.hash()); + + let ReceiptInfo { + block_number, + gas_used, + status, + .. + } = tx.wait_for_receipt().await?; + println!("Receipt: "); + println!("- Block number: {block_number}"); + println!("- Gas used: {gas_used}"); + println!("- Success: {status:?}"); + + print_balance().await?; + Ok(()) +} diff --git a/eth-rpc/examples/westend_local_network.toml b/eth-rpc/examples/westend_local_network.toml new file mode 100644 index 0000000000..76561be814 --- /dev/null +++ b/eth-rpc/examples/westend_local_network.toml @@ -0,0 +1,37 @@ +[settings] +node_spawn_timeout = 240 + +[relaychain] +default_command = "{{POLKADOT_BINARY}}" +default_args = ["-lparachain=debug,xcm=trace"] +chain = "westend-local" +[[relaychain.nodes]] +name = "alice-westend-validator" +validator = true +rpc_port = 9935 +ws_port = 9945 +balance = 2000000000000 + +[[relaychain.nodes]] +name = "bob-westend-validator" +validator = true +rpc_port = 9936 +ws_port = 9946 +balance = 2000000000000 + +[[parachains]] +id = 1000 +chain = "asset-hub-westend-local" +cumulus_based = true + +[[parachains.collators]] +name = "asset-hub-westend-collator1" +rpc_port = 9011 +ws_port = 9944 +command = "{{POLKADOT_PARACHAIN_BINARY}}" +args = ["-lparachain=debug,runtime::revive=debug"] + +[[parachains.collators]] +name = "asset-hub-westend-collator2" +command = "{{POLKADOT_PARACHAIN_BINARY}}" +args = ["-lparachain=debug,runtime::revive=debug"] diff --git a/eth-rpc/migrations/0001_create_transaction_hashes.sql b/eth-rpc/migrations/0001_create_transaction_hashes.sql new file mode 100644 index 0000000000..8fd6b353fa --- /dev/null +++ b/eth-rpc/migrations/0001_create_transaction_hashes.sql @@ -0,0 +1,22 @@ +-- Useful commands: +-- +-- Set DATABASE_URL environment variable. +-- export DATABASE_URL=sqlite:///$HOME/eth_rpc.db +-- +-- Create DB: +-- cargo sqlx database create +-- +-- Run migration manually: +-- cargo sqlx migrate run +-- +-- Update compile time artifacts: +-- cargo sqlx prepare +CREATE TABLE IF NOT EXISTS transaction_hashes ( + transaction_hash BLOB NOT NULL PRIMARY KEY, + transaction_index INTEGER NOT NULL, + block_hash BLOB NOT NULL +); + +CREATE INDEX IF NOT EXISTS idx_block_hash ON transaction_hashes ( + block_hash +); diff --git a/eth-rpc/migrations/0002_create_log_table.sql b/eth-rpc/migrations/0002_create_log_table.sql new file mode 100644 index 0000000000..4b012e17a3 --- /dev/null +++ b/eth-rpc/migrations/0002_create_log_table.sql @@ -0,0 +1,28 @@ +CREATE TABLE IF NOT EXISTS logs ( + block_hash BLOB NOT NULL, + transaction_index INTEGER NOT NULL, + log_index INTEGER NOT NULL, + address BLOB NOT NULL, + block_number INTEGER NOT NULL, + transaction_hash BLOB NOT NULL, + topic_0 BLOB, + topic_1 BLOB, + topic_2 BLOB, + topic_3 BLOB, + data BLOB, + PRIMARY KEY (block_hash, transaction_index, log_index) +); + +CREATE INDEX IF NOT EXISTS idx_block_number_address_topics ON logs ( + block_number, + address, + topic_0, + topic_1, + topic_2, + topic_3 +); + +CREATE INDEX IF NOT EXISTS idx_block_hash ON logs ( + block_hash +); + diff --git a/eth-rpc/migrations/0003_create_eth_substrate_block_mapping.sql b/eth-rpc/migrations/0003_create_eth_substrate_block_mapping.sql new file mode 100644 index 0000000000..80f7326528 --- /dev/null +++ b/eth-rpc/migrations/0003_create_eth_substrate_block_mapping.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS eth_to_substrate_blocks ( + ethereum_block_hash BLOB NOT NULL PRIMARY KEY, + substrate_block_hash BLOB NOT NULL +); + +CREATE INDEX IF NOT EXISTS idx_substrate_block_hash ON eth_to_substrate_blocks ( + substrate_block_hash +); diff --git a/eth-rpc/src/apis.rs b/eth-rpc/src/apis.rs new file mode 100644 index 0000000000..ae85246c55 --- /dev/null +++ b/eth-rpc/src/apis.rs @@ -0,0 +1,24 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +mod debug_apis; +pub use debug_apis::*; + +mod execution_apis; +pub use execution_apis::*; + +mod health_api; +pub use health_api::*; diff --git a/eth-rpc/src/apis/debug_apis.rs b/eth-rpc/src/apis/debug_apis.rs new file mode 100644 index 0000000000..df40361adf --- /dev/null +++ b/eth-rpc/src/apis/debug_apis.rs @@ -0,0 +1,129 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use crate::*; +use jsonrpsee::{core::RpcResult, proc_macros::rpc}; + +/// Debug Ethererum JSON-RPC apis. +#[rpc(server, client)] +pub trait DebugRpc { + /// Returns the tracing of the execution of a specific block using its number. + /// + /// ## References + /// + /// - + #[method(name = "debug_traceBlockByNumber")] + async fn trace_block_by_number( + &self, + block: BlockNumberOrTag, + tracer_config: TracerConfig, + ) -> RpcResult>; + + /// Returns a transaction's traces by replaying it. + /// + /// ## References + /// + /// - + #[method(name = "debug_traceTransaction")] + async fn trace_transaction( + &self, + transaction_hash: H256, + tracer_config: TracerConfig, + ) -> RpcResult; + + /// Dry run a call and returns the transaction's traces. + /// + /// ## References + /// + /// - + #[method(name = "debug_traceCall")] + async fn trace_call( + &self, + transaction: GenericTransaction, + block: BlockNumberOrTagOrHash, + tracer_config: TracerConfig, + ) -> RpcResult; + + #[method(name = "debug_getAutomine")] + async fn get_automine(&self) -> RpcResult; +} + +pub struct DebugRpcServerImpl { + client: client::Client, +} + +impl DebugRpcServerImpl { + pub fn new(client: client::Client) -> Self { + Self { client } + } +} + +async fn with_timeout( + timeout: Option, + fut: impl std::future::Future>, +) -> RpcResult { + if let Some(timeout) = timeout { + match tokio::time::timeout(timeout, fut).await { + Ok(r) => Ok(r?), + Err(_) => Err(ErrorObjectOwned::owned::( + -32000, + "execution timeout".to_string(), + None, + )), + } + } else { + Ok(fut.await?) + } +} + +#[async_trait] +impl DebugRpcServer for DebugRpcServerImpl { + async fn trace_block_by_number( + &self, + block: BlockNumberOrTag, + tracer_config: TracerConfig, + ) -> RpcResult> { + let TracerConfig { config, timeout } = tracer_config; + with_timeout(timeout, self.client.trace_block_by_number(block, config)).await + } + + async fn trace_transaction( + &self, + transaction_hash: H256, + tracer_config: TracerConfig, + ) -> RpcResult { + let TracerConfig { config, timeout } = tracer_config; + with_timeout( + timeout, + self.client.trace_transaction(transaction_hash, config), + ) + .await + } + + async fn trace_call( + &self, + transaction: GenericTransaction, + block: BlockNumberOrTagOrHash, + tracer_config: TracerConfig, + ) -> RpcResult { + let TracerConfig { config, timeout } = tracer_config; + with_timeout(timeout, self.client.trace_call(transaction, block, config)).await + } + + async fn get_automine(&self) -> RpcResult { + sc_service::Result::Ok(self.client.get_automine().await) + } +} diff --git a/eth-rpc/src/apis/execution_apis.rs b/eth-rpc/src/apis/execution_apis.rs new file mode 100644 index 0000000000..25866fb889 --- /dev/null +++ b/eth-rpc/src/apis/execution_apis.rs @@ -0,0 +1,189 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Generated JSON-RPC methods. +#![allow(missing_docs)] + +use crate::*; +use jsonrpsee::{core::RpcResult, proc_macros::rpc}; + +#[rpc(server, client)] +pub trait EthRpc { + /// Returns a list of addresses owned by client. + #[method(name = "eth_accounts")] + async fn accounts(&self) -> RpcResult>; + + /// Returns the number of most recent block. + #[method(name = "eth_blockNumber")] + async fn block_number(&self) -> RpcResult; + + /// Executes a new message call immediately without creating a transaction on the block chain. + #[method(name = "eth_call")] + async fn call( + &self, + transaction: GenericTransaction, + block: Option, + ) -> RpcResult; + + /// Returns the chain ID of the current network. + #[method(name = "eth_chainId")] + async fn chain_id(&self) -> RpcResult; + + /// Generates and returns an estimate of how much gas is necessary to allow the transaction to + /// complete. + #[method(name = "eth_estimateGas")] + async fn estimate_gas( + &self, + transaction: GenericTransaction, + block: Option, + ) -> RpcResult; + + /// Returns the current price per gas in wei. + #[method(name = "eth_gasPrice")] + async fn gas_price(&self) -> RpcResult; + + /// Returns the balance of the account of given address. + #[method(name = "eth_getBalance")] + async fn get_balance(&self, address: Address, block: BlockNumberOrTagOrHash) + -> RpcResult; + + /// Returns information about a block by hash. + #[method(name = "eth_getBlockByHash")] + async fn get_block_by_hash( + &self, + block_hash: H256, + hydrated_transactions: bool, + ) -> RpcResult>; + + /// Returns information about a block by number. + #[method(name = "eth_getBlockByNumber")] + async fn get_block_by_number( + &self, + block: BlockNumberOrTag, + hydrated_transactions: bool, + ) -> RpcResult>; + + /// Returns the number of transactions in a block from a block matching the given block hash. + #[method(name = "eth_getBlockTransactionCountByHash")] + async fn get_block_transaction_count_by_hash( + &self, + block_hash: Option, + ) -> RpcResult>; + + /// Returns the number of transactions in a block matching the given block number. + #[method(name = "eth_getBlockTransactionCountByNumber")] + async fn get_block_transaction_count_by_number( + &self, + block: Option, + ) -> RpcResult>; + + /// Returns code at a given address. + #[method(name = "eth_getCode")] + async fn get_code(&self, address: Address, block: BlockNumberOrTagOrHash) -> RpcResult; + + /// Returns an array of all logs matching filter with given id. + #[method(name = "eth_getLogs")] + async fn get_logs(&self, filter: Option) -> RpcResult; + + /// Returns the value from a storage position at a given address. + #[method(name = "eth_getStorageAt")] + async fn get_storage_at( + &self, + address: Address, + storage_slot: U256, + block: BlockNumberOrTagOrHash, + ) -> RpcResult; + + /// Returns information about a transaction by block hash and transaction index position. + #[method(name = "eth_getTransactionByBlockHashAndIndex")] + async fn get_transaction_by_block_hash_and_index( + &self, + block_hash: H256, + transaction_index: U256, + ) -> RpcResult>; + + /// Returns information about a transaction by block number and transaction index position. + #[method(name = "eth_getTransactionByBlockNumberAndIndex")] + async fn get_transaction_by_block_number_and_index( + &self, + block: BlockNumberOrTag, + transaction_index: U256, + ) -> RpcResult>; + + /// Returns the information about a transaction requested by transaction hash. + #[method(name = "eth_getTransactionByHash")] + async fn get_transaction_by_hash( + &self, + transaction_hash: H256, + ) -> RpcResult>; + + /// Returns the number of transactions sent from an address. + #[method(name = "eth_getTransactionCount")] + async fn get_transaction_count( + &self, + address: Address, + block: BlockNumberOrTagOrHash, + ) -> RpcResult; + + /// Returns the receipt of a transaction by transaction hash. + #[method(name = "eth_getTransactionReceipt")] + async fn get_transaction_receipt( + &self, + transaction_hash: H256, + ) -> RpcResult>; + + /// Returns the current maxPriorityFeePerGas per gas in wei. + #[method(name = "eth_maxPriorityFeePerGas")] + async fn max_priority_fee_per_gas(&self) -> RpcResult; + + /// Submits a raw transaction. For EIP-4844 transactions, the raw form must be the network form. + /// This means it includes the blobs, KZG commitments, and KZG proofs. + #[method(name = "eth_sendRawTransaction")] + async fn send_raw_transaction(&self, transaction: Bytes) -> RpcResult; + + /// Signs and submits a transaction. + #[method(name = "eth_sendTransaction")] + async fn send_transaction(&self, transaction: GenericTransaction) -> RpcResult; + + /// Returns an object with data about the sync status or false. + #[method(name = "eth_syncing")] + async fn syncing(&self) -> RpcResult; + + /// Returns true when the client is actively listening for network connections, otherwise false + #[method(name = "net_listening")] + async fn net_listening(&self) -> RpcResult; + + /// The string value of current network id + #[method(name = "net_version")] + async fn net_version(&self) -> RpcResult; + + /// The string value of the current client version + #[method(name = "web3_clientVersion")] + async fn web3_client_version(&self) -> RpcResult; + + /// Returns transaction base fee per gas and effective priority fee per gas for the + /// requested/supported block range. + /// + /// Transaction fee history, which is introduced in EIP-1159. + #[method(name = "eth_feeHistory")] + async fn fee_history( + &self, + block_count: U256, + newest_block: BlockNumberOrTag, + reward_percentiles: Option>, + ) -> RpcResult; +} diff --git a/eth-rpc/src/apis/health_api.rs b/eth-rpc/src/apis/health_api.rs new file mode 100644 index 0000000000..971c1b9720 --- /dev/null +++ b/eth-rpc/src/apis/health_api.rs @@ -0,0 +1,74 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Heatlh JSON-RPC methods. + +use crate::*; +use jsonrpsee::{core::RpcResult, proc_macros::rpc}; +use sc_rpc_api::system::helpers::Health; + +#[rpc(server, client)] +pub trait SystemHealthRpc { + /// Proxy the substrate chain system_health RPC call. + #[method(name = "system_health")] + async fn system_health(&self) -> RpcResult; + + ///Returns the number of peers currently connected to the client. + #[method(name = "net_peerCount")] + async fn net_peer_count(&self) -> RpcResult; +} + +pub struct SystemHealthRpcServerImpl { + client: client::Client, +} + +impl SystemHealthRpcServerImpl { + pub fn new(client: client::Client) -> Self { + Self { client } + } +} + +#[async_trait] +impl SystemHealthRpcServer for SystemHealthRpcServerImpl { + async fn system_health(&self) -> RpcResult { + let (sync_state, health) = + tokio::try_join!(self.client.sync_state(), self.client.system_health())?; + + let latest = self.client.latest_block().await.number(); + + // Compare against `latest + 1` to avoid a false positive if the health check runs + // immediately after a new block is produced but before the cache updates. + if sync_state.current_block > latest + 1 { + log::warn!( + target: LOG_TARGET, + "Client is out of sync. Current block: {}, latest cache block: {latest}", + sync_state.current_block, + ); + return Err(ErrorCode::InternalError.into()); + } + + Ok(Health { + peers: health.peers, + is_syncing: health.is_syncing, + should_have_peers: health.should_have_peers, + }) + } + + async fn net_peer_count(&self) -> RpcResult { + let health = self.client.system_health().await?; + Ok((health.peers as u64).into()) + } +} diff --git a/eth-rpc/src/block_info_provider.rs b/eth-rpc/src/block_info_provider.rs new file mode 100644 index 0000000000..f68a4a5b19 --- /dev/null +++ b/eth-rpc/src/block_info_provider.rs @@ -0,0 +1,210 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::{ + client::{SubscriptionType, SubstrateBlock, SubstrateBlockNumber}, + subxt_client::SrcChainConfig, + ClientError, +}; +use jsonrpsee::core::async_trait; +use sp_core::H256; +use std::sync::Arc; +use subxt::{backend::legacy::LegacyRpcMethods, OnlineClient}; +use tokio::sync::RwLock; + +/// BlockInfoProvider cache and retrieves information about blocks. +#[async_trait] +pub trait BlockInfoProvider: Send + Sync { + /// Update the latest block + async fn update_latest(&self, block: Arc, subscription_type: SubscriptionType); + + /// Return the latest finalized block. + async fn latest_finalized_block(&self) -> Arc; + + /// Return the latest block. + async fn latest_block(&self) -> Arc; + + /// Return the latest block number + async fn latest_block_number(&self) -> SubstrateBlockNumber { + return self.latest_block().await.number(); + } + + /// Get block by block_number. + async fn block_by_number( + &self, + block_number: SubstrateBlockNumber, + ) -> Result>, ClientError>; + + /// Get block by block hash. + async fn block_by_hash(&self, hash: &H256) -> Result>, ClientError>; +} + +/// Provides information about blocks. +#[derive(Clone)] +pub struct SubxtBlockInfoProvider { + /// The latest block. + latest_block: Arc>>, + + /// The latest finalized block. + latest_finalized_block: Arc>>, + + /// The rpc client, used to fetch blocks not in the cache. + rpc: LegacyRpcMethods, + + /// The api client, used to fetch blocks not in the cache. + api: OnlineClient, +} + +impl SubxtBlockInfoProvider { + pub async fn new( + api: OnlineClient, + rpc: LegacyRpcMethods, + ) -> Result { + let latest = Arc::new(api.blocks().at_latest().await?); + Ok(Self { + api, + rpc, + latest_block: Arc::new(RwLock::new(latest.clone())), + latest_finalized_block: Arc::new(RwLock::new(latest)), + }) + } +} + +#[async_trait] +impl BlockInfoProvider for SubxtBlockInfoProvider { + async fn update_latest(&self, block: Arc, subscription_type: SubscriptionType) { + let mut latest = match subscription_type { + SubscriptionType::FinalizedBlocks => self.latest_finalized_block.write().await, + SubscriptionType::BestBlocks => self.latest_block.write().await, + }; + *latest = block; + } + + async fn latest_block(&self) -> Arc { + self.latest_block.read().await.clone() + } + + async fn latest_finalized_block(&self) -> Arc { + self.latest_finalized_block.read().await.clone() + } + + async fn block_by_number( + &self, + block_number: SubstrateBlockNumber, + ) -> Result>, ClientError> { + let latest = self.latest_block().await; + if block_number == latest.number() { + return Ok(Some(latest)); + } + + let latest_finalized = self.latest_finalized_block().await; + if block_number == latest_finalized.number() { + return Ok(Some(latest_finalized)); + } + + let Some(hash) = self + .rpc + .chain_get_block_hash(Some(block_number.into())) + .await? + else { + return Ok(None); + }; + + match self.api.blocks().at(hash).await { + Ok(block) => Ok(Some(Arc::new(block))), + Err(subxt::Error::Block(subxt::error::BlockError::NotFound(_))) => Ok(None), + Err(err) => Err(err.into()), + } + } + + async fn block_by_hash(&self, hash: &H256) -> Result>, ClientError> { + let latest = self.latest_block().await; + if hash == &latest.hash() { + return Ok(Some(latest)); + } + + let latest_finalized = self.latest_finalized_block().await; + if hash == &latest_finalized.hash() { + return Ok(Some(latest_finalized)); + } + + match self.api.blocks().at(*hash).await { + Ok(block) => Ok(Some(Arc::new(block))), + Err(subxt::Error::Block(subxt::error::BlockError::NotFound(_))) => Ok(None), + Err(err) => Err(err.into()), + } + } +} + +#[cfg(test)] +pub mod test { + use super::*; + use crate::BlockInfo; + + /// A Noop BlockInfoProvider used to test [`db::ReceiptProvider`]. + pub struct MockBlockInfoProvider; + + pub struct MockBlockInfo { + pub number: SubstrateBlockNumber, + pub hash: H256, + } + + impl BlockInfo for MockBlockInfo { + fn hash(&self) -> H256 { + self.hash + } + fn number(&self) -> SubstrateBlockNumber { + self.number + } + } + + #[async_trait] + impl BlockInfoProvider for MockBlockInfoProvider { + async fn update_latest( + &self, + _block: Arc, + _subscription_type: SubscriptionType, + ) { + } + + async fn latest_finalized_block(&self) -> Arc { + unimplemented!() + } + + async fn latest_block(&self) -> Arc { + unimplemented!() + } + + async fn latest_block_number(&self) -> SubstrateBlockNumber { + 2u32 + } + + async fn block_by_number( + &self, + _block_number: SubstrateBlockNumber, + ) -> Result>, ClientError> { + Ok(None) + } + + async fn block_by_hash( + &self, + _hash: &H256, + ) -> Result>, ClientError> { + Ok(None) + } + } +} diff --git a/eth-rpc/src/cli.rs b/eth-rpc/src/cli.rs new file mode 100644 index 0000000000..517814ad1a --- /dev/null +++ b/eth-rpc/src/cli.rs @@ -0,0 +1,284 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! The Ethereum JSON-RPC server. +use crate::{ + client::{connect, Client, SubscriptionType, SubstrateBlockNumber}, + DebugRpcServer, DebugRpcServerImpl, EthRpcServer, EthRpcServerImpl, ReceiptExtractor, + ReceiptProvider, SubxtBlockInfoProvider, SystemHealthRpcServer, SystemHealthRpcServerImpl, + LOG_TARGET, +}; +use clap::Parser; +use futures::{future::BoxFuture, pin_mut, FutureExt}; +use jsonrpsee::server::RpcModule; +use sc_cli::{PrometheusParams, RpcParams, SharedParams, Signals}; +use sc_service::{ + config::{PrometheusConfig, RpcConfiguration}, + start_rpc_servers, TaskManager, +}; +use sqlx::sqlite::SqlitePoolOptions; + +// Default port if --prometheus-port is not specified +const DEFAULT_PROMETHEUS_PORT: u16 = 9616; + +// Default port if --rpc-port is not specified +const DEFAULT_RPC_PORT: u16 = 8545; + +const IN_MEMORY_DB: &str = "sqlite::memory:"; + +// Parsed command instructions from the command line +#[derive(Parser, Debug)] +#[clap(author, about, version)] +pub struct CliCommand { + /// The node url to connect to + #[clap(long, default_value = "ws://127.0.0.1:9944")] + pub node_rpc_url: String, + + /// The maximum number of blocks to cache in memory. + #[clap(long, default_value = "256")] + pub cache_size: usize, + + /// Earliest block number to consider when searching for transaction receipts. + #[clap(long)] + pub earliest_receipt_block: Option, + + /// The database used to store Ethereum transaction hashes. + /// This is only useful if the node needs to act as an archive node and respond to Ethereum RPC + /// queries for transactions that are not in the in memory cache. + #[clap(long, env = "DATABASE_URL", default_value = IN_MEMORY_DB)] + pub database_url: String, + + /// If provided, index the last n blocks + #[clap(long)] + pub index_last_n_blocks: Option, + + #[allow(missing_docs)] + #[clap(flatten)] + pub shared_params: SharedParams, + + #[allow(missing_docs)] + #[clap(flatten)] + pub rpc_params: RpcParams, + + #[allow(missing_docs)] + #[clap(flatten)] + pub prometheus_params: PrometheusParams, +} + +/// Initialize the logger +#[cfg(not(test))] +fn init_logger(params: &SharedParams) -> anyhow::Result<()> { + let mut logger = sc_cli::LoggerBuilder::new(params.log_filters().join(",")); + logger + .with_log_reloading(params.enable_log_reloading) + .with_detailed_output(params.detailed_log_output); + + if let Some(tracing_targets) = ¶ms.tracing_targets { + let tracing_receiver = params.tracing_receiver.into(); + logger.with_profiling(tracing_receiver, tracing_targets); + } + + if params.disable_log_color { + logger.with_colors(false); + } + + logger.init()?; + Ok(()) +} + +fn build_client( + tokio_handle: &tokio::runtime::Handle, + cache_size: usize, + earliest_receipt_block: Option, + node_rpc_url: &str, + database_url: &str, + abort_signal: Signals, +) -> anyhow::Result { + let fut = async { + let (api, rpc_client, rpc) = connect(node_rpc_url).await?; + let block_provider = SubxtBlockInfoProvider::new( api.clone(), rpc.clone()).await?; + + let (pool, keep_latest_n_blocks) = if database_url == IN_MEMORY_DB { + log::warn!( target: LOG_TARGET, "💾 Using in-memory database, keeping only {cache_size} blocks in memory"); + // see sqlite in-memory issue: https://github.com/launchbadge/sqlx/issues/2510 + let pool = SqlitePoolOptions::new() + .max_connections(1) + .idle_timeout(None) + .max_lifetime(None) + .connect(database_url).await?; + + (pool, Some(cache_size)) + } else { + (SqlitePoolOptions::new().connect(database_url).await?, None) + }; + + let receipt_extractor = ReceiptExtractor::new( + api.clone(), + earliest_receipt_block, + ).await?; + + let receipt_provider = ReceiptProvider::new( + pool, + block_provider.clone(), + receipt_extractor.clone(), + keep_latest_n_blocks, + ) + .await?; + + let client = + Client::new(api, rpc_client, rpc, block_provider, receipt_provider).await?; + + Ok(client) + } + .fuse(); + pin_mut!(fut); + + match tokio_handle.block_on(abort_signal.try_until_signal(fut)) { + Ok(Ok(client)) => Ok(client), + Ok(Err(err)) => Err(err), + Err(_) => anyhow::bail!("Process interrupted"), + } +} + +/// Start the JSON-RPC server using the given command line arguments. +pub fn run(cmd: CliCommand) -> anyhow::Result<()> { + let CliCommand { + rpc_params, + prometheus_params, + node_rpc_url, + cache_size, + database_url, + earliest_receipt_block, + index_last_n_blocks, + shared_params, + .. + } = cmd; + + #[cfg(not(test))] + init_logger(&shared_params)?; + let is_dev = shared_params.dev; + let rpc_addrs: Option> = rpc_params + .rpc_addr(is_dev, false, 8545)? + .map(|addrs| addrs.into_iter().map(Into::into).collect()); + + let rpc_config = RpcConfiguration { + addr: rpc_addrs, + methods: rpc_params.rpc_methods.into(), + max_connections: rpc_params.rpc_max_connections, + cors: rpc_params.rpc_cors(is_dev)?, + max_request_size: rpc_params.rpc_max_request_size, + max_response_size: rpc_params.rpc_max_response_size, + id_provider: None, + max_subs_per_conn: rpc_params.rpc_max_subscriptions_per_connection, + port: rpc_params.rpc_port.unwrap_or(DEFAULT_RPC_PORT), + message_buffer_capacity: rpc_params.rpc_message_buffer_capacity_per_connection, + batch_config: rpc_params.rpc_batch_config()?, + rate_limit: rpc_params.rpc_rate_limit, + rate_limit_whitelisted_ips: rpc_params.rpc_rate_limit_whitelisted_ips, + rate_limit_trust_proxy_headers: rpc_params.rpc_rate_limit_trust_proxy_headers, + request_logger_limit: if is_dev { 1024 * 1024 } else { 1024 }, + }; + + let prometheus_config = + prometheus_params.prometheus_config(DEFAULT_PROMETHEUS_PORT, "eth-rpc".into()); + let prometheus_registry = prometheus_config.as_ref().map(|config| &config.registry); + + let tokio_runtime = sc_cli::build_runtime()?; + let tokio_handle = tokio_runtime.handle(); + let mut task_manager = TaskManager::new(tokio_handle.clone(), prometheus_registry)?; + + let client = build_client( + tokio_handle, + cache_size, + earliest_receipt_block, + &node_rpc_url, + &database_url, + tokio_runtime.block_on(async { Signals::capture() })?, + )?; + + // Prometheus metrics. + if let Some(PrometheusConfig { port, registry }) = prometheus_config.clone() { + task_manager.spawn_handle().spawn( + "prometheus-endpoint", + None, + prometheus_endpoint::init_prometheus(port, registry).map(drop), + ); + } + + let rpc_server_handle = start_rpc_servers( + &rpc_config, + prometheus_registry, + tokio_handle, + || rpc_module(is_dev, client.clone()), + None, + )?; + + task_manager + .spawn_essential_handle() + .spawn("block-subscription", None, async move { + let mut futures: Vec>> = vec![ + Box::pin(client.subscribe_and_cache_new_blocks(SubscriptionType::BestBlocks)), + Box::pin(client.subscribe_and_cache_new_blocks(SubscriptionType::FinalizedBlocks)), + ]; + + if let Some(index_last_n_blocks) = index_last_n_blocks { + futures.push(Box::pin( + client.subscribe_and_cache_blocks(index_last_n_blocks), + )); + } + + if let Err(err) = futures::future::try_join_all(futures).await { + panic!("Block subscription task failed: {err:?}",) + } + }); + + task_manager.keep_alive(rpc_server_handle); + let signals = tokio_runtime.block_on(async { Signals::capture() })?; + tokio_runtime.block_on(signals.run_until_signal(task_manager.future().fuse()))?; + Ok(()) +} + +/// Create the JSON-RPC module. +fn rpc_module(is_dev: bool, client: Client) -> Result, sc_service::Error> { + let eth_api = EthRpcServerImpl::new(client.clone()) + .with_accounts(if is_dev { + vec![ + crate::Account::from(subxt_signer::eth::dev::alith()), + crate::Account::from(subxt_signer::eth::dev::baltathar()), + crate::Account::from(subxt_signer::eth::dev::charleth()), + crate::Account::from(subxt_signer::eth::dev::dorothy()), + crate::Account::from(subxt_signer::eth::dev::ethan()), + ] + } else { + vec![] + }) + .into_rpc(); + + let health_api = SystemHealthRpcServerImpl::new(client.clone()).into_rpc(); + let debug_api = DebugRpcServerImpl::new(client).into_rpc(); + + let mut module = RpcModule::new(()); + module + .merge(eth_api) + .map_err(|e| sc_service::Error::Application(e.into()))?; + module + .merge(health_api) + .map_err(|e| sc_service::Error::Application(e.into()))?; + module + .merge(debug_api) + .map_err(|e| sc_service::Error::Application(e.into()))?; + Ok(module) +} diff --git a/eth-rpc/src/client.rs b/eth-rpc/src/client.rs new file mode 100644 index 0000000000..6a91d77f9d --- /dev/null +++ b/eth-rpc/src/client.rs @@ -0,0 +1,840 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! The client connects to the source substrate chain +//! and is used by the rpc server to query and send transactions to the substrate chain. + +pub(crate) mod runtime_api; +pub(crate) mod storage_api; + +use crate::{ + subxt_client::{self, revive::calls::types::EthTransact, SrcChainConfig}, + BlockInfoProvider, BlockTag, FeeHistoryProvider, ReceiptProvider, SubxtBlockInfoProvider, + TracerType, TransactionInfo, +}; +use jsonrpsee::types::{error::CALL_EXECUTION_FAILED_CODE, ErrorObjectOwned}; +use pallet_revive::{ + evm::{ + decode_revert_reason, Block, BlockNumberOrTag, BlockNumberOrTagOrHash, FeeHistoryResult, + Filter, GenericTransaction, HashesOrTransactionInfos, Log, ReceiptInfo, SyncingProgress, + SyncingStatus, Trace, TransactionSigned, TransactionTrace, H256, + }, + EthTransactError, +}; +use runtime_api::RuntimeApi; +use sp_runtime::traits::Block as BlockT; +use sp_weights::Weight; +use std::{ops::Range, sync::Arc, time::Duration}; +use storage_api::StorageApi; +use subxt::{ + backend::{ + legacy::{rpc_methods::SystemHealth, LegacyRpcMethods}, + rpc::{ + reconnecting_rpc_client::{ExponentialBackoff, RpcClient as ReconnectingRpcClient}, + RpcClient, + }, + }, + config::{HashFor, Header}, + ext::subxt_rpcs::rpc_params, + Config, OnlineClient, +}; +use thiserror::Error; +use tokio::sync::Mutex; + +/// The substrate block type. +pub type SubstrateBlock = subxt::blocks::Block>; + +/// The substrate block header. +pub type SubstrateBlockHeader = ::Header; + +/// The substrate block number type. +pub type SubstrateBlockNumber = ::Number; + +/// The substrate block hash type. +pub type SubstrateBlockHash = HashFor; + +/// The runtime balance type. +pub type Balance = u128; + +/// The subscription type used to listen to new blocks. +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum SubscriptionType { + /// Subscribe to best blocks. + BestBlocks, + /// Subscribe to finalized blocks. + FinalizedBlocks, +} + +/// The error type for the client. +#[derive(Error, Debug)] +pub enum ClientError { + /// A [`jsonrpsee::core::ClientError`] wrapper error. + #[error(transparent)] + Jsonrpsee(#[from] jsonrpsee::core::ClientError), + /// A [`subxt::Error`] wrapper error. + #[error(transparent)] + SubxtError(#[from] subxt::Error), + #[error(transparent)] + RpcError(#[from] subxt::ext::subxt_rpcs::Error), + /// A [`sqlx::Error`] wrapper error. + #[error(transparent)] + SqlxError(#[from] sqlx::Error), + /// A [`codec::Error`] wrapper error. + #[error(transparent)] + CodecError(#[from] codec::Error), + /// Transcact call failed. + #[error("contract reverted: {0:?}")] + TransactError(EthTransactError), + /// A decimal conversion failed. + #[error("conversion failed")] + ConversionFailed, + /// The block hash was not found. + #[error("hash not found")] + BlockNotFound, + /// The contract was not found. + #[error("Contract not found")] + ContractNotFound, + #[error("No Ethereum extrinsic found")] + EthExtrinsicNotFound, + /// The transaction fee could not be found + #[error("transactionFeePaid event not found")] + TxFeeNotFound, + /// Failed to decode a raw payload into a signed transaction. + #[error("Failed to decode a raw payload into a signed transaction")] + TxDecodingFailed, + /// Failed to recover eth address. + #[error("failed to recover eth address")] + RecoverEthAddressFailed, + /// Failed to filter logs. + #[error("Failed to filter logs")] + LogFilterFailed(#[from] anyhow::Error), + /// Receipt storage was not found. + #[error("Receipt storage not found")] + ReceiptDataNotFound, + /// Ethereum block was not found. + #[error("Ethereum block not found")] + EthereumBlockNotFound, + /// Receipt data length mismatch. + #[error("Receipt data length mismatch")] + ReceiptDataLengthMismatch, +} +const LOG_TARGET: &str = "eth-rpc::client"; + +const REVERT_CODE: i32 = 3; + +const NOTIFIER_CAPACITY: usize = 16; +impl From for ErrorObjectOwned { + fn from(err: ClientError) -> Self { + match err { + ClientError::SubxtError(subxt::Error::Rpc(subxt::error::RpcError::ClientError( + subxt::ext::subxt_rpcs::Error::User(err), + ))) + | ClientError::RpcError(subxt::ext::subxt_rpcs::Error::User(err)) => { + ErrorObjectOwned::owned::>(err.code, err.message, None) + } + ClientError::TransactError(EthTransactError::Data(data)) => { + let msg = match decode_revert_reason(&data) { + Some(reason) => format!("execution reverted: {reason}"), + None => "execution reverted".to_string(), + }; + + let data = format!("0x{}", hex::encode(data)); + ErrorObjectOwned::owned::(REVERT_CODE, msg, Some(data)) + } + ClientError::TransactError(EthTransactError::Message(msg)) => { + ErrorObjectOwned::owned::(CALL_EXECUTION_FAILED_CODE, msg, None) + } + _ => { + ErrorObjectOwned::owned::(CALL_EXECUTION_FAILED_CODE, err.to_string(), None) + } + } + } +} + +/// A client connect to a node and maintains a cache of the last `CACHE_SIZE` blocks. +#[derive(Clone)] +pub struct Client { + api: OnlineClient, + rpc_client: RpcClient, + rpc: LegacyRpcMethods, + receipt_provider: ReceiptProvider, + block_provider: SubxtBlockInfoProvider, + fee_history_provider: FeeHistoryProvider, + chain_id: u64, + max_block_weight: Weight, + /// Whether the node has automine enabled. + automine: bool, + /// A notifier, that informs subscribers of new best blocks. + block_notifier: Option>, + /// A lock to ensure only one subscription can perform write operations at a time. + subscription_lock: Arc>, +} + +/// Fetch the chain ID from the substrate chain. +async fn chain_id(api: &OnlineClient) -> Result { + let query = subxt_client::constants().revive().chain_id(); + api.constants().at(&query).map_err(|err| err.into()) +} + +/// Fetch the max block weight from the substrate chain. +async fn max_block_weight(api: &OnlineClient) -> Result { + let query = subxt_client::constants().system().block_weights(); + let weights = api.constants().at(&query)?; + let max_block = weights + .per_class + .normal + .max_extrinsic + .unwrap_or(weights.max_block); + Ok(max_block.0) +} + +/// Get the automine status from the node. +async fn get_automine(rpc_client: &RpcClient) -> bool { + match rpc_client + .request::("getAutomine", rpc_params![]) + .await + { + Ok(val) => val, + Err(err) => { + log::info!(target: LOG_TARGET, "Node does not have getAutomine RPC. Defaulting to automine=false. error: {err:?}"); + false + } + } +} + +/// Connect to a node at the given URL, and return the underlying API, RPC client, and legacy RPC +/// clients. +pub async fn connect( + node_rpc_url: &str, +) -> Result< + ( + OnlineClient, + RpcClient, + LegacyRpcMethods, + ), + ClientError, +> { + log::info!(target: LOG_TARGET, "🌐 Connecting to node at: {node_rpc_url} ..."); + let rpc_client = ReconnectingRpcClient::builder() + .retry_policy(ExponentialBackoff::from_millis(100).max_delay(Duration::from_secs(10))) + .build(node_rpc_url.to_string()) + .await?; + let rpc_client = RpcClient::new(rpc_client); + log::info!(target: LOG_TARGET, "🌟 Connected to node at: {node_rpc_url}"); + + let api = OnlineClient::::from_rpc_client(rpc_client.clone()).await?; + let rpc = LegacyRpcMethods::::new(rpc_client.clone()); + Ok((api, rpc_client, rpc)) +} + +impl Client { + /// Create a new client instance. + pub async fn new( + api: OnlineClient, + rpc_client: RpcClient, + rpc: LegacyRpcMethods, + block_provider: SubxtBlockInfoProvider, + receipt_provider: ReceiptProvider, + ) -> Result { + let (chain_id, max_block_weight, automine) = + tokio::try_join!(chain_id(&api), max_block_weight(&api), async { + Ok(get_automine(&rpc_client).await) + },)?; + + let client = Self { + api, + rpc_client, + rpc, + receipt_provider, + block_provider, + fee_history_provider: FeeHistoryProvider::default(), + chain_id, + max_block_weight, + automine, + block_notifier: automine + .then(|| tokio::sync::broadcast::channel::(NOTIFIER_CAPACITY).0), + subscription_lock: Arc::new(Mutex::new(())), + }; + + Ok(client) + } + + /// Creates a block notifier instance. + pub fn create_block_notifier(&mut self) { + self.block_notifier = Some(tokio::sync::broadcast::channel::(NOTIFIER_CAPACITY).0); + } + + /// Subscribe to past blocks executing the callback for each block in `range`. + async fn subscribe_past_blocks( + &self, + range: Range, + callback: F, + ) -> Result<(), ClientError> + where + F: Fn(Arc) -> Fut + Send + Sync, + Fut: std::future::Future> + Send, + { + let mut block = self + .block_provider + .block_by_number(range.end) + .await? + .ok_or(ClientError::BlockNotFound)?; + + loop { + let block_number = block.number(); + log::trace!(target: "eth-rpc::subscription", "Processing past block #{block_number}"); + + let parent_hash = block.header().parent_hash; + callback(block.clone()).await.inspect_err(|err| { + log::error!(target: "eth-rpc::subscription", "Failed to process past block #{block_number}: {err:?}"); + })?; + + if range.start < block_number { + block = self + .block_provider + .block_by_hash(&parent_hash) + .await? + .ok_or(ClientError::BlockNotFound)?; + } else { + return Ok(()); + } + } + } + + /// Subscribe to new blocks, and execute the async closure for each block. + async fn subscribe_new_blocks( + &self, + subscription_type: SubscriptionType, + callback: F, + ) -> Result<(), ClientError> + where + F: Fn(SubstrateBlock) -> Fut + Send + Sync, + Fut: std::future::Future> + Send, + { + let mut block_stream = match subscription_type { + SubscriptionType::BestBlocks => self.api.blocks().subscribe_best().await, + SubscriptionType::FinalizedBlocks => self.api.blocks().subscribe_finalized().await, + } + .inspect_err(|err| { + log::error!(target: LOG_TARGET, "Failed to subscribe to blocks: {err:?}"); + })?; + + while let Some(block) = block_stream.next().await { + let block = match block { + Ok(block) => block, + Err(err) => { + if err.is_disconnected_will_reconnect() { + log::warn!( + target: LOG_TARGET, + "The RPC connection was lost and we may have missed a few blocks ({subscription_type:?}): {err:?}" + ); + continue; + } + + log::error!(target: LOG_TARGET, "Failed to fetch block ({subscription_type:?}): {err:?}"); + return Err(err.into()); + } + }; + + // Acquire lock to ensure only one subscription can perform write operations at a time + let _guard = self.subscription_lock.lock().await; + + let block_number = block.number(); + log::trace!(target: "eth-rpc::subscription", "⏳ Processing {subscription_type:?} block: {block_number}"); + if let Err(err) = callback(block).await { + log::error!(target: LOG_TARGET, "Failed to process block {block_number}: {err:?}"); + } else { + log::trace!(target: "eth-rpc::subscription", "✅ Processed {subscription_type:?} block: {block_number}"); + } + } + + log::info!(target: LOG_TARGET, "Block subscription ended"); + Ok(()) + } + + /// Start the block subscription, and populate the block cache. + pub async fn subscribe_and_cache_new_blocks( + &self, + subscription_type: SubscriptionType, + ) -> Result<(), ClientError> { + log::info!(target: LOG_TARGET, "🔌 Subscribing to new blocks ({subscription_type:?})"); + self.subscribe_new_blocks(subscription_type, |block| async { + let hash = block.hash(); + let evm_block = self.runtime_api(hash).eth_block().await?; + let (_, receipts): (Vec<_>, Vec<_>) = self + .receipt_provider + .insert_block_receipts(&block, &evm_block.hash) + .await? + .into_iter() + .unzip(); + + self.block_provider + .update_latest(Arc::new(block), subscription_type) + .await; + self.fee_history_provider + .update_fee_history(&evm_block, &receipts) + .await; + + // Only broadcast for best blocks to avoid duplicate notifications. + match (subscription_type, &self.block_notifier) { + (SubscriptionType::BestBlocks, Some(sender)) if sender.receiver_count() > 0 => { + let _ = sender.send(hash); + } + _ => {} + } + Ok(()) + }) + .await + } + + /// Cache old blocks up to the given block number. + pub async fn subscribe_and_cache_blocks( + &self, + index_last_n_blocks: SubstrateBlockNumber, + ) -> Result<(), ClientError> { + let last = self.latest_block().await.number().saturating_sub(1); + let range = last.saturating_sub(index_last_n_blocks)..last; + log::info!(target: LOG_TARGET, "🗄️ Indexing past blocks in range {range:?}"); + + self.subscribe_past_blocks(range, |block| async move { + let ethereum_hash = self + .runtime_api(block.hash()) + .eth_block_hash(pallet_revive::evm::U256::from(block.number())) + .await? + .ok_or(ClientError::EthereumBlockNotFound)?; + self.receipt_provider + .insert_block_receipts(&block, ðereum_hash) + .await?; + Ok(()) + }) + .await?; + + log::info!(target: LOG_TARGET, "🗄️ Finished indexing past blocks"); + Ok(()) + } + + /// Get the block hash for the given block number or tag. + pub async fn block_hash_for_tag( + &self, + at: BlockNumberOrTagOrHash, + ) -> Result { + match at { + BlockNumberOrTagOrHash::BlockHash(hash) => self + .resolve_substrate_hash(&hash) + .await + .ok_or(ClientError::EthereumBlockNotFound), + BlockNumberOrTagOrHash::BlockNumber(block_number) => { + let n: SubstrateBlockNumber = (block_number) + .try_into() + .map_err(|_| ClientError::ConversionFailed)?; + let hash = self + .get_block_hash(n) + .await? + .ok_or(ClientError::BlockNotFound)?; + Ok(hash) + } + BlockNumberOrTagOrHash::BlockTag(BlockTag::Finalized | BlockTag::Safe) => { + let block = self.latest_finalized_block().await; + Ok(block.hash()) + } + BlockNumberOrTagOrHash::BlockTag(_) => { + let block = self.latest_block().await; + Ok(block.hash()) + } + } + } + + /// Get the storage API for the given block. + pub fn storage_api(&self, block_hash: H256) -> StorageApi { + StorageApi::new(self.api.storage().at(block_hash)) + } + + /// Get the runtime API for the given block. + pub fn runtime_api(&self, block_hash: H256) -> RuntimeApi { + RuntimeApi::new(self.api.runtime_api().at(block_hash)) + } + + /// Get the latest finalized block. + pub async fn latest_finalized_block(&self) -> Arc { + self.block_provider.latest_finalized_block().await + } + + /// Get the latest best block. + pub async fn latest_block(&self) -> Arc { + self.block_provider.latest_block().await + } + + /// Expose the transaction API. + pub async fn submit( + &self, + call: subxt::tx::DefaultPayload, + ) -> Result { + let ext = self + .api + .tx() + .create_unsigned(&call) + .map_err(ClientError::from)?; + let hash: H256 = self + .rpc_client + .request("author_submitExtrinsic", rpc_params![to_hex(ext.encoded())]) + .await?; + log::debug!(target: LOG_TARGET, "Submitted transaction with substrate hash: {hash:?}"); + Ok(hash) + } + + /// Get an EVM transaction receipt by hash. + pub async fn receipt(&self, tx_hash: &H256) -> Option { + self.receipt_provider.receipt_by_hash(tx_hash).await + } + + pub async fn sync_state( + &self, + ) -> Result, ClientError> { + let client = self.rpc_client.clone(); + let sync_state: sc_rpc::system::SyncState = client + .request("system_syncState", Default::default()) + .await?; + Ok(sync_state) + } + + /// Get the syncing status of the chain. + pub async fn syncing(&self) -> Result { + let health = self.rpc.system_health().await?; + + let status = if health.is_syncing { + let sync_state = self.sync_state().await?; + SyncingProgress { + current_block: Some(sync_state.current_block.into()), + highest_block: Some(sync_state.highest_block.into()), + starting_block: Some(sync_state.starting_block.into()), + } + .into() + } else { + SyncingStatus::Bool(false) + }; + + Ok(status) + } + + /// Get an EVM transaction receipt by hash. + pub async fn receipt_by_hash_and_index( + &self, + block_hash: &H256, + transaction_index: usize, + ) -> Option { + self.receipt_provider + .receipt_by_block_hash_and_index(block_hash, transaction_index) + .await + } + + pub async fn signed_tx_by_hash(&self, tx_hash: &H256) -> Option { + self.receipt_provider.signed_tx_by_hash(tx_hash).await + } + + /// Get receipts count per block. + pub async fn receipts_count_per_block(&self, block_hash: &SubstrateBlockHash) -> Option { + self.receipt_provider + .receipts_count_per_block(block_hash) + .await + } + + /// Get an EVM transaction receipt by specified Ethereum block hash. + pub async fn receipt_by_ethereum_hash_and_index( + &self, + ethereum_hash: &H256, + transaction_index: usize, + ) -> Option { + // Fallback: use hash as Substrate hash if Ethereum hash cannot be resolved + let substrate_hash = self + .resolve_substrate_hash(ethereum_hash) + .await + .unwrap_or(*ethereum_hash); + self.receipt_by_hash_and_index(&substrate_hash, transaction_index) + .await + } + + /// Get the system health. + pub async fn system_health(&self) -> Result { + let health = self.rpc.system_health().await?; + Ok(health) + } + + /// Get the block number of the latest block. + pub async fn block_number(&self) -> Result { + let latest_block = self.block_provider.latest_block().await; + Ok(latest_block.number()) + } + + /// Get a block hash for the given block number. + pub async fn get_block_hash( + &self, + block_number: SubstrateBlockNumber, + ) -> Result, ClientError> { + let maybe_block = self.block_provider.block_by_number(block_number).await?; + Ok(maybe_block.map(|block| block.hash())) + } + + /// Get a block for the specified hash or number. + pub async fn block_by_number_or_tag( + &self, + block: &BlockNumberOrTag, + ) -> Result>, ClientError> { + match block { + BlockNumberOrTag::U256(n) => { + let n = (*n).try_into().map_err(|_| ClientError::ConversionFailed)?; + self.block_by_number(n).await + } + BlockNumberOrTag::BlockTag(BlockTag::Finalized | BlockTag::Safe) => { + let block = self.block_provider.latest_finalized_block().await; + Ok(Some(block)) + } + BlockNumberOrTag::BlockTag(_) => { + let block = self.block_provider.latest_block().await; + Ok(Some(block)) + } + } + } + + /// Get a block by hash + pub async fn block_by_hash( + &self, + hash: &SubstrateBlockHash, + ) -> Result>, ClientError> { + self.block_provider.block_by_hash(hash).await + } + + /// Resolve Ethereum block hash to Substrate block hash, then get the block. + /// This method provides the abstraction layer needed by the RPC APIs. + pub async fn resolve_substrate_hash(&self, ethereum_hash: &H256) -> Option { + self.receipt_provider + .get_substrate_hash(ethereum_hash) + .await + } + + /// Resolve Substrate block hash to Ethereum block hash, then get the block. + /// This method provides the abstraction layer needed by the RPC APIs. + pub async fn resolve_ethereum_hash(&self, substrate_hash: &H256) -> Option { + self.receipt_provider + .get_ethereum_hash(substrate_hash) + .await + } + + /// Get a block by Ethereum hash with automatic resolution to Substrate hash. + /// Falls back to treating the hash as a Substrate hash if no mapping exists. + pub async fn block_by_ethereum_hash( + &self, + ethereum_hash: &H256, + ) -> Result>, ClientError> { + // First try to resolve the Ethereum hash to a Substrate hash + if let Some(substrate_hash) = self.resolve_substrate_hash(ethereum_hash).await { + return self.block_by_hash(&substrate_hash).await; + } + + // Fallback: treat the provided hash as a Substrate hash (backward compatibility) + self.block_by_hash(ethereum_hash).await + } + + /// Get a block by number + pub async fn block_by_number( + &self, + block_number: SubstrateBlockNumber, + ) -> Result>, ClientError> { + self.block_provider.block_by_number(block_number).await + } + + async fn tracing_block( + &self, + block_hash: H256, + ) -> Result< + sp_runtime::generic::Block< + sp_runtime::generic::Header, + sp_runtime::OpaqueExtrinsic, + >, + ClientError, + > { + let signed_block: sp_runtime::generic::SignedBlock< + sp_runtime::generic::Block< + sp_runtime::generic::Header, + sp_runtime::OpaqueExtrinsic, + >, + > = self + .rpc_client + .request("chain_getBlock", rpc_params![block_hash]) + .await + .unwrap(); + + Ok(signed_block.block) + } + + /// Get the transaction traces for the given block. + pub async fn trace_block_by_number( + &self, + at: BlockNumberOrTag, + config: TracerType, + ) -> Result, ClientError> { + if self.receipt_provider.is_before_earliest_block(&at) { + return Ok(vec![]); + } + + let block_hash = self.block_hash_for_tag(at.into()).await?; + let block = self.tracing_block(block_hash).await?; + let parent_hash = block.header().parent_hash; + let runtime_api = RuntimeApi::new(self.api.runtime_api().at(parent_hash)); + let traces = runtime_api.trace_block(block, config.clone()).await?; + + let mut hashes = self + .receipt_provider + .block_transaction_hashes(&block_hash) + .await + .ok_or(ClientError::EthExtrinsicNotFound)?; + + let traces = traces.into_iter().filter_map(|(index, trace)| { + Some(TransactionTrace { + tx_hash: hashes.remove(&(index as usize))?, + trace, + }) + }); + + Ok(traces.collect()) + } + + /// Get the transaction traces for the given transaction. + pub async fn trace_transaction( + &self, + transaction_hash: H256, + config: TracerType, + ) -> Result { + let (block_hash, transaction_index) = self + .receipt_provider + .find_transaction(&transaction_hash) + .await + .ok_or(ClientError::EthExtrinsicNotFound)?; + + let block = self.tracing_block(block_hash).await?; + let parent_hash = block.header.parent_hash; + let runtime_api = self.runtime_api(parent_hash); + + runtime_api + .trace_tx(block, transaction_index as u32, config) + .await + } + + /// Get the transaction traces for the given block. + pub async fn trace_call( + &self, + transaction: GenericTransaction, + block: BlockNumberOrTagOrHash, + config: TracerType, + ) -> Result { + let block_hash = self.block_hash_for_tag(block).await?; + let runtime_api = self.runtime_api(block_hash); + runtime_api.trace_call(transaction, config).await + } + + /// Get the EVM block for the given Substrate block. + pub async fn evm_block( + &self, + block: Arc, + hydrated_transactions: bool, + ) -> Option { + log::trace!(target: LOG_TARGET, "Get Ethereum block for hash {:?}", block.hash()); + + // This could potentially fail under below circumstances: + // - state has been pruned + // - the block author cannot be obtained from the digest logs (highly unlikely) + // - the node we are targeting has an outdated revive pallet (or ETH block functionality is + // disabled) + match self.runtime_api(block.hash()).eth_block().await { + Ok(mut eth_block) => { + log::trace!(target: LOG_TARGET, "Ethereum block from runtime API hash {:?}", eth_block.hash); + + if hydrated_transactions { + // Hydrate the block. + let tx_infos = self + .receipt_provider + .receipts_from_block(&block) + .await + .unwrap_or_default() + .into_iter() + .map(|(signed_tx, receipt)| TransactionInfo::new(&receipt, signed_tx)) + .collect::>(); + + eth_block.transactions = HashesOrTransactionInfos::TransactionInfos(tx_infos); + } + + Some(eth_block) + } + Err(err) => { + log::error!(target: LOG_TARGET, "Failed to get Ethereum block for hash {:?}: {err:?}", block.hash()); + None + } + } + } + + /// Get the chain ID. + pub fn chain_id(&self) -> u64 { + self.chain_id + } + + /// Get the Max Block Weight. + pub fn max_block_weight(&self) -> Weight { + self.max_block_weight + } + + /// Get the block notifier, if automine is enabled or Self::create_block_notifier was called. + pub fn block_notifier(&self) -> Option> { + self.block_notifier.clone() + } + + /// Get the logs matching the given filter. + pub async fn logs(&self, filter: Option) -> Result, ClientError> { + let logs = self + .receipt_provider + .logs(filter) + .await + .map_err(ClientError::LogFilterFailed)?; + Ok(logs) + } + + pub async fn fee_history( + &self, + block_count: u32, + latest_block: BlockNumberOrTag, + reward_percentiles: Option>, + ) -> Result { + let Some(latest_block) = self.block_by_number_or_tag(&latest_block).await? else { + return Err(ClientError::BlockNotFound); + }; + + self.fee_history_provider + .fee_history(block_count, latest_block.number(), reward_percentiles) + .await + } + + /// Check if automine is enabled. + pub fn is_automine(&self) -> bool { + self.automine + } + + /// Get the automine status from the node. + pub async fn get_automine(&self) -> bool { + get_automine(&self.rpc_client).await + } +} + +fn to_hex(bytes: impl AsRef<[u8]>) -> String { + format!("0x{}", hex::encode(bytes.as_ref())) +} diff --git a/eth-rpc/src/client/runtime_api.rs b/eth-rpc/src/client/runtime_api.rs new file mode 100644 index 0000000000..d002ec66fd --- /dev/null +++ b/eth-rpc/src/client/runtime_api.rs @@ -0,0 +1,263 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::{ + client::Balance, + subxt_client::{self, SrcChainConfig}, + ClientError, +}; +use futures::TryFutureExt; +use pallet_revive::{ + evm::{ + Block as EthBlock, BlockNumberOrTagOrHash, BlockTag, GenericTransaction, ReceiptGasInfo, + Trace, H160, U256, + }, + DryRunConfig, EthTransactInfo, +}; +use sp_core::H256; +use sp_timestamp::Timestamp; +use subxt::{error::MetadataError, ext::subxt_rpcs::UserError, Error::Metadata, OnlineClient}; + +const LOG_TARGET: &str = "eth-rpc::runtime_api"; + +/// A Wrapper around subxt Runtime API +#[derive(Clone)] +pub struct RuntimeApi(subxt::runtime_api::RuntimeApi>); + +impl RuntimeApi { + /// Create a new instance. + pub fn new( + api: subxt::runtime_api::RuntimeApi>, + ) -> Self { + Self(api) + } + + /// Get the balance of the given address. + pub async fn balance(&self, address: H160) -> Result { + let address = address.0.into(); + let payload = subxt_client::apis().revive_api().balance(address); + let balance = self.0.call(payload).await?; + Ok(*balance) + } + + /// Get the contract storage for the given contract address and key. + pub async fn get_storage( + &self, + contract_address: H160, + key: [u8; 32], + ) -> Result>, ClientError> { + let contract_address = contract_address.0.into(); + let payload = subxt_client::apis() + .revive_api() + .get_storage(contract_address, key); + let result = self + .0 + .call(payload) + .await? + .map_err(|_| ClientError::ContractNotFound)?; + Ok(result) + } + + /// Dry run a transaction and returns the [`EthTransactInfo`] for the transaction. + pub async fn dry_run( + &self, + tx: GenericTransaction, + block: BlockNumberOrTagOrHash, + ) -> Result, ClientError> { + let timestamp_override = match block { + BlockNumberOrTagOrHash::BlockTag(BlockTag::Pending) => { + Some(Timestamp::current().as_millis()) + } + _ => None, + }; + + let payload = subxt_client::apis() + .revive_api() + .eth_transact_with_config( + tx.clone().into(), + DryRunConfig::new(timestamp_override).into(), + ) + .unvalidated(); + + let result = self + .0 + .call(payload) + .or_else(|err| async { + match err { + // This will be hit if subxt metadata (subxt uses the latest finalized block + // metadata when the eth-rpc starts) does not contain the new method + Metadata(MetadataError::RuntimeMethodNotFound(name)) => { + log::debug!(target: LOG_TARGET, "Method {name:?} not found falling back to eth_transact"); + let payload = subxt_client::apis().revive_api().eth_transact(tx.into()); + self.0.call(payload).await + }, + // This will be hit if we are trying to hit a block where the runtime did not + // have this new runtime `eth_transact_with_config` defined + subxt::Error::Rpc(subxt::error::RpcError::ClientError( + subxt::ext::subxt_rpcs::Error::User(UserError { message, .. }), + )) if message.contains("eth_transact_with_config is not found") => { + log::debug!(target: LOG_TARGET, "{message:?} not found falling back to eth_transact"); + let payload = subxt_client::apis().revive_api().eth_transact(tx.into()); + self.0.call(payload).await + }, + e => Err(e), + } + }) + .await?; + + match result { + Err(err) => { + log::debug!(target: LOG_TARGET, "Dry run failed {err:?}"); + Err(ClientError::TransactError(err.0)) + } + Ok(result) => Ok(result.0), + } + } + + /// Get the nonce of the given address. + pub async fn nonce(&self, address: H160) -> Result { + let address = address.0.into(); + let payload = subxt_client::apis().revive_api().nonce(address); + let nonce = self.0.call(payload).await?; + Ok(nonce.into()) + } + + /// Get the gas price + pub async fn gas_price(&self) -> Result { + let payload = subxt_client::apis().revive_api().gas_price(); + let gas_price = self.0.call(payload).await?; + Ok(*gas_price) + } + + /// Convert a weight to a fee. + pub async fn block_gas_limit(&self) -> Result { + let payload = subxt_client::apis().revive_api().block_gas_limit(); + let gas_limit = self.0.call(payload).await?; + Ok(*gas_limit) + } + + /// Get the miner address + pub async fn block_author(&self) -> Result { + let payload = subxt_client::apis().revive_api().block_author(); + let author = self.0.call(payload).await?; + Ok(author) + } + + /// Get the trace for the given transaction index in the given block. + pub async fn trace_tx( + &self, + block: sp_runtime::generic::Block< + sp_runtime::generic::Header, + sp_runtime::OpaqueExtrinsic, + >, + transaction_index: u32, + tracer_type: crate::TracerType, + ) -> Result { + let payload = subxt_client::apis() + .revive_api() + .trace_tx(block.into(), transaction_index, tracer_type.into()) + .unvalidated(); + + let trace = self + .0 + .call(payload) + .await? + .ok_or(ClientError::EthExtrinsicNotFound)? + .0; + Ok(trace) + } + + /// Get the trace for the given block. + pub async fn trace_block( + &self, + block: sp_runtime::generic::Block< + sp_runtime::generic::Header, + sp_runtime::OpaqueExtrinsic, + >, + tracer_type: crate::TracerType, + ) -> Result, ClientError> { + let payload = subxt_client::apis() + .revive_api() + .trace_block(block.into(), tracer_type.into()) + .unvalidated(); + + let traces = self + .0 + .call(payload) + .await? + .into_iter() + .map(|(idx, t)| (idx, t.0)) + .collect(); + Ok(traces) + } + + /// Get the trace for the given call. + pub async fn trace_call( + &self, + transaction: GenericTransaction, + tracer_type: crate::TracerType, + ) -> Result { + let payload = subxt_client::apis() + .revive_api() + .trace_call(transaction.into(), tracer_type.into()) + .unvalidated(); + + let trace = self + .0 + .call(payload) + .await? + .map_err(|err| ClientError::TransactError(err.0))?; + Ok(trace.0) + } + + /// Get the code of the given address. + pub async fn code(&self, address: H160) -> Result, ClientError> { + let payload = subxt_client::apis().revive_api().code(address); + let code = self.0.call(payload).await?; + Ok(code) + } + + /// Get the current Ethereum block. + pub async fn eth_block(&self) -> Result { + let payload = subxt_client::apis().revive_api().eth_block(); + let block = self.0.call(payload).await.inspect_err(|err| { + log::debug!(target: LOG_TARGET, "Ethereum block not found, err: {err:?}"); + })?; + Ok(block.0) + } + + /// Get the Ethereum block hash for the given block number. + pub async fn eth_block_hash(&self, number: U256) -> Result, ClientError> { + let payload = subxt_client::apis() + .revive_api() + .eth_block_hash(number.into()); + let hash = self.0.call(payload).await.inspect_err(|err| { + log::debug!(target: LOG_TARGET, "Ethereum block hash for block #{number:?} not found, err: {err:?}"); + })?; + Ok(hash) + } + + /// Get the receipt data for the current block. + pub async fn eth_receipt_data(&self) -> Result, ClientError> { + let payload = subxt_client::apis().revive_api().eth_receipt_data(); + let receipt_data = self.0.call(payload).await.inspect_err(|err| { + log::debug!(target: LOG_TARGET, "Receipt data not found, err: {err:?}"); + })?; + let receipt_data = receipt_data.into_iter().map(|item| item.0).collect(); + Ok(receipt_data) + } +} diff --git a/eth-rpc/src/client/storage_api.rs b/eth-rpc/src/client/storage_api.rs new file mode 100644 index 0000000000..fb312e805a --- /dev/null +++ b/eth-rpc/src/client/storage_api.rs @@ -0,0 +1,65 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::{ + subxt_client::{ + self, + runtime_types::pallet_revive::storage::{AccountType, ContractInfo}, + SrcChainConfig, + }, + ClientError, H160, +}; +use subxt::{storage::Storage, OnlineClient}; + +/// A wrapper around the Substrate Storage API. +#[derive(Clone)] +pub struct StorageApi(Storage>); + +impl StorageApi { + /// Create a new instance of the StorageApi. + pub fn new(api: Storage>) -> Self { + Self(api) + } + + /// Get the contract info for the given contract address. + pub async fn get_contract_info( + &self, + contract_address: &H160, + ) -> Result { + // TODO: remove once subxt is updated + let contract_address: subxt::utils::H160 = contract_address.0.into(); + + let query = subxt_client::storage() + .revive() + .account_info_of(contract_address); + let Some(info) = self.0.fetch(&query).await? else { + return Err(ClientError::ContractNotFound); + }; + + let AccountType::Contract(contract_info) = info.account_type else { + return Err(ClientError::ContractNotFound); + }; + + Ok(contract_info) + } + + /// Get the contract trie id for the given contract address. + pub async fn get_contract_trie_id(&self, address: &H160) -> Result, ClientError> { + let ContractInfo { trie_id, .. } = self.get_contract_info(address).await?; + Ok(trie_id.0) + } +} diff --git a/eth-rpc/src/example.rs b/eth-rpc/src/example.rs new file mode 100644 index 0000000000..0822e3b8cd --- /dev/null +++ b/eth-rpc/src/example.rs @@ -0,0 +1,240 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Example utilities +use crate::{EthRpcClient, ReceiptInfo}; +use anyhow::Context; +use pallet_revive::evm::*; +use std::sync::Arc; + +/// Transaction builder. +pub struct TransactionBuilder { + client: Arc, + signer: Account, + value: U256, + input: Bytes, + to: Option, + nonce: Option, + mutate: Box, +} + +#[derive(Debug)] +pub struct SubmittedTransaction { + tx: GenericTransaction, + hash: H256, + client: Arc, +} + +impl SubmittedTransaction { + /// Get the hash of the transaction. + pub fn hash(&self) -> H256 { + self.hash + } + + /// The gas sent with the transaction. + pub fn gas(&self) -> U256 { + self.tx.gas.unwrap() + } + + pub fn generic_transaction(&self) -> GenericTransaction { + self.tx.clone() + } + + /// Wait for the receipt of the transaction. + pub async fn wait_for_receipt(&self) -> anyhow::Result { + let hash = self.hash(); + for _ in 0..30 { + tokio::time::sleep(std::time::Duration::from_secs(2)).await; + let receipt = self.client.get_transaction_receipt(hash).await?; + if let Some(receipt) = receipt { + if receipt.is_success() { + eprintln!("Gas estimated; {}, used: {}", self.gas(), receipt.gas_used); + assert!( + self.gas() > receipt.gas_used, + "Gas used should be less than gas estimated." + ); + return Ok(receipt); + } else { + anyhow::bail!("Transaction failed receipt: {receipt:?}") + } + } + } + + anyhow::bail!("Timeout, failed to get receipt") + } +} + +impl TransactionBuilder { + pub fn new(client: &Arc) -> Self { + Self { + client: Arc::clone(client), + signer: Account::default(), + value: U256::zero(), + input: Bytes::default(), + to: None, + nonce: None, + mutate: Box::new(|_| {}), + } + } + /// Set the signer. + pub fn signer(mut self, signer: Account) -> Self { + self.signer = signer; + self + } + + /// Set the value. + pub fn value(mut self, value: U256) -> Self { + self.value = value; + self + } + + /// Set the input. + pub fn input(mut self, input: Vec) -> Self { + self.input = Bytes(input); + self + } + + /// Set the destination. + pub fn to(mut self, to: H160) -> Self { + self.to = Some(to); + self + } + + /// Set the nonce. + pub fn nonce(mut self, nonce: U256) -> Self { + self.nonce = Some(nonce); + self + } + + /// Set a mutation function, that mutates the transaction before sending. + pub fn mutate(mut self, mutate: impl FnOnce(&mut TransactionLegacyUnsigned) + 'static) -> Self { + self.mutate = Box::new(mutate); + self + } + + /// Call eth_call to get the result of a view function + pub async fn eth_call(self) -> anyhow::Result> { + let TransactionBuilder { + client, + signer, + value, + input, + to, + .. + } = self; + + let from = signer.address(); + let result = client + .call( + GenericTransaction { + from: Some(from), + input: input.into(), + value: Some(value), + to, + ..Default::default() + }, + None, + ) + .await + .with_context(|| "eth_call failed")?; + Ok(result.0) + } + + /// Send the transaction. + pub async fn send(self) -> anyhow::Result> { + let TransactionBuilder { + client, + signer, + value, + input, + to, + nonce, + mutate, + } = self; + + let from = signer.address(); + let chain_id = Some(client.chain_id().await?); + let gas_price = client.gas_price().await?; + let nonce = if let Some(nonce) = nonce { + nonce + } else { + client + .get_transaction_count(from, BlockTag::Latest.into()) + .await + .with_context(|| "Failed to fetch account nonce")? + }; + + let gas = client + .estimate_gas( + GenericTransaction { + from: Some(from), + input: input.clone().into(), + value: Some(value), + gas_price: Some(gas_price), + to, + ..Default::default() + }, + None, + ) + .await + .with_context(|| "Failed to fetch gas estimate")?; + + println!("Gas estimate: {gas:?}"); + let mut unsigned_tx = TransactionLegacyUnsigned { + gas, + nonce, + to, + value, + input, + gas_price, + chain_id, + ..Default::default() + }; + + mutate(&mut unsigned_tx); + + let signed_tx = signer.sign_transaction(unsigned_tx.into()); + let bytes = signed_tx.signed_payload(); + + let hash = client + .send_raw_transaction(bytes.into()) + .await + .with_context(|| "send_raw_transaction failed")?; + + Ok(SubmittedTransaction { + tx: GenericTransaction::from_signed(signed_tx, gas_price, Some(from)), + hash, + client, + }) + } +} + +#[test] +fn test_dummy_payload_has_correct_len() { + let signer = Account::from(subxt_signer::eth::dev::ethan()); + let unsigned_tx: TransactionUnsigned = TransactionLegacyUnsigned { + input: vec![42u8; 100].into(), + ..Default::default() + } + .into(); + + let signed_tx = signer.sign_transaction(unsigned_tx.clone()); + let signed_payload = signed_tx.signed_payload(); + let unsigned_tx = signed_tx.unsigned(); + + let dummy_payload = unsigned_tx.dummy_signed_payload(); + assert_eq!(dummy_payload.len(), signed_payload.len()); +} diff --git a/eth-rpc/src/fee_history_provider.rs b/eth-rpc/src/fee_history_provider.rs new file mode 100644 index 0000000000..a46d3a5f81 --- /dev/null +++ b/eth-rpc/src/fee_history_provider.rs @@ -0,0 +1,214 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use crate::{client::SubstrateBlockNumber, ClientError}; +use pallet_revive::evm::{Block, FeeHistoryResult, ReceiptInfo}; +use sp_core::U256; +use std::{collections::BTreeMap, sync::Arc}; +use tokio::sync::RwLock; + +/// The size of the fee history cache. +const CACHE_SIZE: u32 = 1024; + +#[derive(Default, Clone)] +struct FeeHistoryCacheItem { + base_fee: u128, + gas_used_ratio: f64, + rewards: Vec, +} + +/// Manages the fee history cache. +#[derive(Default, Clone)] +pub struct FeeHistoryProvider { + fee_history_cache: Arc>>, +} + +impl FeeHistoryProvider { + /// Update the fee history cache with the given block and receipts. + pub async fn update_fee_history(&self, block: &Block, receipts: &[ReceiptInfo]) { + // Evenly spaced percentile list from 0.0 to 100.0 with a 0.5 resolution. + // This means we cache 200 percentile points. + // Later in request handling we will approximate by rounding percentiles that + // fall in between with `(round(n*2)/2)`. + let reward_percentiles: Vec = (0..=200).map(|i| i as f64 * 0.5).collect(); + let block_number: SubstrateBlockNumber = block + .number + .try_into() + .expect("Block number is always valid"); + + let base_fee = block.base_fee_per_gas.as_u128(); + let gas_used = block.gas_used.as_u128(); + let gas_used_ratio = (gas_used as f64) / (block.gas_limit.as_u128() as f64); + let mut result = FeeHistoryCacheItem { + base_fee, + gas_used_ratio, + rewards: vec![], + }; + + let mut receipts = receipts + .iter() + .map(|receipt| { + let gas_used = receipt.gas_used.as_u128(); + let effective_reward = receipt + .effective_gas_price + .as_u128() + .saturating_sub(base_fee); + (gas_used, effective_reward) + }) + .collect::>(); + receipts.sort_by(|(_, a), (_, b)| a.cmp(b)); + + // Calculate percentile rewards. + result.rewards = reward_percentiles + .into_iter() + .filter_map(|p| { + let target_gas = (p * gas_used as f64 / 100f64) as u128; + let mut sum_gas = 0u128; + for (gas_used, reward) in &receipts { + sum_gas += gas_used; + if target_gas <= sum_gas { + return Some(*reward); + } + } + None + }) + .collect(); + + let mut cache = self.fee_history_cache.write().await; + if cache.len() >= CACHE_SIZE as usize { + cache.pop_first(); + } + cache.insert(block_number, result); + } + + /// Get the fee history for the given block range. + pub async fn fee_history( + &self, + block_count: u32, + highest: SubstrateBlockNumber, + reward_percentiles: Option>, + ) -> Result { + let block_count = block_count.min(CACHE_SIZE); + + let cache = self.fee_history_cache.read().await; + let Some(lowest_in_cache) = cache.first_key_value().map(|(k, _)| *k) else { + return Ok(FeeHistoryResult { + oldest_block: U256::zero(), + base_fee_per_gas: vec![], + gas_used_ratio: vec![], + reward: vec![], + }); + }; + + let lowest = highest + .saturating_sub(block_count.saturating_sub(1)) + .max(lowest_in_cache); + + let mut response = FeeHistoryResult { + oldest_block: U256::from(lowest), + base_fee_per_gas: Vec::new(), + gas_used_ratio: Vec::new(), + reward: Default::default(), + }; + + let rewards = &mut response.reward; + // Iterate over the requested block range. + for n in lowest..=highest { + if let Some(block) = cache.get(&n) { + response.base_fee_per_gas.push(U256::from(block.base_fee)); + response.gas_used_ratio.push(block.gas_used_ratio); + // If the request includes reward percentiles, get them from the cache. + if let Some(ref requested_percentiles) = reward_percentiles { + let mut block_rewards = Vec::new(); + // Resolution is half a point. I.e. 1.0,1.5 + let resolution_per_percentile: f64 = 2.0; + // Get cached reward for each provided percentile. + for p in requested_percentiles { + // Find the cache index from the user percentile. + let p = p.clamp(0.0, 100.0); + let index = ((p.round() / 2f64) * 2f64) * resolution_per_percentile; + // Get and push the reward. + let reward = if let Some(r) = block.rewards.get(index as usize) { + U256::from(*r) + } else { + U256::zero() + }; + block_rewards.push(reward); + } + // Push block rewards. + if !block_rewards.is_empty() { + rewards.push(block_rewards); + } + } + } + } + + // Next block base fee, use constant value for now + let base_fee = cache + .last_key_value() + .map(|(_, block)| U256::from(block.base_fee)) + .unwrap_or_default(); + response.base_fee_per_gas.push(base_fee); + Ok(response) + } +} + +#[tokio::test] +async fn test_update_fee_history() { + let block = Block { + number: U256::from(200u64), + base_fee_per_gas: U256::from(1000u64), + gas_used: U256::from(600u64), + gas_limit: U256::from(1200u64), + ..Default::default() + }; + + let receipts = vec![ + ReceiptInfo { + gas_used: U256::from(200u64), + effective_gas_price: U256::from(1200u64), + ..Default::default() + }, + ReceiptInfo { + gas_used: U256::from(200u64), + effective_gas_price: U256::from(1100u64), + ..Default::default() + }, + ReceiptInfo { + gas_used: U256::from(200u64), + effective_gas_price: U256::from(1050u64), + ..Default::default() + }, + ]; + + let provider = FeeHistoryProvider { + fee_history_cache: Arc::new(RwLock::new(BTreeMap::new())), + }; + provider.update_fee_history(&block, &receipts).await; + + let fee_history_result = provider + .fee_history(1, 200, Some(vec![0.0f64, 50.0, 100.0])) + .await + .unwrap(); + + let expected_result = FeeHistoryResult { + oldest_block: U256::from(200), + base_fee_per_gas: vec![U256::from(1000), U256::from(1000)], + gas_used_ratio: vec![0.5f64], + reward: vec![vec![U256::from(50), U256::from(100), U256::from(200)]], + }; + assert_eq!(fee_history_result, expected_result); +} diff --git a/eth-rpc/src/lib.rs b/eth-rpc/src/lib.rs new file mode 100644 index 0000000000..614dce4de5 --- /dev/null +++ b/eth-rpc/src/lib.rs @@ -0,0 +1,489 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! The [`EthRpcServer`] RPC server implementation +#![cfg_attr(docsrs, feature(doc_cfg))] + +use client::ClientError; +use jsonrpsee::{ + core::{async_trait, RpcResult}, + types::{ErrorCode, ErrorObjectOwned}, +}; +use pallet_revive::evm::*; +use sp_core::{keccak_256, H160, H256, U256}; +use thiserror::Error; +use tokio::time::Duration; + +pub mod cli; +pub mod client; +pub mod example; +pub mod subxt_client; + +#[cfg(test)] +mod tests; + +mod block_info_provider; +pub use block_info_provider::*; + +mod receipt_provider; +pub use receipt_provider::*; + +mod fee_history_provider; +pub use fee_history_provider::*; + +mod receipt_extractor; +pub use receipt_extractor::*; + +mod apis; +pub use apis::*; + +pub const LOG_TARGET: &str = "eth-rpc"; + +/// An EVM RPC server implementation. +pub struct EthRpcServerImpl { + /// The client used to interact with the substrate node. + client: client::Client, + + /// The accounts managed by the server. + accounts: Vec, +} + +impl EthRpcServerImpl { + /// Creates a new [`EthRpcServerImpl`]. + pub fn new(client: client::Client) -> Self { + Self { + client, + accounts: vec![], + } + } + + /// Sets the accounts managed by the server. + pub fn with_accounts(mut self, accounts: Vec) -> Self { + self.accounts = accounts; + self + } +} + +/// The error type for the EVM RPC server. +#[derive(Error, Debug)] +pub enum EthRpcError { + /// A [`ClientError`] wrapper error. + #[error("Client error: {0}")] + ClientError(#[from] ClientError), + /// A [`rlp::DecoderError`] wrapper error. + #[error("Decoding error: {0}")] + RlpError(#[from] rlp::DecoderError), + /// A Decimals conversion error. + #[error("Conversion error")] + ConversionError, + /// An invalid signature error. + #[error("Invalid signature")] + InvalidSignature, + /// The account was not found at the given address + #[error("Account not found for address {0:?}")] + AccountNotFound(H160), + /// Received an invalid transaction + #[error("Invalid transaction")] + InvalidTransaction, + /// Received an invalid transaction + #[error("Invalid transaction {0:?}")] + TransactionTypeNotSupported(Byte), +} + +// TODO use https://eips.ethereum.org/EIPS/eip-1474#error-codes +impl From for ErrorObjectOwned { + fn from(value: EthRpcError) -> Self { + match value { + EthRpcError::ClientError(err) => Self::from(err), + _ => Self::owned::(ErrorCode::InvalidRequest.code(), value.to_string(), None), + } + } +} + +#[async_trait] +impl EthRpcServer for EthRpcServerImpl { + async fn net_version(&self) -> RpcResult { + Ok(self.client.chain_id().to_string()) + } + + async fn net_listening(&self) -> RpcResult { + let syncing = self.client.syncing().await?; + let listening = matches!(syncing, SyncingStatus::Bool(false)); + Ok(listening) + } + + async fn syncing(&self) -> RpcResult { + Ok(self.client.syncing().await?) + } + + async fn block_number(&self) -> RpcResult { + let number = self.client.block_number().await?; + Ok(number.into()) + } + + async fn get_transaction_receipt( + &self, + transaction_hash: H256, + ) -> RpcResult> { + let receipt = self.client.receipt(&transaction_hash).await; + Ok(receipt) + } + + async fn estimate_gas( + &self, + transaction: GenericTransaction, + block: Option, + ) -> RpcResult { + log::trace!(target: LOG_TARGET, "estimate_gas transaction={transaction:?} block={block:?}"); + let block = block.unwrap_or_default(); + let hash = self.client.block_hash_for_tag(block.clone().into()).await?; + let runtime_api = self.client.runtime_api(hash); + let dry_run = runtime_api.dry_run(transaction, block.into()).await?; + log::trace!(target: LOG_TARGET, "estimate_gas result={dry_run:?}"); + Ok(dry_run.eth_gas) + } + + async fn call( + &self, + transaction: GenericTransaction, + block: Option, + ) -> RpcResult { + let block = block.unwrap_or_default(); + let hash = self.client.block_hash_for_tag(block.clone()).await?; + let runtime_api = self.client.runtime_api(hash); + let dry_run = runtime_api.dry_run(transaction, block).await?; + Ok(dry_run.data.into()) + } + + async fn send_raw_transaction(&self, transaction: Bytes) -> RpcResult { + let hash = H256(keccak_256(&transaction.0)); + log::trace!(target: LOG_TARGET, "send_raw_transaction transaction: {transaction:?} ethereum_hash: {hash:?}"); + let call = subxt_client::tx().revive().eth_transact(transaction.0); + + // Subscribe to new block only when automine is enabled. + let receiver = self + .client + .block_notifier() + .map(|sender| sender.subscribe()); + + // Submit the transaction + let substrate_hash = self.client.submit(call).await.map_err(|err| { + log::trace!(target: LOG_TARGET, "send_raw_transaction ethereum_hash: {hash:?} failed: {err:?}"); + err + })?; + + log::trace!(target: LOG_TARGET, "send_raw_transaction ethereum_hash: {hash:?} substrate_hash: {substrate_hash:?}"); + + // Wait for the transaction to be included in a block if automine is enabled + if let Some(mut receiver) = receiver { + if let Err(err) = tokio::time::timeout(Duration::from_millis(500), async { + loop { + if let Ok(block_hash) = receiver.recv().await { + let Ok(Some(block)) = self.client.block_by_hash(&block_hash).await else { + log::debug!(target: LOG_TARGET, "Could not find the block with the received hash: {hash:?}."); + continue + }; + let Some(evm_block) = self.client.evm_block(block, false).await else { + log::debug!(target: LOG_TARGET, "Failed to get the EVM block for substrate block with hash: {hash:?}"); + continue + }; + if evm_block.transactions.contains_tx(hash) { + log::debug!(target: LOG_TARGET, "{hash:} was included in a block"); + break; + } + } + } + }) + .await + { + log::debug!(target: LOG_TARGET, "timeout waiting for new block: {err:?}"); + } + } + + log::debug!(target: LOG_TARGET, "send_raw_transaction hash: {hash:?}"); + Ok(hash) + } + + async fn send_transaction(&self, mut transaction: GenericTransaction) -> RpcResult { + log::debug!(target: LOG_TARGET, "{transaction:#?}"); + + let Some(from) = transaction.from else { + log::debug!(target: LOG_TARGET, "Transaction must have a sender"); + return Err(EthRpcError::InvalidTransaction.into()); + }; + + let account = self + .accounts + .iter() + .find(|account| account.address() == from) + .ok_or(EthRpcError::AccountNotFound(from))?; + + if transaction.gas.is_none() { + transaction.gas = Some(self.estimate_gas(transaction.clone(), None).await?); + } + + if transaction.gas_price.is_none() { + transaction.gas_price = Some(self.gas_price().await?); + } + + if transaction.nonce.is_none() { + transaction.nonce = Some( + self.get_transaction_count(from, BlockTag::Latest.into()) + .await?, + ); + } + + if transaction.chain_id.is_none() { + transaction.chain_id = Some(self.chain_id().await?); + } + + let tx = transaction + .try_into_unsigned() + .map_err(|_| EthRpcError::InvalidTransaction)?; + let payload = account.sign_transaction(tx).signed_payload(); + self.send_raw_transaction(Bytes(payload)).await + } + + async fn get_block_by_hash( + &self, + block_hash: H256, + hydrated_transactions: bool, + ) -> RpcResult> { + let Some(block) = self.client.block_by_ethereum_hash(&block_hash).await? else { + return Ok(None); + }; + let block = self.client.evm_block(block, hydrated_transactions).await; + Ok(block) + } + + async fn get_balance(&self, address: H160, block: BlockNumberOrTagOrHash) -> RpcResult { + let hash = self.client.block_hash_for_tag(block).await?; + let runtime_api = self.client.runtime_api(hash); + let balance = runtime_api.balance(address).await?; + Ok(balance) + } + + async fn chain_id(&self) -> RpcResult { + Ok(self.client.chain_id().into()) + } + + async fn gas_price(&self) -> RpcResult { + let hash = self + .client + .block_hash_for_tag(BlockTag::Latest.into()) + .await?; + let runtime_api = self.client.runtime_api(hash); + Ok(runtime_api.gas_price().await?) + } + + async fn max_priority_fee_per_gas(&self) -> RpcResult { + // We do not support tips. Hence the recommended priority fee is + // always zero. The effective gas price will always be the base price. + Ok(Default::default()) + } + + async fn get_code(&self, address: H160, block: BlockNumberOrTagOrHash) -> RpcResult { + let hash = self.client.block_hash_for_tag(block).await?; + let code = self.client.runtime_api(hash).code(address).await?; + Ok(code.into()) + } + + async fn accounts(&self) -> RpcResult> { + Ok(self + .accounts + .iter() + .map(|account| account.address()) + .collect()) + } + + async fn get_block_by_number( + &self, + block_number: BlockNumberOrTag, + hydrated_transactions: bool, + ) -> RpcResult> { + let Some(block) = self.client.block_by_number_or_tag(&block_number).await? else { + return Ok(None); + }; + let block = self.client.evm_block(block, hydrated_transactions).await; + Ok(block) + } + + async fn get_block_transaction_count_by_hash( + &self, + block_hash: Option, + ) -> RpcResult> { + let block_hash = if let Some(block_hash) = block_hash { + block_hash + } else { + self.client.latest_block().await.hash() + }; + + let Some(substrate_hash) = self.client.resolve_substrate_hash(&block_hash).await else { + return Ok(None); + }; + + Ok(self + .client + .receipts_count_per_block(&substrate_hash) + .await + .map(U256::from)) + } + + async fn get_block_transaction_count_by_number( + &self, + block: Option, + ) -> RpcResult> { + let substrate_hash = if let Some(block) = self + .client + .block_by_number_or_tag(&block.unwrap_or_else(|| BlockTag::Latest.into())) + .await? + { + block.hash() + } else { + return Ok(None); + }; + + Ok(self + .client + .receipts_count_per_block(&substrate_hash) + .await + .map(U256::from)) + } + + async fn get_logs(&self, filter: Option) -> RpcResult { + let logs = self.client.logs(filter).await?; + Ok(FilterResults::Logs(logs)) + } + + async fn get_storage_at( + &self, + address: H160, + storage_slot: U256, + block: BlockNumberOrTagOrHash, + ) -> RpcResult { + let hash = self.client.block_hash_for_tag(block).await?; + let runtime_api = self.client.runtime_api(hash); + let bytes = runtime_api + .get_storage(address, storage_slot.to_big_endian()) + .await?; + Ok(bytes.unwrap_or_default().into()) + } + + async fn get_transaction_by_block_hash_and_index( + &self, + block_hash: H256, + transaction_index: U256, + ) -> RpcResult> { + let Some(substrate_block_hash) = self.client.resolve_substrate_hash(&block_hash).await + else { + return Ok(None); + }; + self.get_transaction_by_substrate_block_hash_and_index( + substrate_block_hash, + transaction_index, + ) + .await + } + + async fn get_transaction_by_block_number_and_index( + &self, + block: BlockNumberOrTag, + transaction_index: U256, + ) -> RpcResult> { + let Some(block) = self.client.block_by_number_or_tag(&block).await? else { + return Ok(None); + }; + self.get_transaction_by_substrate_block_hash_and_index(block.hash(), transaction_index) + .await + } + + async fn get_transaction_by_hash( + &self, + transaction_hash: H256, + ) -> RpcResult> { + let receipt = self.client.receipt(&transaction_hash).await; + let signed_tx = self.client.signed_tx_by_hash(&transaction_hash).await; + if let (Some(receipt), Some(signed_tx)) = (receipt, signed_tx) { + return Ok(Some(TransactionInfo::new(&receipt, signed_tx))); + } + + Ok(None) + } + + async fn get_transaction_count( + &self, + address: H160, + block: BlockNumberOrTagOrHash, + ) -> RpcResult { + let hash = self.client.block_hash_for_tag(block).await?; + let runtime_api = self.client.runtime_api(hash); + let nonce = runtime_api.nonce(address).await?; + Ok(nonce) + } + + async fn web3_client_version(&self) -> RpcResult { + let git_revision = env!("GIT_REVISION"); + let rustc_version = env!("RUSTC_VERSION"); + let target = env!("TARGET"); + Ok(format!("eth-rpc/{git_revision}/{target}/{rustc_version}")) + } + + async fn fee_history( + &self, + block_count: U256, + newest_block: BlockNumberOrTag, + reward_percentiles: Option>, + ) -> RpcResult { + let block_count: u32 = block_count + .try_into() + .map_err(|_| EthRpcError::ConversionError)?; + let result = self + .client + .fee_history(block_count, newest_block, reward_percentiles) + .await?; + Ok(result) + } +} + +impl EthRpcServerImpl { + async fn get_transaction_by_substrate_block_hash_and_index( + &self, + substrate_block_hash: H256, + transaction_index: U256, + ) -> RpcResult> { + let Some(receipt) = self + .client + .receipt_by_hash_and_index( + &substrate_block_hash, + transaction_index + .try_into() + .map_err(|_| EthRpcError::ConversionError)?, + ) + .await + else { + return Ok(None); + }; + let Some(signed_tx) = self + .client + .signed_tx_by_hash(&receipt.transaction_hash) + .await + else { + return Ok(None); + }; + + Ok(Some(TransactionInfo::new(&receipt, signed_tx))) + } +} diff --git a/eth-rpc/src/main.rs b/eth-rpc/src/main.rs new file mode 100644 index 0000000000..5fb9aca872 --- /dev/null +++ b/eth-rpc/src/main.rs @@ -0,0 +1,24 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! The Ethereum JSON-RPC server. +use clap::Parser; +use pallet_revive_eth_rpc::cli; + +fn main() -> anyhow::Result<()> { + let cmd = cli::CliCommand::parse(); + cli::run(cmd) +} diff --git a/eth-rpc/src/receipt_extractor.rs b/eth-rpc/src/receipt_extractor.rs new file mode 100644 index 0000000000..b3c9c71195 --- /dev/null +++ b/eth-rpc/src/receipt_extractor.rs @@ -0,0 +1,359 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use crate::{ + client::{runtime_api::RuntimeApi, SubstrateBlock, SubstrateBlockNumber}, + subxt_client::{ + revive::{ + calls::types::EthTransact, + events::{ContractEmitted, EthExtrinsicRevert}, + }, + SrcChainConfig, + }, + ClientError, H160, LOG_TARGET, +}; + +use futures::{stream, StreamExt}; +use pallet_revive::{ + create1, + evm::{GenericTransaction, Log, ReceiptGasInfo, ReceiptInfo, TransactionSigned, H256, U256}, +}; +use sp_core::keccak_256; +use std::{future::Future, pin::Pin, sync::Arc}; +use subxt::{blocks::ExtrinsicDetails, OnlineClient}; + +type FetchReceiptDataFn = Arc< + dyn Fn(H256) -> Pin>> + Send>> + Send + Sync, +>; + +type FetchEthBlockHashFn = + Arc Pin> + Send>> + Send + Sync>; + +type RecoverEthAddressFn = Arc Result + Send + Sync>; + +/// Utility to extract receipts from extrinsics. +#[derive(Clone)] +pub struct ReceiptExtractor { + /// Fetch the receipt data info. + fetch_receipt_data: FetchReceiptDataFn, + + /// Fetch ethereum block hash. + fetch_eth_block_hash: FetchEthBlockHashFn, + + /// Earliest block number to consider when searching for transaction receipts. + earliest_receipt_block: Option, + + /// Recover the ethereum address from a transaction signature. + recover_eth_address: RecoverEthAddressFn, +} + +impl ReceiptExtractor { + /// Check if the block is before the earliest block. + pub fn is_before_earliest_block(&self, block_number: SubstrateBlockNumber) -> bool { + block_number < self.earliest_receipt_block.unwrap_or_default() + } + + /// Create a new `ReceiptExtractor` with the given native to eth ratio. + pub async fn new( + api: OnlineClient, + earliest_receipt_block: Option, + ) -> Result { + Self::new_with_custom_address_recovery( + api, + earliest_receipt_block, + Arc::new(|signed_tx: &TransactionSigned| signed_tx.recover_eth_address()), + ) + .await + } + + /// Create a new `ReceiptExtractor` with the given native to eth ratio. + /// + /// Specify also a custom Ethereum address recovery logic. + /// Use `ReceiptExtractor::new` if the default Ethereum address recovery + /// logic ([`TransactionSigned::recover_eth_address`] based) is enough. + pub async fn new_with_custom_address_recovery( + api: OnlineClient, + earliest_receipt_block: Option, + recover_eth_address_fn: RecoverEthAddressFn, + ) -> Result { + let api_inner = api.clone(); + let fetch_eth_block_hash = Arc::new(move |block_hash, block_number| { + let api_inner = api_inner.clone(); + + let fut = async move { + let runtime_api = RuntimeApi::new(api_inner.runtime_api().at(block_hash)); + runtime_api + .eth_block_hash(U256::from(block_number)) + .await + .ok() + .flatten() + }; + + Box::pin(fut) as Pin> + }); + + let api_inner = api.clone(); + let fetch_receipt_data = Arc::new(move |block_hash| { + let api_inner = api_inner.clone(); + + let fut = async move { + let runtime_api = RuntimeApi::new(api_inner.runtime_api().at(block_hash)); + runtime_api.eth_receipt_data().await.ok() + }; + + Box::pin(fut) as Pin> + }); + + Ok(Self { + fetch_receipt_data, + fetch_eth_block_hash, + earliest_receipt_block, + recover_eth_address: recover_eth_address_fn, + }) + } + + #[cfg(test)] + pub fn new_mock() -> Self { + let fetch_receipt_data = Arc::new(|_| Box::pin(std::future::ready(None)) as Pin>); + // This method is useful when testing eth - substrate mapping. + let fetch_eth_block_hash = Arc::new(|block_hash: H256, block_number: u64| { + // Generate hash from substrate block hash and number + let bytes: Vec = [block_hash.as_bytes(), &block_number.to_be_bytes()].concat(); + let eth_block_hash = H256::from(keccak_256(&bytes)); + Box::pin(std::future::ready(Some(eth_block_hash))) as Pin> + }); + + Self { + fetch_receipt_data, + fetch_eth_block_hash, + earliest_receipt_block: None, + recover_eth_address: Arc::new(|signed_tx: &TransactionSigned| { + signed_tx.recover_eth_address() + }), + } + } + + /// Extract a [`TransactionSigned`] and a [`ReceiptInfo`] from an extrinsic. + async fn extract_from_extrinsic( + &self, + substrate_block: &SubstrateBlock, + eth_block_hash: H256, + ext: subxt::blocks::ExtrinsicDetails>, + call: EthTransact, + receipt_gas_info: ReceiptGasInfo, + transaction_index: usize, + ) -> Result<(TransactionSigned, ReceiptInfo), ClientError> { + let events = ext.events().await?; + let block_number: U256 = substrate_block.number().into(); + + let success = !events.has::().inspect_err(|err| { + log::debug!( + target: LOG_TARGET, + "Failed to lookup for EthExtrinsicRevert event in block {block_number}: {err:?}" + ); + })?; + + let transaction_hash = H256(keccak_256(&call.payload)); + + let signed_tx = + TransactionSigned::decode(&call.payload).map_err(|_| ClientError::TxDecodingFailed)?; + let from = (self.recover_eth_address)(&signed_tx).map_err(|_| { + log::error!(target: LOG_TARGET, "Failed to recover eth address from signed tx"); + ClientError::RecoverEthAddressFailed + })?; + + let tx_info = GenericTransaction::from_signed( + signed_tx.clone(), + receipt_gas_info.effective_gas_price, + Some(from), + ); + + // get logs from ContractEmitted event + let logs = events + .iter() + .filter_map(|event_details| { + let event_details = event_details.ok()?; + let event = event_details.as_event::().ok()??; + + Some(Log { + address: event.contract, + topics: event.topics, + data: Some(event.data.into()), + block_number, + transaction_hash, + transaction_index: transaction_index.into(), + block_hash: eth_block_hash, + log_index: event_details.index().into(), + ..Default::default() + }) + }) + .collect(); + + let contract_address = if tx_info.to.is_none() { + Some(create1( + &from, + tx_info + .nonce + .unwrap_or_default() + .try_into() + .map_err(|_| ClientError::ConversionFailed)?, + )) + } else { + None + }; + + let receipt = ReceiptInfo::new( + eth_block_hash, + block_number, + contract_address, + from, + logs, + tx_info.to, + receipt_gas_info.effective_gas_price, + U256::from(receipt_gas_info.gas_used), + success, + transaction_hash, + transaction_index.into(), + tx_info.r#type.unwrap_or_default(), + ); + Ok((signed_tx, receipt)) + } + + /// Extract receipts from block. + pub async fn extract_from_block( + &self, + block: &SubstrateBlock, + ) -> Result, ClientError> { + if self.is_before_earliest_block(block.number()) { + return Ok(vec![]); + } + + let ext_iter = self.get_block_extrinsics(block).await?; + + let substrate_block_number = block.number() as u64; + let substrate_block_hash = block.hash(); + let eth_block_hash = + (self.fetch_eth_block_hash)(substrate_block_hash, substrate_block_number) + .await + .unwrap_or(substrate_block_hash); + + // Process extrinsics in order while maintaining parallelism within buffer window + stream::iter(ext_iter) + .map(|(ext, call, receipt, ext_idx)| async move { + self.extract_from_extrinsic(block, eth_block_hash, ext, call, receipt, ext_idx) + .await + .inspect_err(|err| { + log::warn!(target: LOG_TARGET, "Error extracting extrinsic: {err:?}"); + }) + }) + .buffered(10) + .collect::>>() + .await + .into_iter() + .collect::, _>>() + } + + /// Return the ETH extrinsics of the block grouped with reconstruction receipt info and + /// extrinsic index + pub async fn get_block_extrinsics( + &self, + block: &SubstrateBlock, + ) -> Result< + impl Iterator< + Item = ( + ExtrinsicDetails>, + EthTransact, + ReceiptGasInfo, + usize, + ), + >, + ClientError, + > { + // Filter extrinsics from pallet_revive + let extrinsics = block.extrinsics().await.inspect_err(|err| { + log::debug!(target: LOG_TARGET, "Error fetching for #{:?} extrinsics: {err:?}", block.number()); + })?; + + let receipt_data = (self.fetch_receipt_data)(block.hash()) + .await + .ok_or(ClientError::ReceiptDataNotFound)?; + let extrinsics: Vec<_> = extrinsics + .iter() + .enumerate() + .flat_map(|(ext_idx, ext)| { + let call = ext.as_extrinsic::().ok()??; + Some((ext, call, ext_idx)) + }) + .collect(); + + // Sanity check we received enough data from the pallet revive. + if receipt_data.len() != extrinsics.len() { + log::error!( + target: LOG_TARGET, + "Receipt data length ({}) does not match extrinsics length ({})", + receipt_data.len(), + extrinsics.len() + ); + Err(ClientError::ReceiptDataLengthMismatch) + } else { + Ok(extrinsics + .into_iter() + .zip(receipt_data) + .map(|((extr, call, ext_idx), rec)| (extr, call, rec, ext_idx))) + } + } + + /// Extract a [`TransactionSigned`] and a [`ReceiptInfo`] for a specific transaction in a + /// [`SubstrateBlock`] + pub async fn extract_from_transaction( + &self, + block: &SubstrateBlock, + transaction_index: usize, + ) -> Result<(TransactionSigned, ReceiptInfo), ClientError> { + let ext_iter = self.get_block_extrinsics(block).await?; + + let (ext, eth_call, receipt_gas_info, _) = ext_iter + .into_iter() + .find(|(_, _, _, ext_idx)| *ext_idx == transaction_index) + .ok_or(ClientError::EthExtrinsicNotFound)?; + + let substrate_block_number = block.number() as u64; + let substrate_block_hash = block.hash(); + let eth_block_hash = + (self.fetch_eth_block_hash)(substrate_block_hash, substrate_block_number) + .await + .unwrap_or(substrate_block_hash); + + self.extract_from_extrinsic( + block, + eth_block_hash, + ext, + eth_call, + receipt_gas_info, + transaction_index, + ) + .await + } + + /// Get the Ethereum block hash for the Substrate block with specific hash. + pub async fn get_ethereum_block_hash( + &self, + block_hash: &H256, + block_number: u64, + ) -> Option { + (self.fetch_eth_block_hash)(*block_hash, block_number).await + } +} diff --git a/eth-rpc/src/receipt_provider.rs b/eth-rpc/src/receipt_provider.rs new file mode 100644 index 0000000000..e6628e9a1e --- /dev/null +++ b/eth-rpc/src/receipt_provider.rs @@ -0,0 +1,1198 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use crate::{ + client::{SubstrateBlock, SubstrateBlockNumber}, + Address, AddressOrAddresses, BlockInfoProvider, BlockNumberOrTag, BlockTag, Bytes, ClientError, + FilterTopic, ReceiptExtractor, SubxtBlockInfoProvider, +}; +use pallet_revive::evm::{Filter, Log, ReceiptInfo, TransactionSigned}; +use sp_core::{H256, U256}; +use sqlx::{query, QueryBuilder, Row, Sqlite, SqlitePool}; +use std::{ + collections::{BTreeMap, HashMap}, + sync::Arc, +}; +use tokio::sync::Mutex; + +const LOG_TARGET: &str = "eth-rpc::receipt_provider"; + +/// ReceiptProvider stores transaction receipts and logs in a SQLite database. +#[derive(Clone)] +pub struct ReceiptProvider { + /// The database pool. + pool: SqlitePool, + /// The block provider used to fetch blocks, and reconstruct receipts. + block_provider: B, + /// A means to extract receipts from extrinsics. + receipt_extractor: ReceiptExtractor, + /// When `Some`, old blocks will be pruned. + keep_latest_n_blocks: Option, + /// A Map of the latest block numbers to block hashes. + block_number_to_hashes: Arc>>, +} + +/// Substrate block to Ethereum block mapping +#[derive(Clone, Debug, PartialEq, Eq)] +struct BlockHashMap { + substrate_hash: H256, + ethereum_hash: H256, +} + +impl BlockHashMap { + fn new(substrate_hash: H256, ethereum_hash: H256) -> Self { + Self { + substrate_hash, + ethereum_hash, + } + } +} + +/// Provides information about a block, +/// This is an abstratction on top of [`SubstrateBlock`] that can't be mocked in tests. +/// Can be removed once is fixed. +pub trait BlockInfo { + /// Returns the block hash. + fn hash(&self) -> H256; + /// Returns the block number. + fn number(&self) -> SubstrateBlockNumber; +} + +impl BlockInfo for SubstrateBlock { + fn hash(&self) -> H256 { + SubstrateBlock::hash(self) + } + fn number(&self) -> SubstrateBlockNumber { + SubstrateBlock::number(self) + } +} + +impl ReceiptProvider { + /// Create a new `ReceiptProvider` with the given database URL and block provider. + pub async fn new( + pool: SqlitePool, + block_provider: B, + receipt_extractor: ReceiptExtractor, + keep_latest_n_blocks: Option, + ) -> Result { + sqlx::migrate!().run(&pool).await?; + Ok(Self { + pool, + block_provider, + receipt_extractor, + keep_latest_n_blocks, + block_number_to_hashes: Default::default(), + }) + } + + // Get block hash and transaction index by transaction hash + pub async fn find_transaction(&self, transaction_hash: &H256) -> Option<(H256, usize)> { + let transaction_hash = transaction_hash.as_ref(); + let result = query!( + r#" + SELECT block_hash, transaction_index + FROM transaction_hashes + WHERE transaction_hash = $1 + "#, + transaction_hash + ) + .fetch_optional(&self.pool) + .await + .ok()??; + + let block_hash = H256::from_slice(&result.block_hash[..]); + let transaction_index = result.transaction_index.try_into().ok()?; + Some((block_hash, transaction_index)) + } + + /// Insert a block mapping from Ethereum block hash to Substrate block hash. + async fn insert_block_mapping(&self, block_map: &BlockHashMap) -> Result<(), ClientError> { + let ethereum_hash_ref = block_map.ethereum_hash.as_ref(); + let substrate_hash_ref = block_map.substrate_hash.as_ref(); + + query!( + r#" + INSERT OR REPLACE INTO eth_to_substrate_blocks (ethereum_block_hash, substrate_block_hash) + VALUES ($1, $2) + "#, + ethereum_hash_ref, + substrate_hash_ref, + ) + .execute(&self.pool) + .await?; + + log::trace!(target: LOG_TARGET, "Insert block mapping ethereum block: {:?} -> substrate block: {:?}", block_map.ethereum_hash, block_map.substrate_hash); + Ok(()) + } + + /// Get the Substrate block hash for the given Ethereum block hash. + pub async fn get_substrate_hash(&self, ethereum_block_hash: &H256) -> Option { + let ethereum_hash = ethereum_block_hash.as_ref(); + let result = query!( + r#" + SELECT substrate_block_hash + FROM eth_to_substrate_blocks + WHERE ethereum_block_hash = $1 + "#, + ethereum_hash + ) + .fetch_optional(&self.pool) + .await + .inspect_err(|e| { + log::error!(target: LOG_TARGET, "failed to get block mapping for ethereum block {ethereum_block_hash:?}, err: {e:?}"); + }) + .ok()? + .or_else(||{ + log::trace!(target: LOG_TARGET, "No block mapping found for ethereum block: {ethereum_block_hash:?}"); + None + })?; + + log::trace!(target: LOG_TARGET, "Get block mapping ethereum block: {:?} -> substrate block: {ethereum_block_hash:?}", H256::from_slice(&result.substrate_block_hash[..])); + + Some(H256::from_slice(&result.substrate_block_hash[..])) + } + + /// Get the Ethereum block hash for the given Substrate block hash. + pub async fn get_ethereum_hash(&self, substrate_block_hash: &H256) -> Option { + let substrate_hash = substrate_block_hash.as_ref(); + let result = query!( + r#" + SELECT ethereum_block_hash + FROM eth_to_substrate_blocks + WHERE substrate_block_hash = $1 + "#, + substrate_hash + ) + .fetch_optional(&self.pool) + .await + .inspect_err(|e| { + log::error!(target: LOG_TARGET, "failed to get block mapping for substrate block {substrate_block_hash:?}, err: {e:?}"); + }) + .ok()? + .or_else(||{ + log::trace!(target: LOG_TARGET, "No block mapping found for substrate block: {substrate_block_hash:?}"); + None + })?; + + log::trace!(target: LOG_TARGET, "Get block mapping substrate block: {substrate_block_hash:?} -> ethereum block: {:?}", H256::from_slice(&result.ethereum_block_hash[..])); + + Some(H256::from_slice(&result.ethereum_block_hash[..])) + } + + /// Deletes older records from the database. + async fn remove(&self, block_mappings: &[BlockHashMap]) -> Result<(), ClientError> { + if block_mappings.is_empty() { + return Ok(()); + } + log::debug!(target: LOG_TARGET, "Removing block hashes: {block_mappings:?}"); + + let placeholders = vec!["?"; block_mappings.len()].join(", "); + let sql = format!("DELETE FROM transaction_hashes WHERE block_hash in ({placeholders})"); + + let mut delete_tx_query = sqlx::query(&sql); + let sql = format!( + "DELETE FROM eth_to_substrate_blocks WHERE substrate_block_hash in ({placeholders})" + ); + let mut delete_mappings_query = sqlx::query(&sql); + + let sql = format!("DELETE FROM logs WHERE block_hash in ({placeholders})"); + let mut delete_logs_query = sqlx::query(&sql); + + for block_map in block_mappings { + delete_tx_query = delete_tx_query.bind(block_map.substrate_hash.as_ref()); + delete_mappings_query = delete_mappings_query.bind(block_map.substrate_hash.as_ref()); + // logs table uses ethereum block hash + delete_logs_query = delete_logs_query.bind(block_map.ethereum_hash.as_ref()); + } + + let delete_transaction_hashes = delete_tx_query.execute(&self.pool); + let delete_logs = delete_logs_query.execute(&self.pool); + let delete_mappings = delete_mappings_query.execute(&self.pool); + tokio::try_join!(delete_transaction_hashes, delete_logs, delete_mappings)?; + Ok(()) + } + + /// Check if the block is before the earliest block. + pub fn is_before_earliest_block(&self, at: &BlockNumberOrTag) -> bool { + match at { + BlockNumberOrTag::U256(block_number) => self + .receipt_extractor + .is_before_earliest_block(block_number.as_u32()), + BlockNumberOrTag::BlockTag(_) => false, + } + } + + /// Fetch receipts from the given block. + pub async fn receipts_from_block( + &self, + block: &SubstrateBlock, + ) -> Result, ClientError> { + self.receipt_extractor.extract_from_block(block).await + } + + /// Extract and insert receipts from the given block. + pub async fn insert_block_receipts( + &self, + block: &SubstrateBlock, + ethereum_hash: &H256, + ) -> Result, ClientError> { + let receipts = self.receipts_from_block(block).await?; + self.insert(block, &receipts, ethereum_hash).await?; + Ok(receipts) + } + + /// Prune blocks older blocks. + async fn prune_blocks( + &self, + block_number: SubstrateBlockNumber, + block_map: &BlockHashMap, + ) -> Result<(), ClientError> { + let mut to_remove = Vec::new(); + let mut block_number_to_hash = self.block_number_to_hashes.lock().await; + + // Fork? - If inserting the same block number with a different hash, remove the old ones. + match block_number_to_hash.insert(block_number, block_map.clone()) { + Some(old_block_map) if &old_block_map != block_map => { + to_remove.push(old_block_map); + + // Now loop through the blocks that were building on top of the old fork and remove + // them. + let mut next_block_number = block_number.saturating_add(1); + while let Some(old_block_map) = block_number_to_hash.remove(&next_block_number) { + to_remove.push(old_block_map); + next_block_number = next_block_number.saturating_add(1); + } + } + _ => {} + } + + if let Some(keep_latest_n_blocks) = self.keep_latest_n_blocks { + // If we have more blocks than we should keep, remove the oldest ones by count + // (not by block number range, to handle gaps correctly) + while block_number_to_hash.len() > keep_latest_n_blocks { + // Remove the block with the smallest number (first in BTreeMap) + if let Some((_, block_map)) = block_number_to_hash.pop_first() { + to_remove.push(block_map); + } + } + } + + // Release the lock. + drop(block_number_to_hash); + + if !to_remove.is_empty() { + log::trace!(target: LOG_TARGET, "Pruning old blocks: {to_remove:?}"); + self.remove(&to_remove).await?; + } + + Ok(()) + } + + /// Insert receipts into the provider. + /// + /// Note: Can be merged into `insert_block_receipts` once is fixed and subxt let + /// us create Mock `SubstrateBlock` + async fn insert( + &self, + block: &impl BlockInfo, + receipts: &[(TransactionSigned, ReceiptInfo)], + ethereum_hash: &H256, + ) -> Result<(), ClientError> { + let substrate_block_hash = block.hash(); + let substrate_hash_ref = substrate_block_hash.as_ref(); + let block_number = block.number() as i64; + let ethereum_hash_ref = ethereum_hash.as_ref(); + let block_map = BlockHashMap::new(substrate_block_hash, *ethereum_hash); + + log::trace!(target: LOG_TARGET, "Insert receipts for substrate block #{block_number} {:?}", substrate_block_hash); + + self.prune_blocks(block.number(), &block_map).await?; + + // Check if mapping already exists (eg. added when processing best block and we are now + // processing finalized block) + let result = sqlx::query!( + r#"SELECT EXISTS(SELECT 1 FROM eth_to_substrate_blocks WHERE substrate_block_hash = $1) AS "exists!:bool""#, substrate_hash_ref + ) + .fetch_one(&self.pool) + .await?; + + // Assuming that if no mapping exists then no relevant entries in transaction_hashes and + // logs exist + if !result.exists { + for (_, receipt) in receipts { + let transaction_hash: &[u8] = receipt.transaction_hash.as_ref(); + let transaction_index = receipt.transaction_index.as_u32() as i32; + + query!( + r#" + INSERT INTO transaction_hashes (transaction_hash, block_hash, transaction_index) + VALUES ($1, $2, $3) + "#, + transaction_hash, + substrate_hash_ref, + transaction_index + ) + .execute(&self.pool) + .await?; + + for log in &receipt.logs { + let log_index = log.log_index.as_u32() as i32; + let address: &[u8] = log.address.as_ref(); + + let topic_0 = log.topics.first().as_ref().map(|v| &v[..]); + let topic_1 = log.topics.get(1).as_ref().map(|v| &v[..]); + let topic_2 = log.topics.get(2).as_ref().map(|v| &v[..]); + let topic_3 = log.topics.get(3).as_ref().map(|v| &v[..]); + let data = log.data.as_ref().map(|v| &v.0[..]); + + query!( + r#" + INSERT INTO logs( + block_hash, + transaction_index, + log_index, + address, + block_number, + transaction_hash, + topic_0, topic_1, topic_2, topic_3, + data) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) + "#, + ethereum_hash_ref, + transaction_index, + log_index, + address, + block_number, + transaction_hash, + topic_0, + topic_1, + topic_2, + topic_3, + data + ) + .execute(&self.pool) + .await?; + } + } + // Insert block mapping from Ethereum to Substrate hash + self.insert_block_mapping(&block_map).await?; + } + + Ok(()) + } + + /// Get logs that match the given filter. + pub async fn logs(&self, filter: Option) -> anyhow::Result> { + let mut qb = QueryBuilder::::new("SELECT logs.* FROM logs WHERE 1=1"); + let filter = filter.unwrap_or_default(); + + let latest_block = U256::from(self.block_provider.latest_block_number().await); + + let as_block_number = |block_param| match block_param { + None => Ok(None), + Some(BlockNumberOrTag::U256(v)) => Ok(Some(v)), + Some(BlockNumberOrTag::BlockTag(BlockTag::Latest)) => Ok(Some(latest_block)), + Some(BlockNumberOrTag::BlockTag(tag)) => anyhow::bail!("Unsupported tag: {tag:?}"), + }; + + let from_block = as_block_number(filter.from_block)?; + let to_block = as_block_number(filter.to_block)?; + + match (from_block, to_block, filter.block_hash) { + (Some(_), _, Some(_)) | (_, Some(_), Some(_)) => { + anyhow::bail!("block number and block hash cannot be used together"); + } + + (Some(block), _, _) | (_, Some(block), _) if block > latest_block => { + anyhow::bail!("block number exceeds latest block"); + } + (Some(from_block), Some(to_block), None) if from_block > to_block => { + anyhow::bail!("invalid block range params"); + } + (Some(from_block), Some(to_block), None) if from_block == to_block => { + qb.push(" AND block_number = ") + .push_bind(from_block.as_u64() as i64); + } + (Some(from_block), Some(to_block), None) => { + qb.push(" AND block_number BETWEEN ") + .push_bind(from_block.as_u64() as i64) + .push(" AND ") + .push_bind(to_block.as_u64() as i64); + } + (Some(from_block), None, None) => { + qb.push(" AND block_number >= ") + .push_bind(from_block.as_u64() as i64); + } + (None, Some(to_block), None) => { + qb.push(" AND block_number <= ") + .push_bind(to_block.as_u64() as i64); + } + (None, None, Some(hash)) => { + qb.push(" AND block_hash = ").push_bind(hash.0.to_vec()); + } + (None, None, None) => { + qb.push(" AND block_number = ") + .push_bind(latest_block.as_u64() as i64); + } + } + + if let Some(addresses) = filter.address { + match addresses { + AddressOrAddresses::Address(addr) => { + qb.push(" AND address = ").push_bind(addr.0.to_vec()); + } + AddressOrAddresses::Addresses(addrs) => { + qb.push(" AND address IN ("); + let mut separated = qb.separated(", "); + for addr in addrs { + separated.push_bind(addr.0.to_vec()); + } + separated.push_unseparated(")"); + } + } + } + + if let Some(topics) = filter.topics { + if topics.len() > 4 { + return Err(anyhow::anyhow!("exceed max topics")); + } + + for (i, topic) in topics.into_iter().enumerate() { + match topic { + FilterTopic::Single(hash) => { + qb.push(format_args!(" AND topic_{i} = ")) + .push_bind(hash.0.to_vec()); + } + FilterTopic::Multiple(hashes) => { + qb.push(format_args!(" AND topic_{i} IN (")); + let mut separated = qb.separated(", "); + for hash in hashes { + separated.push_bind(hash.0.to_vec()); + } + separated.push_unseparated(")"); + } + } + } + } + + qb.push(" LIMIT 10000"); + + let logs = qb + .build() + .try_map(|row| { + let block_hash: Vec = row.try_get("block_hash")?; + let transaction_index: i64 = row.try_get("transaction_index")?; + let log_index: i64 = row.try_get("log_index")?; + let address: Vec = row.try_get("address")?; + let block_number: i64 = row.try_get("block_number")?; + let transaction_hash: Vec = row.try_get("transaction_hash")?; + let topic_0: Option> = row.try_get("topic_0")?; + let topic_1: Option> = row.try_get("topic_1")?; + let topic_2: Option> = row.try_get("topic_2")?; + let topic_3: Option> = row.try_get("topic_3")?; + let data: Option> = row.try_get("data")?; + + let topics = [topic_0, topic_1, topic_2, topic_3] + .iter() + .filter_map(|t| t.as_ref().map(|t| H256::from_slice(t))) + .collect::>(); + + Ok(Log { + address: Address::from_slice(&address), + block_hash: H256::from_slice(&block_hash), + block_number: U256::from(block_number as u64), + data: data.map(Bytes::from), + log_index: U256::from(log_index as u64), + topics, + transaction_hash: H256::from_slice(&transaction_hash), + transaction_index: U256::from(transaction_index as u64), + removed: false, + }) + }) + .fetch_all(&self.pool) + .await?; + + Ok(logs) + } + + /// Get the number of receipts per block. + pub async fn receipts_count_per_block(&self, block_hash: &H256) -> Option { + let block_hash = block_hash.as_ref(); + let row = query!( + r#" + SELECT COUNT(*) as count + FROM transaction_hashes + WHERE block_hash = $1 + "#, + block_hash + ) + .fetch_one(&self.pool) + .await + .ok()?; + + let count = row.count as usize; + Some(count) + } + + /// Return all transaction hashes for the given block hash. + pub async fn block_transaction_hashes( + &self, + block_hash: &H256, + ) -> Option> { + let block_hash = block_hash.as_ref(); + let rows = query!( + r#" + SELECT transaction_index, transaction_hash + FROM transaction_hashes + WHERE block_hash = $1 + "#, + block_hash + ) + .map(|row| { + let transaction_index = row.transaction_index as usize; + let transaction_hash = H256::from_slice(&row.transaction_hash); + (transaction_index, transaction_hash) + }) + .fetch_all(&self.pool) + .await + .ok()?; + + Some(rows.into_iter().collect()) + } + + /// Get the receipt for the given block hash and transaction index. + pub async fn receipt_by_block_hash_and_index( + &self, + block_hash: &H256, + transaction_index: usize, + ) -> Option { + let block = self.block_provider.block_by_hash(block_hash).await.ok()??; + let (_, receipt) = self + .receipt_extractor + .extract_from_transaction(&block, transaction_index) + .await + .ok()?; + Some(receipt) + } + + /// Get the receipt for the given transaction hash. + pub async fn receipt_by_hash(&self, transaction_hash: &H256) -> Option { + let (block_hash, transaction_index) = self.find_transaction(transaction_hash).await?; + + let block = self + .block_provider + .block_by_hash(&block_hash) + .await + .ok()??; + let (_, receipt) = self + .receipt_extractor + .extract_from_transaction(&block, transaction_index) + .await + .ok()?; + Some(receipt) + } + + /// Get the signed transaction for the given transaction hash. + pub async fn signed_tx_by_hash(&self, transaction_hash: &H256) -> Option { + let (block_hash, transaction_index) = self.find_transaction(transaction_hash).await?; + + let block = self + .block_provider + .block_by_hash(&block_hash) + .await + .ok()??; + let (signed_tx, _) = self + .receipt_extractor + .extract_from_transaction(&block, transaction_index) + .await + .ok()?; + Some(signed_tx) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::test::{MockBlockInfo, MockBlockInfoProvider}; + use pallet_revive::evm::{ReceiptInfo, TransactionSigned}; + use pretty_assertions::assert_eq; + use sp_core::{H160, H256}; + use sqlx::SqlitePool; + + async fn count(pool: &SqlitePool, table: &str, block_hash: Option) -> usize { + let count: i64 = match block_hash { + None => { + sqlx::query_scalar(&format!("SELECT COUNT(*) FROM {table}")) + .fetch_one(pool) + .await + } + Some(hash) => { + sqlx::query_scalar(&format!( + "SELECT COUNT(*) FROM {table} WHERE block_hash = ?" + )) + .bind(hash.as_ref()) + .fetch_one(pool) + .await + } + } + .unwrap(); + + count as _ + } + + async fn setup_sqlite_provider(pool: SqlitePool) -> ReceiptProvider { + ReceiptProvider { + pool, + block_provider: MockBlockInfoProvider {}, + receipt_extractor: ReceiptExtractor::new_mock(), + keep_latest_n_blocks: Some(10), + block_number_to_hashes: Default::default(), + } + } + + #[sqlx::test] + async fn test_insert_remove(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + let block = MockBlockInfo { + hash: H256::default(), + number: 0, + }; + let receipts = vec![( + TransactionSigned::default(), + ReceiptInfo { + logs: vec![Log { + block_hash: block.hash, + ..Default::default() + }], + ..Default::default() + }, + )]; + let ethereum_hash = H256::from([1_u8; 32]); + let block_map = BlockHashMap::new(block.hash(), ethereum_hash); + + provider.insert(&block, &receipts, ðereum_hash).await?; + let row = provider + .find_transaction(&receipts[0].1.transaction_hash) + .await; + assert_eq!(row, Some((block.hash, 0))); + + provider.remove(&[block_map]).await?; + assert_eq!( + count(&provider.pool, "transaction_hashes", Some(block.hash())).await, + 0 + ); + assert_eq!(count(&provider.pool, "logs", Some(block.hash())).await, 0); + Ok(()) + } + + #[sqlx::test] + async fn test_prune(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + let n = provider.keep_latest_n_blocks.unwrap(); + + for i in 0..2 * n { + let block = MockBlockInfo { + hash: H256::from([i as u8; 32]), + number: i as _, + }; + let transaction_hash = H256::from([i as u8; 32]); + let receipts = vec![( + TransactionSigned::default(), + ReceiptInfo { + transaction_hash, + logs: vec![Log { + block_hash: block.hash, + transaction_hash, + ..Default::default() + }], + ..Default::default() + }, + )]; + let ethereum_hash = H256::from([(i + 1) as u8; 32]); + provider.insert(&block, &receipts, ðereum_hash).await?; + } + assert_eq!(count(&provider.pool, "transaction_hashes", None).await, n); + assert_eq!(count(&provider.pool, "logs", None).await, n); + assert_eq!( + count(&provider.pool, "eth_to_substrate_blocks", None).await, + n + ); + assert_eq!(provider.block_number_to_hashes.lock().await.len(), n); + + return Ok(()); + } + + #[sqlx::test] + async fn test_fork(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + + let build_block = |seed, number| { + let block = MockBlockInfo { + hash: H256::from([seed; 32]), + number, + }; + let transaction_hash = H256::from([seed; 32]); + let receipts = vec![( + TransactionSigned::default(), + ReceiptInfo { + transaction_hash, + logs: vec![Log { + block_hash: block.hash, + transaction_hash, + ..Default::default() + }], + ..Default::default() + }, + )]; + let ethereum_hash = H256::from([seed + 1; 32]); + + (block, receipts, ethereum_hash) + }; + + // Build 4 blocks on consecutive heights: 0,1,2,3. + let (block0, receipts, ethereum_hash_0) = build_block(0, 0); + provider + .insert(&block0, &receipts, ðereum_hash_0) + .await?; + let (block1, receipts, ethereum_hash_1) = build_block(1, 1); + provider + .insert(&block1, &receipts, ðereum_hash_1) + .await?; + let (block2, receipts, ethereum_hash_2) = build_block(2, 2); + provider + .insert(&block2, &receipts, ðereum_hash_2) + .await?; + let (block3, receipts, ethereum_hash_3) = build_block(3, 3); + provider + .insert(&block3, &receipts, ðereum_hash_3) + .await?; + + assert_eq!(count(&provider.pool, "transaction_hashes", None).await, 4); + assert_eq!(count(&provider.pool, "logs", None).await, 4); + assert_eq!( + count(&provider.pool, "eth_to_substrate_blocks", None).await, + 4 + ); + assert_eq!( + provider.block_number_to_hashes.lock().await.clone(), + [ + (0, BlockHashMap::new(block0.hash, ethereum_hash_0)), + (1, BlockHashMap::new(block1.hash, ethereum_hash_1)), + (2, BlockHashMap::new(block2.hash, ethereum_hash_2)), + (3, BlockHashMap::new(block3.hash, ethereum_hash_3)) + ] + .into(), + ); + + // Now build another block on height 1. + let (fork_block, receipts, ethereum_hash_fork) = build_block(4, 1); + provider + .insert(&fork_block, &receipts, ðereum_hash_fork) + .await?; + + assert_eq!(count(&provider.pool, "transaction_hashes", None).await, 2); + assert_eq!(count(&provider.pool, "logs", None).await, 2); + assert_eq!( + count(&provider.pool, "eth_to_substrate_blocks", None).await, + 2 + ); + + assert_eq!( + provider.block_number_to_hashes.lock().await.clone(), + [ + (0, BlockHashMap::new(block0.hash, ethereum_hash_0)), + (1, BlockHashMap::new(fork_block.hash, ethereum_hash_fork)) + ] + .into(), + ); + + return Ok(()); + } + + #[sqlx::test] + async fn test_receipts_count_per_block(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + let block = MockBlockInfo { + hash: H256::default(), + number: 0, + }; + let receipts = vec![ + ( + TransactionSigned::default(), + ReceiptInfo { + transaction_hash: H256::from([0u8; 32]), + ..Default::default() + }, + ), + ( + TransactionSigned::default(), + ReceiptInfo { + transaction_hash: H256::from([1u8; 32]), + ..Default::default() + }, + ), + ]; + let ethereum_hash = H256::from([2u8; 32]); + + provider.insert(&block, &receipts, ðereum_hash).await?; + let count = provider.receipts_count_per_block(&block.hash).await; + assert_eq!(count, Some(2)); + Ok(()) + } + + #[sqlx::test] + async fn test_query_logs(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + let block1 = MockBlockInfo { + hash: H256::from([1u8; 32]), + number: 1, + }; + let block2 = MockBlockInfo { + hash: H256::from([2u8; 32]), + number: 2, + }; + let ethereum_hash1 = H256::from([3u8; 32]); + let ethereum_hash2 = H256::from([4u8; 32]); + let log1 = Log { + block_hash: ethereum_hash1, + block_number: block1.number.into(), + address: H160::from([1u8; 20]), + topics: vec![H256::from([1u8; 32]), H256::from([2u8; 32])], + data: Some(vec![0u8; 32].into()), + transaction_hash: H256::default(), + transaction_index: U256::from(1), + log_index: U256::from(1), + ..Default::default() + }; + let log2 = Log { + block_hash: ethereum_hash2, + block_number: block2.number.into(), + address: H160::from([2u8; 20]), + topics: vec![H256::from([2u8; 32]), H256::from([3u8; 32])], + transaction_hash: H256::from([1u8; 32]), + transaction_index: U256::from(2), + log_index: U256::from(1), + ..Default::default() + }; + + provider + .insert( + &block1, + &vec![( + TransactionSigned::default(), + ReceiptInfo { + logs: vec![log1.clone()], + transaction_hash: log1.transaction_hash, + transaction_index: log1.transaction_index, + ..Default::default() + }, + )], + ðereum_hash1, + ) + .await?; + provider + .insert( + &block2, + &vec![( + TransactionSigned::default(), + ReceiptInfo { + logs: vec![log2.clone()], + transaction_hash: log2.transaction_hash, + transaction_index: log2.transaction_index, + ..Default::default() + }, + )], + ðereum_hash2, + ) + .await?; + + // Empty filter + let logs = provider.logs(None).await?; + assert_eq!(logs, vec![log2.clone()]); + + // from_block filter + let logs = provider + .logs(Some(Filter { + from_block: Some(log2.block_number.into()), + ..Default::default() + })) + .await?; + assert_eq!(logs, vec![log2.clone()]); + + // from_block filter (using latest block) + let logs = provider + .logs(Some(Filter { + from_block: Some(BlockTag::Latest.into()), + ..Default::default() + })) + .await?; + assert_eq!(logs, vec![log2.clone()]); + + // to_block filter + let logs = provider + .logs(Some(Filter { + to_block: Some(log1.block_number.into()), + ..Default::default() + })) + .await?; + assert_eq!(logs, vec![log1.clone()]); + + // block_hash filter + let logs = provider + .logs(Some(Filter { + block_hash: Some(log1.block_hash), + ..Default::default() + })) + .await?; + assert_eq!(logs, vec![log1.clone()]); + + // single address + let logs = provider + .logs(Some(Filter { + from_block: Some(U256::from(0).into()), + address: Some(log1.address.into()), + ..Default::default() + })) + .await?; + assert_eq!(logs, vec![log1.clone()]); + + // multiple addresses + let logs = provider + .logs(Some(Filter { + from_block: Some(U256::from(0).into()), + address: Some(vec![log1.address, log2.address].into()), + ..Default::default() + })) + .await?; + assert_eq!(logs, vec![log1.clone(), log2.clone()]); + + // single topic + let logs = provider + .logs(Some(Filter { + from_block: Some(U256::from(0).into()), + topics: Some(vec![FilterTopic::Single(log1.topics[0])]), + ..Default::default() + })) + .await?; + assert_eq!(logs, vec![log1.clone()]); + + // multiple topic + let logs = provider + .logs(Some(Filter { + from_block: Some(U256::from(0).into()), + topics: Some(vec![ + FilterTopic::Single(log1.topics[0]), + FilterTopic::Single(log1.topics[1]), + ]), + ..Default::default() + })) + .await?; + assert_eq!(logs, vec![log1.clone()]); + + // multiple topic for topic_0 + let logs = provider + .logs(Some(Filter { + from_block: Some(U256::from(0).into()), + topics: Some(vec![FilterTopic::Multiple(vec![ + log1.topics[0], + log2.topics[0], + ])]), + ..Default::default() + })) + .await?; + assert_eq!(logs, vec![log1.clone(), log2.clone()]); + + // Altogether + let logs = provider + .logs(Some(Filter { + from_block: Some(log1.block_number.into()), + to_block: Some(log2.block_number.into()), + block_hash: None, + address: Some(vec![log1.address, log2.address].into()), + topics: Some(vec![FilterTopic::Multiple(vec![ + log1.topics[0], + log2.topics[0], + ])]), + })) + .await?; + assert_eq!(logs, vec![log1.clone(), log2.clone()]); + Ok(()) + } + + #[sqlx::test] + async fn test_block_mapping_insert_get(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + let ethereum_hash = H256::from([1u8; 32]); + let substrate_hash = H256::from([2u8; 32]); + let block_map = BlockHashMap::new(substrate_hash, ethereum_hash); + + // Insert mapping + provider.insert_block_mapping(&block_map).await?; + + // Test forward lookup + let resolved = provider.get_substrate_hash(ðereum_hash).await; + assert_eq!(resolved, Some(substrate_hash)); + + // Test reverse lookup + let resolved = provider.get_ethereum_hash(&substrate_hash).await; + assert_eq!(resolved, Some(ethereum_hash)); + + Ok(()) + } + + #[sqlx::test] + async fn test_block_mapping_remove(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + let ethereum_hash1 = H256::from([1u8; 32]); + let ethereum_hash2 = H256::from([2u8; 32]); + let substrate_hash1 = H256::from([3u8; 32]); + let substrate_hash2 = H256::from([4u8; 32]); + let block_map1 = BlockHashMap::new(substrate_hash1, ethereum_hash1); + let block_map2 = BlockHashMap::new(substrate_hash2, ethereum_hash2); + + // Insert mappings + provider.insert_block_mapping(&block_map1).await?; + provider.insert_block_mapping(&block_map2).await?; + + // Verify they exist + assert_eq!( + provider.get_substrate_hash(&block_map1.ethereum_hash).await, + Some(block_map1.substrate_hash) + ); + assert_eq!( + provider.get_substrate_hash(&block_map2.ethereum_hash).await, + Some(block_map2.substrate_hash) + ); + + // Remove one mapping + provider.remove(&[block_map1]).await?; + + // Verify removal + assert_eq!(provider.get_substrate_hash(ðereum_hash1).await, None); + assert_eq!( + provider.get_substrate_hash(ðereum_hash2).await, + Some(substrate_hash2) + ); + + Ok(()) + } + + #[sqlx::test] + async fn test_block_mapping_pruning_integration(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + let ethereum_hash = H256::from([1u8; 32]); + let substrate_hash = H256::from([2u8; 32]); + let block_map = BlockHashMap::new(substrate_hash, ethereum_hash); + + // Insert mapping + provider.insert_block_mapping(&block_map).await?; + assert_eq!( + provider.get_substrate_hash(&block_map.ethereum_hash).await, + Some(block_map.substrate_hash) + ); + + // Remove substrate block (this should also remove the mapping) + provider.remove(&[block_map.clone()]).await?; + + // Mapping should be gone + assert_eq!( + provider.get_substrate_hash(&block_map.ethereum_hash).await, + None + ); + + Ok(()) + } + + #[sqlx::test] + async fn test_logs_with_ethereum_block_hash_mapping(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + let ethereum_hash = H256::from([1u8; 32]); + let substrate_hash = H256::from([2u8; 32]); + let block_number = 1u64; + + // Create a log with ethereum hash + let log = Log { + block_hash: ethereum_hash, + block_number: block_number.into(), + address: H160::from([1u8; 20]), + topics: vec![H256::from([1u8; 32])], + transaction_hash: H256::from([3u8; 32]), + transaction_index: U256::from(0), + log_index: U256::from(0), + data: Some(vec![0u8; 32].into()), + ..Default::default() + }; + + // Insert the log + let block = MockBlockInfo { + hash: substrate_hash, + number: block_number as u32, + }; + let receipts = vec![( + TransactionSigned::default(), + ReceiptInfo { + logs: vec![log.clone()], + transaction_hash: log.transaction_hash, + transaction_index: log.transaction_index, + ..Default::default() + }, + )]; + provider.insert(&block, &receipts, ðereum_hash).await?; + + // Query logs using Ethereum block hash (should resolve to substrate hash) + let logs = provider + .logs(Some(Filter { + block_hash: Some(ethereum_hash), + ..Default::default() + })) + .await?; + assert_eq!(logs, vec![log]); + + Ok(()) + } + + #[sqlx::test] + async fn test_mapping_count(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + + // Initially no mappings + assert_eq!( + count(&provider.pool, "eth_to_substrate_blocks", None).await, + 0 + ); + + let block_map1 = BlockHashMap::new(H256::from([1u8; 32]), H256::from([2u8; 32])); + let block_map2 = BlockHashMap::new(H256::from([3u8; 32]), H256::from([4u8; 32])); + + // Insert some mappings + provider.insert_block_mapping(&block_map1).await?; + provider.insert_block_mapping(&block_map2).await?; + + assert_eq!( + count(&provider.pool, "eth_to_substrate_blocks", None).await, + 2 + ); + + // Remove one + provider.remove(&[block_map1]).await?; + assert_eq!( + count(&provider.pool, "eth_to_substrate_blocks", None).await, + 1 + ); + + Ok(()) + } +} diff --git a/eth-rpc/src/subxt_client.rs b/eth-rpc/src/subxt_client.rs new file mode 100644 index 0000000000..bd9666aba8 --- /dev/null +++ b/eth-rpc/src/subxt_client.rs @@ -0,0 +1,81 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! The generated subxt client. +//! Generated against a substrate chain configured with [`pallet_revive`] using: +//! subxt metadata --url ws://localhost:9944 -o rpc/revive_chain.scale +pub use subxt::config::PolkadotConfig as SrcChainConfig; + +#[subxt::subxt( + runtime_metadata_path = "revive_chain.scale", + // TODO remove once subxt use the same U256 type + substitute_type( + path = "primitive_types::U256", + with = "::subxt::utils::Static<::sp_core::U256>" + ), + + substitute_type( + path = "sp_runtime::generic::block::Block", + with = "::subxt::utils::Static<::sp_runtime::generic::Block< + ::sp_runtime::generic::Header, + ::sp_runtime::OpaqueExtrinsic + >>" + ), + substitute_type( + path = "pallet_revive::evm::api::debug_rpc_types::Trace", + with = "::subxt::utils::Static<::pallet_revive::evm::Trace>" + ), + substitute_type( + path = "pallet_revive::evm::api::debug_rpc_types::TracerType", + with = "::subxt::utils::Static<::pallet_revive::evm::TracerType>" + ), + + substitute_type( + path = "pallet_revive::evm::api::rpc_types_gen::GenericTransaction", + with = "::subxt::utils::Static<::pallet_revive::evm::GenericTransaction>" + ), + substitute_type( + path = "pallet_revive::evm::api::rpc_types::DryRunConfig", + with = "::subxt::utils::Static<::pallet_revive::evm::DryRunConfig>" + ), + substitute_type( + path = "pallet_revive::primitives::EthTransactInfo", + with = "::subxt::utils::Static<::pallet_revive::EthTransactInfo>" + ), + substitute_type( + path = "pallet_revive::primitives::EthTransactError", + with = "::subxt::utils::Static<::pallet_revive::EthTransactError>" + ), + substitute_type( + path = "pallet_revive::primitives::ExecReturnValue", + with = "::subxt::utils::Static<::pallet_revive::ExecReturnValue>" + ), + substitute_type( + path = "sp_weights::weight_v2::Weight", + with = "::subxt::utils::Static<::sp_weights::Weight>" + ), + substitute_type( + path = "pallet_revive::evm::api::rpc_types_gen::Block", + with = "::subxt::utils::Static<::pallet_revive::evm::Block>" + ), + substitute_type( + path = "pallet_revive::evm::block_hash::ReceiptGasInfo", + with = "::subxt::utils::Static<::pallet_revive::evm::ReceiptGasInfo>" + ), + derive_for_all_types = "codec::Encode, codec::Decode" +)] +mod src_chain {} +pub use src_chain::*; diff --git a/eth-rpc/src/tests.rs b/eth-rpc/src/tests.rs new file mode 100644 index 0000000000..5dc9cb7035 --- /dev/null +++ b/eth-rpc/src/tests.rs @@ -0,0 +1,892 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Test the eth-rpc cli with the kitchensink node. +//! This only includes basic transaction tests, most of the other tests are in the +//! [evm-test-suite](https://github.com/paritytech/evm-test-suite) repository. + +use crate::{ + cli::{self, CliCommand}, + client, + example::TransactionBuilder, + subxt_client::{ + self, src_chain::runtime_types::pallet_revive::primitives::Code, SrcChainConfig, + }, + EthRpcClient, +}; +use anyhow::anyhow; +use clap::Parser; +use jsonrpsee::ws_client::{WsClient, WsClientBuilder}; +use pallet_revive::{ + create1, + evm::{ + Account, Block, BlockNumberOrTag, BlockNumberOrTagOrHash, BlockTag, + HashesOrTransactionInfos, TransactionInfo, H256, U256, + }, +}; +use std::{sync::Arc, thread}; +use subxt::{ + backend::rpc::RpcClient, + ext::subxt_rpcs::rpc_params, + tx::{SubmittableTransaction, TxStatus}, + OnlineClient, +}; + +const LOG_TARGET: &str = "eth-rpc-tests"; + +/// Create a websocket client with a 120s timeout. +async fn ws_client_with_retry(url: &str) -> WsClient { + let timeout = tokio::time::Duration::from_secs(120); + tokio::time::timeout(timeout, async { + loop { + if let Ok(client) = WsClientBuilder::default().build(url).await { + return client; + } else { + tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; + } + } + }) + .await + .expect("Hit timeout") +} + +struct SharedResources { + _node_handle: std::thread::JoinHandle<()>, + _rpc_handle: std::thread::JoinHandle<()>, +} + +impl SharedResources { + fn start() -> Self { + // Start revive-dev-node + let _node_handle = thread::spawn(move || { + if let Err(e) = polymesh::command::run_with_args(vec![ + "--dev".to_string(), + "--rpc-port=45789".to_string(), + "-lerror,sc_rpc_server=info,runtime::revive=debug".to_string(), + ]) { + panic!("Node exited with error: {e:?}"); + } + }); + + // Start the rpc server. + let args = CliCommand::parse_from([ + "--dev", + "--rpc-port=45788", + "--node-rpc-url=ws://localhost:45789", + "--no-prometheus", + "-linfo,eth-rpc=debug", + ]); + + let _rpc_handle = thread::spawn(move || { + if let Err(e) = cli::run(args) { + panic!("eth-rpc exited with error: {e:?}"); + } + }); + + Self { + _node_handle, + _rpc_handle, + } + } + + async fn client() -> WsClient { + ws_client_with_retry("ws://localhost:45788").await + } + + fn node_rpc_url() -> &'static str { + "ws://localhost:45789" + } +} + +macro_rules! unwrap_call_err( + ($err:expr) => { + match $err.downcast_ref::().unwrap() { + jsonrpsee::core::client::Error::Call(call) => call, + _ => panic!("Expected Call error"), + } + } +); + +// Helper functions +/// Prepare multiple EVM transfer transactions with nonce in descending order +async fn prepare_evm_transactions( + client: &Arc, + signer: Account, + recipient: pallet_revive::evm::Address, + amount: U256, + count: usize, +) -> anyhow::Result>> { + let start_nonce = client + .get_transaction_count(signer.address(), BlockTag::Latest.into()) + .await?; + + let mut transactions = Vec::new(); + for i in (0..count).rev() { + let nonce = start_nonce.saturating_add(U256::from(i as u64)); + let tx_builder = TransactionBuilder::new(client) + .signer(signer.clone()) + .nonce(nonce) + .value(amount) + .to(recipient); + + transactions.push(tx_builder); + log::trace!(target: LOG_TARGET, "Prepared EVM transaction {}/{count} with nonce: {nonce:?}", i + 1); + } + + Ok(transactions) +} + +/// Prepare multiple Substrate transfer transactions with sequential nonces +async fn prepare_substrate_transactions( + node_client: &OnlineClient, + signer: &subxt_signer::sr25519::Keypair, + count: usize, +) -> anyhow::Result>>> { + let mut nonce = node_client + .tx() + .account_nonce(&signer.public_key().into()) + .await?; + let mut substrate_txs = Vec::new(); + for i in 0..count { + let remark_data = format!("Hello from test {}", i); + let call = subxt::dynamic::tx( + "System", + "remark", + vec![subxt::dynamic::Value::from_bytes(remark_data.as_bytes())], + ); + + let params = subxt::config::polkadot::PolkadotExtrinsicParamsBuilder::new() + .nonce(nonce) + .build(); + + let tx = node_client + .tx() + .create_signed(&call, signer, params) + .await?; + substrate_txs.push(tx); + log::trace!(target: LOG_TARGET, "Prepared substrate transaction {i}/{count} with nonce: {nonce}"); + nonce += 1 as u64; + } + Ok(substrate_txs) +} + +/// Submit multiple transactions and return them without waiting for receipts +async fn submit_evm_transactions( + transactions: Vec>, +) -> anyhow::Result< + Vec<( + H256, + pallet_revive::evm::GenericTransaction, + crate::example::SubmittedTransaction, + )>, +> { + let mut submitted_txs = Vec::new(); + + for tx_builder in transactions { + let tx = tx_builder.send().await?; + let hash = tx.hash(); + let generic_tx = tx.generic_transaction(); + submitted_txs.push((hash, generic_tx, tx)); + } + + Ok(submitted_txs) +} + +/// Submit substrate transactions and return futures for waiting +async fn submit_substrate_transactions( + substrate_txs: Vec>>, +) -> Vec>> { + let mut futures = Vec::new(); + + for (i, tx) in substrate_txs.into_iter().enumerate() { + let fut = async move { + match tx.submit_and_watch().await { + Ok(mut progress) => { + log::trace!(target: LOG_TARGET, "Substrate tx {i} submitted"); + while let Some(status) = progress.next().await { + match status { + Ok(TxStatus::InFinalizedBlock(block)) + | Ok(TxStatus::InBestBlock(block)) => { + log::trace!(target: LOG_TARGET, + "Substrate tx {i} included in block {:?}", + block.block_hash() + ); + return Ok(()); + } + Err(e) => return Err(anyhow::anyhow!("Substrate tx {i} error: {e}")), + Ok(status) => { + log::trace!(target: LOG_TARGET, "Substrate tx {i} status {:?}", status); + } + } + } + Err(anyhow::anyhow!( + "Failed to get status of submitted substrate tx {i}, assuming error" + )) + } + Err(e) => Err(anyhow::anyhow!("Failed to submit substrate tx {i}: {e}")), + } + }; + futures.push(fut); + } + + futures +} + +/// Verify all given transaction hashes are in the specified block and accessible via RPC +async fn verify_transactions_in_single_block( + client: &Arc, + block_number: U256, + expected_tx_hashes: &[H256], +) -> anyhow::Result<()> { + // Fetch the block + let block = client + .get_block_by_number(BlockNumberOrTag::U256(block_number), false) + .await? + .ok_or_else(|| anyhow!("Block {block_number} should exist"))?; + + let block_tx_hashes = match &block.transactions { + HashesOrTransactionInfos::Hashes(hashes) => hashes.clone(), + HashesOrTransactionInfos::TransactionInfos(infos) => { + infos.iter().map(|info| info.hash).collect() + } + }; + + if let Some(missing_hash) = expected_tx_hashes + .iter() + .find(|hash| !block_tx_hashes.contains(hash)) + { + return Err(anyhow!( + "Transaction {missing_hash:?} not found in block {block_number}" + )); + } + + Ok(()) +} + +#[tokio::test] +async fn run_all_eth_rpc_tests() -> anyhow::Result<()> { + // start node and rpc server + let _shared = SharedResources::start(); + let client = Arc::new(SharedResources::client().await); + + macro_rules! run_tests { + ($($test:ident),+ $(,)?) => { + $( + { + let test_name = stringify!($test); + log::debug!(target: LOG_TARGET, "Running test: {}", test_name); + match $test(client.clone()).await { + Ok(()) => log::debug!(target: LOG_TARGET, "Test passed: {}", test_name), + Err(err) => panic!("Test {} failed: {err:?}", test_name), + } + } + )+ + }; + } + + run_tests!( + test_transfer, + test_deploy_and_call, + test_runtime_api_dry_run_addr_works, + test_invalid_transaction, + test_evm_blocks_should_match, + test_evm_blocks_hydrated_should_match, + test_block_hash_for_tag_with_proper_ethereum_block_hash_works, + test_block_hash_for_tag_with_invalid_ethereum_block_hash_fails, + test_block_hash_for_tag_with_block_number_works, + test_block_hash_for_tag_with_block_tags_works, + test_multiple_transactions_in_block, + test_mixed_evm_substrate_transactions, + test_runtime_pallets_address_upload_code, + ); + + log::debug!(target: LOG_TARGET, "All tests completed successfully!"); + Ok(()) +} + +async fn test_transfer(client: Arc) -> anyhow::Result<()> { + let ethan = Account::from(subxt_signer::eth::dev::ethan()); + let initial_balance = client + .get_balance(ethan.address(), BlockTag::Latest.into()) + .await?; + + let value = 1_000_000_000_000_000_000_000u128.into(); + let tx = TransactionBuilder::new(&client) + .value(value) + .to(ethan.address()) + .send() + .await?; + + let receipt = tx.wait_for_receipt().await?; + assert_eq!( + Some(ethan.address()), + receipt.to, + "Receipt should have the correct contract address." + ); + + let balance = client + .get_balance(ethan.address(), BlockTag::Latest.into()) + .await?; + assert_eq!( + Some(value), + balance.checked_sub(initial_balance), + "Ethan {:?} {balance:?} should have increased by {value:?} from {initial_balance}.", + ethan.address() + ); + Ok(()) +} + +async fn test_deploy_and_call(client: Arc) -> anyhow::Result<()> { + let account = Account::default(); + + // Balance transfer + let ethan = Account::from(subxt_signer::eth::dev::ethan()); + let initial_balance = client + .get_balance(ethan.address(), BlockTag::Latest.into()) + .await?; + let value = 1_000_000_000_000_000_000_000u128.into(); + let tx = TransactionBuilder::new(&client) + .value(value) + .to(ethan.address()) + .send() + .await?; + + let receipt = tx.wait_for_receipt().await?; + assert_eq!( + Some(ethan.address()), + receipt.to, + "Receipt should have the correct contract address." + ); + + let balance = client + .get_balance(ethan.address(), BlockTag::Latest.into()) + .await?; + assert_eq!( + Some(value), + balance.checked_sub(initial_balance), + "Ethan {:?} {balance:?} should have increased by {value:?} from {initial_balance}.", + ethan.address() + ); + + // Deploy contract + let data = b"hello world".to_vec(); + let value = U256::from(5_000_000_000_000u128); + let (bytes, _) = pallet_revive_fixtures::compile_module("dummy")?; + let input = bytes.into_iter().chain(data.clone()).collect::>(); + let nonce = client + .get_transaction_count(account.address(), BlockTag::Latest.into()) + .await?; + let tx = TransactionBuilder::new(&client) + .value(value) + .input(input) + .send() + .await?; + let receipt = tx.wait_for_receipt().await?; + let contract_address = create1(&account.address(), nonce.try_into().unwrap()); + assert_eq!( + Some(contract_address), + receipt.contract_address, + "Contract should be deployed at {contract_address:?}." + ); + + let nonce_after_deploy = client + .get_transaction_count(account.address(), BlockTag::Latest.into()) + .await?; + + assert_eq!( + nonce_after_deploy - nonce, + U256::from(1), + "Nonce should have increased by 1" + ); + + let initial_balance = client + .get_balance(contract_address, BlockTag::Latest.into()) + .await?; + assert_eq!( + value, initial_balance, + "Contract {contract_address:?} balance should be the same as the value sent ({value})." + ); + + // Call contract + let tx = TransactionBuilder::new(&client) + .value(value) + .to(contract_address) + .send() + .await?; + let receipt = tx.wait_for_receipt().await?; + + assert_eq!( + Some(contract_address), + receipt.to, + "Receipt should have the correct contract address {contract_address:?}." + ); + + let balance = client + .get_balance(contract_address, BlockTag::Latest.into()) + .await?; + assert_eq!(Some(value), balance.checked_sub(initial_balance), "Contract {contract_address:?} Balance {balance} should have increased from {initial_balance} by {value}."); + + // Balance transfer to contract + let initial_balance = client + .get_balance(contract_address, BlockTag::Latest.into()) + .await?; + let tx = TransactionBuilder::new(&client) + .value(value) + .to(contract_address) + .send() + .await?; + + tx.wait_for_receipt().await?; + + let balance = client + .get_balance(contract_address, BlockTag::Latest.into()) + .await?; + + assert_eq!( + Some(value), + balance.checked_sub(initial_balance), + "Balance {balance} should have increased from {initial_balance} by {value}." + ); + Ok(()) +} + +async fn test_runtime_api_dry_run_addr_works(client: Arc) -> anyhow::Result<()> { + let account = Account::default(); + let origin: [u8; 32] = account.substrate_account().into(); + let data = b"hello world".to_vec(); + let value = 5_000_000_000_000u128; + let (bytes, _) = pallet_revive_fixtures::compile_module("dummy")?; + + let payload = subxt_client::apis().revive_api().instantiate( + subxt::utils::AccountId32(origin), + value, + None, + None, + Code::Upload(bytes), + data, + None, + ); + + // runtime_api.at_latest() uses the latest finalized block, query nonce accordingly + let nonce = client + .get_transaction_count(account.address(), BlockTag::Finalized.into()) + .await?; + let contract_address = create1(&account.address(), nonce.try_into().unwrap()); + + let c = OnlineClient::::from_url("ws://localhost:45789").await?; + let res = c + .runtime_api() + .at_latest() + .await? + .call(payload) + .await? + .result + .unwrap(); + + assert_eq!(res.addr, contract_address); + Ok(()) +} + +async fn test_invalid_transaction(client: Arc) -> anyhow::Result<()> { + let ethan = Account::from(subxt_signer::eth::dev::ethan()); + + let err = TransactionBuilder::new(&client) + .value(U256::from(1_000_000_000_000u128)) + .to(ethan.address()) + .mutate(|tx| tx.chain_id = Some(42u32.into())) + .send() + .await + .unwrap_err(); + + let call_err = unwrap_call_err!(err.source().unwrap()); + assert_eq!(call_err.message(), "Invalid Transaction"); + + Ok(()) +} + +async fn get_evm_block_from_storage( + node_client: &OnlineClient, + node_rpc_client: &RpcClient, + block_number: U256, +) -> anyhow::Result { + let block_hash: H256 = node_rpc_client + .request("chain_getBlockHash", rpc_params![block_number]) + .await + .unwrap(); + + let query = subxt_client::storage().revive().ethereum_block(); + let Some(block) = node_client + .storage() + .at(block_hash) + .fetch(&query) + .await + .unwrap() + else { + return Err(anyhow!("EVM block {block_hash:?} not found")); + }; + Ok(block.0) +} + +async fn test_evm_blocks_should_match(client: Arc) -> anyhow::Result<()> { + let (node_client, node_rpc_client, _) = client::connect(SharedResources::node_rpc_url()) + .await + .unwrap(); + + // Deploy a contract to have some interesting blocks + let (bytes, _) = pallet_revive_fixtures::compile_module("dummy")?; + let value = U256::from(5_000_000_000_000u128); + let tx = TransactionBuilder::new(&client) + .value(value) + .input(bytes.to_vec()) + .send() + .await?; + + let receipt = tx.wait_for_receipt().await?; + let block_number = receipt.block_number; + let block_hash = receipt.block_hash; + log::trace!(target: LOG_TARGET, "block_number = {block_number:?}"); + log::trace!(target: LOG_TARGET, "tx hash = {:?}", tx.hash()); + + let evm_block_from_storage = + get_evm_block_from_storage(&node_client, &node_rpc_client, block_number).await?; + + // Fetch the block immediately (should come from storage EthereumBlock) + let evm_block_from_rpc_by_number = client + .get_block_by_number(BlockNumberOrTag::U256(block_number.into()), false) + .await? + .expect("Block should exist"); + let evm_block_from_rpc_by_hash = client + .get_block_by_hash(block_hash, false) + .await? + .expect("Block should exist"); + + assert!( + matches!( + evm_block_from_rpc_by_number.transactions, + pallet_revive::evm::HashesOrTransactionInfos::Hashes(_) + ), + "Block should not have hydrated transactions" + ); + + // All EVM blocks must match + assert_eq!( + evm_block_from_storage, evm_block_from_rpc_by_number, + "EVM blocks should match" + ); + assert_eq!( + evm_block_from_storage, evm_block_from_rpc_by_hash, + "EVM blocks should match" + ); + + Ok(()) +} + +async fn test_evm_blocks_hydrated_should_match(client: Arc) -> anyhow::Result<()> { + // Deploy a contract to have some transactions in the block + let (bytes, _) = pallet_revive_fixtures::compile_module("dummy")?; + let value = U256::from(5_000_000_000_000u128); + let signer = Account::default(); + let signer_copy = Account::default(); + let tx = TransactionBuilder::new(&client) + .value(value) + .signer(signer) + .input(bytes.to_vec()) + .send() + .await?; + + let receipt = tx.wait_for_receipt().await?; + let block_number = receipt.block_number; + let block_hash = receipt.block_hash; + log::trace!(target: LOG_TARGET, "block_number = {block_number:?}"); + log::trace!(target: LOG_TARGET, "tx hash = {:?}", tx.hash()); + + // Fetch the block with hydrated transactions via RPC (by number and by hash) + let evm_block_from_rpc_by_number = client + .get_block_by_number(BlockNumberOrTag::U256(block_number.into()), true) + .await? + .expect("Block should exist"); + let evm_block_from_rpc_by_hash = client + .get_block_by_hash(block_hash, true) + .await? + .expect("Block should exist"); + + // Both blocks should be identical + assert_eq!( + evm_block_from_rpc_by_number, evm_block_from_rpc_by_hash, + "Hydrated EVM blocks should match" + ); + + // Verify transaction info + let unsigned_tx = tx + .generic_transaction() + .try_into_unsigned() + .expect("Transaction shall be converted"); + let signed_tx = signer_copy.sign_transaction(unsigned_tx); + let expected_tx_info = TransactionInfo::new(&receipt, signed_tx); + + let tx_info = if let HashesOrTransactionInfos::TransactionInfos(tx_infos) = + evm_block_from_rpc_by_number.transactions + { + tx_infos[0].clone() + } else { + panic!("Expected hydrated transactions"); + }; + assert_eq!(expected_tx_info, tx_info, "TransationInfos should match"); + + Ok(()) +} + +async fn test_block_hash_for_tag_with_proper_ethereum_block_hash_works( + client: Arc, +) -> anyhow::Result<()> { + // Deploy a transaction to create a block with transactions + let (bytes, _) = pallet_revive_fixtures::compile_module("dummy")?; + let value = U256::from(5_000_000_000_000u128); + let tx = TransactionBuilder::new(&client) + .value(value) + .input(bytes.to_vec()) + .send() + .await?; + + let receipt = tx.wait_for_receipt().await?; + let ethereum_block_hash = receipt.block_hash; + + log::trace!(target: LOG_TARGET, "Testing with Ethereum block hash: {ethereum_block_hash:?}"); + + let block_by_hash = client + .get_block_by_hash(ethereum_block_hash, false) + .await? + .expect("Block should exist"); + + let account = Account::default(); + let balance = client + .get_balance(account.address(), ethereum_block_hash.into()) + .await?; + + assert!( + balance >= U256::zero(), + "Balance should be retrievable with Ethereum hash" + ); + assert_eq!( + block_by_hash.hash, ethereum_block_hash, + "Block hash should match" + ); + + Ok(()) +} + +async fn test_block_hash_for_tag_with_invalid_ethereum_block_hash_fails( + client: Arc, +) -> anyhow::Result<()> { + let fake_eth_hash = H256::from([0x42u8; 32]); + + log::trace!(target: LOG_TARGET, "Testing with fake Ethereum hash: {fake_eth_hash:?}"); + + let account = Account::default(); + let result = client + .get_balance(account.address(), fake_eth_hash.into()) + .await; + + assert!( + result.is_err(), + "Should fail with non-existent Ethereum hash" + ); + + Ok(()) +} + +async fn test_block_hash_for_tag_with_block_number_works( + client: Arc, +) -> anyhow::Result<()> { + let block_number = client.block_number().await?; + + log::trace!(target: LOG_TARGET, "Testing with block number: {block_number}"); + + let account = Account::default(); + let balance = client + .get_balance( + account.address(), + BlockNumberOrTagOrHash::BlockNumber(block_number), + ) + .await?; + + assert!( + balance >= U256::zero(), + "Balance should be retrievable with block number" + ); + Ok(()) +} + +async fn test_block_hash_for_tag_with_block_tags_works( + client: Arc, +) -> anyhow::Result<()> { + let account = Account::default(); + + let tags = vec![ + BlockTag::Latest, + BlockTag::Finalized, + BlockTag::Safe, + BlockTag::Earliest, + BlockTag::Pending, + ]; + + for tag in tags { + let balance = client + .get_balance(account.address(), tag.clone().into()) + .await?; + + assert!( + balance >= U256::zero(), + "Balance should be retrievable with tag {tag:?}" + ); + } + + Ok(()) +} + +async fn test_multiple_transactions_in_block(client: Arc) -> anyhow::Result<()> { + let num_transactions = 20; + let alith = Account::default(); + let ethan = Account::from(subxt_signer::eth::dev::ethan()); + let amount = U256::from(1_000_000_000_000_000_000u128); + + // Prepare EVM transfer transactions + let transactions = + prepare_evm_transactions(&client, alith, ethan.address(), amount, num_transactions).await?; + + // Submit all transactions + let submitted_txs = submit_evm_transactions(transactions).await?; + let tx_hashes: Vec = submitted_txs.iter().map(|(hash, _, _)| *hash).collect(); + log::trace!(target: LOG_TARGET, "Submitted {} transactions", submitted_txs.len()); + + // All transactions should be included in the same block since nonces are in descending order + let first_receipt = submitted_txs[0].2.wait_for_receipt().await?; + + // Fetch and verify block contains all transactions + verify_transactions_in_single_block(&client, first_receipt.block_number, &tx_hashes).await?; + Ok(()) +} + +async fn test_mixed_evm_substrate_transactions(client: Arc) -> anyhow::Result<()> { + let num_evm_txs = 10; + let num_substrate_txs = 7; + + let alith = Account::default(); + let ethan = Account::from(subxt_signer::eth::dev::ethan()); + let amount = U256::from(500_000_000_000_000_000u128); + + // Prepare EVM transactions + log::trace!(target: LOG_TARGET, "Creating {num_evm_txs} EVM transfer transactions"); + let evm_transactions = + prepare_evm_transactions(&client, alith, ethan.address(), amount, num_evm_txs).await?; + + // Prepare substrate transactions (simple remarks) + log::trace!(target: LOG_TARGET, "Creating {num_substrate_txs} substrate remark transactions"); + let alice_signer = subxt_signer::sr25519::dev::alice(); + let (node_client, _, _) = client::connect(SharedResources::node_rpc_url()) + .await + .unwrap(); + + let substrate_txs = + prepare_substrate_transactions(&node_client, &alice_signer, num_substrate_txs).await?; + + log::trace!(target: LOG_TARGET, "Submitting {num_evm_txs} EVM and {num_substrate_txs} substrate transactions"); + + // Submit EVM transactions + let evm_submitted = submit_evm_transactions(evm_transactions).await?; + let evm_tx_hashes: Vec = evm_submitted.iter().map(|(hash, _, _)| *hash).collect(); + + // Submit substrate transactions + let substrate_futures = submit_substrate_transactions(substrate_txs).await; + + // Wait for first EVM receipt and all substrate transactions in parallel + let (evm_first_receipt_result, _substrate_results) = tokio::join!( + async { evm_submitted[0].2.wait_for_receipt().await }, + futures::future::join_all(substrate_futures) + ); + // Handle the EVM receipt result + let evm_first_receipt = evm_first_receipt_result?; + + // Fetch and verify block contains all transactions + verify_transactions_in_single_block(&client, evm_first_receipt.block_number, &evm_tx_hashes) + .await?; + + Ok(()) +} + +async fn test_runtime_pallets_address_upload_code(client: Arc) -> anyhow::Result<()> { + let (node_client, node_rpc_client, _) = + client::connect(SharedResources::node_rpc_url()).await?; + + let (bytecode, _) = pallet_revive_fixtures::compile_module("dummy")?; + let signer = Account::default(); + + // Helper function to get substrate block hash from EVM block number + let get_substrate_block_hash = |block_number: U256| { + let rpc_client = node_rpc_client.clone(); + async move { + rpc_client + .request::("chain_getBlockHash", rpc_params![block_number]) + .await + } + }; + + // Step 1: Encode the Substrate upload_code call + let upload_call = subxt::dynamic::tx( + "Revive", + "upload_code", + vec![ + subxt::dynamic::Value::from_bytes(&bytecode), + subxt::dynamic::Value::u128(u128::max_value()), // storage_deposit_limit + ], + ); + let encoded_call = node_client.tx().call_data(&upload_call)?; + + // Step 2: Send the encoded call to RUNTIME_PALLETS_ADDR + let tx = TransactionBuilder::new(&client) + .signer(signer.clone()) + .to(pallet_revive::RUNTIME_PALLETS_ADDR) + .input(encoded_call.clone()) + .send() + .await?; + + // Step 3: Wait for receipt + let receipt = tx.wait_for_receipt().await?; + + // Step 4: Verify transaction was successful + assert_eq!( + receipt.status.unwrap_or(U256::zero()), + U256::one(), + "Transaction should be successful" + ); + + // Step 5: Verify the code was actually uploaded + let code_hash = H256(sp_io::hashing::keccak_256(&bytecode)); + let query = subxt_client::storage().revive().pristine_code(code_hash); + let block_hash: sp_core::H256 = get_substrate_block_hash(receipt.block_number).await?; + let stored_code = node_client.storage().at(block_hash).fetch(&query).await?; + assert!( + stored_code.is_some(), + "Code with hash {code_hash:?} should exist in storage" + ); + assert_eq!( + stored_code.unwrap(), + bytecode, + "Stored code should match the uploaded bytecode" + ); + + Ok(()) +} diff --git a/integration/Cargo.lock b/integration/Cargo.lock index c8d5eb3989..6bce784a70 100644 --- a/integration/Cargo.lock +++ b/integration/Cargo.lock @@ -3077,9 +3077,9 @@ dependencies = [ [[package]] name = "polymesh-api" -version = "3.11.0" +version = "3.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ff80f4052cb02de5dcf3eb34d709c054d56f9d670e1d0c79f6eb2aee8c8a9a" +checksum = "846f2b44b8a7392986284a391c6376053f6b70d6c0bcc69ba697e7c106673f9b" dependencies = [ "async-trait", "ink", @@ -3095,9 +3095,9 @@ dependencies = [ [[package]] name = "polymesh-api-client" -version = "3.9.0" +version = "3.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56cf9e3a73fada7c5859a0a8821975553d9478f840f8dfae0b97fbf766ea5bd" +checksum = "e70cf61a899a749b026a4e1ec0731eecf0dcb7e20d80063c073111ca7bfa8fb8" dependencies = [ "async-stream", "async-trait", @@ -3129,9 +3129,9 @@ dependencies = [ [[package]] name = "polymesh-api-client-extras" -version = "3.6.0" +version = "3.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a684432bc48150f1de14f8695da6c3bb9629e45b5e76fdfde14e994bd334f6b" +checksum = "119c0c5de4178af4927568b5400b7ace606fdee126339f368022073d3c95a712" dependencies = [ "parity-scale-codec", "polymesh-api", @@ -3142,9 +3142,9 @@ dependencies = [ [[package]] name = "polymesh-api-codegen" -version = "3.7.0" +version = "3.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a63d6a2adabd1d0dc37b9deefef14221e9a1c606044e42366677ddc0605887e7" +checksum = "3d6549a43d5579ad483ebf8bd5bd5b90c31cb1981f8f569600e837c48a8fec25" dependencies = [ "frame-metadata", "heck 0.4.1", @@ -3162,9 +3162,9 @@ dependencies = [ [[package]] name = "polymesh-api-codegen-macro" -version = "3.7.0" +version = "3.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27676a20d1b51d72f53e6209ad4c0357e02a4a64459c88876df979b2dafc3615" +checksum = "2dabf76731ecc7a962d0176f15cb3f1ef07e60e038a723c3d576da4f197c3343" dependencies = [ "darling", "parity-scale-codec", @@ -3193,9 +3193,9 @@ dependencies = [ [[package]] name = "polymesh-api-tester" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "998e2026b62c49a2bfe25b95f64815947eafd1ae8410a80d959780e02d3d8a99" +checksum = "e5baf6433b8ebd0cfae673d173746081f97ce9b3dd5f5f9b847472187208e917" dependencies = [ "async-trait", "env_logger 0.11.8", diff --git a/integration/Cargo.toml b/integration/Cargo.toml index 78c3bb03df..6071ce5d3a 100644 --- a/integration/Cargo.toml +++ b/integration/Cargo.toml @@ -5,18 +5,26 @@ edition = "2021" # Use these for testing new versions of `polymesh-api`. #[patch.crates-io] +# Git paths #polymesh-api = { git = "https://github.com/PolymeshAssociation/polymesh-api" } #polymesh-api-client = { git = "https://github.com/PolymeshAssociation/polymesh-api" } #polymesh-api-client-extras = { git = "https://github.com/PolymeshAssociation/polymesh-api" } #polymesh-api-tester = { git = "https://github.com/PolymeshAssociation/polymesh-api" } #polymesh-api-codegen = { git = "https://github.com/PolymeshAssociation/polymesh-api" } #polymesh-api-codegen-macro = { git = "https://github.com/PolymeshAssociation/polymesh-api" } +# local paths +#polymesh-api = { path = "../../polymesh-api/" } +#polymesh-api-client = { path = "../../polymesh-api/crates/polymesh-api-client/" } +#polymesh-api-client-extras = { path = "../../polymesh-api/crates/polymesh-api-client-extras/" } +#polymesh-api-tester = { path = "../../polymesh-api/crates/polymesh-api-tester/" } +#polymesh-api-codegen = { path = "../../polymesh-api/crates/polymesh-api-codegen/" } +#polymesh-api-codegen-macro = { path = "../../polymesh-api/crates/polymesh-api-codegen-macro/" } [features] default = [] previous_release = [] -current_release = [] +current_release = ["polymesh-api/polymesh_v8", "polymesh-api-tester/polymesh_v8"] [dependencies] anyhow = "1" @@ -32,6 +40,6 @@ sp-keyring = "41.0" sp-weights = "31.1" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive", "max-encoded-len"] } -polymesh-api = { version = "3.11.0", features = ["download_metadata"] } -polymesh-api-client-extras = { version = "3.6.0" } -polymesh-api-tester = { version = "0.10.0", features = ["download_metadata"] } +polymesh-api = { version = "3.13.1", features = ["download_metadata"] } +polymesh-api-client-extras = { version = "3.6.2" } +polymesh-api-tester = { version = "0.10.1", features = ["download_metadata"] } diff --git a/integration/rust-toolchain.toml b/integration/rust-toolchain.toml index 4962bfc2f0..7322ebbc59 100644 --- a/integration/rust-toolchain.toml +++ b/integration/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "nightly-2024-11-14" +channel = "nightly-2025-07-16" components = [ "rustfmt" ] profile = "minimal" diff --git a/integration/tests/contract_permissions.rs b/integration/tests/contract_permissions.rs index 04664ae58c..b65b6786e1 100644 --- a/integration/tests/contract_permissions.rs +++ b/integration/tests/contract_permissions.rs @@ -49,7 +49,7 @@ async fn contract_as_secondary_key_change_identity() -> Result<()> { .polymesh_contracts() .instantiate_with_code_perms( 0, - Weight::from_parts(10_500_000_000, 0), + Weight::from_parts(10_000_000_000, 300_000), None, call_runtime_bytes.to_vec(), vec![0x9b, 0xae, 0x9d, 0x5e], // Selector for `new` constructor. @@ -134,7 +134,7 @@ async fn contract_as_secondary_key_change_identity() -> Result<()> { .call( contract.into(), 0, - Weight::from_parts(10_500_000_000, 0), + Weight::from_parts(10_500_000_000, 300_000), None, encoded_call, )? diff --git a/integration/tests/contract_revert.rs b/integration/tests/contract_revert.rs index 0c34168308..1718814efa 100644 --- a/integration/tests/contract_revert.rs +++ b/integration/tests/contract_revert.rs @@ -18,7 +18,7 @@ async fn contract_constructor_reverted() -> Result<()> { .polymesh_contracts() .instantiate_with_code_perms( 0, - Weight::from_parts(10_000_000_000, 0), + Weight::from_parts(10_000_000_000, 300_000), None, contract_revert_bytes.to_vec(), vec![0x9b, 0xae, 0x9d, 0x5e, 0x01], // Selector for `new(true)` constructor. diff --git a/integration/tests/multisig_permissions.rs b/integration/tests/multisig_permissions.rs index 81f239435b..2527bb4fa0 100644 --- a/integration/tests/multisig_permissions.rs +++ b/integration/tests/multisig_permissions.rs @@ -437,7 +437,7 @@ async fn secondary_key_ms_make_primary() -> Result<()> { .api .call() .balances() - .transfer(ms.account.into(), 10 * ONE_POLYX)? + .transfer_with_memo(ms.account.into(), 10 * ONE_POLYX, None)? .execute(&mut did1) .await?; @@ -657,7 +657,7 @@ async fn ms_remove_payer() -> Result<()> { .api .call() .balances() - .transfer(ms.account.into(), 10 * ONE_POLYX)? + .transfer_with_memo(ms.account.into(), 10 * ONE_POLYX, None)? .execute(&mut did) .await?; // Wait for transfer. @@ -704,7 +704,7 @@ async fn ms_remove_payer_via_payer() -> Result<()> { .api .call() .balances() - .transfer(ms.account.into(), 10 * ONE_POLYX)? + .transfer_with_memo(ms.account.into(), 10 * ONE_POLYX, None)? .execute(&mut did) .await?; // Wait for transfer. diff --git a/integration/tests/permissions.rs b/integration/tests/permissions.rs index 7f16abd050..e94d4ef353 100644 --- a/integration/tests/permissions.rs +++ b/integration/tests/permissions.rs @@ -126,7 +126,7 @@ async fn secondary_keys_permissions() -> Result<()> { // Prepare a POLYX transfer to one user. let user0_pk = users[0].account(); let balance_transfer_call = - Arc::new(tester.api.call().balances().transfer(user0_pk.into(), 1)?); + Arc::new(tester.api.call().balances().transfer_with_memo(user0_pk.into(), 1, None)?); // Prepare `system.remark` call. let remark_call = Arc::new(tester.api.call().system().remark(vec![])?); // Prepare `settlement.create_venue` call. @@ -243,7 +243,7 @@ async fn secondary_key_change_identity() -> Result<()> { // Prepare a POLYX transfer to one user. let balance_transfer_call = - Arc::new(tester.api.call().balances().transfer(user0_pk.into(), 1)?); + Arc::new(tester.api.call().balances().transfer_with_memo(user0_pk.into(), 1, None)?); // Prepare `system.remark` call. let remark_call = Arc::new(tester.api.call().system().remark(vec![])?); // Prepare `settlement.create_venue` call. diff --git a/integration/tests/simple_transfer.rs b/integration/tests/simple_transfer.rs index 3e8771966b..1194c64f3e 100644 --- a/integration/tests/simple_transfer.rs +++ b/integration/tests/simple_transfer.rs @@ -11,7 +11,7 @@ async fn simple_polyx_transfer() -> Result<()> { .api .call() .balances() - .transfer(users[1].account().into(), 13 * ONE_POLYX)? + .transfer_with_memo(users[1].account().into(), 13 * ONE_POLYX, None)? .execute(&mut users[0]) .await?; let events = res.events().await?; diff --git a/integration/tests/sto.rs b/integration/tests/sto.rs index 74e4ba5d91..82c8a97168 100644 --- a/integration/tests/sto.rs +++ b/integration/tests/sto.rs @@ -2,26 +2,14 @@ #[cfg(feature = "previous_release")] mod sto_tests { use anyhow::Result; - use codec::{Decode, Encode}; use integration::*; - use polymesh_api::types::pallet_sto::{FundraiserId, FundraiserName, PriceTier}; + use polymesh_api::types::pallet_sto::{FundraiserName, PriceTier}; use polymesh_api::types::polymesh_primitives::{ identity_id::{PortfolioId, PortfolioKind}, settlement::{VenueDetails, VenueType}, }; - /// An offchain fundraiser receipt. - #[derive(Encode, Decode, Clone, Debug)] - pub struct FundraiserReceipt { - uid: u64, - fundraiser_id: FundraiserId, - sender_identity: IdentityId, - receiver_identity: IdentityId, - ticker: Ticker, - amount: u128, - } - /// Test a STO with onchain asset funding. #[tokio::test] async fn sto_onchain_funding() -> Result<()> { diff --git a/metadata-tools/Cargo.toml b/metadata-tools/Cargo.toml index 5b83833c7c..35f34e79f2 100644 --- a/metadata-tools/Cargo.toml +++ b/metadata-tools/Cargo.toml @@ -4,18 +4,18 @@ version = "0.1.0" edition = "2021" [dependencies] -clap = { version = "4.0", features = ["derive"] } +substrate-differ = { git = "https://github.com/PolymeshAssociation/subwasm.git", branch = "polymesh", default-features = false, features = ["v14", "reduced"] } + frame-metadata = { version = "16.0", features = ["std", "legacy"] } -codec = { package = "parity-scale-codec", version = "3.0" } + anyhow = "1.0" -substrate-differ = { git = "https://github.com/PolymeshAssociation/subwasm.git", branch = "polymesh", default-features = false, features = ["v14", "reduced"] } -jsonrpsee = { version = "0.24.7", features = [ - "http-client", - "ws-client", -] } +clap = { version = "4.0", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.0" } +env_logger = { version = "0.11.5", default-features = false } hex = "0.4.3" -tokio = { version = "1.42.0", features = ["rt"] } +jsonrpsee = { version = "0.24.7", features = ["http-client","ws-client"] } serde = "1.0.215" -sp-version = { version = "35.0.0", default-features = false, features = ["std"] } serde_json = "1.0.133" -env_logger = { version = "0.11.5", default-features = false } +sp-version = { version = "35.0.0", default-features = false, features = ["std"] } +tokio = { version = "1.42.0", features = ["rt"] } + diff --git a/node-rpc/Cargo.toml b/node-rpc/Cargo.toml index 48cf175997..ef5ddc09a0 100644 --- a/node-rpc/Cargo.toml +++ b/node-rpc/Cargo.toml @@ -10,31 +10,50 @@ repository = "https://github.com/PolymeshAssociation/substrate" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.16.2", features = ["server"] } +jsonrpsee = { version = "0.24.8", features = ["server"] } -polymesh-primitives = { path = "../primitives", default-features = false } -pallet-group-rpc = { path = "../pallets/group/rpc" } -pallet-staking-rpc = { path = "../pallets/staking/rpc" } -pallet-protocol-fee-rpc = { path = "../pallets/protocol-fee/rpc" } -node-rpc = { path = "../rpc" } +polymesh-primitives = { workspace = true, default-features = false } +pallet-group-rpc = { workspace = true, default-features = false } +pallet-protocol-fee-rpc = { workspace = true, default-features = false } +node-rpc = { workspace = true, default-features = false } -sc-chain-spec = { version = "4.0.0-dev" } -sc-client-api = { version = "4.0.0-dev" } -sc-consensus-babe = { version = "0.10.0-dev" } -sc-consensus-babe-rpc = { version = "0.10.0-dev" } -sc-consensus-epochs = { version = "0.10.0-dev" } -sc-consensus-grandpa = { version = "0.10.0-dev" } -sc-consensus-grandpa-rpc = { version = "0.10.0-dev" } -sc-rpc = { version = "4.0.0-dev" } -sc-rpc-api = { version = "0.10.0-dev" } -sc-rpc-spec-v2 = { version = "0.10.0-dev" } -sc-sync-state-rpc = { version = "0.10.0-dev" } -sc-transaction-pool-api = { version = "4.0.0-dev" } -sp-api = { version = "4.0.0-dev" } -sp-block-builder = { version = "4.0.0-dev" } -sp-blockchain = { version = "4.0.0-dev" } -sp-consensus = { version = "0.10.0-dev" } -sp-consensus-babe = { version = "0.10.0-dev" } -sp-keystore = { version = "0.13.0" } -sp-runtime = { version = "7.0.0" } -substrate-frame-rpc-system = { version = "4.0.0-dev" } +mmr-gadget = { workspace = true } +mmr-rpc = { workspace = true } + +sc-chain-spec = { workspace = true } +sc-client-api = { workspace = true } +sc-consensus-babe = { workspace = true } +sc-consensus-babe-rpc = { workspace = true } +sc-consensus-beefy = { workspace = true } +sc-consensus-beefy-rpc = { workspace = true } +sc-consensus-grandpa = { workspace = true } +sc-consensus-grandpa-rpc = { workspace = true } +sc-rpc = { workspace = true } +sc-rpc-api = { workspace = true } +sc-rpc-spec-v2 = { workspace = true } +sc-sync-state-rpc = { workspace = true } +sc-transaction-pool-api = { workspace = true } +sp-api = { workspace = true, default-features = false } +sp-application-crypto = { workspace = true, default-features = false } +sp-block-builder = { workspace = true, default-features = false } +sp-blockchain = { workspace = true, default-features = false } +sp-consensus = { workspace = true, default-features = false } +sp-consensus-babe = { workspace = true, default-features = false } +sp-consensus-beefy = { workspace = true } +sp-keystore = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +substrate-frame-rpc-system = { workspace = true, default-features = false } + +[features] +default = ["std"] +std = [ + "polymesh-primitives/std", + "pallet-group-rpc/std", + "pallet-protocol-fee-rpc/std", + "node-rpc/std", + "sp-api/std", + "sp-block-builder/std", + "sp-consensus-babe/std", + "sp-keystore/std", + "sp-runtime/std", +] diff --git a/node-rpc/src/lib.rs b/node-rpc/src/lib.rs index 41bc76f2c1..3bbcd0be3f 100644 --- a/node-rpc/src/lib.rs +++ b/node-rpc/src/lib.rs @@ -33,31 +33,33 @@ use std::sync::Arc; use jsonrpsee::RpcModule; -use polymesh_primitives::{AccountId, Block, BlockNumber, Hash, IdentityId, Index, Moment, Ticker}; +use polymesh_primitives::{AccountId, Block, BlockNumber, Hash, IdentityId, Moment, Nonce, Ticker}; use sc_client_api::AuxStore; -use sc_consensus_babe::{BabeConfiguration, Epoch}; -use sc_consensus_epochs::SharedEpochChanges; +use sc_consensus_babe::BabeWorkerHandle; +use sc_consensus_beefy::communication::notification::{ + BeefyBestBlockStream, BeefyVersionedFinalityProofStream, +}; use sc_consensus_grandpa::{ FinalityProofProvider, GrandpaJustificationStream, SharedAuthoritySet, SharedVoterState, }; -use sc_rpc::SubscriptionTaskExecutor; +pub use sc_rpc::SubscriptionTaskExecutor; pub use sc_rpc_api::DenyUnsafe; use sc_transaction_pool_api::TransactionPool; use sp_api::ProvideRuntimeApi; +use sp_application_crypto::RuntimeAppPublic; use sp_block_builder::BlockBuilder; use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; use sp_consensus::SelectChain; use sp_consensus_babe::BabeApi; -use sp_keystore::SyncCryptoStorePtr; +use sp_consensus_beefy::AuthorityIdBound; +use sp_keystore::KeystorePtr; /// Extra dependencies for BABE. pub struct BabeDeps { - /// BABE protocol config. - pub babe_config: BabeConfiguration, - /// BABE pending epoch changes. - pub shared_epoch_changes: SharedEpochChanges, + /// A handle to the BABE worker for issuing requests. + pub babe_worker_handle: BabeWorkerHandle, /// The keystore that manages the keys of the node. - pub keystore: SyncCryptoStorePtr, + pub keystore: KeystorePtr, } /// Extra dependencies for GRANDPA @@ -74,8 +76,18 @@ pub struct GrandpaDeps { pub finality_provider: Arc>, } +/// Dependencies for BEEFY +pub struct BeefyDeps { + /// Receives notifications about finality proof events from BEEFY. + pub beefy_finality_proof_stream: BeefyVersionedFinalityProofStream, + /// Receives notifications about best block events from BEEFY. + pub beefy_best_block_stream: BeefyBestBlockStream, + /// Executor to drive the subscription manager in the BEEFY RPC handler. + pub subscription_executor: SubscriptionTaskExecutor, +} + /// Full client dependencies. -pub struct FullDeps { +pub struct FullDeps { /// The client instance to use. pub client: Arc, /// Transaction pool instance. @@ -84,18 +96,28 @@ pub struct FullDeps { pub select_chain: SC, /// A copy of the chain spec. pub chain_spec: Box, - /// Whether to deny unsafe calls - pub deny_unsafe: DenyUnsafe, /// BABE specific dependencies. pub babe: BabeDeps, /// GRANDPA specific dependencies. pub grandpa: GrandpaDeps, + /// BEEFY specific dependencies. + pub beefy: BeefyDeps, + /// The backend used by the node. + pub backend: Arc, } /// Instantiate all Full RPC extensions. -pub fn create_full( - deps: FullDeps, - _backend: Arc, +pub fn create_full( + FullDeps { + client, + pool, + select_chain, + chain_spec, + babe, + grandpa, + beefy, + backend, + }: FullDeps, ) -> Result, Box> where C: ProvideRuntimeApi @@ -106,9 +128,9 @@ where + Sync + Send + 'static, - C::Api: substrate_frame_rpc_system::AccountNonceApi, + C::Api: substrate_frame_rpc_system::AccountNonceApi, + C::Api: mmr_rpc::MmrRuntimeApi::Hash, BlockNumber>, C::Api: node_rpc::transaction_payment::TransactionPaymentRuntimeApi, - C::Api: pallet_staking_rpc::StakingRuntimeApi, C::Api: node_rpc::pips::PipsRuntimeApi, C::Api: node_rpc::identity::IdentityRuntimeApi, C::Api: pallet_protocol_fee_rpc::ProtocolFeeRuntimeApi, @@ -121,8 +143,11 @@ where P: TransactionPool + 'static, SC: SelectChain + 'static, B: sc_client_api::Backend + Send + Sync + 'static, - B::State: sc_client_api::backend::StateBackend>, + B::State: sc_client_api::backend::StateBackend>, + AuthorityId: AuthorityIdBound, + ::Signature: Send + Sync, { + use mmr_rpc::{Mmr, MmrApiServer}; use node_rpc::{ asset::{Asset, AssetApiServer}, identity::{Identity, IdentityApiServer}, @@ -133,29 +158,18 @@ where }; use pallet_group_rpc::{Group, GroupApiServer}; use pallet_protocol_fee_rpc::{ProtocolFee, ProtocolFeeApiServer}; - use pallet_staking_rpc::{Staking, StakingApiServer}; use sc_consensus_babe_rpc::{Babe, BabeApiServer}; + use sc_consensus_beefy_rpc::{Beefy, BeefyApiServer}; use sc_consensus_grandpa_rpc::{Grandpa, GrandpaApiServer}; use sc_rpc::dev::{Dev, DevApiServer}; - use sc_rpc_spec_v2::chain_spec::{ChainSpec, ChainSpecApiServer}; use sc_sync_state_rpc::{SyncState, SyncStateApiServer}; use substrate_frame_rpc_system::{System, SystemApiServer}; let mut io = RpcModule::new(()); - let FullDeps { - client, - pool, - select_chain, - chain_spec, - deny_unsafe, - babe, - grandpa, - } = deps; let BabeDeps { keystore, - babe_config, - shared_epoch_changes, + babe_worker_handle, } = babe; let GrandpaDeps { shared_voter_state, @@ -165,25 +179,26 @@ where finality_provider, } = grandpa; - let chain_name = chain_spec.name().to_string(); - let genesis_hash = client - .block_hash(0) - .ok() - .flatten() - .expect("Genesis block exists; qed"); - let properties = chain_spec.properties(); - io.merge(ChainSpec::new(chain_name, genesis_hash, properties).into_rpc())?; - - io.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?; + io.merge(System::new(client.clone(), pool).into_rpc())?; + // Making synchronous calls in light client freezes the browser currently, + // more context: https://github.com/paritytech/substrate/pull/3480 + // These RPCs should use an asynchronous caller instead. + io.merge( + Mmr::new( + client.clone(), + backend + .offchain_storage() + .ok_or_else(|| "Backend doesn't provide an offchain storage")?, + ) + .into_rpc(), + )?; io.merge(TransactionPayment::new(client.clone()).into_rpc())?; io.merge( Babe::new( client.clone(), - shared_epoch_changes.clone(), + babe_worker_handle.clone(), keystore, - babe_config, select_chain, - deny_unsafe, ) .into_rpc(), )?; @@ -203,14 +218,22 @@ where chain_spec, client.clone(), shared_authority_set, - shared_epoch_changes, + babe_worker_handle, )? .into_rpc(), )?; - io.merge(Dev::new(client.clone(), deny_unsafe).into_rpc())?; + io.merge(Dev::new(client.clone()).into_rpc())?; + + io.merge( + Beefy::::new( + beefy.beefy_finality_proof_stream, + beefy.beefy_best_block_stream, + beefy.subscription_executor, + )? + .into_rpc(), + )?; - io.merge(Staking::new(client.clone()).into_rpc())?; io.merge(Pips::new(client.clone()).into_rpc())?; io.merge(Identity::new(client.clone()).into_rpc())?; io.merge(ProtocolFee::new(client.clone()).into_rpc())?; diff --git a/pallets/asset/Cargo.toml b/pallets/asset/Cargo.toml index 83edd21c38..af9d823925 100644 --- a/pallets/asset/Cargo.toml +++ b/pallets/asset/Cargo.toml @@ -22,7 +22,7 @@ polymesh-runtime-common = { workspace = true, default-features = false } # Other serde = { version = "1.0.104", default-features = false } serde_derive = { version = "1.0.104", optional = true, default-features = false } -serde_json = "1.0.48" +serde_json = { version = "1.0.48", default-features = false } rustc-hex = { version = "2.1.0", default-features = false } hex-literal = "0.2.1" arrayvec = { version = "0.7.1", default-features = false } @@ -30,20 +30,20 @@ log = "0.4" # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-arithmetic = { version = "6.0.0", default-features = false } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-arithmetic = { workspace = true, default-features = false } +sp-core = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +pallet-timestamp = { workspace = true, default-features = false } # Only in STD -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [features] default = ["std"] @@ -57,6 +57,7 @@ std = [ "pallet-portfolio/std", "pallet-timestamp/std", "pallet-external-agents/std", + "pallet-statistics/std", "polymesh-primitives/std", "polymesh-common-utilities/std", "polymesh-runtime-common/std", @@ -74,5 +75,11 @@ std = [ runtime-benchmarks = [ "frame-benchmarking", "pallet-identity/runtime-benchmarks", + "pallet-external-agents/runtime-benchmarks", + "pallet-permissions/runtime-benchmarks", + "pallet-portfolio/runtime-benchmarks", + "pallet-statistics/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", + "polymesh-runtime-common/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/asset/src/checkpoint/mod.rs b/pallets/asset/src/checkpoint/mod.rs index fd9ca9cbad..8a32983cd7 100644 --- a/pallets/asset/src/checkpoint/mod.rs +++ b/pallets/asset/src/checkpoint/mod.rs @@ -78,9 +78,6 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config + crate::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; } @@ -259,13 +256,15 @@ pub mod pallet { pub(super) type StorageVersion = StorageValue<_, Version, ValueQuery>; #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig { + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { pub schedules_max_complexity: u64, + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { StorageVersion::::put(Version::new(2)); diff --git a/pallets/asset/src/lib.rs b/pallets/asset/src/lib.rs index 4c31d1a18f..02dd4006ed 100644 --- a/pallets/asset/src/lib.rs +++ b/pallets/asset/src/lib.rs @@ -89,13 +89,13 @@ mod types; use codec::{Decode, Encode}; use core::mem; use currency::*; -use frame_support::dispatch::{ - DispatchError, DispatchResult, DispatchResultWithPostInfo, PostDispatchInfo, -}; +use frame_support::dispatch::{DispatchResult, DispatchResultWithPostInfo, PostDispatchInfo}; use frame_support::ensure; +use frame_support::pallet_prelude::DispatchError; use frame_support::traits::{Currency, Get, UnixTime}; use frame_support::weights::Weight; use frame_support::BoundedBTreeSet; +use frame_system::pallet_prelude::*; use frame_system::{ensure_root, ensure_signed}; use sp_io::hashing::blake2_128; use sp_runtime::traits::Zero; @@ -153,7 +153,6 @@ pub use pallet::*; pub mod pallet { use super::*; use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; #[pallet::config] pub trait Config: @@ -163,9 +162,6 @@ pub mod pallet { + pallet_portfolio::Config + AssetFnConfig { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - type Currency: Currency; type ComplianceManager: ComplianceFnConfig; @@ -612,15 +608,16 @@ pub mod pallet { #[pallet::genesis_config] #[derive(frame_support::DefaultNoBound)] - pub struct GenesisConfig { - // TODO: Why is serde required here? + pub struct GenesisConfig { pub ticker_registration_config: TickerRegistrationConfig, pub reserved_country_currency_codes: Vec, pub asset_metadata: Vec<(AssetMetadataName, AssetMetadataSpec)>, + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig + impl BuildGenesisConfig for GenesisConfig where T: AssetConfig, { @@ -3335,7 +3332,7 @@ impl Pallet { } pub fn generate_asset_id(caller_acc: T::AccountId, update: bool) -> AssetId { - let genesis_hash = frame_system::Pallet::::block_hash(T::BlockNumber::zero()); + let genesis_hash = frame_system::Pallet::::block_hash(BlockNumberFor::::zero()); let nonce = Self::get_nonce(&caller_acc, update); blake2_128(&(b"modlpy/pallet_asset", genesis_hash, caller_acc, nonce).encode()).into() } diff --git a/pallets/asset/src/types.rs b/pallets/asset/src/types.rs index 44534a3eee..d785a74592 100644 --- a/pallets/asset/src/types.rs +++ b/pallets/asset/src/types.rs @@ -1,8 +1,6 @@ -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; - use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; use polymesh_primitives::asset::AssetType; use polymesh_primitives::{Balance, IdentityId}; @@ -64,7 +62,7 @@ pub struct TickerRegistration { } /// struct to store the ticker registration config. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] #[derive( Clone, Debug, diff --git a/pallets/balances/Cargo.toml b/pallets/balances/Cargo.toml deleted file mode 100644 index 2bd4a7fa41..0000000000 --- a/pallets/balances/Cargo.toml +++ /dev/null @@ -1,62 +0,0 @@ -[package] -name = "pallet-balances" -version = "0.1.0" -authors = ["PolymeshAssociation"] -edition = "2021" - -[dependencies] -# Our pallets -pallet-permissions = { workspace = true, default-features = false } -pallet-identity = { workspace = true, default-features = false } -polymesh-primitives = { workspace = true, default-features = false } - -log = "0.4.8" -serde = { version = "1.0.104", default-features = false } -serde_derive = { version = "1.0.104", optional = true, default-features = false} - -codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-arithmetic = { version = "6.0.0", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } - -pallet-timestamp = { version = "4.0.0-dev", default-features = false } - -# Benchmarking -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } - -[features] -equalize = [] -default = ["std", "equalize"] -no_std = [] -only-staking = [] -std = [ - "serde_derive", - "serde/std", - "codec/std", - "sp-std/std", - "sp-io/std", - "sp-core/std", - "sp-runtime/std", - "sp-version/std", - "sp-api/std", - "sp-arithmetic/std", - "frame-system/std", - "frame-support/std", - "pallet-timestamp/std", - "polymesh-primitives/std", - "pallet-permissions/std", - "pallet-identity/std", -] -runtime-benchmarks = [ - "frame-benchmarking", - "pallet-permissions/runtime-benchmarks", - "pallet-identity/runtime-benchmarks", -] -try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/balances/src/benchmarking.rs b/pallets/balances/src/benchmarking.rs deleted file mode 100644 index f8f1ac8dc5..0000000000 --- a/pallets/balances/src/benchmarking.rs +++ /dev/null @@ -1,91 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Balances pallet benchmarking. - -use super::*; -use crate::Pallet as Balances; -use frame_benchmarking::benchmarks; -use frame_system::RawOrigin; -use pallet_identity::benchmarking::UserBuilder; - -fn make_worst_memo() -> Option { - Some(Memo([7u8; 32])) -} - -benchmarks! { - // Benchmark `transfer` extrinsic with the worst possible conditions: - // * Transfer will create the recipient account. - transfer { - let amount = Balance::from(500u32); - let caller = UserBuilder::::default().balance(1200u32).generate_did().build("caller"); - let recipient = UserBuilder::::default().balance(0u32).generate_did().build( "recipient"); - }: _(caller.origin(), recipient.lookup(), amount) - verify { - assert_eq!(Balances::::free_balance(&caller.account), (1200u32-500).into()); - assert_eq!(Balances::::free_balance(&recipient.account), amount); - } - - transfer_with_memo { - let caller = UserBuilder::::default().balance(1000u32).generate_did().build("caller"); - let recipient = UserBuilder::::default().balance(0u32).generate_did().build("recipient"); - let amount = 42u32.into(); - let memo = make_worst_memo(); - - }: _(caller.origin(), recipient.lookup(), amount, memo) - verify { - assert_eq!(Balances::::free_balance(&caller.account), (1000u32-42).into()); - assert_eq!(Balances::::free_balance(&recipient.account), amount); - } - - deposit_block_reward_reserve_balance { - let caller = UserBuilder::::default().balance(1000u32).generate_did().build("caller"); - let amount = 500u32.into(); - }: _(caller.origin(), amount) - verify { - assert_eq!(Balances::::free_balance(&caller.account), (1000u32-500).into()); - assert_eq!(Balances::::block_rewards_reserve_balance(), amount); - } - - set_balance { - let caller = UserBuilder::::default().balance(1000u32).generate_did().build("caller"); - let free_balance: Balance = 1_000_000u32.into(); - let reserved_balance: Balance = 100u32.into(); - }: _(RawOrigin::Root, caller.lookup(), free_balance.clone(), reserved_balance) - verify { - assert_eq!(Balances::::free_balance(&caller.account), free_balance); - assert_eq!(Balances::::reserved_balance(&caller.account), reserved_balance); - } - - force_transfer { - let source = UserBuilder::::default().balance(1000u32).generate_did().build("source"); - let dest = UserBuilder::::default().balance(1u32).generate_did().build("dest"); - let amount = 500u32.into(); - }: _(RawOrigin::Root, source.lookup(), dest.lookup(), amount) - verify { - assert_eq!(Balances::::free_balance(&source.account), (1000u32-500).into()); - assert_eq!(Balances::::free_balance(&dest.account), (1u32+500).into()); - } - - burn_account_balance { - let caller = UserBuilder::::default().balance(1000u32).generate_did().build("caller"); - let amount = 500u32.into(); - }: _(caller.origin(), amount) - verify { - assert_eq!(Balances::::free_balance(&caller.account), (1000u32-500).into()); - } -} diff --git a/pallets/balances/src/imbalances.rs b/pallets/balances/src/imbalances.rs deleted file mode 100644 index de981826b8..0000000000 --- a/pallets/balances/src/imbalances.rs +++ /dev/null @@ -1,193 +0,0 @@ -// This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). -// Copyright (c) 2020 Polymesh Association - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3. - -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -use crate::BlockRewardConfig; -use core::marker::PhantomData; -use frame_support::traits::{Imbalance, SameOrOther, TryDrop}; -use polymesh_primitives::traits::BlockRewardsReserveCurrency; -use polymesh_primitives::Balance; -use sp_arithmetic::traits::Zero; -use sp_std::{mem, result}; - -// wrapping these imbalances in a private module is necessary to ensure absolute privacy -// of the inner member. - -/// Opaque, move-only struct with private fields that serves as a token denoting that -/// funds have been created without any equal and opposite accounting. -#[must_use] -pub struct PositiveImbalance(Balance, PhantomData); - -impl Default for PositiveImbalance { - fn default() -> Self { - Self::new(<_>::default()) - } -} - -impl PositiveImbalance { - /// Create a new positive imbalance from a balance. - pub fn new(amount: Balance) -> Self { - PositiveImbalance(amount, PhantomData) - } -} - -impl TryDrop for PositiveImbalance { - fn try_drop(self) -> result::Result<(), Self> { - self.drop_zero() - } -} - -impl Imbalance for PositiveImbalance { - type Opposite = NegativeImbalance; - - fn zero() -> Self { - Self::new(Zero::zero()) - } - - fn drop_zero(self) -> result::Result<(), Self> { - if self.0.is_zero() { - Ok(()) - } else { - Err(self) - } - } - - fn split(self, amount: Balance) -> (Self, Self) { - let first = self.0.min(amount); - let second = self.0 - first; - - mem::forget(self); - (Self::new(first), Self::new(second)) - } - - fn merge(mut self, other: Self) -> Self { - self.0 = self.0.saturating_add(other.0); - mem::forget(other); - - self - } - - fn subsume(&mut self, other: Self) { - self.0 = self.0.saturating_add(other.0); - mem::forget(other); - } - - fn offset(self, other: Self::Opposite) -> SameOrOther { - let (a, b) = (self.0, other.0); - mem::forget((self, other)); - - if a > b { - SameOrOther::Same(Self::new(a - b)) - } else if b > a { - SameOrOther::Other(NegativeImbalance::new(b - a)) - } else { - SameOrOther::None - } - } - - fn peek(&self) -> Balance { - self.0 - } -} - -impl Drop for PositiveImbalance { - /// Basic drop handler will just square up the total issuance. - fn drop(&mut self) { - T::BlockRewardsReserve::drop_positive_imbalance(self.0); - } -} - -/// Opaque, move-only struct with private fields that serves as a token denoting that -/// funds have been destroyed without any equal and opposite accounting. -#[must_use] -pub struct NegativeImbalance(Balance, PhantomData); - -impl Default for NegativeImbalance { - fn default() -> Self { - Self::new(<_>::default()) - } -} - -impl NegativeImbalance { - /// Create a new negative imbalance from a balance. - pub fn new(amount: Balance) -> Self { - NegativeImbalance(amount, PhantomData) - } -} - -impl TryDrop for NegativeImbalance { - fn try_drop(self) -> result::Result<(), Self> { - self.drop_zero() - } -} - -impl Imbalance for NegativeImbalance { - type Opposite = PositiveImbalance; - - fn zero() -> Self { - Self::new(Zero::zero()) - } - - fn drop_zero(self) -> result::Result<(), Self> { - if self.0.is_zero() { - Ok(()) - } else { - Err(self) - } - } - - fn split(self, amount: Balance) -> (Self, Self) { - let first = self.0.min(amount); - let second = self.0 - first; - - mem::forget(self); - (Self::new(first), Self::new(second)) - } - - fn merge(mut self, other: Self) -> Self { - self.0 = self.0.saturating_add(other.0); - mem::forget(other); - - self - } - - fn subsume(&mut self, other: Self) { - self.0 = self.0.saturating_add(other.0); - mem::forget(other); - } - - fn offset(self, other: Self::Opposite) -> SameOrOther { - let (a, b) = (self.0, other.0); - mem::forget((self, other)); - - if a > b { - SameOrOther::Same(Self::new(a - b)) - } else if b > a { - SameOrOther::Other(PositiveImbalance::new(b - a)) - } else { - SameOrOther::None - } - } - - fn peek(&self) -> Balance { - self.0 - } -} - -impl Drop for NegativeImbalance { - /// Basic drop handler will just square up the total issuance. - fn drop(&mut self) { - T::BlockRewardsReserve::drop_negative_imbalance(self.0); - } -} diff --git a/pallets/balances/src/lib.rs b/pallets/balances/src/lib.rs deleted file mode 100644 index fe1cc301fc..0000000000 --- a/pallets/balances/src/lib.rs +++ /dev/null @@ -1,1528 +0,0 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -// Modified by Polymesh Association - 16th March 2020 -// Implement `BlockRewardsReserveCurrency` trait in the balances module. -// Remove migration functionality from the balances module as Polymesh doesn't needed -// any migration data structure. - -//! # Balances Module -//! -//! The Balances module provides functionality for handling accounts and balances. -//! -//! - [`balances::Trait`](./trait.Trait.html) -//! - [`Call`](./enum.Call.html) -//! - [`Module`](./struct.Module.html) -//! -//! ## Overview -//! -//! This is a modified implementation of substrate's balances FRAME. -//! The modifications made are as follows: -//! -//! - To curb front running, sending a tip along with your transaction is now prohibited. -//! - Added From trait to Balances type. -//! - Removed existential amount requirement to prevent a replay attack scenario. -//! - Added block rewards reserve that subsidize minting for block rewards. -//! - Added CDD check for POLYX recipients. -//! - Added ability to attach a memo with a transfer. -//! - Added ability to burn your tokens. -//! -//! The Original Balances module provides functions for: -//! -//! - Getting and setting free balances. -//! - Retrieving total, reserved and unreserved balances. -//! - Repatriating a reserved balance to a beneficiary account that exists. -//! - Transferring a balance between accounts (when not reserved). -//! - Slashing an account balance. -//! - Account creation and removal. -//! - Managing total issuance. -//! - Setting and managing locks. -//! -//! ### Terminology -//! -//! - **Total Issuance:** The total number of units in existence in a system. -//! - **Reaping an account:** The act of removing an account by resetting its nonce. Happens after its balance is set -//! to zero. -//! - **Free Balance:** The portion of a balance that is not reserved. The free balance is the only balance that matters -//! for most operations. -//! - **Reserved Balance:** Reserved balance still belongs to the account holder, but is suspended. Reserved balance -//! can still be slashed, but only after all the free balance has been slashed. -//! - **Imbalance:** A condition when some funds were credited or debited without equal and opposite accounting -//! (i.e. a difference between total issuance and account balances). Functions that result in an imbalance will -//! return an object of the `Imbalance` trait that can be managed within your runtime logic. (If an imbalance is -//! simply dropped, it should automatically maintain any book-keeping such as total issuance.) -//! - **Lock:** A freeze on a specified amount of an account's free balance until a specified block number. Multiple -//! locks always operate over the same funds, so they "overlay" rather than "stack". -//! - **Vesting:** Similar to a lock, this is another, but independent, liquidity restriction that reduces linearly -//! over time. -//! -//! ### Implementations -//! -//! The Balances module provides implementations for the following traits. If these traits provide the functionality -//! that you need, then you can avoid coupling with the Balances module. -//! -//! - [`Currency`](../frame_support/traits/trait.Currency.html): Functions for dealing with a -//! fungible assets system. -//! - [`ReservableCurrency`](../frame_support/traits/trait.ReservableCurrency.html): -//! Functions for dealing with assets that can be reserved from an account. -//! - [`LockableCurrency`](../frame_support/traits/trait.LockableCurrency.html): Functions for -//! dealing with accounts that allow liquidity restrictions. -//! - [`Imbalance`](../frame_support/traits/trait.Imbalance.html): Functions for handling -//! imbalances between total issuance in the system and account balances. Must be used when a function -//! creates new funds (e.g. a reward) or destroys some funds (e.g. a system fee). -//! -//! ## Interface -//! -//! ### Dispatchable Functions -//! -//! - `transfer` - Transfer some liquid free balance to another account. -//! - `transfer_with_memo` - Transfer some liquid free balance to another account alon with a memo. -//! - `set_balance` - Set the balances of a given account. The origin of this call must be root. -//! - `deposit_block_reward_reserve_balance` - Transfer some liquid free balance to block rewards reserve. -//! - `force_transfer` - Force transfer some balance from one account to another. The origin of this call must be root. -//! - `burn_account_balance` - Burn some liquid free balance. - -//! ### Public Functions -//! -//! - `free_balance` - Get the free balance of an account. -//! - `usable_balance` - Get the balance of an account that can be used for transfers, reservations, or any other non-locking, non-transaction-fee activity. -//! - `usable_balance_for_fees` - Get the balance of an account that can be used for paying transaction fees (not tipping, or any other kind of fees, though). -//! - `reserved_balance` - Get the reserved balance of an account. -//! ## Usage -//! -//! The following examples show how to use the Balances module in your custom module. -//! -//! ### Examples from the FRAME -//! -//! The Contract module uses the `Currency` trait to handle gas payment, and its types inherit from `Currency`: -//! -//! ``` -//! use frame_support::traits::Currency; -//! # pub trait Trait: frame_system::Config { -//! # type Currency: Currency; -//! # } -//! -//! pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; -//! pub type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; -//! -//! # fn main() {} -//! ``` -//! -//! The Staking module uses the `LockableCurrency` trait to lock a stash account's funds: -//! -//! ``` -//! use frame_support::traits::{WithdrawReasons, LockableCurrency}; -//! use sp_runtime::traits::Bounded; -//! pub trait Trait: frame_system::Config { -//! type Currency: LockableCurrency; -//! } -//! # struct StakingLedger { -//! # stash: ::AccountId, -//! # total: <::Currency as frame_support::traits::Currency<::AccountId>>::Balance, -//! # phantom: std::marker::PhantomData, -//! # } -//! # const STAKING_ID: [u8; 8] = *b"staking "; -//! -//! fn update_ledger( -//! controller: &T::AccountId, -//! ledger: &StakingLedger -//! ) { -//! T::Currency::set_lock( -//! STAKING_ID, -//! &ledger.stash, -//! ledger.total, -//! WithdrawReasons::all() -//! ); -//! // >::insert(controller, ledger); // Commented out as we don't have access to Staking's storage here. -//! } -//! # fn main() {} -//! ``` -//! -//! ## Genesis config -//! -//! The Balances module depends on the [`GenesisConfig`](./struct.GenesisConfig.html). -//! -//! ## Assumptions -//! -//! * Total issued balanced of all accounts should be less than `Trait::Balance::max_value()`. - -#![cfg_attr(not(feature = "std"), no_std)] - -#[cfg(feature = "runtime-benchmarks")] -pub mod benchmarking; - -pub mod imbalances; -pub use imbalances::{NegativeImbalance, PositiveImbalance}; - -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{ - dispatch::{DispatchError, DispatchResult}, - ensure, - traits::{ - tokens::{fungible, BalanceStatus as Status, DepositConsequence, WithdrawConsequence}, - Currency, ExistenceRequirement, Get, Imbalance, LockIdentifier, LockableCurrency, - OnUnbalanced, ReservableCurrency, SignedImbalance, StoredMap, WithdrawReasons, - }, - weights::Weight, -}; -use frame_system::{self as system, ensure_root, ensure_signed}; -use polymesh_primitives::traits::{BlockRewardsReserveCurrency, CheckCdd, IdentityFnTrait}; -use polymesh_primitives::{Balance, IdentityId, Memo, SystematicIssuers, GC_DID}; -use scale_info::TypeInfo; -use sp_runtime::{ - traits::{AccountIdConversion, StaticLookup, Zero}, - RuntimeDebug, -}; -use sp_std::ops::BitOr; -use sp_std::{cmp, mem, prelude::*, result}; - -type CallPermissions = pallet_permissions::Pallet; - -pub trait BlockRewardConfig: Sized { - type BlockRewardsReserve: BlockRewardsReserveCurrency>; -} - -// POLYMESH-NOTE: Make `AccountData` public to access it from the outside module. -/// All balance information for an account. -#[derive( - Encode, - Decode, - Clone, - PartialEq, - Eq, - Default, - RuntimeDebug, - MaxEncodedLen, - TypeInfo -)] -pub struct AccountData { - /// Non-reserved part of the balance. There may still be restrictions on this, but it is the - /// total pool what may in principle be transferred, reserved and used for tipping. - /// - /// This is the only balance that matters in terms of most operations on tokens. It - /// alone is used to determine the balance when in the contract execution environment. - pub free: Balance, - /// Balance which is reserved and may not be used at all. - /// - /// This can still get slashed, but gets slashed last of all. - /// - /// This balance is a 'reserve' balance that other subsystems use in order to set aside tokens - /// that are still 'owned' by the account holder, but which are suspendable. - pub reserved: Balance, - /// The amount that `free` may not drop below when withdrawing for *anything except transaction - /// fee payment*. - pub misc_frozen: Balance, - /// The amount that `free` may not drop below when withdrawing specifically for transaction - /// fee payment. - pub fee_frozen: Balance, -} - -impl AccountData { - /// How much this account's balance can be reduced for the given `reasons`. - pub fn usable(&self, reasons: Reasons) -> Balance { - self.free.saturating_sub(self.frozen(reasons)) - } - /// The amount that this account's free balance may not be reduced beyond for the given - /// `reasons`. - pub fn frozen(&self, reasons: Reasons) -> Balance { - match reasons { - Reasons::All => self.misc_frozen.max(self.fee_frozen), - Reasons::Misc => self.misc_frozen, - Reasons::Fee => self.fee_frozen, - } - } - /// The total balance in this account including any that is reserved and ignoring any frozen. - pub fn total(&self) -> Balance { - self.free.saturating_add(self.reserved) - } -} - -/// Simplified reasons for withdrawing balance. -#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)] -#[allow(clippy::unnecessary_cast)] -pub enum Reasons { - /// Paying system transaction fees. - Fee = 0, - /// Any reason other than paying system transaction fees. - Misc = 1, - /// Any reason at all. - All = 2, -} - -impl From for Reasons { - fn from(r: WithdrawReasons) -> Reasons { - if r == WithdrawReasons::TRANSACTION_PAYMENT { - Reasons::Fee - } else if r.contains(WithdrawReasons::TRANSACTION_PAYMENT) { - Reasons::All - } else { - Reasons::Misc - } - } -} - -impl BitOr for Reasons { - type Output = Reasons; - fn bitor(self, other: Reasons) -> Reasons { - if self == other { - return self; - } - Reasons::All - } -} - -pub use pallet::*; - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - /// An account was created with some free balance. \[did, account, free_balance] - Endowed(Option, T::AccountId, Balance), - /// Transfer succeeded (from_did, from, to_did, to, value, memo). - Transfer( - Option, - T::AccountId, - Option, - T::AccountId, - Balance, - Option, - ), - /// A balance was set by root (did, who, free, reserved). - BalanceSet(IdentityId, T::AccountId, Balance, Balance), - /// The account and the amount of unlocked balance of that account that was burned. - /// (caller Id, caller account, amount) - AccountBalanceBurned(IdentityId, T::AccountId, Balance), - /// Some balance was reserved (moved from free to reserved). \[who, value] - Reserved(T::AccountId, Balance), - /// Some balance was unreserved (moved from reserved to free). \[who, value] - Unreserved(T::AccountId, Balance), - /// Some balance was moved from the reserve of the first account to the second account. - /// Final argument indicates the destination balance type. - /// \[from, to, balance, destination_status] - ReserveRepatriated(T::AccountId, T::AccountId, Balance, Status), - /// Transfer with memo succeeded. - TransferWithMemo { - from: T::AccountId, - to: T::AccountId, - amount: Balance, - memo: Option, - }, - } - - #[pallet::pallet] - pub struct Pallet(_); - - pub trait WeightInfo { - fn transfer() -> Weight; - fn transfer_with_memo() -> Weight; - fn deposit_block_reward_reserve_balance() -> Weight; - fn set_balance() -> Weight; - fn force_transfer() -> Weight; - fn burn_account_balance() -> Weight; - } - - #[pallet::config] - pub trait Config: frame_system::Config + pallet_identity::Config + BlockRewardConfig { - /// The means of storing the balances of an account. - type AccountStore: StoredMap; - - /// Handler for the unbalanced reduction when removing a dust account. - type DustRemoval: OnUnbalanced>; - - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - /// This type is no longer needed but kept for compatibility reasons. - /// The minimum amount required to keep an account open. - #[pallet::constant] - type ExistentialDeposit: Get; - - /// Used to check if an account is linked to a CDD'd identity - type CddChecker: CheckCdd; - - /// Weight information for extrinsics in this pallet. - type WeightInfo: WeightInfo; - - /// The maximum number of locks that should exist on an account. - /// Not strictly enforced, but used for weight estimation. - type MaxLocks: Get; - } - - /// Additional functionality atop `LockableCurrency` allowing a local, - /// per-id, stacking layer atop the overlay. - pub trait LockableCurrencyExt: - LockableCurrency - { - /// Reduce the locked amount under `id` for `who`. - /// If less than `amount` was locked, then `InsufficientBalance` is raised. - /// If the whole locked amount is reduced, then the lock is removed. - fn reduce_lock(id: LockIdentifier, who: &AccountId, amount: Balance) -> DispatchResult; - - /// Increase the locked amount under `id` for `who` or raises `Overflow`. - /// If there's no lock already, it will be made, unless `amount.is_zero()`. - /// Before committing to storage, `check_sum` is called with the lock total, - /// allowing the transaction to be aborted. - fn increase_lock( - id: LockIdentifier, - who: &AccountId, - amount: Balance, - reasons: WithdrawReasons, - check_sum: impl FnOnce(Balance) -> DispatchResult, - ) -> DispatchResult; - } - - #[pallet::error] - pub enum Error { - /// Account liquidity restrictions prevent withdrawal - LiquidityRestrictions, - /// Got an overflow after adding - Overflow, - /// Balance too low to send value - InsufficientBalance, - /// Value too low to create account due to existential deposit - ExistentialDeposit, - /// Receiver does not have a valid CDD - ReceiverCddMissing, - } - - /// A single lock on a balance. There can be many of these on an account and they "overlap", so the - /// same balance is frozen by multiple locks. - #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] - pub struct BalanceLock { - /// An identifier for this lock. Only one lock may be in existence for each identifier. - pub id: LockIdentifier, - /// The amount which the free balance may not drop below when this lock is in effect. - pub amount: Balance, - /// If true, then the lock remains in effect even for payment of transaction fees. - pub reasons: Reasons, - } - - /// The total units issued in the system. - #[pallet::storage] - pub type TotalIssuance = StorageValue<_, Balance, ValueQuery>; - - /// Any liquidity locks on some account balances. - /// NOTE: Should only be accessed when setting, changing and freeing a lock. - #[pallet::storage] - #[pallet::unbounded] - pub type Locks = - StorageMap<_, Blake2_128Concat, T::AccountId, Vec>, ValueQuery>; - - #[pallet::genesis_config] - #[derive(frame_support::DefaultNoBound)] - pub struct GenesisConfig { - pub balances: Vec<(T::AccountId, Balance)>, - } - - #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { - fn build(&self) { - let f = |u: Balance, &v| u + v; - let total: Balance = self.balances.iter().map(|(_, v)| v).fold(Zero::zero(), f); - TotalIssuance::::put(total); - - for (who, free) in &self.balances { - T::AccountStore::insert( - who, - AccountData { - free: *free, - ..Default::default() - }, - ) - .unwrap(); - } - } - } - - #[pallet::call] - impl Pallet { - /// Transfer some liquid free balance to another account. - /// - /// `transfer` will set the `FreeBalance` of the sender and receiver. - /// It will decrease the total issuance of the system by the `TransferFee`. - /// - /// The dispatch origin for this call must be `Signed` by the transactor. - /// - /// # - /// - Dependent on arguments but not critical, given proper implementations for - /// input config types. See related functions below. - /// - It contains a limited number of reads and writes internally and no complex computation. - /// - /// Related functions: - /// - /// - `ensure_can_withdraw` is always called internally but has a bounded complexity. - /// - Transferring balances to accounts that did not exist before will cause - /// `T::OnNewAccount::on_new_account` to be called. - /// --------------------------------- - /// - Base Weight: 73.64 µs, worst case scenario (account created, account removed) - /// - DB Weight: 1 Read and 1 Write to destination account. - /// - Origin account is already in memory, so no DB operations for them. - /// # - #[pallet::weight(::WeightInfo::transfer())] - #[pallet::call_index(0)] - pub fn transfer( - origin: OriginFor, - dest: ::Source, - #[pallet::compact] value: Balance, - ) -> DispatchResult { - let transactor = ensure_signed(origin)?; - let dest = T::Lookup::lookup(dest)?; - // Polymesh modified code. CDD is checked before processing transfer. - Self::transfer_core( - &transactor, - &dest, - value, - None, - ExistenceRequirement::AllowDeath, - ) - } - - // Polymesh modified code. New function to transfer with a memo. - /// Transfer the native currency with the help of identifier string - /// this functionality can help to differentiate the transfers. - /// - /// # - /// - Base Weight: 73.64 µs, worst case scenario (account created, account removed) - /// - DB Weight: 1 Read and 1 Write to destination account. - /// - Origin account is already in memory, so no DB operations for them. - /// # - #[pallet::weight(::WeightInfo::transfer_with_memo())] - #[pallet::call_index(1)] - pub fn transfer_with_memo( - origin: OriginFor, - dest: ::Source, - #[pallet::compact] value: Balance, - memo: Option, - ) -> DispatchResult { - let transactor = ensure_signed(origin)?; - let dest = T::Lookup::lookup(dest)?; - Self::transfer_core( - &transactor, - &dest, - value, - memo, - ExistenceRequirement::AllowDeath, - ) - } - - // Polymesh specific change. New function to transfer balance to BRR. - /// Move some POLYX from balance of self to balance of BRR. - #[pallet::weight(::WeightInfo::deposit_block_reward_reserve_balance())] - #[pallet::call_index(2)] - pub fn deposit_block_reward_reserve_balance( - origin: OriginFor, - #[pallet::compact] value: Balance, - ) -> DispatchResult { - let transactor = ensure_signed(origin)?; - CallPermissions::::ensure_call_permissions(&transactor)?; - let dest = Self::block_rewards_reserve(); - Self::transfer_core( - &transactor, - &dest, - value, - None, - ExistenceRequirement::AllowDeath, - ) - } - - /// Set the balances of a given account. - /// - /// This will alter `FreeBalance` and `ReservedBalance` in storage. it will - /// also decrease the total issuance of the system (`TotalIssuance`). - /// - /// The dispatch origin for this call is `root`. - #[pallet::weight(::WeightInfo::set_balance())] - #[pallet::call_index(3)] - pub fn set_balance( - origin: OriginFor, - who: ::Source, - #[pallet::compact] new_free: Balance, - #[pallet::compact] new_reserved: Balance, - ) -> DispatchResult { - ensure_root(origin)?; - let who = T::Lookup::lookup(who)?; - let caller_id = GC_DID; - - let (free, reserved) = Self::mutate_account(&who, |account| { - if new_free > account.free { - mem::drop(PositiveImbalance::::new(new_free - account.free)); - } else if new_free < account.free { - mem::drop(NegativeImbalance::::new(account.free - new_free)); - } - - if new_reserved > account.reserved { - mem::drop(PositiveImbalance::::new(new_reserved - account.reserved)); - } else if new_reserved < account.reserved { - mem::drop(NegativeImbalance::::new(account.reserved - new_reserved)); - } - - account.free = new_free; - account.reserved = new_reserved; - - (account.free, account.reserved) - }); - Self::deposit_event(Event::BalanceSet(caller_id, who, free, reserved)); - Ok(()) - } - - /// Exactly as `transfer`, except the origin must be root and the source account may be - /// specified. - /// - /// # - /// - Same as transfer, but additional read and write because the source account is - /// not assumed to be in the overlay. - /// # - #[pallet::weight(::WeightInfo::force_transfer())] - #[pallet::call_index(4)] - pub fn force_transfer( - origin: OriginFor, - source: ::Source, - dest: ::Source, - #[pallet::compact] value: Balance, - ) -> DispatchResult { - ensure_root(origin)?; - let source = T::Lookup::lookup(source)?; - let dest = T::Lookup::lookup(dest)?; - Self::transfer_core( - &source, - &dest, - value, - None, - ExistenceRequirement::AllowDeath, - ) - } - - // Polymesh modified code. New dispatchable function that anyone can call to burn their balance. - /// Burns the given amount of tokens from the caller's free, unlocked balance. - #[pallet::weight(::WeightInfo::burn_account_balance())] - #[pallet::call_index(5)] - pub fn burn_account_balance(origin: OriginFor, amount: Balance) -> DispatchResult { - let who = ensure_signed(origin)?; - let caller_id = CallPermissions::::ensure_call_permissions(&who)?.primary_did; - // Withdraw the account balance and burn the resulting imbalance by dropping it. - let _ = >::withdraw( - &who, - amount, - // There is no specific "burn" reason in Substrate. However, if the caller is - // allowed to transfer then they should also be allowed to burn. - WithdrawReasons::TRANSFER, - ExistenceRequirement::AllowDeath, - )?; - Self::deposit_event(Event::AccountBalanceBurned(caller_id, who, amount)); - Ok(()) - } - } -} - -impl Pallet { - // PRIVATE MUTABLES - - /// Get the free balance of an account. - pub fn free_balance(who: impl sp_std::borrow::Borrow) -> Balance { - Self::account(who.borrow()).free - } - - /// Get the balance of an account that can be used for transfers, reservations, or any other - /// non-locking, non-transaction-fee activity. Will be at most `free_balance`. - pub fn usable_balance(who: impl sp_std::borrow::Borrow) -> Balance { - Self::account(who.borrow()).usable(Reasons::Misc) - } - - /// Get the balance of an account that can be used for paying transaction fees (not tipping, - /// or any other kind of fees, though). Will be at most `free_balance`. - pub fn usable_balance_for_fees(who: impl sp_std::borrow::Borrow) -> Balance { - Self::account(who.borrow()).usable(Reasons::Fee) - } - - /// Get the reserved balance of an account. - pub fn reserved_balance(who: impl sp_std::borrow::Borrow) -> Balance { - Self::account(who.borrow()).reserved - } - - pub fn block_rewards_reserve() -> T::AccountId { - SystematicIssuers::BlockRewardReserve - .as_pallet_id() - .into_account_truncating() - } - - /// Get both the free and reserved balances of an account. - fn account(who: &T::AccountId) -> AccountData { - T::AccountStore::get(&who) - } - - /// Places the `free` and `reserved` parts of `new` into `account`. Also does any steps needed - /// after mutating an account. This includes DustRemoval unbalancing, in the case than the `new` - /// account's total balance is non-zero but below ED. - /// - /// Returns the final free balance, iff the account was previously of total balance zero, known - /// as its "endowment". - fn post_mutation(_who: &T::AccountId, new: AccountData) -> Option { - // Polymesh modified code. Removed Existential Deposit logic - Some(new) - } - - fn deposit_consequence( - _who: &T::AccountId, - amount: Balance, - account: &AccountData, - mint: bool, - ) -> DepositConsequence { - if amount.is_zero() { - return DepositConsequence::Success; - } - - if mint && TotalIssuance::::get().checked_add(amount).is_none() { - return DepositConsequence::Overflow; - } - - let new_total_balance = match account.total().checked_add(amount) { - Some(x) => x, - None => return DepositConsequence::Overflow, - }; - - if new_total_balance < T::ExistentialDeposit::get() { - return DepositConsequence::BelowMinimum; - } - - // NOTE: We assume that we are a provider, so don't need to do any checks in the - // case of account creation. - - DepositConsequence::Success - } - - fn withdraw_consequence( - who: &T::AccountId, - amount: Balance, - account: &AccountData, - ) -> WithdrawConsequence { - if amount.is_zero() { - return WithdrawConsequence::Success; - } - - if TotalIssuance::::get().checked_sub(amount).is_none() { - return WithdrawConsequence::Underflow; - } - - let new_total_balance = match account.total().checked_sub(amount) { - Some(x) => x, - None => return WithdrawConsequence::NoFunds, - }; - - // Provider restriction - total account balance cannot be reduced to zero if it cannot - // sustain the loss of a provider reference. - // NOTE: This assumes that the pallet is a provider (which is true). Is this ever changes, - // then this will need to adapt accordingly. - let ed = T::ExistentialDeposit::get(); - let success = if new_total_balance < ed { - if frame_system::Pallet::::can_dec_provider(who) { - WithdrawConsequence::ReducedToZero(new_total_balance) - } else { - return WithdrawConsequence::WouldDie; - } - } else { - WithdrawConsequence::Success - }; - - // Enough free funds to have them be reduced. - let new_free_balance = match account.free.checked_sub(amount) { - Some(b) => b, - None => return WithdrawConsequence::NoFunds, - }; - - // Eventual free funds must be no less than the frozen balance. - let min_balance = account.frozen(Reasons::All); - if new_free_balance < min_balance { - return WithdrawConsequence::Frozen; - } - - success - } - - /// Mutate an account to some new value, or delete it entirely with `None`. - /// - /// NOTE: Doesn't do any preparatory work for creating a new account, so should only be used - /// when it is known that the account already exists. - /// - /// NOTE: LOW-LEVEL: This will not attempt to maintain total issuance. It is expected that - /// the caller will do this. - pub fn mutate_account(who: &T::AccountId, f: impl FnOnce(&mut AccountData) -> R) -> R { - Self::try_mutate_account(who, |a, _| -> Result { Ok(f(a)) }) - .expect("Error is infallible; qed") - } - - /// Mutate an account to some new value, or delete it entirely with `None`. - /// This will do nothing if the result of `f` is an `Err`. - /// - /// NOTE: Doesn't do any preparatory work for creating a new account, so should only be used - /// when it is known that the account already exists. - /// - /// NOTE: LOW-LEVEL: This will not attempt to maintain total issuance. It is expected that - /// the caller will do this. - fn try_mutate_account>( - who: &T::AccountId, - f: impl FnOnce(&mut AccountData, bool) -> Result, - ) -> Result { - T::AccountStore::try_mutate_exists(who, |maybe_account| { - let is_new = maybe_account.is_none(); - let mut account = maybe_account.take().unwrap_or_default(); - f(&mut account, is_new).map(move |result| { - let maybe_endowed = if is_new { Some(account.free) } else { None }; - // `post_mutation` always return the same account store - *maybe_account = Self::post_mutation(who, account); - (maybe_endowed, result) - }) - }) - .map(|(maybe_endowed, result)| { - if let Some(endowed) = maybe_endowed { - // Polymesh-note: Modified the code in the favour of Polymesh code base - let who_id = T::IdentityFn::get_identity(who); - Self::deposit_event(Event::Endowed(who_id, who.clone(), endowed)); - } - result - }) - } - - /// Update the account entry for `who`, given the locks. - fn update_locks(who: &T::AccountId, locks: &[BalanceLock]) { - if locks.len() as u32 > T::MaxLocks::get() { - log::warn!( - "Warning: A user has more currency locks than expected. \ - A runtime configuration adjustment may be needed." - ); - } - - Self::mutate_account(who, |b| { - b.misc_frozen = Zero::zero(); - b.fee_frozen = Zero::zero(); - for l in locks.iter() { - if l.reasons == Reasons::All || l.reasons == Reasons::Misc { - b.misc_frozen = b.misc_frozen.max(l.amount); - } - if l.reasons == Reasons::All || l.reasons == Reasons::Fee { - b.fee_frozen = b.fee_frozen.max(l.amount); - } - } - }); - - let existed = Locks::::contains_key(who); - if locks.is_empty() { - Locks::::remove(who); - if existed { - // TODO: use Locks::::hashed_key - // https://github.com/paritytech/substrate/issues/4969 - system::Pallet::::dec_consumers(who); - } - } else { - Locks::::insert(who, locks); - if !existed { - let _ = system::Pallet::::inc_consumers(who); - } - } - } - - /// Common functionality for transfers. - /// It does not emit any event. - /// - /// # Return - /// On success, It will return the applied feed. - // Transfer some free balance from `transactor` to `dest`. - // Is a no-op if value to be transferred is zero or the `transactor` is the same as `dest`. - fn transfer_core( - transactor: &T::AccountId, - dest: &T::AccountId, - value: Balance, - memo: Option, - _existence_requirement: ExistenceRequirement, - ) -> DispatchResult { - if value.is_zero() || transactor == dest { - return Ok(()); - } - - Self::try_mutate_account(dest, |to_account, _| -> DispatchResult { - Self::try_mutate_account(transactor, |from_account, _| -> DispatchResult { - from_account.free = from_account - .free - .checked_sub(value) - .ok_or(Error::::InsufficientBalance)?; - - // NOTE: total stake being stored in the same type means that this could never overflow - // but better to be safe than sorry. - to_account.free = to_account - .free - .checked_add(value) - .ok_or(Error::::Overflow)?; - - Self::ensure_can_withdraw( - transactor, - value, - WithdrawReasons::TRANSFER, - from_account.free, - )?; - - Ok(()) - }) - })?; - - let transactor_id = T::IdentityFn::get_identity(transactor); - let dest_id = T::IdentityFn::get_identity(dest); - - Self::deposit_event(Event::TransferWithMemo { - from: transactor.clone(), - to: dest.clone(), - amount: value, - memo: memo.clone(), - }); - - Self::deposit_event(Event::Transfer( - transactor_id, - transactor.clone(), - dest_id, - dest.clone(), - value, - memo, - )); - - Ok(()) - } -} - -// Polymesh modified code. Managed BRR related functions. -impl BlockRewardsReserveCurrency> for Pallet { - // Polymesh modified code. Drop behavious modified to reduce BRR balance instead of inflating total supply. - fn drop_positive_imbalance(mut amount: Balance) { - if amount.is_zero() { - return; - } - let brr = Self::block_rewards_reserve(); - let _ = Self::try_mutate_account(&brr, |account, _| -> DispatchResult { - if account.free > Zero::zero() { - let old_brr_free_balance = account.free; - let new_brr_free_balance = old_brr_free_balance.saturating_sub(amount); - account.free = new_brr_free_balance; - // Calculate how much amount to mint that is not available with the Brr - // eg. amount = 100 and the account.free = 60 then `amount_to_mint` = 40 - amount -= old_brr_free_balance - new_brr_free_balance; - } - TotalIssuance::::mutate(|v| *v = v.saturating_add(amount)); - Ok(()) - }); - } - - fn drop_negative_imbalance(amount: Balance) { - TotalIssuance::::mutate(|v| *v = v.saturating_sub(amount)); - } - - // Polymesh modified code. Instead of minting new tokens, this function tries to transfer tokens from BRR to the beneficiary. - // If BRR does not have enough free funds, new tokens are issued. - fn issue_using_block_rewards_reserve(mut amount: Balance) -> NegativeImbalance { - if amount.is_zero() { - return NegativeImbalance::zero(); - } - let brr = Self::block_rewards_reserve(); - Self::try_mutate_account( - &brr, - |account, _| -> Result, DispatchError> { - let amount_to_mint = if account.free > Zero::zero() { - let old_brr_free_balance = account.free; - let new_brr_free_balance = old_brr_free_balance.saturating_sub(amount); - account.free = new_brr_free_balance; - // Calculate how much amount to mint that is not available with the Brr - // eg. amount = 100 and the account.free = 60 then `amount_to_mint` = 40 - amount - (old_brr_free_balance - new_brr_free_balance) - } else { - amount - }; - TotalIssuance::::mutate(|issued| { - *issued = issued.checked_add(amount_to_mint).unwrap_or_else(|| { - amount = Balance::max_value() - *issued; - Balance::max_value() - }) - }); - Ok(NegativeImbalance::new(amount)) - }, - ) - .unwrap_or_else(|_x| NegativeImbalance::new(Zero::zero())) - } - - // Polymesh modified code. Returns balance of BRR - fn block_rewards_reserve_balance() -> Balance { - let brr = Self::block_rewards_reserve(); - >::free_balance(&brr) - } -} - -impl Currency for Pallet { - type Balance = Balance; - type PositiveImbalance = PositiveImbalance; - type NegativeImbalance = NegativeImbalance; - - fn total_balance(who: &T::AccountId) -> Self::Balance { - Self::account(who).total() - } - - // Check if `value` amount of free balance can be slashed from `who`. - fn can_slash(who: &T::AccountId, value: Self::Balance) -> bool { - if value.is_zero() { - return true; - } - Self::free_balance(who) >= value - } - - fn total_issuance() -> Self::Balance { - TotalIssuance::::get() - } - - fn minimum_balance() -> Self::Balance { - Zero::zero() - } - - fn free_balance(who: &T::AccountId) -> Self::Balance { - Self::account(who).free - } - - // Burn funds from the total issuance, returning a positive imbalance for the amount burned. - // Is a no-op if amount to be burned is zero. - fn burn(mut amount: Self::Balance) -> Self::PositiveImbalance { - if amount.is_zero() { - return PositiveImbalance::zero(); - } - TotalIssuance::::mutate(|issued| { - *issued = issued.checked_sub(amount).unwrap_or_else(|| { - amount = *issued; - Zero::zero() - }); - }); - PositiveImbalance::new(amount) - } - - // Create new funds into the total issuance, returning a negative imbalance - // for the amount issued. - // Is a no-op if amount to be issued it zero. - fn issue(mut amount: Self::Balance) -> Self::NegativeImbalance { - if amount.is_zero() { - return NegativeImbalance::zero(); - } - TotalIssuance::::mutate(|issued| { - *issued = issued.checked_add(amount).unwrap_or_else(|| { - amount = Self::Balance::max_value() - *issued; - Self::Balance::max_value() - }) - }); - NegativeImbalance::new(amount) - } - - // Ensure that an account can withdraw from their free balance given any existing withdrawal - // restrictions like locks and vesting balance. - // Is a no-op if amount to be withdrawn is zero. - // - // # - // Despite iterating over a list of locks, they are limited by the number of - // lock IDs, which means the number of runtime modules that intend to use and create locks. - // # - fn ensure_can_withdraw( - who: &T::AccountId, - amount: Balance, - reasons: WithdrawReasons, - new_balance: Balance, - ) -> DispatchResult { - if amount.is_zero() { - return Ok(()); - } - let min_balance = Self::account(who).frozen(reasons.into()); - ensure!( - new_balance >= min_balance, - Error::::LiquidityRestrictions - ); - Ok(()) - } - - /// Transfer some free balance from `transactor` to `dest`. - /// Is a no-op if value to be transferred is zero or the `transactor` is the same as `dest`. - fn transfer( - transactor: &T::AccountId, - dest: &T::AccountId, - value: Self::Balance, - existence_requirement: ExistenceRequirement, - ) -> DispatchResult { - Self::transfer_core(transactor, dest, value, None, existence_requirement) - } - - /// Transfer some free balance from `transactor` to `dest`. - /// Is a no-op if value to be transferred is zero or the `transactor` is the same as `dest`. - fn transfer_no_cdd( - transactor: &T::AccountId, - dest: &T::AccountId, - value: Self::Balance, - existence_requirement: ExistenceRequirement, - ) -> DispatchResult { - Self::transfer_core(transactor, dest, value, None, existence_requirement) - } - - /// Slash a target account `who`, returning the negative imbalance created and any left over - /// amount that could not be slashed. - /// - /// Is a no-op if `value` to be slashed is zero. - /// - /// NOTE: `slash()` prefers free balance, but assumes that reserve balance can be drawn - /// from in extreme circumstances. `can_slash()` should be used prior to `slash()` to avoid having - /// to draw from reserved funds, however we err on the side of punishment if things are inconsistent - /// or `can_slash` wasn't used appropriately. - fn slash(who: &T::AccountId, value: Self::Balance) -> (Self::NegativeImbalance, Self::Balance) { - if value.is_zero() { - return (NegativeImbalance::zero(), Zero::zero()); - } - if Self::total_balance(who).is_zero() { - return (NegativeImbalance::zero(), value); - } - - Self::mutate_account(who, |account| { - let free_slash = cmp::min(account.free, value); - account.free -= free_slash; - - let remaining_slash = value - free_slash; - if !remaining_slash.is_zero() { - let reserved_slash = cmp::min(account.reserved, remaining_slash); - account.reserved -= reserved_slash; - ( - NegativeImbalance::new(free_slash + reserved_slash), - remaining_slash - reserved_slash, - ) - } else { - (NegativeImbalance::new(value), Zero::zero()) - } - }) - } - - /// Deposit some `value` into the free balance of an existing target account `who`. - /// - /// Is a no-op if the `value` to be deposited is zero. - fn deposit_into_existing( - who: &T::AccountId, - value: Self::Balance, - ) -> Result { - if value.is_zero() { - return Ok(PositiveImbalance::zero()); - } - - Self::try_mutate_account( - who, - |account, _| -> Result { - // Polymesh modified code. Removed existential deposit requirements. - // This function is now logically equivalent to `deposit_creating`. - - account.free = account - .free - .checked_add(value) - .ok_or(Error::::Overflow)?; - Ok(PositiveImbalance::new(value)) - }, - ) - } - - /// Deposit some `value` into the free balance of `who`, possibly creating a new account. - /// - /// This function is a no-op if: - /// - the `value` to be deposited is zero; or - /// - `value` is so large it would cause the balance of `who` to overflow. - fn deposit_creating(who: &T::AccountId, value: Self::Balance) -> Self::PositiveImbalance { - if value.is_zero() { - return Self::PositiveImbalance::zero(); - } - - Self::try_mutate_account( - who, - |account, _| -> Result { - // Polymesh modified code. Removed existential deposit requirements. - // This function is now logically equivalent to `deposit_into_existing`. - account.free = match account.free.checked_add(value) { - Some(x) => x, - None => return Ok(Self::PositiveImbalance::zero()), - }; - - Ok(PositiveImbalance::new(value)) - }, - ) - .unwrap_or_else(|_| Self::PositiveImbalance::zero()) - } - - /// Withdraw some free balance from an account - /// - /// Is a no-op if value to be withdrawn is zero. - fn withdraw( - who: &T::AccountId, - value: Self::Balance, - reasons: WithdrawReasons, - _liveness: ExistenceRequirement, - ) -> result::Result { - if value.is_zero() { - return Ok(NegativeImbalance::zero()); - } - - Self::try_mutate_account( - who, - |account, _| -> Result { - let new_free_account = account - .free - .checked_sub(value) - .ok_or(Error::::InsufficientBalance)?; - - // Polymesh modified code. Removed existential deposit requirements. - - Self::ensure_can_withdraw(who, value, reasons, new_free_account)?; - - account.free = new_free_account; - - Ok(NegativeImbalance::new(value)) - }, - ) - } - - /// Force the new free balance of a target account `who` to some new value `balance`. - fn make_free_balance_be( - who: &T::AccountId, - value: Self::Balance, - ) -> SignedImbalance { - Self::try_mutate_account( - who, - |account, _| -> Result, DispatchError> { - // Polymesh modified code. Removed existential deposit requirements. - - let imbalance = if account.free <= value { - SignedImbalance::Positive(PositiveImbalance::new(value - account.free)) - } else { - SignedImbalance::Negative(NegativeImbalance::new(account.free - value)) - }; - account.free = value; - Ok(imbalance) - }, - ) - .unwrap_or_else(|_| SignedImbalance::Positive(Self::PositiveImbalance::zero())) - } -} - -impl ReservableCurrency for Pallet { - /// Check if `who` can reserve `value` from their free balance. - /// - /// Always `true` if value to be reserved is zero. - fn can_reserve(who: &T::AccountId, value: Self::Balance) -> bool { - if value.is_zero() { - return true; - } - Self::account(who) - .free - .checked_sub(value) - .map_or(false, |new_balance| { - Self::ensure_can_withdraw(who, value, WithdrawReasons::RESERVE, new_balance).is_ok() - }) - } - - fn reserved_balance(who: &T::AccountId) -> Self::Balance { - Self::account(who).reserved - } - - /// Move `value` from the free balance from `who` to their reserved balance. - /// - /// Is a no-op if value to be reserved is zero. - fn reserve(who: &T::AccountId, value: Self::Balance) -> DispatchResult { - if value.is_zero() { - return Ok(()); - } - - Self::try_mutate_account(who, |account, _| -> DispatchResult { - account.free = account - .free - .checked_sub(value) - .ok_or(Error::::InsufficientBalance)?; - account.reserved = account - .reserved - .checked_add(value) - .ok_or(Error::::Overflow)?; - Self::ensure_can_withdraw(who, value, WithdrawReasons::RESERVE, account.free) - })?; - Self::deposit_event(Event::Reserved(who.clone(), value)); - Ok(()) - } - - /// Unreserve some funds, returning any amount that was unable to be unreserved. - /// - /// Is a no-op if the value to be unreserved is zero. - /// - /// NOTE: returns amount value which wasn't successfully unreserved. - fn unreserve(who: &T::AccountId, value: Self::Balance) -> Self::Balance { - if value.is_zero() { - return Zero::zero(); - } - if Self::total_balance(who).is_zero() { - return value; - } - - let actual = Self::mutate_account(who, |account| { - let actual = cmp::min(account.reserved, value); - account.reserved -= actual; - // defensive only: this can never fail since total issuance which is at least free+reserved - // fits into the same data type. - account.free = account.free.saturating_add(actual); - actual - }); - - Self::deposit_event(Event::Unreserved(who.clone(), actual)); - value - actual - } - - /// Slash from reserved balance, returning the negative imbalance created, - /// and any amount that was unable to be slashed. - /// - /// Is a no-op if the value to be slashed is zero. - fn slash_reserved( - who: &T::AccountId, - value: Self::Balance, - ) -> (Self::NegativeImbalance, Self::Balance) { - if value.is_zero() { - return (NegativeImbalance::zero(), Zero::zero()); - } - if Self::total_balance(who).is_zero() { - return (NegativeImbalance::zero(), value); - } - - Self::mutate_account(who, |account| { - // underflow should never happen, but it if does, there's nothing to be done here. - let actual = cmp::min(account.reserved, value); - account.reserved -= actual; - (NegativeImbalance::new(actual), value - actual) - }) - } - - /// Move the reserved balance of one account into the balance of another, according to `status`. - /// - /// Is a no-op if: - /// - the value to be moved is zero; or - /// - the `slashed` id equal to `beneficiary` and the `status` is `Reserved`. - /// - /// NOTE: returns actual amount of transferred value in `Ok` case. - fn repatriate_reserved( - slashed: &T::AccountId, - beneficiary: &T::AccountId, - value: Self::Balance, - status: Status, - ) -> Result { - if value.is_zero() { - return Ok(Zero::zero()); - } - - if slashed == beneficiary { - return match status { - Status::Free => Ok(value.saturating_sub(Self::unreserve(slashed, value))), - Status::Reserved => Ok(value.saturating_sub(Self::reserved_balance(slashed))), - }; - } - - let actual = Self::try_mutate_account( - beneficiary, - |to_account, _| -> Result { - // Polymesh modified code. Removed existential deposit requirements. - Self::try_mutate_account( - slashed, - |from_account, _| -> Result { - let actual = cmp::min(from_account.reserved, value); - match status { - Status::Free => { - to_account.free = to_account - .free - .checked_add(actual) - .ok_or(Error::::Overflow)? - } - Status::Reserved => { - to_account.reserved = to_account - .reserved - .checked_add(actual) - .ok_or(Error::::Overflow)? - } - } - from_account.reserved -= actual; - Ok(actual) - }, - ) - }, - )?; - Self::deposit_event(Event::ReserveRepatriated( - slashed.clone(), - beneficiary.clone(), - actual, - status, - )); - Ok(value - actual) - } -} - -impl LockableCurrency for Pallet { - type Moment = T::BlockNumber; - - type MaxLocks = T::MaxLocks; - - // Polymesh-note: The implementations below differ from substrate in terms - // of performance (ours uses in-place modification), but are functionally equivalent. - - // Set a lock on the balance of `who`. - // Is a no-op if lock amount is zero or `reasons` `is_empty()`. - fn set_lock(id: LockIdentifier, who: &T::AccountId, amount: Balance, reasons: WithdrawReasons) { - if amount.is_zero() || reasons.is_empty() { - return; - } - let new_lock = BalanceLock { - id, - amount, - reasons: reasons.into(), - }; - let mut locks = Locks::::get(who); - if let Some(pos) = locks.iter().position(|l| l.id == id) { - locks[pos] = new_lock; - } else { - locks.push(new_lock); - } - Self::update_locks(who, &locks[..]); - } - - // Extend a lock on the balance of `who`. - // Is a no-op if lock amount is zero or `reasons` `is_empty()`. - fn extend_lock( - id: LockIdentifier, - who: &T::AccountId, - amount: Balance, - reasons: WithdrawReasons, - ) { - if amount.is_zero() || reasons.is_empty() { - return; - } - let reasons = reasons.into(); - let mut locks = Locks::::get(who); - if let Some(pos) = locks.iter().position(|l| l.id == id) { - let slot = &mut locks[pos]; - slot.amount = slot.amount.max(amount); - slot.reasons = slot.reasons | reasons; - } else { - locks.push(BalanceLock { - id, - amount, - reasons, - }); - } - Self::update_locks(who, &locks[..]); - } - - fn remove_lock(id: LockIdentifier, who: &T::AccountId) { - let mut locks = Locks::::get(who); - locks.retain(|l| l.id != id); - Self::update_locks(who, &locks[..]); - } -} - -impl LockableCurrencyExt for Pallet { - fn reduce_lock(id: LockIdentifier, who: &T::AccountId, amount: Balance) -> DispatchResult { - if amount.is_zero() { - return Ok(()); - } - let mut locks = Locks::::get(who); - locks - .iter() - .position(|l| l.id == id) - .and_then(|p| { - let slot = &mut locks[p].amount; - let new = slot.checked_sub(amount).map(|n| *slot = n); - if slot.is_zero() { - locks.swap_remove(p); - } - new - }) - .ok_or(Error::::InsufficientBalance)?; - Self::update_locks(who, &locks[..]); - Ok(()) - } - - fn increase_lock( - id: LockIdentifier, - who: &T::AccountId, - amount: Balance, - reasons: WithdrawReasons, - check_sum: impl FnOnce(Balance) -> DispatchResult, - ) -> DispatchResult { - if amount.is_zero() || reasons.is_empty() { - return Ok(()); - } - let reasons = reasons.into(); - let mut locks = Locks::::get(who); - check_sum(if let Some(pos) = locks.iter().position(|l| l.id == id) { - let slot = &mut locks[pos]; - slot.amount = slot - .amount - .checked_add(amount) - .ok_or(Error::::Overflow)?; - slot.reasons = slot.reasons | reasons; - slot.amount - } else { - locks.push(BalanceLock { - id, - amount, - reasons, - }); - amount - })?; - Self::update_locks(who, &locks[..]); - Ok(()) - } -} - -impl fungible::Inspect for Pallet { - type Balance = Balance; - - fn total_issuance() -> Self::Balance { - TotalIssuance::::get() - } - fn minimum_balance() -> Self::Balance { - T::ExistentialDeposit::get() - } - fn balance(who: &T::AccountId) -> Self::Balance { - Self::account(who).total() - } - fn reducible_balance(who: &T::AccountId, keep_alive: bool) -> Self::Balance { - let a = Self::account(who); - // Liquid balance is what is neither reserved nor locked/frozen. - let liquid = a.free.saturating_sub(a.fee_frozen.max(a.misc_frozen)); - if frame_system::Pallet::::can_dec_provider(who) && !keep_alive { - liquid - } else { - // `must_remain_to_exist` is the part of liquid balance which must remain to keep total - // over ED. - let must_remain_to_exist = - T::ExistentialDeposit::get().saturating_sub(a.total() - liquid); - liquid.saturating_sub(must_remain_to_exist) - } - } - fn can_deposit(who: &T::AccountId, amount: Self::Balance, mint: bool) -> DepositConsequence { - Self::deposit_consequence(who, amount, &Self::account(who), mint) - } - fn can_withdraw( - who: &T::AccountId, - amount: Self::Balance, - ) -> WithdrawConsequence { - Self::withdraw_consequence(who, amount, &Self::account(who)) - } -} diff --git a/pallets/base/src/lib.rs b/pallets/base/src/lib.rs index f9ce076efe..230d3ab64e 100644 --- a/pallets/base/src/lib.rs +++ b/pallets/base/src/lib.rs @@ -26,9 +26,11 @@ use codec::{Decode, Encode}; use core::mem; -use frame_support::dispatch::{DispatchError, DispatchResult}; +use frame_support::dispatch::DispatchResult; use frame_support::ensure; +use frame_support::pallet_prelude::DispatchError; use frame_support::traits::Get; + use polymesh_primitives::checked_inc::CheckedInc; use polymesh_primitives::AccountId as AccountId32; @@ -41,9 +43,6 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config { - /// The overarching event type. - type RuntimeEvent: From + IsType<::RuntimeEvent>; - /// The maximum length governing `TooLong`. /// /// How lengths are computed to compare against this value is situation based. @@ -55,13 +54,6 @@ pub mod pallet { #[pallet::pallet] pub struct Pallet(_); - #[pallet::event] - pub enum Event { - /// An unexpected error happened that should be investigated. - /// TODO: Unused, remove it. - UnexpectedError(Option), - } - #[pallet::error] pub enum Error { /// Exceeded a generic length limit. diff --git a/pallets/bridge/Cargo.toml b/pallets/bridge/Cargo.toml deleted file mode 100644 index f25ba0689b..0000000000 --- a/pallets/bridge/Cargo.toml +++ /dev/null @@ -1,55 +0,0 @@ -[package] -name = "pallet-bridge" -version = "1.0.0" -authors = ["PolymeshAssociation"] -edition = "2021" - -[dependencies] -polymesh-primitives = { workspace = true, default-features = false } - -pallet-balances = { workspace = true, default-features = false } -pallet-base = { workspace = true, default-features = false } -pallet-identity = { workspace = true, default-features = false } -pallet-multisig = { workspace = true, default-features = false } - -# Substrate -codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -pallet-scheduler = { version = "4.0.0-dev", default-features = false } - -frame-benchmarking = { version = "4.0.0-dev", optional = true } - -# Other -serde = { version = "1.0.104", default-features = false } -log = "0.4.8" - -[features] -equalize = [] -only-staking = [] -default = ["std", "equalize"] -no_std = [] -std = [ - "frame-benchmarking/std", - "frame-support/std", - "frame-system/std", - "pallet-base/std", - "pallet-balances/std", - "pallet-identity/std", - "pallet-multisig/std", - "pallet-scheduler/std", - "polymesh-primitives/std", - "serde/std", - "sp-core/std", - "sp-runtime/std", - "sp-std/std", -] - -runtime-benchmarks = [ - "frame-benchmarking" -] -try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/bridge/src/lib.rs b/pallets/bridge/src/lib.rs deleted file mode 100644 index 6251bcda40..0000000000 --- a/pallets/bridge/src/lib.rs +++ /dev/null @@ -1,167 +0,0 @@ -// This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). -// Copyright (c) 2020 Polymesh Association - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3. - -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -//! # Bridge from Ethereum to Polymesh -//! Removed. - -#![cfg_attr(not(feature = "std"), no_std)] - -use codec::{Decode, Encode}; -use polymesh_primitives::{storage_migration_ver, Balance, IdentityId}; -use scale_info::TypeInfo; -use sp_core::H256; -use sp_std::{fmt::Debug, prelude::*, vec}; - -pub use pallet::*; - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use frame_support::pallet_prelude::{ValueQuery, *}; - - #[pallet::config] - pub trait Config: frame_system::Config {} - - #[pallet::pallet] - pub struct Pallet(_); - - /// The status of a bridge transaction. - #[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] - #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] - pub enum BridgeTxStatus { - /// No such transaction in the system. - Absent, - /// The transaction is missing a CDD or the bridge module is frozen. The `u8` parameter is the - /// capped number of times the module tried processing this transaction. It will be retried - /// automatically. Anyone can retry these manually. - Pending(u8), - /// The transaction is frozen by the admin. It will not be retried automatically. - Frozen, - /// The transaction is pending its first execution. These can not be manually triggered by - /// normal accounts. - Timelocked, - /// The transaction has been successfully credited. - Handled, - } - - impl Default for BridgeTxStatus { - fn default() -> Self { - BridgeTxStatus::Absent - } - } - - /// A unique lock-and-mint bridge transaction. - #[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] - #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Default)] - pub struct BridgeTx { - /// A single transaction hash can have multiple locks. This nonce differentiates between them. - pub nonce: u32, - /// The recipient account of POLYX on Polymesh. - pub recipient: Account, - /// Amount of POLYX tokens to credit. - pub amount: Balance, - /// Ethereum token lock transaction hash. It is not used internally in the bridge and is kept - /// here for compatibility reasons only. - pub tx_hash: H256, - } - - /// Additional details of a bridge transaction. - #[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] - #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Default)] - pub struct BridgeTxDetail { - /// Amount of POLYX tokens to credit. - pub amount: Balance, - /// Status of the bridge transaction. - pub status: BridgeTxStatus, - /// Block number at which this transaction was executed or is planned to be executed. - pub execution_block: BlockNumber, - /// Ethereum token lock transaction hash. It is not used internally in the bridge and is kept - /// here for compatibility reasons only. - pub tx_hash: H256, - } - - storage_migration_ver!(0); - - /// The multisig account of the bridge controller. The genesis signers accept their - /// authorizations and are able to get their proposals delivered. The bridge creator - /// transfers some POLY to their identity. - #[pallet::storage] - pub(super) type Controller = StorageValue<_, T::AccountId>; - - /// Details of bridge transactions identified with pairs of the recipient account and the - /// bridge transaction nonce. - #[pallet::storage] - pub(super) type BridgeTxDetails = StorageDoubleMap< - _, - Blake2_128Concat, - T::AccountId, - Blake2_128Concat, - u32, - BridgeTxDetail, - ValueQuery, - >; - - /// The admin key. - #[pallet::storage] - pub(super) type Admin = StorageValue<_, T::AccountId>; - - /// Whether or not the bridge operation is frozen. - #[pallet::storage] - pub(super) type Frozen = StorageValue<_, bool, ValueQuery>; - - /// Freeze bridge admins. These accounts can only freeze the bridge. - #[pallet::storage] - pub(super) type FreezeAdmins = - StorageMap<_, Blake2_128Concat, T::AccountId, bool, ValueQuery>; - - /// The bridge transaction timelock period, in blocks, since the acceptance of the - /// transaction proposal during which the admin key can freeze the transaction. - #[pallet::storage] - pub(super) type Timelock = StorageValue<_, T::BlockNumber, ValueQuery>; - - /// The maximum number of bridged POLYX per identity within a set interval of - /// blocks. Fields: POLYX amount and the block interval duration. - #[pallet::storage] - pub(super) type BridgeLimit = StorageValue<_, (Balance, T::BlockNumber), ValueQuery>; - - /// Amount of POLYX bridged by the identity in last block interval. Fields: the bridged - /// amount and the last interval number. - #[pallet::storage] - pub(super) type PolyxBridged = - StorageMap<_, Identity, IdentityId, (Balance, T::BlockNumber), ValueQuery>; - - /// Identities not constrained by the bridge limit. - #[pallet::storage] - pub(super) type BridgeLimitExempted = - StorageMap<_, Twox64Concat, IdentityId, bool, ValueQuery>; - - /// Storage version. - #[pallet::storage] - pub(super) type StorageVersion = StorageValue<_, Version, ValueQuery>; - - #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig {} - - #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { - fn build(&self) { - StorageVersion::::put(Version::new(0)); - } - } - - #[pallet::call] - impl Pallet {} -} diff --git a/pallets/committee/Cargo.toml b/pallets/committee/Cargo.toml index 1ef7fa995b..f71927a8b8 100644 --- a/pallets/committee/Cargo.toml +++ b/pallets/committee/Cargo.toml @@ -15,19 +15,19 @@ serde_derive = { version = "1.0.104", optional = true, default-features = false # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +pallet-timestamp = { workspace = true, default-features = false } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [features] equalize = [] @@ -50,9 +50,12 @@ std = [ "polymesh-primitives/std", "pallet-identity/std", ] +try-runtime = ["frame-support/try-runtime"] runtime-benchmarks = [ - "frame-benchmarking", - "sp-runtime/runtime-benchmarks", + "frame-benchmarking/runtime-benchmarks", "frame-system/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", ] -try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/committee/src/lib.rs b/pallets/committee/src/lib.rs index fd56299bec..56aa60b62d 100644 --- a/pallets/committee/src/lib.rs +++ b/pallets/committee/src/lib.rs @@ -58,28 +58,24 @@ #[cfg(feature = "runtime-benchmarks")] pub mod benchmarking; +use codec::{Decode, Encode, MaxEncodedLen}; use core::marker::PhantomData; use core::mem; -use frame_support::{ - codec::{Decode, Encode, MaxEncodedLen}, - dispatch::{ - DispatchClass, DispatchError, DispatchResult, Dispatchable, GetDispatchInfo, Parameter, - PostDispatchInfo, Weight, - }, - ensure, - traits::{ChangeMembers, EnsureOrigin, InitializeMembers}, -}; -use polymesh_primitives::{ - traits::{ - group::{GroupTrait, InactiveMember, MemberCount}, - GovernanceGroupTrait, - }, - IdentityId, MaybeBlock, SystematicIssuers, GC_DID, +use frame_support::dispatch::{ + DispatchClass, DispatchResult, GetDispatchInfo, Parameter, PostDispatchInfo, }; +use frame_support::ensure; +use frame_support::pallet_prelude::DispatchError; +use frame_support::traits::{ChangeMembers, EnsureOrigin, InitializeMembers}; +use frame_support::weights::Weight; use scale_info::TypeInfo; -use sp_runtime::traits::Hash; +use sp_runtime::traits::{Dispatchable, Hash}; use sp_std::{prelude::*, vec}; +use polymesh_primitives::traits::group::{GroupTrait, InactiveMember, MemberCount}; +use polymesh_primitives::traits::GovernanceGroupTrait; +use polymesh_primitives::{IdentityId, MaybeBlock, SystematicIssuers, GC_DID}; + type IdentityPallet = pallet_identity::Pallet; /// The maximum number of concurrently active proposals defined for the sake of weight computation. @@ -129,16 +125,13 @@ pub mod pallet { /// Required origin for changing the voting threshold. type VoteThresholdOrigin: EnsureOrigin<::RuntimeOrigin>; - /// The outer event type. - type RuntimeEvent: From> - + IsType<::RuntimeEvent>; - /// Weight computation. type WeightInfo: WeightInfo; } /// Origin for the committee module. - #[derive(PartialEq, Eq, Clone, Debug, Encode, Decode, TypeInfo, MaxEncodedLen)] + #[derive(Debug, Decode, DecodeWithMemTracking, Encode)] + #[derive(Clone, Eq, MaxEncodedLen, PartialEq, TypeInfo)] #[scale_info(skip_type_params(I))] pub enum RawOrigin { /// It has been condoned by M of N members of this committee @@ -184,7 +177,7 @@ pub mod pallet { #[pallet::storage] #[pallet::unbounded] pub type Voting, I: 'static = ()> = - StorageMap<_, Identity, T::Hash, PolymeshVotes, OptionQuery>; + StorageMap<_, Identity, T::Hash, PolymeshVotes>, OptionQuery>; /// Proposals so far. #[pallet::storage] @@ -207,7 +200,7 @@ pub mod pallet { /// Time after which a proposal will expire. #[pallet::storage] pub type ExpiresAfter, I: 'static = ()> = - StorageValue<_, MaybeBlock, ValueQuery>; + StorageValue<_, MaybeBlock>, ValueQuery>; #[pallet::genesis_config] #[derive(frame_support::DefaultNoBound)] @@ -215,13 +208,13 @@ pub mod pallet { pub members: Vec, pub vote_threshold: (u32, u32), pub release_coordinator: IdentityId, - pub expires_after: MaybeBlock, + pub expires_after: MaybeBlock>, #[serde(skip)] pub phantom: PhantomData<(T, I)>, } #[pallet::genesis_build] - impl, I: 'static> GenesisBuild for GenesisConfig { + impl, I: 'static> BuildGenesisConfig for GenesisConfig { fn build(&self) { Members::::put(self.members.clone()); VoteThreshold::::put(self.vote_threshold); @@ -307,10 +300,7 @@ pub mod pallet { ReleaseCoordinatorUpdated(Option), /// Proposal expiry time has been updated. /// Parameters: caller DID, new expiry time (if any). - ExpiresAfterUpdated( - IdentityId, - MaybeBlock<::BlockNumber>, - ), + ExpiresAfterUpdated(IdentityId, MaybeBlock>), /// Voting threshold has been updated /// Parameters: caller DID, numerator, denominator VoteThresholdUpdated(IdentityId, u32, u32), @@ -385,7 +375,7 @@ pub mod pallet { #[pallet::call_index(2)] pub fn set_expires_after( origin: OriginFor, - expiry: MaybeBlock, + expiry: MaybeBlock>, ) -> DispatchResult { T::CommitteeOrigin::ensure_origin(origin)?; >::put(expiry); @@ -410,7 +400,10 @@ pub mod pallet { /// # Errors /// * `FirstVoteReject`, if `call` hasn't been proposed and `approve == false`. /// * `NotAMember`, if the `origin` is not a member of this committee. - #[pallet::weight((>::WeightInfo::vote_or_propose_new_proposal().saturating_add(call.get_dispatch_info().weight), DispatchClass::Operational))] + #[pallet::weight((>::WeightInfo::vote_or_propose_new_proposal() + .saturating_add(call.get_dispatch_info().call_weight), + DispatchClass::Operational + ))] #[pallet::call_index(3)] pub fn vote_or_propose( origin: OriginFor, @@ -489,7 +482,7 @@ pub mod pallet { fn ensure_proposal( hash: &T::Hash, idx: ProposalIndex, - ) -> Result, DispatchError> { + ) -> Result>, DispatchError> { let voting = Voting::::get(&hash).ok_or(Error::::NoSuchProposal)?; ensure!(voting.index == idx, Error::::MismatchedVotingIndex); Ok(voting) @@ -623,7 +616,7 @@ pub mod pallet { /// As a side-effect, on error, any existing proposal data is pruned. fn ensure_not_expired( proposal: &T::Hash, - expiry: MaybeBlock, + expiry: MaybeBlock>, ) -> Result<(), Error> { match expiry { MaybeBlock::Some(e) if e <= frame_system::Pallet::::block_number() => { diff --git a/pallets/common/Cargo.toml b/pallets/common/Cargo.toml index f78a935d4b..f3e67bc751 100644 --- a/pallets/common/Cargo.toml +++ b/pallets/common/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -serde = { version = "1.0.104", optional = true, default-features = false, features = ["derive"] } +serde = { version = "1.0.104", default-features = false, features = ["alloc", "derive"] } polymesh-primitives = { workspace = true, default-features = false } @@ -19,7 +19,7 @@ sp-std = { workspace = true, default-features = false } default = ["std"] std = [ - "serde", + "serde/std", "codec/std", "frame-support/std", "polymesh-primitives/std", diff --git a/pallets/common/src/protocol_fee.rs b/pallets/common/src/protocol_fee.rs index 03308f76e4..5d1c721b97 100644 --- a/pallets/common/src/protocol_fee.rs +++ b/pallets/common/src/protocol_fee.rs @@ -13,16 +13,15 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use frame_support::dispatch::DispatchResult; use scale_info::TypeInfo; -#[cfg(feature = "std")] use serde::{Deserialize, Serialize}; /// Protocol fee operations. -#[derive(Decode, Encode, TypeInfo, MaxEncodedLen)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, MaxEncodedLen)] #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] pub enum ProtocolOp { /// Fee charged when registering a new ticker. AssetRegisterTicker, diff --git a/pallets/common/src/traits/checkpoint.rs b/pallets/common/src/traits/checkpoint.rs index 64d3dca277..3e40aba228 100644 --- a/pallets/common/src/traits/checkpoint.rs +++ b/pallets/common/src/traits/checkpoint.rs @@ -1,6 +1,6 @@ #![allow(missing_docs)] -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use scale_info::TypeInfo; use sp_std::collections::btree_map::BTreeMap; use sp_std::collections::btree_set::BTreeSet; @@ -10,13 +10,23 @@ use polymesh_primitives::calendar::{CalendarPeriod, CheckpointSchedule}; use polymesh_primitives::{impl_checked_inc, Moment}; /// ID of a `StoredSchedule`. -#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] -#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Default)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Copy, Clone, Debug, Default, Eq, Ord, PartialEq, PartialOrd)] pub struct ScheduleId(pub u64); impl_checked_inc!(ScheduleId); /// One or more scheduled checkpoints in the future. -#[derive(Encode, Decode, TypeInfo, Clone, Debug, Default, PartialEq, Eq)] +#[derive( + Encode, + Decode, + DecodeWithMemTracking, + TypeInfo, + Clone, + Debug, + Default, + PartialEq, + Eq +)] pub struct ScheduleCheckpoints { /// The timestamps of the scheduled checkpoints. pub pending: BTreeSet, diff --git a/pallets/common/src/traits/identity.rs b/pallets/common/src/traits/identity.rs index 0339de0932..739b7a71b0 100644 --- a/pallets/common/src/traits/identity.rs +++ b/pallets/common/src/traits/identity.rs @@ -2,7 +2,7 @@ // This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). // Copyright (c) Polymesh Association -use codec::{Decode, Encode}; +use codec::{Decode, DecodeWithMemTracking, Encode}; use polymesh_primitives::{secondary_key::SecondaryKey, IdentityId}; use scale_info::TypeInfo; use sp_core::H512; @@ -31,7 +31,8 @@ pub struct TargetIdAuthorization { /// to an identity. /// /// `auth_signature` is the signature, generated by secondary key, of `TargetIdAuthorization`. -#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct SecondaryKeyWithAuth { /// Secondary key to be added. pub secondary_key: SecondaryKey, @@ -42,7 +43,8 @@ pub struct SecondaryKeyWithAuth { /// Create a child identity using `key` as the primary key of the new child identity. /// /// The `key` needs to sign (off-chain) an authorization. -#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct CreateChildIdentityWithAuth { /// The key to be used as the primary key of a new child identity. pub key: AccountId, diff --git a/pallets/compliance-manager/Cargo.toml b/pallets/compliance-manager/Cargo.toml index b4098e3831..2b85059fe5 100644 --- a/pallets/compliance-manager/Cargo.toml +++ b/pallets/compliance-manager/Cargo.toml @@ -23,19 +23,19 @@ log = "0.4" # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +frame-benchmarking = { workspace = true, default-features = false, optional = true } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } +pallet-timestamp = { workspace = true, default-features = false } [features] equalize = [] @@ -63,6 +63,12 @@ std = [ ] runtime-benchmarks = [ - "frame-benchmarking", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-external-agents/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-permissions/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/compliance-manager/src/lib.rs b/pallets/compliance-manager/src/lib.rs index 9c9b7f462b..c25252798e 100644 --- a/pallets/compliance-manager/src/lib.rs +++ b/pallets/compliance-manager/src/lib.rs @@ -77,11 +77,14 @@ pub mod benchmarking; use codec::{Decode, Encode}; use core::result::Result; -use frame_support::dispatch::{DispatchError, DispatchResult}; +use frame_support::dispatch::DispatchResult; use frame_support::ensure; +use frame_support::pallet_prelude::DispatchError; use frame_support::traits::Get; use frame_support::weights::Weight; use frame_system::pallet_prelude::OriginFor; +use sp_std::{convert::From, prelude::*}; + use pallet_base::ensure_length_ok; use pallet_external_agents::{Config as EAConfig, GroupOfAgent}; use polymesh_common_utilities::protocol_fee::{ChargeProtocolFee, ProtocolOp}; @@ -95,7 +98,6 @@ use polymesh_primitives::{ proposition, storage_migration_ver, Claim, ConditionType, Context, IdentityId, TargetIdentity, TrustedFor, TrustedIssuer, WeightMeter, }; -use sp_std::{convert::From, prelude::*}; type ExternalAgents = pallet_external_agents::Pallet; type Identity = pallet_identity::Pallet; @@ -118,9 +120,6 @@ pub mod pallet { + EAConfig + AssetFnConfig { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// Weight details of all extrinsic type WeightInfo: WeightInfo; @@ -232,11 +231,14 @@ pub mod pallet { pub(super) type StorageVersion = StorageValue<_, Version, ValueQuery>; #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig; + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { StorageVersion::::put(Version::new(1)); } diff --git a/pallets/contracts/Cargo.toml b/pallets/contracts/Cargo.toml index 26179cd207..3e941bde32 100644 --- a/pallets/contracts/Cargo.toml +++ b/pallets/contracts/Cargo.toml @@ -10,15 +10,14 @@ log = "0.4.8" wasm-instrument = { version = "0.3", default-features = false, optional = true } codec = { workspace = true, default-features = false, features = ["derive"] } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -pallet-contracts = { version = "4.0.0-dev", default-features = false } -pallet-contracts-primitives = { version = "7.0.0", default-features = false } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +pallet-contracts = { workspace = true, default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } # Polymesh specific pallet-base = { workspace = true, default-features = false } @@ -26,7 +25,7 @@ pallet-identity = { workspace = true, default-features = false } pallet-permissions = { workspace = true, default-features = false } polymesh-primitives = { workspace = true, default-features = false } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [features] default = ["std"] @@ -46,8 +45,13 @@ std = [ "wasm-instrument?/std", ] runtime-benchmarks = [ - "wasm-instrument", - "frame-benchmarking", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", "pallet-contracts/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-permissions/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", + "wasm-instrument", ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/contracts/src/benchmarking.rs b/pallets/contracts/src/benchmarking.rs index 0553d160ed..b0701ba0a7 100644 --- a/pallets/contracts/src/benchmarking.rs +++ b/pallets/contracts/src/benchmarking.rs @@ -15,13 +15,11 @@ use codec::Encode; use frame_benchmarking::{account, benchmarks}; -use frame_support::{storage::unhashed, traits::tokens::currency::Currency}; +use frame_support::storage::unhashed; +use frame_support::traits::tokens::currency::Currency; use frame_system::{Pallet as System, RawOrigin}; -use pallet_contracts::benchmarking::code::body::DynInstr::{Counter, Regular}; -use pallet_contracts::benchmarking::code::{ - body, max_pages, DataSegment, ImportedFunction, ImportedMemory, Location, ModuleDefinition, - WasmModule, -}; +use pallet_contracts::benchmarking::code::{body, ImportedMemory, ModuleDefinition, WasmModule}; +use pallet_contracts::benchmarking::code::{max_pages, DataSegment, ImportedFunction, Location}; use pallet_contracts::Pallet as FrameContracts; use sp_runtime::traits::StaticLookup; use sp_runtime::Perbill; @@ -32,14 +30,13 @@ use pallet_identity::benchmarking::{cdd_provider, user, User, UserBuilder}; use pallet_identity::ParentDid; use polymesh_primitives::asset::AssetId; use polymesh_primitives::constants::currency::POLY; -use polymesh_primitives::identity::limits::{ - MAX_ASSETS, MAX_EXTRINSICS, MAX_PALLETS, MAX_PORTFOLIOS, -}; +use polymesh_primitives::identity::limits::{MAX_ASSETS, MAX_EXTRINSICS}; +use polymesh_primitives::identity::limits::{MAX_PALLETS, MAX_PORTFOLIOS}; use polymesh_primitives::secondary_key::ExtrinsicNames; -use polymesh_primitives::{ - traits::group::GroupTrait, AssetPermissions, Balance, ExtrinsicName, ExtrinsicPermissions, - PalletName, PalletPermissions, Permissions, PortfolioId, PortfolioNumber, PortfolioPermissions, -}; +use polymesh_primitives::traits::group::GroupTrait; +use polymesh_primitives::{AssetPermissions, Balance, ExtrinsicName, ExtrinsicPermissions}; +use polymesh_primitives::{PalletName, PalletPermissions, Permissions, PortfolioId}; +use polymesh_primitives::{PortfolioNumber, PortfolioPermissions}; use crate::chain_extension::*; use crate::*; @@ -229,16 +226,16 @@ where value: output_len.to_le_bytes().into(), }, ], - call_body: Some(body::repeated_dyn( + call_body: Some(body::repeated( repetitions, - vec![ - Regular(Instruction::I32Const(FuncId::GetKeyDid.into())), - Counter(0, key_len), - Regular(Instruction::I32Const(key_len as i32)), - Regular(Instruction::I32Const(input.len() as i32 + 4)), - Regular(Instruction::I32Const(input.len() as i32)), - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), + &[ + Instruction::I32Const(FuncId::GetKeyDid.into()), + Instruction::I32Const(0), + Instruction::I32Const(key_len as i32), + Instruction::I32Const(input.len() as i32 + 4), + Instruction::I32Const(input.len() as i32), + Instruction::Call(0), + Instruction::Drop, ], )), ..Default::default() @@ -492,7 +489,7 @@ benchmarks! { let salt = vec![42u8; s as usize]; // Create a dummy contract. - let wasm = WasmModule::::sized(c, Location::Deploy); + let wasm = WasmModule::::sized(c, Location::Deploy, false); let code = Code::Upload(wasm.code.clone()); let user = funded_user::(SEED); diff --git a/pallets/contracts/src/chain_extension.rs b/pallets/contracts/src/chain_extension.rs index 42b1aee7cf..dabfc21cbf 100644 --- a/pallets/contracts/src/chain_extension.rs +++ b/pallets/contracts/src/chain_extension.rs @@ -1,17 +1,16 @@ -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; - use codec::{Decode, DecodeLimit, Encode}; -use frame_support::dispatch::{DispatchError, Dispatchable, GetDispatchInfo}; +use frame_support::dispatch::GetDispatchInfo; use frame_support::ensure; -use frame_support::log::trace; +use frame_support::pallet_prelude::DispatchError; use frame_support::storage::unhashed; use frame_support::traits::{Get, GetCallMetadata}; use frame_system::RawOrigin; use scale_info::prelude::format; use scale_info::prelude::string::String; use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; use sp_core::crypto::UncheckedFrom; +use sp_runtime::traits::Dispatchable; use pallet_contracts::chain_extension as ce; use pallet_contracts::Config as BConfig; @@ -26,9 +25,9 @@ type Identity = pallet_identity::Pallet; const MAX_DECODE_DEPTH: u32 = 10; /// ExtrinsicId -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Clone, Copy, Debug, PartialEq, Eq)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +#[derive(Deserialize, Serialize)] pub struct ExtrinsicId(u8, u8); impl From for [u8; 2] { @@ -168,14 +167,14 @@ where env.charge_weight(::WeightInfo::read_storage(key_len, max_len))?; let key = env.read(key_len)?; - trace!( + log::trace!( target: "runtime", "PolymeshExtension contract ReadStorage: key={:x?}", key ); let value = unhashed::get_raw(key.as_slice()); let value_len = value.as_ref().map(|v| v.len() as u32).unwrap_or_default(); - trace!( + log::trace!( target: "runtime", "PolymeshExtension contract ReadStorage: value length={:?}", value_len @@ -195,14 +194,14 @@ where ); } - trace!( + log::trace!( target: "runtime", "PolymeshExtension contract ReadStorage: value={:x?}", value ); let encoded = value.encode(); env.write(&encoded, false, None).map_err(|err| { - trace!( + log::trace!( target: "runtime", "PolymeshExtension failed to write storage value into contract memory:{:?}", err @@ -235,7 +234,7 @@ where } .encode(); env.write(&version, false, None).map_err(|err| { - trace!( + log::trace!( target: "runtime", "PolymeshExtension failed to write value into contract memory:{:?}", err @@ -258,18 +257,18 @@ where env.charge_weight(::WeightInfo::get_key_did())?; let key: T::AccountId = env.read_as()?; - trace!( + log::trace!( target: "runtime", "PolymeshExtension contract GetKeyDid: key={key:?}", ); let did = Identity::::get_identity(&key); - trace!( + log::trace!( target: "runtime", "PolymeshExtension contract GetKeyDid: did={did:?}", ); let encoded = did.encode(); env.write(&encoded, false, None).map_err(|err| { - trace!( + log::trace!( target: "runtime", "PolymeshExtension failed to write identity value into contract memory:{:?}", err @@ -308,12 +307,12 @@ where (KeyHasher::Twox, HashSize::B128) => hashing::twox_128(data.as_slice()).encode(), (KeyHasher::Twox, HashSize::B256) => hashing::twox_256(data.as_slice()).encode(), }; - trace!( + log::trace!( target: "runtime", "PolymeshExtension contract KeyHasher: hash={hash:x?}", ); env.write(&hash, false, None).map_err(|err| { - trace!( + log::trace!( target: "runtime", "PolymeshExtension failed to write hash into contract memory:{:?}", err @@ -360,13 +359,13 @@ where return Err(Error::::NoUpgradesSupported.into()); } - trace!( + log::trace!( target: "runtime", "PolymeshExtension contract GetLatestApiUpgrade: {latest_api_hash:?}", ); let encoded_api_hash = latest_api_hash.unwrap_or_default().encode(); env.write(&encoded_api_hash, false, None).map_err(|err| { - trace!( + log::trace!( target: "runtime", "PolymeshExtension failed to write api code hash value into contract memory:{err:?}", ); @@ -418,7 +417,7 @@ where // Charge weight for the call. let di = call.get_dispatch_info(); - let charged_amount = env.charge_weight(di.weight)?; + let charged_amount = env.charge_weight(di.call_weight)?; // Execute call requested by contract, with current DID set to the contract owner. let addr = env.ext().address().clone(); @@ -474,18 +473,18 @@ where env.charge_weight(::WeightInfo::get_next_asset_id())?; let caller_account: T::AccountId = env.read_as()?; - trace!( + log::trace!( target: "runtime", "PolymeshExtension contract GetNextAssetId: caller_account={caller_account:?}", ); let asset_id = T::AssetFn::generate_asset_id(caller_account); - trace!( + log::trace!( target: "runtime", "PolymeshExtension contract GetNextAssetId: asset_id={asset_id:?}", ); let encoded = asset_id.encode(); env.write(&encoded, false, None).map_err(|err| { - trace!( + log::trace!( target: "runtime", "PolymeshExtension failed to write asset_id value into contract memory:{:?}", err @@ -519,7 +518,7 @@ where // Decode chain extension id. let func_id = FuncId::try_from(ext_id); - trace!( + log::trace!( target: "runtime", "PolymeshExtension contract calling: {func_id:?}", ); @@ -542,7 +541,7 @@ where Some(FuncId::CallRuntimeWithError) => call_runtime(env, true), Some(FuncId::GetNextAssetId) => get_next_asset_id(env), None => { - trace!( + log::trace!( target: "runtime", "PolymeshExtension contract calling invalid ext_id={ext_id:?}", ); @@ -550,7 +549,7 @@ where } }; if let Err(err) = &res { - trace!( + log::trace!( target: "runtime", "PolymeshExtension: err={err:?}", ); diff --git a/pallets/contracts/src/lib.rs b/pallets/contracts/src/lib.rs index 84409b5d19..50d65538aa 100644 --- a/pallets/contracts/src/lib.rs +++ b/pallets/contracts/src/lib.rs @@ -55,7 +55,7 @@ pub mod benchmarking; pub mod chain_extension; -use codec::{Compact, Decode, Encode}; +use codec::{Compact, Decode, DecodeWithMemTracking, Encode}; use frame_support::dispatch::{ DispatchErrorWithPostInfo, DispatchResult, DispatchResultWithPostInfo, }; @@ -65,7 +65,6 @@ use frame_support::traits::Get; use frame_support::weights::Weight; use frame_system::ensure_root; use frame_system::ensure_signed; -#[cfg(feature = "std")] use pallet_contracts::Determinism; use scale_info::TypeInfo; use sp_core::crypto::UncheckedFrom; @@ -74,8 +73,8 @@ use sp_std::{vec, vec::Vec}; pub use chain_extension::{ExtrinsicId, PolymeshExtension}; use pallet_contracts::weights::WeightInfo as FrameWeightInfo; -use pallet_contracts::Config as BConfig; -use pallet_contracts_primitives::Code; +use pallet_contracts::Code; +use pallet_contracts::Config as ContractsConfig; use pallet_identity::{Config as IdentityConfig, ParentDid, WeightInfo as IdentityWeightInfo}; use polymesh_primitives::traits::{AssetFnConfig, AssetFnTrait}; use polymesh_primitives::{storage_migration_ver, Balance, Permissions}; @@ -87,7 +86,8 @@ type CodeHash = ::Hash; pub struct ContractPolymeshHooks; -#[derive(Clone, Debug, Decode, Encode, Eq, MaxEncodedLen, PartialEq, TypeInfo)] +#[derive(Clone, Debug, Eq, MaxEncodedLen, PartialEq, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode)] pub struct Api { desc: [u8; 4], major: u32, @@ -99,7 +99,8 @@ impl Api { } } -#[derive(Clone, Decode, Encode, MaxEncodedLen, Eq, PartialEq, TypeInfo)] +#[derive(Clone, MaxEncodedLen, Eq, PartialEq, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode)] #[scale_info(skip_type_params(T))] pub struct ApiCodeHash { pub hash: CodeHash, @@ -125,18 +126,8 @@ impl sp_std::fmt::Debug for ApiCodeHash { } } -#[derive( - Clone, - Debug, - Decode, - Encode, - MaxEncodedLen, - Eq, - Ord, - PartialOrd, - PartialEq, - TypeInfo -)] +#[derive(MaxEncodedLen, Eq, Ord, PartialOrd, PartialEq, TypeInfo)] +#[derive(Clone, Debug, Decode, DecodeWithMemTracking, Encode)] pub struct ChainVersion { spec_version: u32, tx_version: u32, @@ -151,7 +142,8 @@ impl ChainVersion { } } -#[derive(Clone, Decode, Encode, MaxEncodedLen, Eq, PartialEq, TypeInfo)] +#[derive(Clone, Decode, DecodeWithMemTracking, Encode, Eq)] +#[derive(MaxEncodedLen, PartialEq, TypeInfo)] #[scale_info(skip_type_params(T))] pub struct NextUpgrade { pub chain_version: ChainVersion, @@ -320,11 +312,11 @@ pub mod pallet { /// The `Config` trait for the smart contracts pallet. #[pallet::config] pub trait Config: - IdentityConfig + BConfig + frame_system::Config + AssetFnConfig + IdentityConfig + + ContractsConfig + + frame_system::Config + + AssetFnConfig { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// Max value that `in_len` can take, that is, /// the length of the data sent from a contract when using the ChainExtension. type MaxInLen: Get; @@ -409,7 +401,7 @@ pub mod pallet { } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { StorageVersion::::put(Version::new(1)); @@ -422,10 +414,10 @@ pub mod pallet { owner.clone(), self.upgradable_code.clone(), None, - Determinism::Deterministic, + Determinism::Enforced, ) .unwrap(); - log::info!("Uploaded upgradeable code: {}", code_result.code_hash); + log::info!("Uploaded upgradeable code: {:?}", code_result.code_hash); let api_code_hash = ApiCodeHash::new(code_result.code_hash); let api = Api::new(self.upgradable_description, self.upgradable_major); CurrentApiHash::::insert(&api, &api_code_hash); @@ -687,7 +679,7 @@ where perms: Option<&Permissions>, ) -> Weight { let instantiate_weight = - ::WeightInfo::instantiate_with_code(code_len, data_len, salt_len) + ::WeightInfo::instantiate_with_code(code_len, data_len, salt_len) .saturating_add(::WeightInfo::base_weight_with_code( code_len, data_len, salt_len, )); @@ -700,10 +692,10 @@ where salt_len: u32, perms: Option<&Permissions>, ) -> Weight { - let instantiate_weight = ::WeightInfo::instantiate(data_len, salt_len) - .saturating_add(::WeightInfo::base_weight_with_hash( - data_len, salt_len, - )); + let instantiate_weight = + ::WeightInfo::instantiate(data_len, salt_len).saturating_add( + ::WeightInfo::base_weight_with_hash(data_len, salt_len), + ); instantiate_weight.saturating_add(Self::weight_link_contract_to_did(perms)) } diff --git a/pallets/corporate-actions/Cargo.toml b/pallets/corporate-actions/Cargo.toml index 56536e7013..499e77ae9b 100644 --- a/pallets/corporate-actions/Cargo.toml +++ b/pallets/corporate-actions/Cargo.toml @@ -24,18 +24,18 @@ log = "0.4" # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-arithmetic = { version = "6.0.0", default-features = false } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-arithmetic = { workspace = true, default-features = false } +sp-core = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +frame-benchmarking = { workspace = true, default-features = false, optional = true } +pallet-timestamp = { workspace = true, default-features = false } pallet-compliance-manager = { workspace = true, default-features = false, optional = true } @@ -65,7 +65,13 @@ std = [ "sp-arithmetic/std", ] runtime-benchmarks = [ - "frame-benchmarking", - "pallet-compliance-manager" + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-asset/runtime-benchmarks", + "pallet-compliance-manager/runtime-benchmarks", + "pallet-external-agents/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-portfolio/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/corporate-actions/src/ballot/mod.rs b/pallets/corporate-actions/src/ballot/mod.rs index 1e15878a0c..29732dc90f 100644 --- a/pallets/corporate-actions/src/ballot/mod.rs +++ b/pallets/corporate-actions/src/ballot/mod.rs @@ -77,52 +77,52 @@ #[cfg(feature = "runtime-benchmarks")] pub mod benchmarking; -use crate as ca; -use ca::{CAId, CAKind, CorporateAction}; -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use core::convert::TryInto; use core::mem; -use frame_support::{ - dispatch::{DispatchError, DispatchResult}, - ensure, - traits::Get, - weights::Weight, -}; +use frame_support::dispatch::DispatchResult; +use frame_support::ensure; +use frame_support::pallet_prelude::DispatchError; +use frame_support::traits::Get; +use frame_support::weights::Weight; +use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; +use sp_runtime::traits::Zero; +use sp_std::prelude::*; + use pallet_asset::checkpoint; use pallet_base::ensure_string_limited; use polymesh_common_utilities::protocol_fee::{ChargeProtocolFee, ProtocolOp}; use polymesh_primitives::{storage_migration_ver, Balance, EventDid, IdentityId, Moment}; use polymesh_primitives_derive::VecU8StrongTyped; -use scale_info::TypeInfo; -use sp_runtime::traits::Zero; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; -use sp_std::prelude::*; + +use crate as ca; +use ca::{CAId, CAKind, CorporateAction}; type Checkpoint = checkpoint::Pallet; type CA = ca::Pallet; type ExternalAgents = pallet_external_agents::Pallet; /// A wrapper for a motion title. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize, DecodeWithMemTracking)] #[derive(Encode, Decode, TypeInfo, VecU8StrongTyped)] #[derive(Clone, PartialEq, Eq, Hash, Default, Debug)] pub struct MotionTitle(pub Vec); /// A wrapper for a motion info link. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize, DecodeWithMemTracking)] #[derive(Encode, Decode, TypeInfo, VecU8StrongTyped)] #[derive(Clone, PartialEq, Eq, Hash, Default, Debug)] pub struct MotionInfoLink(pub Vec); /// A wrapper for a choice's title. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize, DecodeWithMemTracking)] #[derive(Encode, Decode, TypeInfo, VecU8StrongTyped)] #[derive(Clone, PartialEq, Eq, Hash, Default, Debug)] pub struct ChoiceTitle(pub Vec); /// Details about motions -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Deserialize, DecodeWithMemTracking, Serialize)] #[derive(Clone, PartialEq, Eq, Default, Debug, Encode, Decode, TypeInfo)] pub struct Motion { /// Title of the motion @@ -136,10 +136,10 @@ pub struct Motion { pub choices: Vec, } -/// A wrapper for a ballot's title. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +/// A wrapper for a ballot's title.] #[derive(Encode, Decode, TypeInfo, VecU8StrongTyped)] -#[derive(Clone, PartialEq, Eq, Hash, Debug, Default)] +#[derive(PartialEq, Eq, Hash, Debug, DecodeWithMemTracking)] +#[derive(Clone, Default, Deserialize, Serialize)] pub struct BallotTitle(pub Vec); /// Metadata about a ballot. @@ -149,8 +149,8 @@ pub struct BallotTitle(pub Vec); /// When the metadata has been committed to chain, /// the needed numbers aforementioned are cached away, /// and the metadata is not read on-chain again. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Clone, PartialEq, Eq, Debug, Encode, TypeInfo, Decode, Default)] +#[derive(Debug, Decode, DecodeWithMemTracking, Eq, Encode, PartialEq, TypeInfo)] +#[derive(Clone, Default, Deserialize, Serialize)] pub struct BallotMeta { /// The ballot's title. pub title: BallotTitle, @@ -168,19 +168,9 @@ impl BallotMeta { } /// Timestamp range details about vote start / end. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive( - Copy, - Clone, - PartialEq, - Eq, - Default, - Debug, - Encode, - Decode, - TypeInfo, - MaxEncodedLen -)] +#[derive(Encode, Decode, DecodeWithMemTracking, MaxEncodedLen)] +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, TypeInfo)] +#[derive(Deserialize, Serialize)] pub struct BallotTimeRange { /// Timestamp at which voting starts. pub start: Moment, @@ -190,19 +180,9 @@ pub struct BallotTimeRange { } /// A vote cast on some choice in some motion in a ballot. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive( - Copy, - Clone, - PartialEq, - Eq, - Default, - Debug, - Encode, - Decode, - TypeInfo, - MaxEncodedLen -)] +#[derive(Encode, Decode, DecodeWithMemTracking, MaxEncodedLen)] +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, TypeInfo)] +#[derive(Deserialize, Serialize)] pub struct BallotVote { /// The weight / voting power assigned to this vote. pub power: Balance, @@ -275,10 +255,7 @@ pub mod pallet { use frame_system::pallet_prelude::*; #[pallet::config] - pub trait Config: frame_system::Config + ca::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - } + pub trait Config: frame_system::Config + ca::Config {} #[pallet::pallet] pub struct Pallet(_); @@ -352,11 +329,14 @@ pub mod pallet { pub(super) type StorageVersion = StorageValue<_, Version, ValueQuery>; #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig; + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { StorageVersion::::put(Version::new(1)); } diff --git a/pallets/corporate-actions/src/distribution/mod.rs b/pallets/corporate-actions/src/distribution/mod.rs index ba0a264ad3..b932b0417c 100644 --- a/pallets/corporate-actions/src/distribution/mod.rs +++ b/pallets/corporate-actions/src/distribution/mod.rs @@ -64,15 +64,17 @@ #[cfg(feature = "runtime-benchmarks")] pub mod benchmarking; -use crate as ca; -use ca::{CAId, Tax}; -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{ - dispatch::{DispatchError, DispatchResult}, - ensure, - traits::Get, - weights::Weight, -}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; +use frame_support::dispatch::DispatchResult; +use frame_support::ensure; +use frame_support::pallet_prelude::DispatchError; +use frame_support::traits::Get; +use frame_support::weights::Weight; +use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; +use sp_runtime::traits::Zero; +use sp_std::prelude::*; + use pallet_identity::PermissionedCallOriginData; use polymesh_common_utilities::protocol_fee::{ChargeProtocolFee, ProtocolOp}; use polymesh_primitives::asset::AssetId; @@ -80,11 +82,9 @@ use polymesh_primitives::{ constants::currency::ONE_UNIT, storage_migration_ver, traits::PortfolioSubTrait, Balance, EventDid, IdentityId, Moment, PortfolioId, PortfolioNumber, SecondaryKey, WeightMeter, }; -use scale_info::TypeInfo; -use sp_runtime::traits::Zero; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; -use sp_std::prelude::*; + +use crate as ca; +use ca::{CAId, Tax}; storage_migration_ver!(1); @@ -101,7 +101,7 @@ pub const PER_SHARE_PRECISION: Balance = 1_000_000; /// A capital distribution's various details. /// /// All information contained is used by on-chain logic. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize, DecodeWithMemTracking)] #[derive(Clone, PartialEq, Eq, Debug, Encode, Decode, MaxEncodedLen, TypeInfo)] pub struct Distribution { /// The portfolio to distribute from. @@ -149,10 +149,7 @@ pub mod pallet { pub const PER_SHARE_PRECISION: Balance = 1_000_000; #[pallet::config] - pub trait Config: frame_system::Config + ca::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - } + pub trait Config: frame_system::Config + ca::Config {} #[pallet::pallet] pub struct Pallet(_); @@ -175,11 +172,14 @@ pub mod pallet { pub(crate) type StorageVersion = StorageValue<_, Version, ValueQuery>; #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig; + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { StorageVersion::::put(Version::new(1)); } diff --git a/pallets/corporate-actions/src/lib.rs b/pallets/corporate-actions/src/lib.rs index cb7ef7a9e5..f38e8de59a 100644 --- a/pallets/corporate-actions/src/lib.rs +++ b/pallets/corporate-actions/src/lib.rs @@ -91,9 +91,10 @@ pub mod benchmarking; pub mod ballot; pub mod distribution; -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::dispatch::{DispatchError, DispatchResult}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; +use frame_support::dispatch::DispatchResult; use frame_support::ensure; +use frame_support::pallet_prelude::DispatchError; use frame_support::traits::Get; use frame_support::weights::Weight; use frame_system::ensure_root; @@ -125,17 +126,8 @@ impl CAConfig for T {} pub type Tax = Permill; /// How should `identities` in `TargetIdentities` be used? -#[derive( - Clone, - Copy, - PartialEq, - Eq, - Encode, - Decode, - TypeInfo, - MaxEncodedLen, - Debug -)] +#[derive(Decode, Encode, Eq, PartialEq, TypeInfo, MaxEncodedLen)] +#[derive(Copy, Clone, Debug, DecodeWithMemTracking)] pub enum TargetTreatment { /// Only those identities should be included. Include, @@ -161,7 +153,8 @@ impl TargetTreatment { } /// A description of which identities that a CA will apply to. -#[derive(Clone, PartialEq, Eq, Encode, Decode, TypeInfo, Default, Debug)] +#[derive(Decode, Default, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Clone, Debug, DecodeWithMemTracking)] pub struct TargetIdentities { /// The specified identities either relevant or irrelevant, depending on `treatment`, for CAs. pub identities: Vec, @@ -186,17 +179,8 @@ impl TargetIdentities { } /// The kind of a `CorporateAction`. -#[derive( - Copy, - Clone, - PartialEq, - Eq, - Encode, - Decode, - TypeInfo, - MaxEncodedLen, - Debug -)] +#[derive(Copy, Debug, Decode, Encode, TypeInfo, MaxEncodedLen)] +#[derive(Clone, DecodeWithMemTracking, Eq, PartialEq)] pub enum CAKind { /// A predictable benefit. /// These are known at the time the asset is created. @@ -227,22 +211,13 @@ impl CAKind { } } -#[derive(Encode, Decode, TypeInfo, VecU8StrongTyped)] -#[derive(Clone, PartialEq, Eq, Default, Debug)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, VecU8StrongTyped)] +#[derive(Clone, Debug, Default, Eq, PartialEq)] pub struct CADetails(pub Vec); /// Defines how to identify a CA's associated checkpoint, if any. -#[derive( - Copy, - Clone, - PartialEq, - Eq, - Encode, - Decode, - TypeInfo, - MaxEncodedLen, - Debug -)] +#[derive(Copy, Debug, Decode, Encode, TypeInfo, MaxEncodedLen)] +#[derive(Clone, DecodeWithMemTracking, Eq, PartialEq)] pub enum CACheckpoint { /// CA uses a record date scheduled to occur in the future. /// Checkpoint ID will be taken after the record date. @@ -257,17 +232,8 @@ pub enum CACheckpoint { /// Defines the record date, at which impact should be calculated, /// along with checkpoint info to assess the impact at the date. -#[derive( - Copy, - Clone, - PartialEq, - Eq, - Encode, - Decode, - TypeInfo, - MaxEncodedLen, - Debug -)] +#[derive(Copy, Debug, Decode, Encode, TypeInfo, MaxEncodedLen)] +#[derive(Clone, DecodeWithMemTracking, Eq, PartialEq)] pub struct RecordDate { /// When the impact should be calculated, or already has. pub date: Moment, @@ -276,17 +242,8 @@ pub struct RecordDate { } /// Input specification of the record date used to derive impact for a CA. -#[derive( - Copy, - Clone, - PartialEq, - Eq, - Encode, - Decode, - TypeInfo, - MaxEncodedLen, - Debug -)] +#[derive(Decode, Encode, Eq, MaxEncodedLen, PartialEq, TypeInfo)] +#[derive(Clone, Copy, Debug, DecodeWithMemTracking)] pub enum RecordDateSpec { /// Record date is in the future. /// A checkpoint should be created. @@ -299,7 +256,8 @@ pub enum RecordDateSpec { /// Details of a generic CA. /// The `(AssetId, ID)` denoting a unique identifier for the CA is stored as a key outside. -#[derive(Clone, PartialEq, Eq, Encode, Decode, TypeInfo, Debug)] +#[derive(Debug, Decode, Encode, TypeInfo)] +#[derive(Clone, DecodeWithMemTracking, Eq, PartialEq)] pub struct CorporateAction { /// The kind of CA that this is. pub kind: CAKind, @@ -330,33 +288,14 @@ impl CorporateAction { /// A `AssetId`-local CA ID. /// By *local*, we mean that the same number might be used for a different `AssetId` /// to uniquely identify a different CA. -#[derive( - Copy, - Clone, - PartialEq, - Eq, - Encode, - Decode, - TypeInfo, - MaxEncodedLen, - Default, - Debug -)] +#[derive(Decode, Encode, Eq, MaxEncodedLen, PartialEq, TypeInfo)] +#[derive(Clone, Copy, Debug, Default, DecodeWithMemTracking)] pub struct LocalCAId(pub u32); impl_checked_inc!(LocalCAId); /// A unique global identifier for a CA. -#[derive( - Copy, - Clone, - PartialEq, - Eq, - Encode, - Decode, - TypeInfo, - MaxEncodedLen, - Debug -)] +#[derive(Decode, Encode, Eq, MaxEncodedLen, PartialEq, TypeInfo)] +#[derive(Clone, Copy, Debug, DecodeWithMemTracking)] pub struct CAId { /// The `[`AssetId`]` component used to disambiguate the `local` one. pub asset_id: AssetId, @@ -364,7 +303,8 @@ pub struct CAId { pub local_id: LocalCAId, } -#[derive(Clone, PartialEq, Eq, Encode, Decode, TypeInfo, Debug)] +#[derive(Decode, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Clone, Debug, DecodeWithMemTracking)] pub struct InitiateCorporateActionArgs { asset_id: AssetId, kind: CAKind, @@ -412,9 +352,6 @@ pub mod pallet { + pallet_asset::Config + pallet_asset::checkpoint::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// Max number of DID specified in `TargetIdentities`. #[pallet::constant] type MaxTargetIds: Get; @@ -517,13 +454,15 @@ pub mod pallet { pub(super) type StorageVersion = StorageValue<_, Version, ValueQuery>; #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig { + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { pub max_details_length: u32, + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { StorageVersion::::put(Version::new(1)); MaxDetailsLength::::put(self.max_details_length); diff --git a/pallets/external-agents/Cargo.toml b/pallets/external-agents/Cargo.toml index 7e8bd23bf0..db2dca1366 100644 --- a/pallets/external-agents/Cargo.toml +++ b/pallets/external-agents/Cargo.toml @@ -21,14 +21,14 @@ log = "0.4" # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-runtime = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } # Only in STD -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [features] default = ["std"] @@ -44,7 +44,11 @@ std = [ "serde_derive", ] runtime-benchmarks = [ - "frame-benchmarking", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", "pallet-identity/runtime-benchmarks", + "pallet-permissions/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/external-agents/src/lib.rs b/pallets/external-agents/src/lib.rs index f1c542cb0d..adf5d65203 100644 --- a/pallets/external-agents/src/lib.rs +++ b/pallets/external-agents/src/lib.rs @@ -92,7 +92,6 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config + PermConfig + IdentityConfig + AssetFnConfig { - type RuntimeEvent: From> + IsType<::RuntimeEvent>; type WeightInfo: WeightInfo; } @@ -138,11 +137,14 @@ pub mod pallet { pub(super) type StorageVersion = StorageValue<_, Version, ValueQuery>; #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig; + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { StorageVersion::::put(Version::new(1)); } diff --git a/pallets/group/Cargo.toml b/pallets/group/Cargo.toml index 02b3c416bd..a8ea9a49f4 100644 --- a/pallets/group/Cargo.toml +++ b/pallets/group/Cargo.toml @@ -15,20 +15,20 @@ serde_derive = { version = "1.0.104", optional = true, default-features = false # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } +pallet-timestamp = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } # Only for benchmarking -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [features] equalize = [] @@ -55,7 +55,10 @@ std = [ runtime-benchmarks = [ "frame-benchmarking", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", "pallet-identity/runtime-benchmarks", "pallet-permissions/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/group/rpc/Cargo.toml b/pallets/group/rpc/Cargo.toml index efdc9cc897..1c7e584c28 100644 --- a/pallets/group/rpc/Cargo.toml +++ b/pallets/group/rpc/Cargo.toml @@ -9,26 +9,37 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { workspace = true, default-features = false, features = ["derive"] } -jsonrpsee = { version = "0.16.2", features = ["server", "macros"] } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-blockchain = { version = "4.0.0-dev" } -sp-core = { version = "7.0.0", default-features = false } -sp-rpc = { version = "6.0.0" } -sp-runtime = { version = "7.0.0", default-features = false } -sp-std = {version = "5.0.0", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } +jsonrpsee = { version = "0.24.8", features = ["server-core", "client-core", "macros"] } +sp-api = { workspace = true, default-features = false } +sp-blockchain = { workspace = true } +sp-core = { workspace = true, default-features = false } +sp-rpc = { workspace = true } +sp-runtime = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } # Common node-rpc = { workspace = true } polymesh-primitives = { workspace = true, default-features = false} # RPC -pallet-group-rpc-runtime-api = { version = "2.0.0", path = "./runtime-api" } +pallet-group-rpc-runtime-api = { workspace = true, default-features = false } # Others -serde = { version = "1.0.104", features = ["derive"] } +serde = { version = "1.0.104", default-features = false, features = ["derive"] } [features] default = ["std"] -std = [] +std = [ + "node-rpc/std", + "codec/std", + "sp-api/std", + "sp-core/std", + "sp-std/std", + "sp-runtime/std", + "frame-support/std", + "frame-system/std", + "polymesh-primitives/std", + "pallet-group-rpc-runtime-api/std" +] diff --git a/pallets/group/rpc/runtime-api/Cargo.toml b/pallets/group/rpc/runtime-api/Cargo.toml index aed64f03e0..433bab284d 100644 --- a/pallets/group/rpc/runtime-api/Cargo.toml +++ b/pallets/group/rpc/runtime-api/Cargo.toml @@ -9,22 +9,24 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # Common -polymesh-primitives = { workspace = true, default-features = false} +polymesh-primitives = { workspace = true, default-features = false } # Others -serde = { version = "1.0.104", optional = true, features = ["derive"] } +serde = { version = "1.0.104", default-features = false, features = ["alloc", "derive"] } # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-std = { version = "5.0.0", default-features = false } +sp-api = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive", "decode"] } [features] default = ["std"] std = [ - "serde", + "serde/std", + "codec/std", "sp-api/std", - "codec/std", "sp-std/std", + "scale-info/std", "polymesh-primitives/std", ] diff --git a/pallets/group/rpc/runtime-api/src/lib.rs b/pallets/group/rpc/runtime-api/src/lib.rs index 7c61143b45..e82d032f55 100644 --- a/pallets/group/rpc/runtime-api/src/lib.rs +++ b/pallets/group/rpc/runtime-api/src/lib.rs @@ -5,13 +5,14 @@ use polymesh_primitives::traits::group::InactiveMember; use polymesh_primitives::{IdentityId, Moment}; use codec::{Decode, Encode}; -#[cfg(feature = "std")] +use scale_info::TypeInfo; use serde::{Deserialize, Serialize}; use sp_std::{prelude::*, vec::Vec}; -#[derive(Eq, PartialEq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] +#[derive(Clone, Decode, Encode, Eq, PartialEq, TypeInfo)] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] pub struct Member { pub id: IdentityId, pub expiry_at: Option, diff --git a/pallets/group/rpc/src/lib.rs b/pallets/group/rpc/src/lib.rs index 9b05f06e6c..aab37f89e0 100644 --- a/pallets/group/rpc/src/lib.rs +++ b/pallets/group/rpc/src/lib.rs @@ -1,18 +1,16 @@ -pub use pallet_group_rpc_runtime_api::{GroupApi as GroupRuntimeApi, Member}; - use std::{marker::PhantomData, sync::Arc}; -use jsonrpsee::{ - core::RpcResult, - proc_macros::rpc, - types::error::{CallError, ErrorObject}, -}; +use jsonrpsee::core::RpcResult; +use jsonrpsee::proc_macros::rpc; +use jsonrpsee::types::error::ErrorObject; use node_rpc::Error; use sp_api::ProvideRuntimeApi; use sp_blockchain::HeaderBackend; use sp_runtime::traits::Block as BlockT; use sp_std::prelude::*; +pub use pallet_group_rpc_runtime_api::{GroupApi as GroupRuntimeApi, Member}; + /// Group RPC methods. #[rpc(client, server)] pub trait GroupApi { @@ -48,12 +46,11 @@ where let api = self.client.runtime_api(); let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); api.get_cdd_valid_members(at_hash).map_err(|e| { - CallError::Custom(ErrorObject::owned( + ErrorObject::owned( Error::RuntimeError.into(), "Unable to fetch CDD providers.", Some(e.to_string()), - )) - .into() + ) }) } @@ -61,12 +58,11 @@ where let api = self.client.runtime_api(); let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); api.get_gc_valid_members(at_hash).map_err(|e| { - CallError::Custom(ErrorObject::owned( + ErrorObject::owned( Error::RuntimeError.into(), "Unable to fetch Governance Committee members.", Some(e.to_string()), - )) - .into() + ) }) } } diff --git a/pallets/group/src/lib.rs b/pallets/group/src/lib.rs index 838343ddb1..aac4fa2ebe 100644 --- a/pallets/group/src/lib.rs +++ b/pallets/group/src/lib.rs @@ -117,10 +117,6 @@ pub mod pallet { + pallet_timestamp::Config + pallet_identity::Config { - /// The overarching event type. - type RuntimeEvent: From> - + IsType<::RuntimeEvent>; - /// Required origin for changing the active limit. /// It's recommended that e.g., in case of a committee, /// this be an origin that cannot be formed through a committee majority. @@ -170,9 +166,6 @@ pub mod pallet { MembersReset(IdentityId, Vec), /// The limit of how many active members there can be concurrently was changed. ActiveLimitChanged(IdentityId, MemberCount, MemberCount), - /// Phantom member, never used. This can be removed now. FRAME v2 doesn't require this. - /// TODO: remove. - Dummy(PhantomData<(T::AccountId, >::RuntimeEvent)>), } const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); @@ -200,25 +193,16 @@ pub mod pallet { pub type ActiveMembersLimit, I: 'static = ()> = StorageValue<_, u32, ValueQuery>; #[pallet::genesis_config] + #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig, I: 'static = ()> { pub active_members_limit: u32, pub active_members: Vec, + #[serde(skip)] pub phantom: PhantomData<(T, I)>, } - #[cfg(feature = "std")] - impl, I: 'static> Default for GenesisConfig { - fn default() -> Self { - Self { - active_members_limit: 0, - active_members: vec![], - phantom: Default::default(), - } - } - } - #[pallet::genesis_build] - impl, I: 'static> GenesisBuild for GenesisConfig { + impl, I: 'static> BuildGenesisConfig for GenesisConfig { fn build(&self) { use frame_support::traits::InitializeMembers; diff --git a/pallets/identity/Cargo.toml b/pallets/identity/Cargo.toml index 0b8f850972..dfb29b5a2b 100644 --- a/pallets/identity/Cargo.toml +++ b/pallets/identity/Cargo.toml @@ -23,9 +23,7 @@ schnorrkel = { version = "0.11", default-features = false, optional = true } # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } frame-support = { workspace = true, default-features = false } -scale-info = { version = "2.0", default-features = false, features = [ - "derive", -] } +scale-info = { workspace = true, default-features = false, features = ["derive"] } frame-system = { workspace = true, default-features = false } pallet-timestamp = { workspace = true, default-features = false } sp-api = { workspace = true, default-features = false } @@ -36,10 +34,8 @@ sp-std = { workspace = true, default-features = false } sp-version = { workspace = true, default-features = false } # Only Benchmarking -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } -hex = { version = "^0.4.0", default-features = false, features = [ - "alloc", -], optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } +hex = { version = "^0.4.0", default-features = false, features = ["alloc"], optional = true } [features] equalize = [] @@ -66,5 +62,13 @@ std = [ "sp-std/std", "sp-version/std", ] -runtime-benchmarks = ["frame-benchmarking", "schnorrkel", "hex"] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-permissions/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", + "schnorrkel", + "hex", +] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/identity/src/benchmarking/user.rs b/pallets/identity/src/benchmarking/user.rs index 33a4b49bb1..50458192e0 100644 --- a/pallets/identity/src/benchmarking/user.rs +++ b/pallets/identity/src/benchmarking/user.rs @@ -55,7 +55,7 @@ impl User { pub fn sign(&self, message: &[u8]) -> Option { self.secret .as_ref() - .and_then(|sk| native_schnorrkel::sign(sk.to_bytes(), message)) + .and_then(|sk| native_schnorrkel::sign(&sk.to_bytes(), message)) } } diff --git a/pallets/identity/src/claims.rs b/pallets/identity/src/claims.rs index fe479d1b80..a09e6d119c 100644 --- a/pallets/identity/src/claims.rs +++ b/pallets/identity/src/claims.rs @@ -13,25 +13,24 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::{ - Claim1stKey, Claim2ndKey, Claims, Config, CustomClaimIdSequence, CustomClaims, - CustomClaimsInverse, DidRecords, Error, Event, Pallet, ParentDid, -}; -use frame_support::{ - dispatch::{DispatchError, DispatchResult}, - ensure, -}; +use frame_support::ensure; +use frame_support::pallet_prelude::{DispatchError, DispatchResult}; use frame_system::ensure_root; -use pallet_base::{ensure_string_limited, try_next_pre}; +use sp_runtime::traits::{CheckedAdd, SaturatedConversion, Zero}; +use sp_std::prelude::*; +use pallet_base::{ensure_string_limited, try_next_pre}; use polymesh_common_utilities::protocol_fee::ProtocolOp; use polymesh_primitives::identity_claim::CustomClaimTypeId; +use polymesh_primitives::traits::group::{GroupTrait, InactiveMember}; use polymesh_primitives::{ - traits::group::{GroupTrait, InactiveMember}, CddId, Claim, ClaimType, IdentityClaim, IdentityId, Scope, SecondaryKey, SystematicIssuers, }; -use sp_runtime::traits::{CheckedAdd, SaturatedConversion, Zero}; -use sp_std::prelude::*; + +use crate::{ + Claim1stKey, Claim2ndKey, Claims, Config, CustomClaimIdSequence, CustomClaims, + CustomClaimsInverse, DidRecords, Error, Event, Pallet, ParentDid, +}; struct CddClaimChecker { filter_cdd_id: Option, diff --git a/pallets/identity/src/keys.rs b/pallets/identity/src/keys.rs index 9d63c9248e..d06dd3a1c9 100644 --- a/pallets/identity/src/keys.rs +++ b/pallets/identity/src/keys.rs @@ -23,7 +23,7 @@ use crate::{ use codec::Encode as _; use frame_support::dispatch::DispatchResult; use frame_support::ensure; -use frame_support::traits::{Currency as _, Get as _}; +use frame_support::traits::{Currency as _, Get as _, Randomness as _}; use frame_system::ensure_signed; use pallet_base::{ensure_custom_length_ok, ensure_custom_string_limited}; use pallet_permissions::{AccountCallPermissionsData, CheckAccountCallPermissions}; @@ -54,8 +54,6 @@ const MAX_NAME_LEN: usize = 60; // Limit the maximum memory/cpu cost of a key's permissions. const MAX_PERMISSION_COMPLEXITY: usize = 1_000_000; -type System = frame_system::Pallet; - impl Pallet { /// Does the identity given by `did` exist? pub fn is_identity_exists(did: &IdentityId) -> bool { @@ -773,17 +771,14 @@ impl Pallet { Ok(()) } - /// Create a new DID out of the parent block hash and a `nonce`. + /// Create a new DID from BABE randomness and a `nonce`. fn make_did() -> Result { let nonce = MultiPurposeNonce::::get() + 7u64; // Even if this transaction fails, nonce should be increased for added unpredictability of dids MultiPurposeNonce::::put(&nonce); - // TODO: Look into getting randomness from `pallet_babe`. - // NB: We can't get the current block's hash while processing - // an extrinsic, so we use parent hash here. - let parent_hash = System::::parent_hash(); - let did = IdentityId(blake2_256(&(USER, parent_hash, nonce).encode())); + let (randomness, _) = T::Randomness::random(&nonce.encode()); + let did = IdentityId(blake2_256(&(USER, randomness, nonce).encode())); // Make sure there's no pre-existing entry for the DID // This should never happen but just being defensive here @@ -849,15 +844,11 @@ impl Pallet { } /// Registers the systematic issuer with its DID. - #[allow(dead_code)] - pub(crate) fn register_systematic_id(issuer: SystematicIssuers) - where - T::AccountId: core::fmt::Display, - { + pub(crate) fn register_systematic_id(issuer: SystematicIssuers) { let acc = issuer.as_pallet_id().into_account_truncating(); let id = issuer.as_id(); log::info!( - "Register Systematic id {} with account {} as {}", + "Register Systematic id {} with account {:?} as {}", issuer, acc, id @@ -867,7 +858,6 @@ impl Pallet { } /// Registers `primary_key` as `id` identity. - #[allow(dead_code)] pub(crate) fn do_register_id( primary_key: T::AccountId, id: IdentityId, diff --git a/pallets/identity/src/lib.rs b/pallets/identity/src/lib.rs index c8e92d5b2f..8713128ce4 100644 --- a/pallets/identity/src/lib.rs +++ b/pallets/identity/src/lib.rs @@ -94,12 +94,13 @@ pub use types::{Claim1stKey, Claim2ndKey, DidStatus, PermissionedCallOriginData, use codec::{Decode, Encode}; use core::convert::From; use frame_support::dispatch::DispatchClass::{Normal, Operational}; -use frame_support::dispatch::{ - DispatchError, DispatchResult, GetDispatchInfo, Pays, PostDispatchInfo, Weight, -}; +use frame_support::dispatch::{DispatchResult, GetDispatchInfo, Pays, PostDispatchInfo}; +use frame_support::pallet_prelude::DispatchError; +use frame_support::traits::tokens::fungible::{Inspect, Mutate, MutateHold}; use frame_support::traits::{ ChangeMembers, Currency, EnsureOrigin, Get, GetCallMetadata, InitializeMembers, }; +use frame_support::weights::Weight; use frame_support::Parameter; use frame_system::ensure_root; use polymesh_common_utilities::{ @@ -115,7 +116,7 @@ use polymesh_primitives::{ traits::{CddAndFeeDetails, IdentityFnTrait}, AssetPermissions, Authorization, AuthorizationData, AuthorizationType, Balance, CddId, Claim, ClaimType, CustomClaimTypeId, DidRecord, ExtrinsicPermissions, IdentityClaim, IdentityId, - KeyRecord, Permissions, PortfolioPermissions, Scope, SecondaryKey, Signatory, Ticker, + KeyRecord, Permissions, PortfolioPermissions, Scope, SecondaryKey, Signatory, }; use polymesh_primitives::{SystematicIssuers, GC_DID}; use scale_info::TypeInfo; @@ -123,7 +124,7 @@ use sp_runtime::traits::{Dispatchable, IdentifyAccount, Member, Verify}; use sp_std::prelude::*; use sp_std::vec::Vec; -storage_migration_ver!(7); +storage_migration_ver!(8); pub trait WeightInfo { fn create_child_identity() -> Weight; @@ -226,8 +227,6 @@ pub mod pallet { + pallet_base::Config + pallet_permissions::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// An extrinsic call. type Proposal: Parameter + Dispatchable< @@ -239,7 +238,10 @@ pub mod pallet { /// Group module type CddServiceProviders: GroupTrait; /// Balances module - type Balances: Currency; + type Balances: Currency + + Inspect + + Mutate + + MutateHold; /// Used to check and update CDD type CddHandler: CddAndFeeDetails< Self::AccountId, @@ -274,6 +276,9 @@ pub mod pallet { /// before it is considered unusable. #[pallet::constant] type MaxAuthRetries: Get; + + /// Source of randomness for DID generation. + type Randomness: frame_support::traits::Randomness>; } #[pallet::event] @@ -319,11 +324,6 @@ pub mod pallet { /// (DID, claim) ClaimRevoked(IdentityId, IdentityClaim), - /// Asset's identity registered. - /// - /// (Asset DID, ticker) - AssetDidRegistered(IdentityId, Ticker), - /// New authorization added. /// /// (authorised_by, target_did, target_key, auth_id, authorization_data, expiry) @@ -555,10 +555,10 @@ pub mod pallet { } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { MultiPurposeNonce::::put(1); - StorageVersion::::put(Version::new(7)); + StorageVersion::::put(Version::new(8)); polymesh_primitives::SYSTEMATIC_ISSUERS .iter() diff --git a/pallets/identity/src/types.rs b/pallets/identity/src/types.rs index 5d34e0334b..f54297a050 100644 --- a/pallets/identity/src/types.rs +++ b/pallets/identity/src/types.rs @@ -3,10 +3,8 @@ use codec::{Decode, Encode, MaxEncodedLen}; use polymesh_primitives::{ClaimType, IdentityId, Permissions, Scope, SecondaryKey}; use scale_info::TypeInfo; -use sp_std::{prelude::*, vec::Vec}; - -#[cfg(feature = "std")] use serde::{Deserialize, Serialize}; +use sp_std::{prelude::*, vec::Vec}; pub type Error = Vec; pub type CddStatus = Result; @@ -17,9 +15,10 @@ pub fn zero_account_id() -> AccountId { } /// A result of execution of get_votes. -#[derive(Eq, PartialEq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] +#[derive(Clone, Decode, Encode, Eq, PartialEq, TypeInfo)] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] pub enum RpcDidRecords { /// Id was found and has the following primary key and secondary keys. Success { @@ -30,8 +29,9 @@ pub enum RpcDidRecords { IdNotFound, } -#[derive(Encode, Decode, MaxEncodedLen, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +#[derive(Clone, Decode, Encode, Eq, MaxEncodedLen, PartialEq, TypeInfo)] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Deserialize, Serialize)] pub enum DidStatus { Unknown, Exists, @@ -39,8 +39,8 @@ pub enum DidStatus { } /// Aggregate information about an `AccountId` in relation to an `IdentityId`. -#[derive(Eq, PartialEq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Clone, Decode, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Deserialize, Serialize)] pub struct KeyIdentityData { /// The identity of the provided `AccountId`. pub identity: IdentityId, diff --git a/pallets/multisig/Cargo.toml b/pallets/multisig/Cargo.toml index be097a2484..00cbe05aab 100644 --- a/pallets/multisig/Cargo.toml +++ b/pallets/multisig/Cargo.toml @@ -17,17 +17,17 @@ serde = { version = "1.0.104", default-features = false } # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-core = { version = "7.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-runtime = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-core = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +frame-benchmarking = { workspace = true, default-features = false, optional = true } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } +pallet-timestamp = { workspace = true, default-features = false } [features] equalize = [] @@ -47,7 +47,11 @@ std = [ "pallet-identity/std", ] runtime-benchmarks = [ - "frame-benchmarking", - "polymesh-primitives/runtime-benchmarks", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-permissions/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", ] try-runtime = [] diff --git a/pallets/multisig/src/lib.rs b/pallets/multisig/src/lib.rs index f5fc8716bd..798ae646ed 100644 --- a/pallets/multisig/src/lib.rs +++ b/pallets/multisig/src/lib.rs @@ -72,12 +72,12 @@ pub mod benchmarking; use codec::{Decode, Encode}; use core::convert::From; use frame_support::dispatch::{ - DispatchError, DispatchResult, DispatchResultWithPostInfo, GetDispatchInfo, PostDispatchInfo, - Weight, + DispatchResult, DispatchResultWithPostInfo, GetDispatchInfo, PostDispatchInfo, }; -use frame_support::ensure; +use frame_support::pallet_prelude::DispatchError; use frame_support::traits::{Get, GetCallMetadata, IsSubType, UnfilteredDispatchable}; -use frame_support::BoundedVec; +use frame_support::weights::Weight; +use frame_support::{ensure, BoundedVec}; use frame_system::ensure_signed; use sp_runtime::traits::{Dispatchable, Hash}; use sp_std::convert::TryFrom; @@ -165,9 +165,6 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config + IdentityConfig { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// The overarching call type for proposals. type Proposal: Parameter + Dispatchable @@ -260,7 +257,7 @@ pub mod pallet { #[pallet::weight({ ::WeightInfo::create_proposal() .saturating_add(::WeightInfo::execute_proposal()) - .saturating_add(proposal.get_dispatch_info().weight) + .saturating_add(proposal.get_dispatch_info().call_weight) })] pub fn create_proposal( origin: OriginFor, @@ -827,11 +824,14 @@ pub mod pallet { pub(super) type StorageVersion = StorageValue<_, Version, ValueQuery>; #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig {} + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { MultiSigNonce::::put(1); TransactionVersion::::put(0); @@ -1044,7 +1044,7 @@ impl Pallet { expiry: Option, ) -> DispatchResultWithPostInfo { Self::ensure_ms_signer(multisig, &signer)?; - let max_weight = proposal.get_dispatch_info().weight; + let max_weight = proposal.get_dispatch_info().call_weight; let caller_did = Self::ensure_ms_get_did(multisig)?; let proposal_id = NextProposalId::::get(multisig); Self::ensure_valid_expiry(&expiry)?; @@ -1123,7 +1123,7 @@ impl Pallet { .ok_or_else(|| Error::::ProposalMissing)?; // Ensure `max_weight` was enough to cover the worst-case weight. - let proposal_weight = proposal.get_dispatch_info().weight; + let proposal_weight = proposal.get_dispatch_info().call_weight; ensure!( proposal_weight.all_lte(max_weight), Error::::MaxWeightTooLow diff --git a/pallets/nft/Cargo.toml b/pallets/nft/Cargo.toml index 8582f303e0..37f5fbf4b6 100644 --- a/pallets/nft/Cargo.toml +++ b/pallets/nft/Cargo.toml @@ -15,16 +15,16 @@ polymesh-primitives = { workspace = true, default-features = false } # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-runtime = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } # Other crates log = "0.4.8" # Only in STD -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [features] default = ["std"] @@ -42,5 +42,11 @@ std = [ ] runtime-benchmarks = [ "frame-benchmarking", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-asset/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-portfolio/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/nft/src/lib.rs b/pallets/nft/src/lib.rs index 4b1ba506cf..fb6682eaa1 100644 --- a/pallets/nft/src/lib.rs +++ b/pallets/nft/src/lib.rs @@ -1,8 +1,7 @@ #![cfg_attr(not(feature = "std"), no_std)] -use frame_support::dispatch::{ - DispatchError, DispatchResult, DispatchResultWithPostInfo, PostDispatchInfo, -}; +use frame_support::dispatch::{DispatchResult, DispatchResultWithPostInfo, PostDispatchInfo}; +use frame_support::pallet_prelude::DispatchError; use frame_support::traits::Get; use frame_support::weights::Weight; use frame_support::{ensure, require_transactional}; @@ -57,7 +56,6 @@ pub mod pallet { + pallet_identity::Config + pallet_portfolio::Config { - type RuntimeEvent: From> + IsType<::RuntimeEvent>; type WeightInfo: WeightInfo; type Compliance: ComplianceFnConfig; #[pallet::constant] @@ -175,18 +173,21 @@ pub mod pallet { >; #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig; + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) {} } #[pallet::hooks] impl Hooks> for Pallet { fn on_runtime_upgrade() -> Weight { - if Pallet::::on_chain_storage_version() <= Pallet::::current_storage_version() { + if Pallet::::on_chain_storage_version() <= Pallet::::in_code_storage_version() { log::info!("Running Migration for initializing Owner storage."); let mut n = 0; for (asset_id, nft_id, owner_portfolio) in NFTOwner::::iter() { diff --git a/pallets/permissions/Cargo.toml b/pallets/permissions/Cargo.toml index c60e9b832b..c4389b1337 100644 --- a/pallets/permissions/Cargo.toml +++ b/pallets/permissions/Cargo.toml @@ -13,14 +13,14 @@ serde = { version = "1.0.104", default-features = false } # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-runtime = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } # Only for benchmarking -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [features] equalize = [] @@ -36,6 +36,6 @@ std = [ "sp-std/std", ] runtime-benchmarks = [ - "frame-benchmarking", + "frame-benchmarking/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/permissions/src/benchmarking.rs b/pallets/permissions/src/benchmarking.rs index 7fb56eb7f9..6b1553988a 100644 --- a/pallets/permissions/src/benchmarking.rs +++ b/pallets/permissions/src/benchmarking.rs @@ -2,10 +2,12 @@ use crate::*; #[cfg(not(feature = "std"))] use alloc::string::String; + use frame_benchmarking::benchmarks; -use polymesh_primitives::{ExtrinsicName, PalletName}; use sp_std::{iter, prelude::*}; +use polymesh_primitives::{ExtrinsicName, PalletName}; + const MAX_PALLET_NAME_LENGTH: u32 = 512; const MAX_DISPATCHABLE_NAME_LENGTH: u32 = 1024; diff --git a/pallets/permissions/src/lib.rs b/pallets/permissions/src/lib.rs index 570cf223c6..2c303f3919 100644 --- a/pallets/permissions/src/lib.rs +++ b/pallets/permissions/src/lib.rs @@ -25,21 +25,19 @@ extern crate alloc; #[cfg(feature = "runtime-benchmarks")] pub mod benchmarking; -use codec::{Decode, Encode}; +use codec::{Decode, DecodeWithMemTracking, Encode}; use core::mem; -use frame_support::{ - dispatch::{DispatchError, DispatchResult}, - traits::{CallMetadata, GetCallMetadata}, -}; -use polymesh_primitives::{ExtrinsicName, IdentityId, PalletName, SecondaryKey}; +use frame_support::dispatch::DispatchResult; +use frame_support::pallet_prelude::*; +use frame_support::traits::{CallMetadata, GetCallMetadata}; use scale_info::TypeInfo; -use sp_runtime::{ - traits::{DispatchInfoOf, PostDispatchInfoOf, SignedExtension}, - transaction_validity::{TransactionValidity, TransactionValidityError, ValidTransaction}, -}; -use sp_std::{fmt, marker::PhantomData, result::Result, vec}; +use sp_runtime::traits::{DispatchInfoOf, Dispatchable, PostDispatchInfoOf, TransactionExtension}; +use sp_runtime::transaction_validity::{TransactionValidityError, ValidTransaction}; +use sp_std::marker::PhantomData; +use sp_std::result::Result; +use sp_std::{fmt, vec}; -use frame_support::pallet_prelude::*; +use polymesh_primitives::{ExtrinsicName, IdentityId, PalletName, SecondaryKey}; pub use pallet::*; @@ -152,7 +150,8 @@ pub mod pallet { } /// A signed extension used in checking call permissions. -#[derive(Encode, Decode, TypeInfo, Clone, Eq, PartialEq, Default)] +#[derive(Decode, DecodeWithMemTracking, Encode)] +#[derive(Clone, Default, Eq, PartialEq, TypeInfo)] #[scale_info(skip_type_params(T))] pub struct StoreCallMetadata(PhantomData); @@ -187,37 +186,46 @@ impl StoreCallMetadata { } } -impl SignedExtension for StoreCallMetadata +impl TransactionExtension for StoreCallMetadata where - T: Config + Send + Sync, - ::RuntimeCall: GetCallMetadata, + T::RuntimeCall: GetCallMetadata, { const IDENTIFIER: &'static str = "StoreCallMetadata"; - type AccountId = T::AccountId; - type Call = ::RuntimeCall; - type AdditionalSigned = (); + type Implicit = (); + type Val = (); type Pre = (); - fn additional_signed(&self) -> Result<(), TransactionValidityError> { - Ok(()) + fn weight(&self, _: &T::RuntimeCall) -> Weight { + Weight::zero() } fn validate( &self, - _: &Self::AccountId, - _: &Self::Call, - _: &DispatchInfoOf, - _: usize, - ) -> TransactionValidity { - Ok(ValidTransaction::default()) + origin: ::RuntimeOrigin, + _call: &T::RuntimeCall, + _info: &DispatchInfoOf, + _len: usize, + _: (), + _implication: &impl Encode, + _source: TransactionSource, + ) -> Result< + ( + ValidTransaction, + Self::Val, + ::RuntimeOrigin, + ), + TransactionValidityError, + > { + Ok((ValidTransaction::default(), (), origin)) } - fn pre_dispatch( + fn prepare( self, - _: &Self::AccountId, - call: &Self::Call, - _: &DispatchInfoOf, - _: usize, + _val: Self::Val, + _origin: &::RuntimeOrigin, + call: &T::RuntimeCall, + _info: &DispatchInfoOf, + _len: usize, ) -> Result { let metadata = call.get_call_metadata(); Self::set_call_metadata(metadata.pallet_name.into(), metadata.function_name.into()); @@ -225,11 +233,11 @@ where } fn post_dispatch( - _: Option, - _: &DispatchInfoOf, - _: &PostDispatchInfoOf, - _: usize, - _: &DispatchResult, + _pre: Self::Pre, + _info: &DispatchInfoOf, + _post_info: &mut PostDispatchInfoOf, + _len: usize, + _result: &DispatchResult, ) -> Result<(), TransactionValidityError> { Self::clear_call_metadata(); Ok(()) diff --git a/pallets/pips/Cargo.toml b/pallets/pips/Cargo.toml index f7b9cd2b3f..856e68f8ea 100644 --- a/pallets/pips/Cargo.toml +++ b/pallets/pips/Cargo.toml @@ -24,21 +24,21 @@ log = "0.4.8" # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } -frame-system = { package = "frame-system", version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } +pallet-timestamp = { workspace = true, default-features = false } # Benchmarking -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } rand = { version = "0.8.2", default-features = false, optional = true } rand_chacha = { version = "0.3.0", default-features = false, optional = true } pallet-committee = { workspace = true, default-features = false, optional = true } @@ -56,6 +56,7 @@ std = [ "frame-system/std", "pallet-base/std", "pallet-balances/std", + "pallet-committee/std", "pallet-group/std", "pallet-identity/std", "pallet-timestamp/std", @@ -74,7 +75,10 @@ std = [ ] runtime-benchmarks = [ "frame-benchmarking", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-committee/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", "rand", "rand_chacha", - "pallet-committee", ] diff --git a/pallets/pips/src/lib.rs b/pallets/pips/src/lib.rs index dc0fc19824..4c5094d40a 100644 --- a/pallets/pips/src/lib.rs +++ b/pallets/pips/src/lib.rs @@ -74,13 +74,16 @@ mod types; use codec::{Decode, Encode}; use frame_support::dispatch::DispatchClass::Operational; -use frame_support::dispatch::{DispatchResult, DispatchResultWithPostInfo, Weight}; +use frame_support::dispatch::{DispatchResult, DispatchResultWithPostInfo}; use frame_support::ensure; use frame_support::pallet_prelude::*; use frame_support::storage::types::StorageValue; -use frame_support::traits::schedule::{DispatchTime, Named}; +use frame_support::traits::schedule::v3::Named as ScheduleNamed; +use frame_support::traits::schedule::DispatchTime; use frame_support::traits::{Currency, EnsureOrigin, Get, WithdrawReasons}; -use frame_system::pallet_prelude::{BlockNumberFor, OriginFor}; +use frame_support::traits::{QueryPreimage, StorePreimage}; +use frame_support::weights::Weight; +use frame_system::pallet_prelude::*; use frame_system::{ensure_root, ensure_signed, RawOrigin}; use sp_runtime::traits::{BlakeTwo256, Dispatchable, Hash, One, Saturating, Zero}; use sp_runtime::DispatchError; @@ -89,7 +92,7 @@ use sp_std::convert::From; use sp_std::vec::Vec; use sp_version::RuntimeVersion; -use pallet_balances::LockableCurrencyExt; +use pallet_balances::impls::LockableCurrencyExt; use pallet_base::{ensure_opt_string_limited, try_next_post}; use pallet_identity::{Config as IdentityConfig, PermissionedCallOriginData}; use polymesh_common_utilities::protocol_fee::{ChargeProtocolFee, ProtocolOp}; @@ -184,6 +187,8 @@ pub mod pallet { ProposalNotInScheduledState, /// Invalid PIP ID. Pip id was not expected to be in the live queue. InvalidPipId, + /// TaskName cannot exceed 32 bytes. + InvalidTaskName, } #[pallet::event] @@ -214,7 +219,7 @@ pub mod pallet { Balance, Option, Option, - MaybeBlock, + MaybeBlock>, ProposalData, ), /// The state of a proposal was updated. @@ -245,15 +250,15 @@ pub mod pallet { /// Parameters: /// - `IdentityId`: The DID of the caller. /// - `PipId`: The ID of the PIP. - /// - `T::BlockNumber`: The block number at which the PIP is scheduled for execution. - ExecutionScheduled(IdentityId, PipId, T::BlockNumber), + /// - `BlockNumber`: The block number at which the PIP is scheduled for execution. + ExecutionScheduled(IdentityId, PipId, BlockNumberFor), /// The default enactment period was changed. /// /// Parameters: /// - `IdentityId`: The DID of the caller. - /// - `T::BlockNumber`: The old enactment period. - /// - `T::BlockNumber`: The new enactment period. - DefaultEnactmentPeriodChanged(IdentityId, T::BlockNumber, T::BlockNumber), + /// - `BlockNumber`: The old enactment period. + /// - `BlockNumber`: The new enactment period. + DefaultEnactmentPeriodChanged(IdentityId, BlockNumberFor, BlockNumberFor), /// The minimum deposit amount for proposals was changed. /// /// Parameters: @@ -269,8 +274,8 @@ pub mod pallet { /// - `MaybeBlock`: The new expiry time. PendingPipExpiryChanged( IdentityId, - MaybeBlock, - MaybeBlock, + MaybeBlock>, + MaybeBlock>, ), /// The maximum number of times a PIP can be skipped was changed. /// @@ -333,22 +338,22 @@ pub mod pallet { /// Parameters: /// - `IdentityId`: The DID of the caller. /// - `PipId`: The ID of the PIP. - /// - `T::BlockNumber`: The block number at which the PIP was scheduled for execution. - ExecutionSchedulingFailed(IdentityId, PipId, T::BlockNumber), + /// - `BlockNumber`: The block number at which the PIP was scheduled for execution. + ExecutionSchedulingFailed(IdentityId, PipId, BlockNumberFor), /// The PIP has been scheduled for expiry. /// /// Parameters: /// - `IdentityId`: The DID of the caller. /// - `PipId`: The ID of the PIP. - /// - `T::BlockNumber`: The block number at which the PIP is scheduled for expiry. - ExpiryScheduled(IdentityId, PipId, T::BlockNumber), + /// - `BlockNumber`: The block number at which the PIP is scheduled for expiry. + ExpiryScheduled(IdentityId, PipId, BlockNumberFor), /// Scheduling of the PIP for expiry failed in the scheduler pallet. /// /// Parameters: /// - `IdentityId`: The DID of the caller. /// - `PipId`: The ID of the PIP. - /// - `T::BlockNumber`: The block number at which the PIP was scheduled for expiry. - ExpirySchedulingFailed(IdentityId, PipId, T::BlockNumber), + /// - `BlockNumber`: The block number at which the PIP was scheduled for expiry. + ExpirySchedulingFailed(IdentityId, PipId, BlockNumberFor), /// Cancelling the PIP execution failed in the scheduler pallet. /// /// Parameters: @@ -361,7 +366,7 @@ pub mod pallet { frame_system::Config + pallet_timestamp::Config + IdentityConfig + pallet_base::Config { /// Currency type for this module. - type Currency: LockableCurrencyExt; + type Currency: LockableCurrencyExt>; /// Origin type for enacting results for PIPs (e.g., reject, approve, skip). type VotingMajorityOrigin: EnsureOrigin; /// Governance committee responsible for overseeing the PIPs. @@ -370,19 +375,24 @@ pub mod pallet { type TechnicalCommitteeVMO: EnsureOrigin; /// Voting majority origin for Upgrade Committee. type UpgradeCommitteeVMO: EnsureOrigin; - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// Weight calculation for extrinsics in this pallet. type WeightInfo: WeightInfo; /// Scheduler for executed or expired proposals. The scheduler module does not have instances, /// so the names of scheduled tasks must be unique within this pallet. Names cannot be just PIP /// IDs because names of executed and expired PIPs should be different. - type Scheduler: Named; + type Scheduler: ScheduleNamed< + BlockNumberFor, + Self::SchedulerCall, + Self::SchedulerOrigin, + Hasher = Self::Hashing, + >; /// A call type used by the scheduler. - type SchedulerCall: From> + Into<::Proposal>; + type SchedulerCall: From> + Into<::Proposal> + Encode; /// The maximum number of votes that can be pruned at once. #[pallet::constant] type MaxRefundsAndVotesPruned: Get; + /// Preimage provider for the scheduler. + type SchedulerPreimage: QueryPreimage + StorePreimage; } /// Set to `true` if historical PIPs data must be removed. @@ -395,12 +405,13 @@ pub mod pallet { /// Default enactment period that will be use after a proposal is accepted by GC. #[pallet::storage] - pub type DefaultEnactmentPeriod = StorageValue<_, T::BlockNumber, ValueQuery>; + pub type DefaultEnactmentPeriod = StorageValue<_, BlockNumberFor, ValueQuery>; /// Number of blocks it will take, after a `Pending` PIP expires, assuming it has not transitioned to another `ProposalState`. #[pallet::storage] #[pallet::unbounded] - pub type PendingPipExpiry = StorageValue<_, MaybeBlock, ValueQuery>; + pub type PendingPipExpiry = + StorageValue<_, MaybeBlock>, ValueQuery>; /// Maximum times a PIP can be skipped before triggering `CannotSkipPip` in `enact_snapshot_results`. #[pallet::storage] @@ -426,7 +437,7 @@ pub mod pallet { #[pallet::storage] #[pallet::unbounded] pub type ProposalMetadata = - StorageMap<_, Twox64Concat, PipId, PipsMetadata, OptionQuery>; + StorageMap<_, Twox64Concat, PipId, PipsMetadata>, OptionQuery>; /// All locked [`DepositInfo`] per [`PipId`] for each account. #[pallet::storage] @@ -459,7 +470,7 @@ pub mod pallet { /// Maps PIPs to the block at which they will be executed. #[pallet::storage] pub type PipToSchedule = - StorageMap<_, Twox64Concat, PipId, T::BlockNumber, OptionQuery>; + StorageMap<_, Twox64Concat, PipId, BlockNumberFor, OptionQuery>; /// A live priority queue (lowest priority at index 0) /// of pending PIPs up to the active limit. @@ -483,7 +494,7 @@ pub mod pallet { /// The [`SnapshotMetadata`]. #[pallet::storage] pub type SnapshotMeta = - StorageValue<_, SnapshotMetadata, OptionQuery>; + StorageValue<_, SnapshotMetadata, T::AccountId>, OptionQuery>; /// The number of times a certain PIP has been skipped. /// Once a (configurable) threshhold is exceeded, a PIP cannot be skipped again. @@ -513,19 +524,19 @@ pub mod pallet { #[pallet::storage] pub(super) type StorageVersion = StorageValue<_, Version, ValueQuery>; - #[derive(frame_support::DefaultNoBound)] #[pallet::genesis_config] + #[derive(frame_support::DefaultNoBound)] pub struct GenesisConfig { pub prune_historical_pips: bool, pub min_proposal_deposit: Balance, - pub default_enactment_period: T::BlockNumber, - pub pending_pip_expiry: MaybeBlock, + pub default_enactment_period: BlockNumberFor, + pub pending_pip_expiry: MaybeBlock>, pub max_pip_skip_count: u8, pub active_pip_limit: u32, } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { PruneHistoricalPips::::put(self.prune_historical_pips); MinimumProposalDeposit::::put(self.min_proposal_deposit); @@ -605,7 +616,7 @@ pub mod pallet { #[pallet::weight((::WeightInfo::set_default_enactment_period(), Operational))] pub fn set_default_enactment_period( origin: OriginFor, - duration: T::BlockNumber, + duration: BlockNumberFor, ) -> DispatchResult { ensure_root(origin)?; let old_value = DefaultEnactmentPeriod::::get(); @@ -631,7 +642,7 @@ pub mod pallet { #[pallet::weight((::WeightInfo::set_pending_pip_expiry(), Operational))] pub fn set_pending_pip_expiry( origin: OriginFor, - expiry: MaybeBlock, + expiry: MaybeBlock>, ) -> DispatchResult { ensure_root(origin)?; let old_value = PendingPipExpiry::::get(); @@ -777,7 +788,7 @@ pub mod pallet { // Schedule for expiry, as long as `Pending`, at block with number `expiring_at`. if let MaybeBlock::Some(expiring_at) = expiry { - Self::schedule_pip_for_expiry(id, expiring_at); + Self::schedule_pip_for_expiry(id, expiring_at)?; } // Record the deposit and as a signal if we have a community PIP. @@ -936,7 +947,7 @@ pub mod pallet { ); // All is good, schedule PIP for execution. - Self::schedule_pip_for_execution(id); + Self::schedule_pip_for_execution(id)?; Ok(()) } @@ -967,7 +978,7 @@ pub mod pallet { Self::is_active(proposal_state), Error::::IncorrectProposalState ); - Self::maybe_unschedule_pip(id, proposal_state); + Self::maybe_unschedule_pip(id, proposal_state)?; Self::maybe_unsnapshot_pip(id, proposal_state); Self::unsafe_reject_proposal(GC_DID, id); Ok(()) @@ -1019,7 +1030,7 @@ pub mod pallet { pub fn reschedule_execution( origin: OriginFor, id: PipId, - until: Option, + until: Option>, ) -> DispatchResult { let did = pallet_identity::Pallet::::ensure_perms(origin)?; @@ -1042,8 +1053,10 @@ pub mod pallet { // Update enactment period & reschedule it. PipToSchedule::::insert(id, new_until); - let res = - T::Scheduler::reschedule_named(id.execution_name(), DispatchTime::At(new_until)); + let task_name = id + .execution_name() + .map_err(|_| Error::::InvalidTaskName)?; + let res = T::Scheduler::reschedule_named(task_name, DispatchTime::At(new_until)); Self::handle_exec_scheduling_result(id, new_until, res); Ok(()) } @@ -1218,7 +1231,7 @@ pub mod pallet { // Approve proposals as instructed. for pip_id in to_approve.iter().copied() { - Self::schedule_pip_for_execution(pip_id); + Self::schedule_pip_for_execution(pip_id)?; } let id = SnapshotMeta::::get().map(|m| m.id); @@ -1356,21 +1369,27 @@ impl Pallet { } /// Adds a PIP expiry call to the PIP expiry schedule. - fn schedule_pip_for_expiry(id: PipId, at: T::BlockNumber) { + fn schedule_pip_for_expiry(id: PipId, at: BlockNumberFor) -> DispatchResult { let did = GC_DID; - let call = Call::::expire_scheduled_pip { did, id }.into(); - let event = match T::Scheduler::schedule_named( - id.expiry_name(), + + let scheduler_call = + ::SchedulerCall::from(Call::::expire_scheduled_pip { did, id }); + + let expire_pip_call = ::SchedulerPreimage::bound(scheduler_call)?; + + match T::Scheduler::schedule_named( + id.expiry_name().map_err(|_| Error::::InvalidTaskName)?, DispatchTime::At(at), None, MAX_NORMAL_PRIORITY, RawOrigin::Root.into(), - call, + expire_pip_call, ) { - Err(_) => Event::ExpirySchedulingFailed(did, id, at), - Ok(_) => Event::ExpiryScheduled(did, id, at), + Err(_) => Self::deposit_event(Event::ExpirySchedulingFailed(did, id, at)), + Ok(_) => Self::deposit_event(Event::ExpiryScheduled(did, id, at)), }; - Self::deposit_event(event); + + Ok(()) } /// Changes the vote of `voter` to `vote`, if any. @@ -1478,22 +1497,29 @@ impl Pallet { } /// Add a PIP execution call to the PIP execution schedule. - fn schedule_pip_for_execution(id: PipId) { + fn schedule_pip_for_execution(id: PipId) -> DispatchResult { // The enactment period is at least 1 block, // as you can only schedule calls for future blocks. let at = DefaultEnactmentPeriod::::get() .max(One::one()) .saturating_add(System::::block_number()); - // Add to schedule. - let call = Call::::execute_scheduled_pip { id }.into(); + let scheduler_call = + ::SchedulerCall::from(Call::::execute_scheduled_pip { id }); + + let execute_pip_call = ::SchedulerPreimage::bound(scheduler_call)?; + + let task_name = id + .execution_name() + .map_err(|_| Error::::InvalidTaskName)?; + let res = T::Scheduler::schedule_named( - id.execution_name(), + task_name, DispatchTime::At(at), None, MAX_NORMAL_PRIORITY, RawOrigin::Root.into(), - call, + execute_pip_call, ); Self::handle_exec_scheduling_result(id, at, res); @@ -1502,10 +1528,12 @@ impl Pallet { // Set the proposal to scheduled. Self::update_proposal_state(GC_DID, id, ProposalState::Scheduled); + + Ok(()) } /// Emit event based on a `result` from scheduling a PIP for execution. - fn handle_exec_scheduling_result(id: PipId, at: T::BlockNumber, result: Result) { + fn handle_exec_scheduling_result(id: PipId, at: BlockNumberFor, result: Result) { Self::deposit_event(match result { Err(_) => Event::ExecutionSchedulingFailed(GC_DID, id, at), Ok(_) => Event::ExecutionScheduled(GC_DID, id, at), @@ -1545,10 +1573,11 @@ impl Pallet { } /// Unschedule PIP with given `id` if it's scheduled for execution. - fn maybe_unschedule_pip(id: PipId, state: ProposalState) { + fn maybe_unschedule_pip(id: PipId, state: ProposalState) -> DispatchResult { if let ProposalState::Scheduled = state { - Self::unschedule_pip(id); + Self::unschedule_pip(id)?; } + Ok(()) } /// Remove the PIP with `id` from the snapshot if it is there. @@ -1573,11 +1602,16 @@ impl Pallet { } /// Remove the PIP with `id` from the `ExecutionSchedule` at `block_no`. - fn unschedule_pip(id: PipId) { + fn unschedule_pip(id: PipId) -> DispatchResult { + let task_name = id + .execution_name() + .map_err(|_| Error::::InvalidTaskName)?; + PipToSchedule::::remove(id); - if T::Scheduler::cancel_named(id.execution_name()).is_err() { + if T::Scheduler::cancel_named(task_name).is_err() { Self::deposit_event(Event::ExecutionCancellingFailed(id)); } + Ok(()) } /// Sets the proposal state to `new_state`, adds the proposal to the pending refunds queue and diff --git a/pallets/pips/src/types.rs b/pallets/pips/src/types.rs index 0275dc1ac3..13f36be390 100644 --- a/pallets/pips/src/types.rs +++ b/pallets/pips/src/types.rs @@ -13,14 +13,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -#[cfg(feature = "std")] -use serde::{Deserialize, Serialize}; - -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use core::cmp::Ordering; +use frame_support::traits::schedule::v3::TaskName; use frame_support::traits::schedule::{Priority, HARD_DEADLINE}; use frame_support::traits::LockIdentifier; use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; use sp_core::H256; use sp_std::convert::From; use sp_std::vec::Vec; @@ -43,26 +42,42 @@ pub const MAX_NORMAL_PRIORITY: Priority = HARD_DEADLINE + 1; pub(crate) const PIPS_LOCK_ID: LockIdentifier = *b"pips "; /// A wrapper for a proposal description. -#[derive(Decode, Encode, TypeInfo, VecU8StrongTyped)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, VecU8StrongTyped)] #[derive(Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)] pub struct PipDescription(pub Vec); /// The global and unique identitifer of a Polymesh Improvement Proposal (PIP). -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Decode, Encode, TypeInfo, MaxEncodedLen)] +#[derive(Serialize, Deserialize)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, MaxEncodedLen)] #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default, Debug)] pub struct PipId(pub u32); impl_checked_inc!(PipId); impl PipId { - /// Converts a PIP ID into a name of a PIP scheduled for execution. - pub fn execution_name(&self) -> Vec { - (PIP_EXECUTION, self.0).encode() + /// Converts [`PipId`] into a [`TaskName`] of a PIP scheduled for execution. + pub fn execution_name(&self) -> Result> { + let mut task_name: TaskName = [0; 32]; + let encoded_task = (PIP_EXECUTION, self.0).encode(); + + if encoded_task.len() >= task_name.len() { + return Err(b"Task name too long".to_vec()); + } + + task_name[..encoded_task.len()].copy_from_slice(&encoded_task[..]); + Ok(task_name) } - /// Converts a PIP ID into a name of a PIP scheduled for expiry. - pub fn expiry_name(&self) -> Vec { - (PIP_EXPIRY, self.0).encode() + /// Converts [`PipId`] into a [`TaskName`] of a PIP scheduled for expiry. + pub fn expiry_name(&self) -> Result> { + let mut task_name: TaskName = [0; 32]; + let encoded_task = (PIP_EXPIRY, self.0).encode(); + + if encoded_task.len() >= task_name.len() { + return Err(b"Task name too long".to_vec()); + } + + task_name[..encoded_task.len()].copy_from_slice(&encoded_task[..]); + Ok(task_name) } } @@ -81,8 +96,9 @@ pub struct Pip { /// A result of execution of get_votes. -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -#[derive(Decode, Encode, Eq, PartialEq)] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Serialize, Deserialize)] +#[derive(Decode, Encode, TypeInfo, MaxEncodedLen, Eq, PartialEq)] pub enum VoteCount { /// Proposal was found and has the following votes. ProposalFound { @@ -97,7 +113,7 @@ pub enum VoteCount { /// Either the entire proposal encoded as a byte vector or its hash. The latter represents large /// proposals. -#[derive(Decode, Encode, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo)] #[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] pub enum ProposalData { /// The hash of the proposal. @@ -107,7 +123,7 @@ pub enum ProposalData { } /// The various sorts of committees that can make a PIP. -#[derive(Decode, Encode, TypeInfo, MaxEncodedLen)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, MaxEncodedLen)] #[derive(Clone, Debug, Eq, PartialEq)] pub enum Committee { /// The technical committee. @@ -117,7 +133,7 @@ pub enum Committee { } /// The proposer of a certain PIP. -#[derive(Decode, Encode, TypeInfo, MaxEncodedLen)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, MaxEncodedLen)] #[derive(Clone, Debug, Eq, PartialEq)] pub enum Proposer { /// The proposer is of the community. @@ -167,7 +183,8 @@ pub struct VotingResult { } /// A "vote" or "signal" on a PIP to move it up or down the review queue. -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Serialize, Deserialize)] #[derive(Decode, Encode, TypeInfo, MaxEncodedLen)] #[derive(Clone, Copy, Eq, PartialEq)] pub struct Vote( @@ -177,15 +194,8 @@ pub struct Vote( pub Balance, ); -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -#[derive(Clone, Decode, Encode, Eq, PartialEq)] -pub struct VoteByPip { - pub pip: PipId, - pub vote: VoteType, -} - /// The state a PIP is in. -#[derive(Decode, Encode, TypeInfo, MaxEncodedLen)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, MaxEncodedLen)] #[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] pub enum ProposalState { /// Initial state. Proposal is open to voting. @@ -215,8 +225,8 @@ pub struct DepositInfo { } /// ID of the taken snapshot in a sequence. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Decode, Encode, TypeInfo, MaxEncodedLen)] +#[derive(Serialize, Deserialize)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, MaxEncodedLen)] #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)] pub struct SnapshotId(pub u32); impl_checked_inc!(SnapshotId); @@ -236,9 +246,8 @@ pub struct SnapshotMetadata { } /// A PIP in the snapshot's priority queue for consideration by the GC. -#[cfg_attr(feature = "std", derive(Debug))] -#[derive(Decode, Encode, TypeInfo, MaxEncodedLen)] -#[derive(Clone, Copy, Eq, PartialEq)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, MaxEncodedLen)] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct SnapshottedPip { /// Identifies the PIP this refers to. pub id: PipId, @@ -268,7 +277,8 @@ pub(crate) fn compare_spip(l: &SnapshottedPip, r: &SnapshottedPip) -> Ordering { /// A result to enact for one or many PIPs in the snapshot queue. // This type is only here due to `enact_snapshot_results`. -#[derive(Clone, Copy, Debug, Decode, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Clone, Copy, Debug)] pub enum SnapshotResult { /// Approve the PIP and move it to the execution queue. Approve, diff --git a/pallets/portfolio/Cargo.toml b/pallets/portfolio/Cargo.toml index 0e40021a8b..040298ec96 100644 --- a/pallets/portfolio/Cargo.toml +++ b/pallets/portfolio/Cargo.toml @@ -19,15 +19,15 @@ log = "0.4.8" # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "7.0.0", default-features = false } -sp-arithmetic = { version = "6.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-runtime = { workspace = true, default-features = false } +sp-arithmetic = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } # Only in STD -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [features] equalize = [] @@ -47,7 +47,10 @@ std = [ ] runtime-benchmarks = [ "frame-benchmarking", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", "pallet-identity/runtime-benchmarks", "pallet-permissions/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/portfolio/src/lib.rs b/pallets/portfolio/src/lib.rs index b38026b24a..f80fa55150 100644 --- a/pallets/portfolio/src/lib.rs +++ b/pallets/portfolio/src/lib.rs @@ -47,9 +47,9 @@ pub mod benchmarking; use codec::{Decode, Encode}; use core::mem; -use frame_support::dispatch::{DispatchError, DispatchResult}; +use frame_support::dispatch::DispatchResult; use frame_support::ensure; -use frame_support::pallet_prelude::Get; +use frame_support::pallet_prelude::{DispatchError, Get}; use frame_support::weights::Weight; use sp_arithmetic::traits::Zero; use sp_std::collections::btree_set::BTreeSet; @@ -109,7 +109,6 @@ pub mod pallet { pub trait Config: frame_system::Config + pallet_permissions::Config + pallet_identity::Config + AssetFnConfig { - type RuntimeEvent: From> + IsType<::RuntimeEvent>; type WeightInfo: WeightInfo; /// Maximum number of fungible assets that can be moved in a single transfer call. #[pallet::constant] @@ -327,11 +326,14 @@ pub mod pallet { storage_migration_ver!(3); #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig; + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { StorageVersion::::put(Version::new(3)); } diff --git a/pallets/protocol-fee/Cargo.toml b/pallets/protocol-fee/Cargo.toml index 7d7f46128d..7cfc9efd2e 100644 --- a/pallets/protocol-fee/Cargo.toml +++ b/pallets/protocol-fee/Cargo.toml @@ -16,16 +16,16 @@ serde = { version = "1.0.104", default-features = false } # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } # benchmark-only -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [features] default = ["std"] @@ -45,7 +45,10 @@ std = [ "sp-std/std", ] runtime-benchmarks = [ - "frame-benchmarking", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", "pallet-identity/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks" ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/protocol-fee/rpc/Cargo.toml b/pallets/protocol-fee/rpc/Cargo.toml index 630e99f3eb..a8759d7b6c 100644 --- a/pallets/protocol-fee/rpc/Cargo.toml +++ b/pallets/protocol-fee/rpc/Cargo.toml @@ -9,15 +9,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { workspace = true, default-features = false, features = ["derive"] } -jsonrpsee = { version = "0.16.2", features = ["server", "macros"] } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-blockchain = { version = "4.0.0-dev" } -sp-core = { version = "7.0.0", default-features = false } -sp-rpc = { version = "6.0.0" } -sp-runtime = { version = "7.0.0", default-features = false } -sp-std = {version = "5.0.0", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } +jsonrpsee = { version = "0.24.9", features = ["server-core", "client-core", "macros"] } +sp-api = { workspace = true, default-features = false } +sp-blockchain = { workspace = true } +sp-core = { workspace = true, default-features = false } +sp-rpc = { workspace = true } +sp-runtime = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } node-rpc = { workspace = true } polymesh-common-utilities = { workspace = true, default-features = false } @@ -25,4 +25,20 @@ polymesh-primitives = { workspace = true, default-features = false } pallet-protocol-fee-rpc-runtime-api = { workspace = true } # General -serde = { version = "1.0.104", features = ["derive"] } +serde = { version = "1.0.104", default-features = false, features = ["alloc", "derive"] } + +[features] +default = ["std"] +std = [ + "codec/std", + "sp-api/std", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", + "frame-support/std", + "frame-system/std", + "polymesh-primitives/std", + "node-rpc/std", + "polymesh-common-utilities/std", + "pallet-protocol-fee-rpc-runtime-api/std" +] \ No newline at end of file diff --git a/pallets/protocol-fee/rpc/runtime-api/Cargo.toml b/pallets/protocol-fee/rpc/runtime-api/Cargo.toml index 9ad78d3d44..4c1dc05212 100644 --- a/pallets/protocol-fee/rpc/runtime-api/Cargo.toml +++ b/pallets/protocol-fee/rpc/runtime-api/Cargo.toml @@ -12,20 +12,22 @@ polymesh-common-utilities = { workspace = true, default-features = false } polymesh-primitives = { workspace = true, default-features = false } # General -serde = { version = "1.0.104", optional = true, features = ["derive"] } +serde = { version = "1.0.104", default-features = false, features = ["alloc", "derive"] } # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -sp-api = { version = "4.0.0-dev", default-features = false} -sp-runtime = { version = "7.0.0", default-features = false} +sp-api = { workspace = true, default-features = false} +sp-runtime = { workspace = true, default-features = false} +scale-info = { workspace = true, default-features = false, features = ["derive", "decode"] } [features] default = ["std"] std = [ - "serde", + "serde/std", "sp-api/std", "codec/std", "sp-runtime/std", + "scale-info/std", "polymesh-primitives/std", "polymesh-common-utilities/std", ] diff --git a/pallets/protocol-fee/rpc/runtime-api/src/lib.rs b/pallets/protocol-fee/rpc/runtime-api/src/lib.rs index 894ee16ecd..b20196966e 100644 --- a/pallets/protocol-fee/rpc/runtime-api/src/lib.rs +++ b/pallets/protocol-fee/rpc/runtime-api/src/lib.rs @@ -18,16 +18,18 @@ #![cfg_attr(not(feature = "std"), no_std)] use codec::{Decode, Encode}; -use polymesh_common_utilities::protocol_fee::ProtocolOp; -#[cfg(feature = "std")] +use scale_info::TypeInfo; use serde::{Deserialize, Serialize}; use sp_runtime::traits::{SaturatedConversion, UniqueSaturatedInto}; +use polymesh_common_utilities::protocol_fee::ProtocolOp; + /// A capped version of `Balance` which is normally a `u128`, fit into `u64` which is a serializable /// type unlike `u128`. There are no fees that would not fit into `u64`. -#[derive(Eq, PartialEq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] +#[derive(Clone, Decode, Encode, Eq, PartialEq, TypeInfo)] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] pub struct CappedFee(pub u64); impl> From for CappedFee { diff --git a/pallets/protocol-fee/rpc/src/lib.rs b/pallets/protocol-fee/rpc/src/lib.rs index 7c7cbac17c..d8075a41b4 100644 --- a/pallets/protocol-fee/rpc/src/lib.rs +++ b/pallets/protocol-fee/rpc/src/lib.rs @@ -13,18 +13,18 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use jsonrpsee::{ - core::RpcResult, - proc_macros::rpc, - types::error::{CallError, ErrorObject}, -}; +use std::sync::Arc; + +use jsonrpsee::core::RpcResult; +use jsonrpsee::proc_macros::rpc; +use jsonrpsee::types::error::ErrorObject; use node_rpc::Error; -pub use pallet_protocol_fee_rpc_runtime_api::{CappedFee, ProtocolFeeApi as ProtocolFeeRuntimeApi}; -use polymesh_common_utilities::protocol_fee::ProtocolOp; use sp_api::ProvideRuntimeApi; use sp_blockchain::HeaderBackend; use sp_runtime::traits::Block as BlockT; -use std::sync::Arc; + +pub use pallet_protocol_fee_rpc_runtime_api::{CappedFee, ProtocolFeeApi as ProtocolFeeRuntimeApi}; +use polymesh_common_utilities::protocol_fee::ProtocolOp; #[rpc(client, server)] pub trait ProtocolFeeApi { @@ -60,17 +60,16 @@ where at: Option<::Hash>, ) -> RpcResult { let api = self.client.runtime_api(); - let at_hash = at.unwrap_or_else(|| - // If the block hash is not supplied assume the best block. - self.client.info().best_hash); + + // If the block hash is not supplied assume the best block. + let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); api.compute_fee(at_hash, op).map_err(|e| { - CallError::Custom(ErrorObject::owned( + ErrorObject::owned( Error::RuntimeError.into(), "Unable to query dispatch info.", Some(e.to_string()), - )) - .into() + ) }) } } diff --git a/pallets/protocol-fee/src/lib.rs b/pallets/protocol-fee/src/lib.rs index 81c0d18111..aab1b6c007 100644 --- a/pallets/protocol-fee/src/lib.rs +++ b/pallets/protocol-fee/src/lib.rs @@ -38,24 +38,26 @@ #[cfg(feature = "runtime-benchmarks")] pub mod benchmarking; -use frame_support::{ - dispatch::{DispatchError, DispatchResult}, - traits::{Currency, ExistenceRequirement, OnUnbalanced, WithdrawReasons}, - weights::Weight, +use frame_support::dispatch::DispatchResult; +use frame_support::pallet_prelude::DispatchError; +use frame_support::traits::{ + fungible::{Balanced, Credit, Inspect}, + tokens::{Fortitude, Precision, Preservation}, + OnUnbalanced, }; +use frame_support::weights::Weight; +use sp_runtime::{traits::Zero, Perbill}; +use sp_std::vec::Vec; + use frame_system::ensure_root; use pallet_identity::Config as IdentityConfig; use polymesh_common_utilities::protocol_fee::{ChargeProtocolFee, ProtocolOp}; -use polymesh_primitives::{ - traits::{CddAndFeeDetails, SubsidiserTrait}, - Balance, IdentityId, PosRatio, GC_DID, -}; -use sp_runtime::{traits::Zero, Perbill}; -use sp_std::vec; +use polymesh_primitives::traits::{CddAndFeeDetails, SubsidiserTrait}; +use polymesh_primitives::{Balance, IdentityId, PosRatio, GC_DID}; + +type NegativeImbalanceOf = + Credit<::AccountId, ::Currency>; -type NegativeImbalanceOf = <::Currency as Currency< - ::AccountId, ->>::NegativeImbalance; /// Either an imbalance or an error. type WithdrawFeeResult = sp_std::result::Result, DispatchError>; @@ -74,9 +76,8 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config + IdentityConfig { - type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// The currency type in which fees will be paid. - type Currency: Currency + Send + Sync; + type Currency: Inspect + Balanced; /// Handler for the unbalanced reduction when taking protocol fees. type OnProtocolFeePayment: OnUnbalanced>; /// Weight calaculation. @@ -108,14 +109,16 @@ pub mod pallet { pub type Coefficient = StorageValue<_, PosRatio, ValueQuery>; #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig { + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { pub base_fees: Vec<(ProtocolOp, Balance)>, pub coefficient: PosRatio, + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { // Set initial base fees for (op, fee) in &self.base_fees { @@ -236,8 +239,9 @@ impl Pallet { let ret = T::Currency::withdraw( &fee_key, fee, - WithdrawReasons::FEE, - ExistenceRequirement::KeepAlive, + Precision::Exact, + Preservation::Protect, + Fortitude::Polite, ) .map_err(|_| Error::::InsufficientAccountBalance)?; diff --git a/pallets/relayer/Cargo.toml b/pallets/relayer/Cargo.toml index 6f7ea37e64..118eaaa6a3 100644 --- a/pallets/relayer/Cargo.toml +++ b/pallets/relayer/Cargo.toml @@ -10,14 +10,14 @@ polymesh-primitives = { workspace = true, default-features = false} # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -sp-runtime = { version = "7.0.0", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-std = { version = "5.0.0", default-features = false } +sp-runtime = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-std = { workspace = true, default-features = false } # Only Benchmarking -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [features] default = ["std"] @@ -32,6 +32,8 @@ std = [ "polymesh-primitives/std", ] runtime-benchmarks = [ - "frame-benchmarking", + "frame-benchmarking/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/relayer/src/lib.rs b/pallets/relayer/src/lib.rs index 531948dd87..c517faff50 100644 --- a/pallets/relayer/src/lib.rs +++ b/pallets/relayer/src/lib.rs @@ -44,21 +44,21 @@ pub mod benchmarking; use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{ - dispatch::{DispatchError, DispatchResult}, - ensure, fail, - traits::{Contains, GetCallMetadata}, - weights::Weight, -}; +use frame_support::dispatch::DispatchResult; +use frame_support::pallet_prelude::DispatchError; +use frame_support::traits::{Contains, GetCallMetadata}; +use frame_support::weights::Weight; +use frame_support::{ensure, fail}; use frame_system::ensure_signed; -use polymesh_primitives::{ - extract_auth, traits::SubsidiserTrait, AuthorizationData, Balance, EventDid, IdentityId, - Signatory, TransactionError, -}; use scale_info::TypeInfo; use sp_runtime::transaction_validity::InvalidTransaction; use sp_std::vec; +use polymesh_primitives::traits::SubsidiserTrait; +use polymesh_primitives::{ + extract_auth, AuthorizationData, Balance, EventDid, IdentityId, Signatory, TransactionError, +}; + type Identity = pallet_identity::Pallet; pub trait WeightInfo { @@ -79,8 +79,6 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config + pallet_identity::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// Subsidy pallet weights. type WeightInfo: WeightInfo; /// Subsidy call filter. diff --git a/pallets/runtime/build_tool/Cargo.toml b/pallets/runtime/build_tool/Cargo.toml index 4f89505a81..f346b700f5 100644 --- a/pallets/runtime/build_tool/Cargo.toml +++ b/pallets/runtime/build_tool/Cargo.toml @@ -7,8 +7,17 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -substrate-wasm-builder = { version = "5.0.0-dev", default-features = false} +substrate-wasm-builder = { workspace = true, default-features = true, optional = true} [features] default = ["std"] -std = [] +std = [ "substrate-wasm-builder" ] + +# Enable the metadata hash generation. +# +# This is hidden behind a feature because it increases the compile time. +# The wasm binary needs to be compiled twice, once to fetch the metadata, +# generate the metadata hash and then a second time with the +# `RUNTIME_METADATA_HASH` environment variable set for the `CheckMetadataHash` +# extension. +metadata-hash = ["substrate-wasm-builder?/metadata-hash"] diff --git a/pallets/runtime/build_tool/src/lib.rs b/pallets/runtime/build_tool/src/lib.rs index d7f7855247..6190546205 100644 --- a/pallets/runtime/build_tool/src/lib.rs +++ b/pallets/runtime/build_tool/src/lib.rs @@ -1,11 +1,13 @@ pub fn build() { - #[cfg(feature = "std")] + #[cfg(all(feature = "std", feature = "metadata-hash"))] { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - //.with_wasm_builder_from_git(BUILDER_REPO, BUILDER_REV) - .export_heap_base() - .import_memory() - .build() + substrate_wasm_builder::WasmBuilder::init_with_defaults() + .enable_metadata_hash("POLYX", 6) + .build(); + } + + #[cfg(all(feature = "std", not(feature = "metadata-hash")))] + { + substrate_wasm_builder::WasmBuilder::build_using_defaults(); } } diff --git a/pallets/runtime/common/Cargo.toml b/pallets/runtime/common/Cargo.toml index 0fe471cfb2..35677e19c8 100644 --- a/pallets/runtime/common/Cargo.toml +++ b/pallets/runtime/common/Cargo.toml @@ -23,14 +23,16 @@ log = "0.4.8" # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -pallet-authorship = { version = "4.0.0-dev", default-features = false } -pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } +frame-election-provider-support = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +pallet-authorship = { workspace = true, default-features = false } +pallet-election-provider-multi-phase = { workspace = true, default-features = false } +pallet-transaction-payment = { workspace = true, default-features = false } +sp-genesis-builder = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } [features] equalize = [] @@ -39,31 +41,35 @@ default = ["std", "equalize"] testing = [] no_std = [] std = [ + "frame-election-provider-support/std", "frame-support/std", "frame-system/std", "pallet-authorship/std", "pallet-balances/std", + "pallet-committee/std", + "pallet-election-provider-multi-phase/std", + "pallet-transaction-payment/std", "pallet-group-rpc-runtime-api/std", "pallet-identity/std", "pallet-multisig/std", - "polymesh-primitives/std", "polymesh-common-utilities/std", + "polymesh-primitives/std", + "sp-genesis-builder/std", + "sp-io/std", "sp-runtime/std", "sp-std/std", - "frame-election-provider-support/std", - "pallet-election-provider-multi-phase/std", - "sp-io/std" ] runtime-benchmarks = [ + "frame-election-provider-support/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-committee/runtime-benchmarks", + "pallet-election-provider-multi-phase/runtime-benchmarks", "pallet-identity/runtime-benchmarks", "pallet-multisig/runtime-benchmarks", "pallet-relayer/runtime-benchmarks", + "pallet-transaction-payment/runtime-benchmarks", "polymesh-primitives/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", "sp-runtime/runtime-benchmarks", - "frame-election-provider-support/runtime-benchmarks", - "pallet-election-provider-multi-phase/runtime-benchmarks", ] diff --git a/pallets/runtime/common/src/impls.rs b/pallets/runtime/common/src/impls.rs index 01f4035d50..cd311283c0 100644 --- a/pallets/runtime/common/src/impls.rs +++ b/pallets/runtime/common/src/impls.rs @@ -34,63 +34,24 @@ //! Auxillary struct/enums use frame_election_provider_support::BalancingConfig; -use frame_support::traits::{Currency, OnUnbalanced}; -use frame_system as system; -use sp_runtime::traits::Convert; +use frame_support::traits::tokens::{ + fungible::{Balanced, Credit}, + imbalance::OnUnbalanced, +}; -use pallet_authorship as authorship; -use pallet_balances as balances; -use polymesh_primitives::Balance; +pub struct Author(sp_std::marker::PhantomData); -use crate::NegativeImbalance; - -pub struct Author(sp_std::marker::PhantomData); - -impl OnUnbalanced> for Author +impl OnUnbalanced>> for Author where - R: balances::Config + authorship::Config, - ::AccountId: From, - ::AccountId: Into, + T: pallet_authorship::Config + pallet_balances::Config + frame_system::Config, { - fn on_nonzero_unbalanced(amount: NegativeImbalance) { - if let Some(author) = authorship::Pallet::::author() { - >::resolve_creating(&author, amount); + fn on_nonzero_unbalanced(credit: Credit>) { + if let Some(author) = pallet_authorship::Pallet::::author() { + let _ = as Balanced<_>>::resolve(&author, credit); } } } -/// Struct that handles the conversion of Balance -> `u128`. This is used for staking's election -/// calculation. -pub struct CurrencyToVoteHandler(sp_std::marker::PhantomData); - -impl CurrencyToVoteHandler -where - R: balances::Config, -{ - fn factor() -> Balance { - let issuance: Balance = >::total_issuance(); - (issuance / u64::max_value() as Balance).max(1) - } -} - -impl Convert for CurrencyToVoteHandler -where - R: balances::Config, -{ - fn convert(x: Balance) -> u64 { - (x / Self::factor()) as u64 - } -} - -impl Convert for CurrencyToVoteHandler -where - R: balances::Config, -{ - fn convert(x: u128) -> Balance { - x * Self::factor() - } -} - pub struct EstimateCallFeeMax; impl> frame_support::traits::EstimateCallFee diff --git a/pallets/runtime/common/src/lib.rs b/pallets/runtime/common/src/lib.rs index a4e8ee69f1..012b6a9486 100644 --- a/pallets/runtime/common/src/lib.rs +++ b/pallets/runtime/common/src/lib.rs @@ -15,42 +15,35 @@ #![cfg_attr(not(feature = "std"), no_std)] // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] +#![recursion_limit = "1024"] -pub mod cdd_check; pub mod fee_details; pub mod impls; pub mod migration; pub mod runtime; -pub use frame_support::{ - dispatch::{DispatchClass, GetDispatchInfo, Weight}, - parameter_types, - traits::{Currency, Get}, - weights::{ - constants::{ - WEIGHT_REF_TIME_PER_MICROS, WEIGHT_REF_TIME_PER_MILLIS, WEIGHT_REF_TIME_PER_NANOS, - WEIGHT_REF_TIME_PER_SECOND, - }, - RuntimeDbWeight, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial, - }, +use frame_election_provider_support::bounds::{ElectionBounds, ElectionBoundsBuilder}; +pub use frame_support::dispatch::{DispatchClass, GetDispatchInfo}; +use frame_support::pallet_prelude::One; +pub use frame_support::parameter_types; +pub use frame_support::traits::{Currency, Get}; +pub use frame_support::weights::constants::{ + WEIGHT_REF_TIME_PER_MICROS, WEIGHT_REF_TIME_PER_MILLIS, WEIGHT_REF_TIME_PER_NANOS, + WEIGHT_REF_TIME_PER_SECOND, +}; +pub use frame_support::weights::{ + RuntimeDbWeight, Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial, }; use frame_system::limits::{BlockLength, BlockWeights}; -use smallvec::smallvec; +use pallet_transaction_payment::Multiplier; pub use sp_runtime::transaction_validity::TransactionPriority; -pub use sp_runtime::{Perbill, Permill}; +pub use sp_runtime::{FixedU128, Perbill, Percent, Permill, SaturatedConversion, Saturating}; -use pallet_balances as balances; +pub use impls::Author; use polymesh_primitives::constants::currency::*; pub use polymesh_primitives::RocksDbWeight; use polymesh_primitives::{Balance, BlockNumber, IdentityId, Moment}; -pub use cdd_check::CddChecker; -pub use impls::{Author, CurrencyToVoteHandler}; - -pub type NegativeImbalance = - as Currency<::AccountId>>::NegativeImbalance; - pub const fn deposit(items: u32, bytes: u32) -> Balance { items as Balance * 15 * CENTS + (bytes as Balance) * 6 * CENTS } @@ -63,13 +56,12 @@ pub const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10); const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); /// We allow for 2 seconds of compute with a 6 second average block time. const MAXIMUM_BLOCK_WEIGHT: Weight = - Weight::from_ref_time(WEIGHT_REF_TIME_PER_SECOND.saturating_mul(2)).set_proof_size(u64::MAX); + Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND.saturating_mul(2), u64::MAX); /// Maximum number of iterations for balancing that will be executed in the embedded OCW /// miner of election provider multi phase. const MINER_MAX_ITERATIONS: u32 = 10; -// TODO (miguel) Remove unused constants. parameter_types! { pub const BlockHashCount: BlockNumber = 4096; /// We allow for 2 seconds of compute with a 6 second average block time. @@ -83,24 +75,36 @@ parameter_types! { /// Blocks can be of upto 10 MB in size. pub const MaximumBlockLength: u32 = 10 * 1024 * 1024; /// 20 ms is needed to create a block. - pub const BlockExecutionWeight: Weight = Weight::from_ref_time(WEIGHT_REF_TIME_PER_MILLIS.saturating_mul(20)); + pub const BlockExecutionWeight: Weight = Weight::from_parts(WEIGHT_REF_TIME_PER_MILLIS.saturating_mul(20), 0); /// 0.65 ms is needed to process an empty extrinsic. - pub const ExtrinsicBaseWeight: Weight = Weight::from_ref_time(WEIGHT_REF_TIME_PER_MICROS.saturating_mul(650)); + pub const ExtrinsicBaseWeight: Weight = Weight::from_parts(WEIGHT_REF_TIME_PER_MICROS.saturating_mul(650), 0); /// This implies a 100 POLYX fee per MB of transaction length pub const TransactionByteFee: Balance = 10 * MILLICENTS; /// We want the noop transaction to cost 0.03 POLYX pub const PolyXBaseFee: Balance = 3 * CENTS; + /// The multiplier for operational fees. + pub const OperationalFeeMultiplier: u8 = 5; + /// The fee multiplier to use for adjusting fees. + pub FeeMultiplier: Multiplier = Multiplier::one(); /// The maximum weight of the pips extrinsic `enact_snapshot_results` which equals to /// `MaximumBlockWeight * AvailableBlockRatio`. pub const PipsEnactSnapshotMaximumWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_mul(75).saturating_div(100); /// Number of block delay an extrinsic claim surcharge has. pub const SignedClaimHandicap: u32 = 2; /// The balance every contract needs to deposit to stay alive indefinitely. - pub const DepositPerContract: u128 = 10 * CENTS; + pub const DepositPerContract: Balance = 10 * CENTS; /// The balance a contract needs to deposit per storage item to stay alive indefinitely. - pub const DepositPerItem: u128 = deposit(1, 0); + pub const DepositPerItem: Balance = deposit(1, 0); + /// The balance a contract needs to deposit per child trie item to stay alive indefinitely. + pub const DepositPerChildTrieItem: Balance = deposit(1, 0) / 100; /// The balance a contract needs to deposit per storage byte to stay alive indefinitely. - pub const DepositPerByte: u128 = deposit(0, 1); + pub const DepositPerByte: Balance = deposit(0, 1); + /// The code hash lookup deposit. + pub CodeHashLockupDepositPercent: Perbill = Perbill::from_percent(30); + /// The default deposit limit. + pub const DefaultDepositLimit: Balance = deposit(1024, 1024 * 1024); + /// The maximum ratio of eth extrinsic weight to block weight. + pub const MaxEthExtrinsicWeight: FixedU128 = FixedU128::from_rational(9, 10); /// The maximum nesting level of a call/instantiate stack. pub const ContractsMaxDepth: u32 = 32; /// The maximum size of a storage value and event payload in bytes. @@ -136,10 +140,13 @@ parameter_types! { .saturating_sub(BlockExecutionWeight::get()); // Staking constants + pub MaxExposurePageSize: u32 = 64; pub MaxNominations: u32 = 16; pub HistoryDepth:u32 = 84; pub MaxUnlockingChunks: u32 = 32; pub MaxValidatorPerIdentity: Permill = Permill::from_percent(33); + pub MaxControllersInDeprecationBatch: u32 = 100; + pub MaxTransientStorageSize: u32 = 1_048_576; // 1 MiB // Multi-phase election parameters // Signed phase @@ -149,18 +156,19 @@ parameter_types! { pub const SignedMaxWeight: Weight = Weight::zero(); pub const SignedMaxRefunds: u32 = 0; pub const SignedRewardBase: Balance = 0; - pub const SignedDepositBase: Balance = 0; + pub const SignedFixedDeposit: Balance = 0; + pub const SignedDepositIncreaseFactor: Percent = Percent::from_percent(0); pub const SignedDepositByte: Balance = 0; - // Unsigned phase - pub BetterUnsignedThreshold: Perbill = Perbill::from_rational(1u32, 10_000); pub const MultiPhaseUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2 - 1u64; // Fallback parameters pub MaxOnChainElectingVoters: u32 = 5000; pub MaxOnChainElectableTargets: u16 = 1250; // Other config parameters pub OffChainRepeat: BlockNumber = 5; - pub MaxElectingVoters: u32 = 40_000; - pub MaxElectableTargets: u16 = 10_000; + pub ElectionBoundsMultiPhase: ElectionBounds = ElectionBoundsBuilder::default() + .voters_count(10_000.into()).targets_count(1_500.into()).build(); + pub ElectionBoundsOnChain: ElectionBounds = ElectionBoundsBuilder::default() + .voters_count(5_000.into()).targets_count(1_250.into()).build(); pub MaxActiveValidators: u32 = 1_000; // Miner Config parameters pub MinerMaxLength: u32 = Perbill::from_rational(9u32, 10) * @@ -171,6 +179,7 @@ parameter_types! { .get(DispatchClass::Normal) .max_extrinsic.expect("Normal extrinsics have a weight limit configured; qed") .saturating_sub(BlockExecutionWeight::get()); + pub MaxElectingVotersSolution: u32 = 40_000; } frame_election_provider_support::generate_solution_type!( @@ -179,35 +188,37 @@ frame_election_provider_support::generate_solution_type!( VoterIndex = u32, TargetIndex = u16, Accuracy = sp_runtime::PerU16, - MaxVoters = MaxElectingVoters, + MaxVoters = MaxElectingVotersSolution, >(16) ); /// Converts Weight to Fee pub struct WeightToFee; -impl WeightToFeePolynomial for WeightToFee { +impl frame_support::weights::WeightToFee for WeightToFee { type Balance = Balance; - /// We want a 0.03 POLYX fee per ExtrinsicBaseWeight. - /// 650_000_000 weight = 30_000 fee => 21_666 weight = 1 fee. - /// Hence, 1 fee = 0 + 1/21_666 weight. - /// This implies, coeff_integer = 0 and coeff_frac = 1/21_666. - fn polynomial() -> WeightToFeeCoefficients { - smallvec![WeightToFeeCoefficient { - degree: 1, - coeff_frac: Perbill::from_rational( - PolyXBaseFee::get(), - ExtrinsicBaseWeight::get().ref_time() as u128 - ), - coeff_integer: 0u128, // Coefficient is zero. - negative: false, - }] + + fn weight_to_fee(weight: &Weight) -> Self::Balance { + let weight_ref_time = weight.ref_time(); + + let fees_per_base = + weight_ref_time.saturating_div(ExtrinsicBaseWeight::get().ref_time()) as Balance; + + let fee = fees_per_base.saturating_mul(PolyXBaseFee::get()); + + Self::Balance::saturated_from(fee) } } -impl Get>> for WeightToFee { - fn get() -> Vec> { - Self::polynomial().to_vec() +pub struct LengthToFee; + +impl frame_support::weights::WeightToFee for LengthToFee { + type Balance = Balance; + + fn weight_to_fee(weight: &Weight) -> Self::Balance { + let weight_ref_time = weight.ref_time(); + + Self::Balance::saturated_from(weight_ref_time).saturating_mul(TransactionByteFee::get()) } } diff --git a/pallets/runtime/common/src/runtime.rs b/pallets/runtime/common/src/runtime.rs index 513c69f3aa..2eb59dac8f 100644 --- a/pallets/runtime/common/src/runtime.rs +++ b/pallets/runtime/common/src/runtime.rs @@ -17,6 +17,8 @@ pub const BENCHMARK_MAX_INCREASE: u32 = 0; #[macro_export] macro_rules! misc_pallet_impls { () => { + use sp_consensus_beefy::ecdsa_crypto::{AuthorityId as BeefyId, Signature as BeefySignature}; + /// The BABE epoch configuration at genesis. pub const BABE_GENESIS_EPOCH_CONFIG: sp_consensus_babe::BabeEpochConfiguration = sp_consensus_babe::BabeEpochConfiguration { @@ -43,39 +45,32 @@ macro_rules! misc_pallet_impls { type RuntimeBaseCallFilter = frame_support::traits::Everything; impl frame_system::Config for Runtime { + /// The ubiquitous event type. + type RuntimeEvent = RuntimeEvent; /// The basic call filter to use in dispatchable. type BaseCallFilter = RuntimeBaseCallFilter; /// Block & extrinsics weights: base values and limits. type BlockWeights = polymesh_runtime_common::RuntimeBlockWeights; /// The maximum length of a block (in bytes). type BlockLength = polymesh_runtime_common::RuntimeBlockLength; - /// The designated SS85 prefix of this chain. - /// - /// This replaces the "ss58Format" property declared in the chain spec. Reason is - /// that the runtime should know about the prefix in order to make use of it as - /// an identifier of the chain. - type SS58Prefix = SS58Prefix; - /// The identifier used to distinguish between accounts. - type AccountId = polymesh_primitives::AccountId; + /// The ubiquitous origin type. + type RuntimeOrigin = RuntimeOrigin; /// The aggregated dispatch type that is available for extrinsics. type RuntimeCall = RuntimeCall; - /// The lookup mechanism to get account ID from whatever is passed in dispatchers. - type Lookup = Indices; - /// The index type for storing how many extrinsics an account has signed. - type Index = polymesh_primitives::Index; - /// The index type for blocks. - type BlockNumber = polymesh_primitives::BlockNumber; + /// The aggregated `RuntimeTask` type. + type RuntimeTask = (); + /// The nonce type for storing how many extrinsics an account has signed. + type Nonce = polymesh_primitives::Nonce; /// The type for hashing blocks and tries. type Hash = polymesh_primitives::Hash; /// The hashing algorithm used. type Hashing = sp_runtime::traits::BlakeTwo256; - /// The header type. - type Header = - sp_runtime::generic::Header; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - /// The ubiquitous origin type. - type RuntimeOrigin = RuntimeOrigin; + /// The identifier used to distinguish between accounts. + type AccountId = polymesh_primitives::AccountId; + /// The lookup mechanism to get account ID from whatever is passed in dispatchers. + type Lookup = Indices; + /// The block type. + type Block = Block; /// Maximum number of block number to block hash mappings to keep (oldest pruned first). type BlockHashCount = polymesh_runtime_common::BlockHashCount; /// The weight of database operations that the runtime can invoke. @@ -86,19 +81,51 @@ macro_rules! misc_pallet_impls { /// /// This type is being generated by `construct_runtime!`. type PalletInfo = PalletInfo; + /// The data to be stored in an account. + type AccountData = pallet_balances::AccountData; /// What to do if a new account is created. type OnNewAccount = (); /// What to do if an account is fully reaped from the system. type OnKilledAccount = (); - /// The data to be stored in an account. - type AccountData = pallet_balances::AccountData; type SystemWeightInfo = polymesh_weights::frame_system::SubstrateWeight; + type ExtensionsWeightInfo = (); + /// The designated SS85 prefix of this chain. + /// + /// This replaces the "ss58Format" property declared in the chain spec. Reason is + /// that the runtime should know about the prefix in order to make use of it as + /// an identifier of the chain. + type SS58Prefix = SS58Prefix; + /// What to do if the runtime wants to change the code to something new. + /// + /// The default (`()`) implementation is responsible for setting the correct storage + /// entry and emitting corresponding event and log item. (see + /// [`Pallet::update_code_in_storage`]). + /// It's unlikely that this needs to be customized, unless you are writing a parachain using + /// `Cumulus`, where the actual code change is deferred. type OnSetCode = (); + /// The maximum number of consumers allowed on a single account. type MaxConsumers = frame_support::traits::ConstU32<16>; + /// The set code logic, just the default since we're not a parachain. + type SingleBlockMigrations = ( + UpgradeSessionKeys, + RemoveTickerDidRecords, + RemoveRandomnessCollectiveFlipStorage, + pallet_contracts::Migration, + pallet_grandpa::migrations::MigrateV4ToV5, + pallet_im_online::migration::v1::Migration, + pallet_offences::migration::v1::MigrateToV1, + pallet_session::migrations::v1::MigrateV0ToV1>, + pallet_staking::migrations::v14::MigrateToV14, + pallet_staking::migrations::v15::MigrateV14ToV15, + pallet_staking::migrations::v16::MigrateV15ToV16, + ); + type MultiBlockMigrator = (); + type PreInherents = (); + type PostInherents = (); + type PostTransactions = (); } impl pallet_base::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type MaxLen = MaxLen; } @@ -109,24 +136,52 @@ macro_rules! misc_pallet_impls { type EpochChangeTrigger = pallet_babe::ExternalTrigger; type DisabledValidators = Session; - type KeyOwnerProofSystem = Historical; + type MaxAuthorities = MaxAuthorities; + type MaxNominators = MaxNominatorRewardedPerValidator; + type KeyOwnerProof = + >::Proof; + type EquivocationReportSystem = + pallet_babe::EquivocationReportSystem; + } + + impl pallet_mmr::Config for Runtime { + const INDEXING_PREFIX: &'static [u8] = b"mmr"; + type Hashing = sp_runtime::traits::Keccak256; + type LeafData = pallet_mmr::ParentNumberAndHash; + type OnNewRoot = pallet_beefy_mmr::DepositBeefyDigest; + type BlockHashProvider = pallet_mmr::DefaultBlockHashProvider; + type WeightInfo = (); + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = (); + } + + parameter_types! { + pub LeafVersion: sp_consensus_beefy::mmr::MmrLeafVersion = sp_consensus_beefy::mmr::MmrLeafVersion::new(0, 0); + } - type KeyOwnerProof = >::Proof; + impl pallet_beefy_mmr::Config for Runtime { + type LeafVersion = LeafVersion; + type BeefyAuthorityToMerkleLeaf = pallet_beefy_mmr::BeefyEcdsaToEthereum; + type LeafExtra = Vec; + type BeefyDataProvider = (); + type WeightInfo = (); + } - type KeyOwnerIdentification = >::IdentificationTuple; + parameter_types! { + pub const BeefySetIdSessionEntries: u32 = BondingDuration::get() * SessionsPerEra::get(); + } - type HandleEquivocation = pallet_babe::EquivocationHandler< - Self::KeyOwnerIdentification, - Offences, - ReportLongevity, - >; + impl pallet_beefy::Config for Runtime { + type BeefyId = BeefyId; type MaxAuthorities = MaxAuthorities; + type MaxNominators = frame_support::traits::ConstU32<0>; + type MaxSetIdSessionEntries = BeefySetIdSessionEntries; + type OnNewValidatorSet = MmrLeaf; + type AncestryHelper = MmrLeaf; + type WeightInfo = (); + type KeyOwnerProof = sp_session::MembershipProof; + type EquivocationReportSystem = + pallet_beefy::EquivocationReportSystem; } impl pallet_indices::Config for Runtime { @@ -163,36 +218,53 @@ macro_rules! misc_pallet_impls { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type Currency = Balances; + #[allow(deprecated)] type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter; - type TransactionByteFee = polymesh_runtime_common::TransactionByteFee; - type WeightToFee = polymesh_runtime_common::WeightToFee; - type FeeMultiplierUpdate = (); + pallet_transaction_payment::FungibleAdapter; + // The two generic parameters of `BlockRatioFee` define a rational number that defines the + // ref_time to fee mapping. The numbers chosen here are exactly the same as the one from the + // `WeightToFeePolynomial` that was used before: + // - The numerator is `3 * currency::CENTS` = 3 * 1_000_000 / 100 = 30_000 + // - The denominator is `Balance::from(ExtrinsicBaseWeight::get().ref_time())` + // - which is 1_000_000 * 650 = 650_000_000 + type WeightToFee = pallet_revive::evm::fees::BlockRatioFee<30_000, 650_000_000, Self, Balance>; + type LengthToFee = polymesh_runtime_common::LengthToFee; + type FeeMultiplierUpdate = pallet_transaction_payment::ConstFeeMultiplier; + type OperationalFeeMultiplier = polymesh_runtime_common::OperationalFeeMultiplier; + type WeightInfo = polymesh_weights::polymesh_transaction_payment::SubstrateWeight; + type ChargeFees = PolymeshTransactionPayment; + } + + impl polymesh_transaction_payment::Config for Runtime { type CddHandler = CddHandler; type Subsidiser = Relayer; type GovernanceCommittee = PolymeshCommittee; type CddProviders = CddServiceProviders; type Identity = Identity; - type WeightToFeeConst = polymesh_runtime_common::WeightToFee; - } - - impl pallet_balances::BlockRewardConfig for Runtime { - type BlockRewardsReserve = pallet_balances::Pallet; } impl pallet_balances::Config for Runtime { - type MaxLocks = MaxLocks; - type DustRemoval = (); type RuntimeEvent = RuntimeEvent; + type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = (); + type WeightInfo = polymesh_weights::pallet_balances::SubstrateWeight; + type Balance = Balance; + type DustRemoval = (); + #[cfg(not(feature = "runtime-benchmarks"))] type ExistentialDeposit = ExistentialDeposit; + #[cfg(feature = "runtime-benchmarks")] + type ExistentialDeposit = BenchmarkEd; type AccountStore = frame_system::Pallet; - type CddChecker = polymesh_runtime_common::cdd_check::CddChecker; - type WeightInfo = polymesh_weights::pallet_balances::SubstrateWeight; + type ReserveIdentifier = [u8; 8]; + type FreezeIdentifier = [u8; 8]; + type MaxLocks = MaxLocks; + type MaxReserves = MaxReserves; + type DoneSlashHandler = (); + type MaxFreezes = frame_support::traits::VariantCountOf; + type Memo = polymesh_primitives::Memo; } impl pallet_protocol_fee::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type Currency = Balances; type OnProtocolFeePayment = DealWithFees; type WeightInfo = polymesh_weights::pallet_protocol_fee::SubstrateWeight; @@ -211,44 +283,139 @@ macro_rules! misc_pallet_impls { type EventHandler = (Staking, ImOnline); } + impl_opaque_keys! { + pub struct OldSessionKeys { + pub grandpa: Grandpa, + pub babe: Babe, + pub im_online: ImOnline, + pub authority_discovery: AuthorityDiscovery, + } + } + impl_opaque_keys! { pub struct SessionKeys { pub grandpa: Grandpa, pub babe: Babe, pub im_online: ImOnline, pub authority_discovery: AuthorityDiscovery, + pub beefy: Beefy, + } + } + + // remove this when removing `OldSessionKeys` + fn transform_session_keys(v: polymesh_primitives::AccountId, old: OldSessionKeys) -> SessionKeys { + SessionKeys { + grandpa: old.grandpa, + babe: old.babe, + im_online: old.im_online, + authority_discovery: old.authority_discovery, + beefy: { + // From Session::upgrade_keys(): + // + // Care should be taken that the raw versions of the + // added keys are unique for every `ValidatorId, KeyTypeId` combination. + // This is an invariant that the session pallet typically maintains internally. + // + // So, produce a dummy value that's unique for the `ValidatorId, KeyTypeId` combination. + let mut id: BeefyId = sp_core::ecdsa::Public::from_raw([0u8; 33]).into(); + let id_raw: &mut [u8] = id.as_mut(); + id_raw[1..33].copy_from_slice(v.as_ref()); + id_raw[0..4].copy_from_slice(b"beef"); + id + }, + } + } + + /// Upgrade Session keys to include BEEFY key. + /// When this is removed, should also remove `OldSessionKeys`. + pub struct UpgradeSessionKeys; + impl frame_support::traits::OnRuntimeUpgrade for UpgradeSessionKeys { + fn on_runtime_upgrade() -> Weight { + Session::upgrade_keys::(transform_session_keys); + Perbill::from_percent(50) * polymesh_runtime_common::RuntimeBlockWeights::get().max_block + } + } + + /// Removes `DidRecord` entries that were created for asset tickers. + pub struct RemoveTickerDidRecords; + impl frame_support::traits::OnRuntimeUpgrade for RemoveTickerDidRecords { + fn on_runtime_upgrade() -> Weight { + use codec::Encode; + + const TARGET_VERSION: pallet_identity::Version = pallet_identity::Version::new(8); + + let current_version = pallet_identity::StorageVersion::::get(); + if current_version >= TARGET_VERSION { + log::info!("identity::RemoveTickerDidRecords: Already at version >= 8, skipping."); + return ::DbWeight::get().reads(1); + } + + const SECURITY_TOKEN_PREFIX: &[u8; 15] = b"SECURITY_TOKEN:"; + + let mut removed = 0u64; + let mut ticker_count = 0u64; + for ticker in pallet_asset::UniqueTickerRegistration::::iter_keys() { + ticker_count += 1; + let hash = (SECURITY_TOKEN_PREFIX, ticker).using_encoded(sp_io::hashing::blake2_256); + let did = polymesh_primitives::IdentityId::try_from(&hash[..]) + .expect("BlakeTwo256 output is 32 bytes = IdentityId size"); + + if pallet_identity::DidRecords::::contains_key(&did) { + pallet_identity::DidRecords::::remove(&did); + removed += 1; + } + } + + pallet_identity::StorageVersion::::put(TARGET_VERSION); + + log::info!( + "identity::RemoveTickerDidRecords: Removed {} asset DidRecords from {} tickers. Storage version set to 8.", + removed, + ticker_count, + ); + + // Reads: 1 (version check) + ticker_count (iter_keys) + ticker_count (contains_key). + // Writes: 1 (version put) + removed (DidRecords removals). + ::DbWeight::get() + .reads_writes(1 + (2 * ticker_count), 1 + removed) } } impl pallet_session::Config for Runtime { type RuntimeEvent = RuntimeEvent; type ValidatorId = polymesh_primitives::AccountId; - type ValidatorIdOf = pallet_staking::StashOf; + type ValidatorIdOf = sp_runtime::traits::ConvertInto; type ShouldEndSession = Babe; type NextSessionRotation = Babe; type SessionManager = pallet_session::historical::NoteHistoricalRoot; type SessionHandler = ::KeyTypeIdProviders; type Keys = SessionKeys; + type DisablingStrategy = (); type WeightInfo = polymesh_weights::pallet_session::SubstrateWeight; + type Currency = Balances; + type KeyDeposit = (); } impl pallet_session::historical::Config for Runtime { + type RuntimeEvent = RuntimeEvent; type FullIdentification = pallet_staking::Exposure< polymesh_primitives::AccountId, polymesh_primitives::Balance, >; - type FullIdentificationOf = pallet_staking::ExposureOf; + type FullIdentificationOf = pallet_staking::DefaultExposureOf; } impl pallet_staking::Config for Runtime { + type OldCurrency = Balances; type Currency = Balances; + type RuntimeHoldReason = RuntimeHoldReason; type CurrencyBalance = Balance; type UnixTime = Timestamp; - type CurrencyToVote = frame_support::traits::U128CurrencyToVote; + type CurrencyToVote = sp_staking::currency_to_vote::U128CurrencyToVote; type ElectionProvider = ElectionProviderMultiPhase; - type GenesisElectionProvider = Self::ElectionProvider; - type MaxNominations = polymesh_runtime_common::MaxNominations; + type GenesisElectionProvider = frame_election_provider_support::onchain::OnChainExecution; + type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; type HistoryDepth = polymesh_runtime_common::HistoryDepth; type RewardRemainder = (); type RuntimeEvent = RuntimeEvent; @@ -259,22 +426,30 @@ macro_rules! misc_pallet_impls { type SlashDeferDuration = SlashDeferDuration; type AdminOrigin = polymesh_primitives::EnsureRoot; type SessionInterface = Self; - type EraPayout = pallet_staking::ConvertCurve; + type EraPayout = pallet_validators::PolymeshConvertCurve; type NextNewSession = Session; - type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; + type MaxExposurePageSize = polymesh_runtime_common::MaxExposurePageSize; type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; type TargetList = pallet_staking::UseValidatorsMap; type MaxUnlockingChunks = polymesh_runtime_common::MaxUnlockingChunks; - type OnStakerSlash = pallet_staking::OnStakerSlashMock; - type BenchmarkingConfig = pallet_staking::SampleBenchmarkingConfig; + type MaxControllersInDeprecationBatch = polymesh_runtime_common::MaxControllersInDeprecationBatch; + type EventListeners = (); + type Filter = frame_support::traits::Nothing; + type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; type WeightInfo = polymesh_weights::pallet_staking::SubstrateWeight; + type Permissioned = Validators; + type MaxValidatorSet = frame_support::traits::ConstU32<1000>; + } + + impl pallet_validators::Config for Runtime { + type WeightInfo = polymesh_weights::pallet_validators::SubstrateWeight; type MaxValidatorPerIdentity = polymesh_runtime_common::MaxValidatorPerIdentity; type MaxVariableInflationTotalIssuance = MaxVariableInflationTotalIssuance; type FixedYearlyReward = FixedYearlyReward; - type Call = RuntimeCall; + type SchedulerCall = RuntimeCall; type PalletsOrigin = OriginCaller; type RewardScheduler = Scheduler; + type SchedulerPreimage = Preimage; } impl pallet_authority_discovery::Config for Runtime { @@ -282,14 +457,12 @@ macro_rules! misc_pallet_impls { } impl pallet_multisig::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type Proposal = RuntimeCall; type WeightInfo = polymesh_weights::pallet_multisig::SubstrateWeight; type MaxSigners = MaxMultiSigSigners; } impl pallet_portfolio::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_portfolio::SubstrateWeight; type MaxNumberOfFungibleMoves = MaxNumberOfFungibleMoves; type MaxNumberOfNFTsMoves = MaxNumberOfNFTsMoves; @@ -297,7 +470,6 @@ macro_rules! misc_pallet_impls { } impl pallet_external_agents::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_external_agents::SubstrateWeight; } @@ -362,7 +534,6 @@ macro_rules! misc_pallet_impls { } impl pallet_relayer::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_relayer::SubstrateWeight; type SubsidyCallFilter = SubsidyFilter; } @@ -372,12 +543,10 @@ macro_rules! misc_pallet_impls { } impl pallet_asset::checkpoint::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_checkpoint::SubstrateWeight; } impl pallet_asset::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type Currency = Balances; type ComplianceManager = pallet_compliance_manager::Pallet; type UnixTime = pallet_timestamp::Pallet; @@ -393,7 +562,6 @@ macro_rules! misc_pallet_impls { } impl polymesh_contracts::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type MaxInLen = MaxInLen; type MaxOutLen = MaxOutLen; type WeightInfo = polymesh_weights::polymesh_contracts::SubstrateWeight; @@ -401,51 +569,99 @@ macro_rules! misc_pallet_impls { impl pallet_contracts::Config for Runtime { type Time = Timestamp; - type Randomness = RandomnessCollectiveFlip; + type Randomness = pallet_babe::RandomnessFromOneEpochAgo; type Currency = Balances; type RuntimeEvent = RuntimeEvent; type RuntimeCall = RuntimeCall; + type RuntimeHoldReason = RuntimeHoldReason; // The `CallFilter` ends up being used in `ext.call_runtime()`, // via the `seal_call_runtime` feature, // which won't swap the current identity, // so we need `Nothing` to basically disable that feature. type CallFilter = frame_support::traits::Nothing; - type DepositPerItem = polymesh_runtime_common::DepositPerItem; - type DepositPerByte = polymesh_runtime_common::DepositPerByte; - type CallStack = [pallet_contracts::Frame; 5]; type WeightPrice = pallet_transaction_payment::Pallet; type WeightInfo = polymesh_weights::pallet_contracts::SubstrateWeight; type ChainExtension = polymesh_contracts::PolymeshExtension; type Schedule = Schedule; - type DeletionQueueDepth = DeletionQueueDepth; - type DeletionWeightLimit = DeletionWeightLimit; + type CallStack = [pallet_contracts::Frame; 5]; + type DepositPerByte = polymesh_runtime_common::DepositPerByte; + type DefaultDepositLimit = polymesh_runtime_common::DefaultDepositLimit; + type DepositPerItem = polymesh_runtime_common::DepositPerItem; + type CodeHashLockupDepositPercent = polymesh_runtime_common::CodeHashLockupDepositPercent; type AddressGenerator = pallet_contracts::DefaultAddressGenerator; + type MaxCodeLen = frame_support::traits::ConstU32<{ 123 * 1024 }>; + type MaxStorageKeyLen = frame_support::traits::ConstU32<128>; + type MaxTransientStorageSize = polymesh_runtime_common::MaxTransientStorageSize; + type MaxDelegateDependencies = frame_support::traits::ConstU32<32>; + type UnsafeUnstableInterface = frame_support::traits::ConstBool; + type MaxDebugBufferLen = frame_support::traits::ConstU32<{ 2 * 1024 * 1024 }>; + type UploadOrigin = frame_system::EnsureSigned; + type InstantiateOrigin = frame_system::EnsureSigned; + #[cfg(not(feature = "runtime-benchmarks"))] + type Migrations = ( + pallet_contracts::migration::v09::Migration, + pallet_contracts::migration::v10::Migration, + pallet_contracts::migration::v11::Migration, + pallet_contracts::migration::v12::Migration, + pallet_contracts::migration::v13::Migration, + pallet_contracts::migration::v14::Migration, + pallet_contracts::migration::v15::Migration, + pallet_contracts::migration::v16::Migration, + ); + #[cfg(feature = "runtime-benchmarks")] + type Migrations = pallet_contracts::migration::codegen::BenchMigrations; + type Debug = (); + type Environment = (); + type ApiVersion = (); + type Xcm = (); #[cfg(not(feature = "runtime-benchmarks"))] type PolymeshHooks = polymesh_contracts::ContractPolymeshHooks; #[cfg(feature = "runtime-benchmarks")] type PolymeshHooks = polymesh_contracts::benchmarking::BenchmarkContractPolymeshHooks; - type MaxCodeLen = frame_support::traits::ConstU32<{ 123 * 1024 }>; - type MaxStorageKeyLen = frame_support::traits::ConstU32<128>; + } + + impl pallet_revive::Config for Runtime { + type Time = Timestamp; + type Balance = Balance; + type Currency = Balances; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type RuntimeOrigin = RuntimeOrigin; + type DepositPerItem = polymesh_runtime_common::DepositPerItem; + type DepositPerChildTrieItem = polymesh_runtime_common::DepositPerChildTrieItem; + type DepositPerByte = polymesh_runtime_common::DepositPerByte; + type WeightInfo = pallet_revive::weights::SubstrateWeight; + type Precompiles = (polymesh_stable_api_precompiles::PolymeshStableApiV8,); + type AddressMapper = pallet_revive::AccountId32Mapper; + type RuntimeMemory = frame_support::traits::ConstU32<{ 128 * 1024 * 1024 }>; + type PVFMemory = frame_support::traits::ConstU32<{ 512 * 1024 * 1024 }>; type UnsafeUnstableInterface = frame_support::traits::ConstBool; - type MaxDebugBufferLen = frame_support::traits::ConstU32<{ 2 * 1024 * 1024 }>; + type UploadOrigin = frame_system::EnsureSigned; + type InstantiateOrigin = frame_system::EnsureSigned; + type RuntimeHoldReason = RuntimeHoldReason; + type CodeHashLockupDepositPercent = polymesh_runtime_common::CodeHashLockupDepositPercent; + type ChainId = frame_support::traits::ConstU64<420_420_420>; + type NativeToEthRatio = frame_support::traits::ConstU64<1_000_000_000_000>; // 10^(18 - 6) Eth is 10^18, Native is 10^6. + type FindAuthor = ::FindAuthor; + type AllowEVMBytecode = frame_support::traits::ConstBool; + type FeeInfo = pallet_revive::evm::fees::Info; + type MaxEthExtrinsicWeight = polymesh_runtime_common::MaxEthExtrinsicWeight; + type DebugEnabled = frame_support::traits::ConstBool; + type GasScale = frame_support::traits::ConstU32<1>; } impl pallet_compliance_manager::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_compliance_manager::SubstrateWeight; type MaxConditionComplexity = MaxConditionComplexity; } impl pallet_capital_distribution::Config for Runtime { - type RuntimeEvent = RuntimeEvent; } impl pallet_corporate_ballot::Config for Runtime { - type RuntimeEvent = RuntimeEvent; } impl pallet_corporate_actions::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type MaxTargetIds = MaxTargetIds; type MaxDidWhts = MaxDidWhts; type WeightInfo = polymesh_weights::pallet_corporate_actions::SubstrateWeight; @@ -454,22 +670,20 @@ macro_rules! misc_pallet_impls { } impl pallet_statistics::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type MaxStatsPerAsset = MaxStatsPerAsset; type MaxTransferConditionsPerAsset = MaxTransferConditionsPerAsset; type WeightInfo = polymesh_weights::pallet_statistics::SubstrateWeight; } impl pallet_utility::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type RuntimeCall = RuntimeCall; type PalletsOrigin = OriginCaller; type WeightInfo = polymesh_weights::pallet_utility::SubstrateWeight; } impl pallet_scheduler::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; type PalletsOrigin = OriginCaller; type RuntimeCall = RuntimeCall; type MaximumWeight = MaximumSchedulerWeight; @@ -478,23 +692,34 @@ macro_rules! misc_pallet_impls { type WeightInfo = polymesh_weights::pallet_scheduler::SubstrateWeight; type OriginPrivilegeCmp = frame_support::traits::EqualPrivilegeOnly; type Preimages = Preimage; + type BlockNumberProvider = frame_system::Pallet; } parameter_types! { - pub const PreimageMaxSize: u32 = 4096 * 1024; pub const PreimageBaseDeposit: Balance = polymesh_runtime_common::deposit(2, 64); pub const PreimageByteDeposit: Balance = polymesh_runtime_common::deposit(0, 1); + pub const PreimageHoldReason: RuntimeHoldReason = RuntimeHoldReason::Preimage(pallet_preimage::HoldReason::Preimage); pub const BridgePalletName: &'static str = "Bridge"; + pub const RandomnessCollectiveFlipPalletName: &'static str = "RandomnessCollectiveFlip"; } + type RemoveRandomnessCollectiveFlipStorage = frame_support::migrations::RemovePallet< + RandomnessCollectiveFlipPalletName, + ::DbWeight + >; + impl pallet_preimage::Config for Runtime { - type WeightInfo = polymesh_weights::pallet_preimage::SubstrateWeight; type RuntimeEvent = RuntimeEvent; + type WeightInfo = polymesh_weights::pallet_preimage::SubstrateWeight; type Currency = Balances; type ManagerOrigin = polymesh_primitives::EnsureRoot; - type BaseDeposit = PreimageBaseDeposit; - type ByteDeposit = PreimageByteDeposit; + type Consideration = frame_support::traits::tokens::fungible::HoldConsideration< + polymesh_primitives::AccountId, + Balances, + PreimageHoldReason, + frame_support::traits::LinearStoragePrice, + >; } impl pallet_offences::Config for Runtime { @@ -503,8 +728,6 @@ macro_rules! misc_pallet_impls { type OnOffenceHandler = Staking; } - type GrandpaKey = (sp_core::crypto::KeyTypeId, pallet_grandpa::AuthorityId); - impl pallet_im_online::Config for Runtime { type AuthorityId = pallet_im_online::sr25519::AuthorityId; type RuntimeEvent = RuntimeEvent; @@ -515,42 +738,27 @@ macro_rules! misc_pallet_impls { type WeightInfo = polymesh_weights::pallet_im_online::SubstrateWeight; type MaxKeys = MaxKeys; type MaxPeerInHeartbeats = MaxPeerInHeartbeats; - type MaxPeerDataEncodingSize = MaxPeerDataEncodingSize; } impl pallet_grandpa::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type KeyOwnerProofSystem = Historical; - - type KeyOwnerProof = - >::Proof; - - type KeyOwnerIdentification = - >::IdentificationTuple; - - type HandleEquivocation = pallet_grandpa::EquivocationHandler< - Self::KeyOwnerIdentification, - Offences, - ReportLongevity, - >; - type WeightInfo = (); type MaxAuthorities = MaxAuthorities; + type MaxNominators = MaxNominatorRewardedPerValidator; type MaxSetIdSessionEntries = MaxSetIdSessionEntries; + type KeyOwnerProof = >::Proof; + type EquivocationReportSystem = + pallet_grandpa::EquivocationReportSystem; } - impl pallet_insecure_randomness_collective_flip::Config for Runtime {} - impl pallet_treasury::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type Currency = Balances; type WeightInfo = polymesh_weights::pallet_treasury::SubstrateWeight; } impl pallet_settlement::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Proposal = RuntimeCall; + type SchedulerCall = RuntimeCall; type Scheduler = Scheduler; type WeightInfo = polymesh_weights::pallet_settlement::SubstrateWeight; type Portfolio = Portfolio; @@ -562,10 +770,10 @@ macro_rules! misc_pallet_impls { type MaxNumberOfVenueSigners = MaxNumberOfVenueSigners; type MaxInstructionMediators = MaxInstructionMediators; type MaximumLockPeriod = MaximumLockPeriod; + type SchedulerPreimage = Preimage; } impl pallet_sto::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_sto::SubstrateWeight; } @@ -573,21 +781,30 @@ macro_rules! misc_pallet_impls { type Checker = Identity; } + impl frame_system::offchain::CreateTransaction for Runtime + where + RuntimeCall: From, + { + type Extension = TxExtension; + + fn create_transaction(call: RuntimeCall, extension: TxExtension) -> UncheckedExtrinsic { + generic::UncheckedExtrinsic::new_transaction(call, extension).into() + } + } + impl frame_system::offchain::CreateSignedTransaction for Runtime where RuntimeCall: From, { - fn create_transaction< + fn create_signed_transaction< C: frame_system::offchain::AppCrypto, >( call: RuntimeCall, public: ::Signer, account: polymesh_primitives::AccountId, - nonce: polymesh_primitives::Index, - ) -> Option<( - RuntimeCall, - ::SignaturePayload, - )> { + nonce: polymesh_primitives::Nonce, + ) -> Option { + let tip = 0; // take the biggest period possible. let period = polymesh_runtime_common::BlockHashCount::get() .checked_next_power_of_two() @@ -598,26 +815,34 @@ macro_rules! misc_pallet_impls { // The `System::block_number` is initialized with `n+1`, // so the actual block number is `n`. .saturating_sub(1); - let tip = 0; - let extra: SignedExtra = ( - frame_system::CheckSpecVersion::new(), - frame_system::CheckTxVersion::new(), - frame_system::CheckGenesis::new(), - frame_system::CheckEra::from(generic::Era::mortal(period, current_block)), + let era = generic::Era::mortal(period, current_block); + let tx_ext: TxExtension = ( + ( + frame_system::AuthorizeCall::new(), + frame_system::CheckNonZeroSender::new(), + frame_system::CheckSpecVersion::new(), + frame_system::CheckTxVersion::new(), + frame_system::CheckGenesis::new(), + ), + frame_system::CheckEra::from(era), frame_system::CheckNonce::from(nonce), frame_system::CheckWeight::new(), - pallet_transaction_payment::ChargeTransactionPayment::from(tip), + polymesh_transaction_payment::ChargeTransactionPayment::from(tip), pallet_permissions::StoreCallMetadata::new(), + frame_metadata_hash_extension::CheckMetadataHash::new(false), + pallet_revive::evm::tx_extension::SetOrigin::default(), + frame_system::WeightReclaim::new(), ); - let raw_payload = SignedPayload::new(call, extra) + let raw_payload = SignedPayload::new(call, tx_ext) .map_err(|e| { log::warn!("Unable to create signed payload: {:?}", e); }) .ok()?; let signature = raw_payload.using_encoded(|payload| C::sign(payload, public))?; let address = Indices::unlookup(account); - let (call, extra, _) = raw_payload.deconstruct(); - Some((call, (address, signature, extra))) + let (call, tx_ext, _) = raw_payload.deconstruct(); + let transaction = generic::UncheckedExtrinsic::new_signed(call, address, signature, tx_ext).into(); + Some(transaction) } } @@ -626,16 +851,49 @@ macro_rules! misc_pallet_impls { type Signature = polymesh_primitives::Signature; } - impl frame_system::offchain::SendTransactionTypes for Runtime + impl frame_system::offchain::CreateTransactionBase for Runtime where RuntimeCall: From, { type Extrinsic = UncheckedExtrinsic; - type OverarchingCall = RuntimeCall; + type RuntimeCall = RuntimeCall; + } + + impl frame_system::offchain::CreateAuthorizedTransaction for Runtime + where + RuntimeCall: From, + { + fn create_extension() -> Self::Extension { + ( + ( + frame_system::AuthorizeCall::::new(), + frame_system::CheckNonZeroSender::::new(), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + ), + frame_system::CheckEra::::from(generic::Era::Immortal), + frame_system::CheckNonce::::from(0), + frame_system::CheckWeight::::new(), + polymesh_transaction_payment::ChargeTransactionPayment::::from(0), + pallet_permissions::StoreCallMetadata::::new(), + frame_metadata_hash_extension::CheckMetadataHash::::new(false), + pallet_revive::evm::tx_extension::SetOrigin::::default(), + frame_system::WeightReclaim::::new(), + ) + } + } + + impl frame_system::offchain::CreateInherent for Runtime + where + RuntimeCall: From, + { + fn create_bare(call: RuntimeCall) -> UncheckedExtrinsic { + generic::UncheckedExtrinsic::new_bare(call).into() + } } impl pallet_nft::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_nft::SubstrateWeight; type Compliance = pallet_compliance_manager::Pallet; type MaxNumberOfCollectionKeys = MaxNumberOfCollectionKeys; @@ -657,8 +915,6 @@ macro_rules! misc_pallet_impls { type SignedPhase = polymesh_runtime_common::SignedPhaseBench; // The minimum amount of improvement to the solution score in the Signed phase type BetterSignedThreshold = (); - // The minimum amount of improvement to the solution score in the Unsigned phase - type BetterUnsignedThreshold = polymesh_runtime_common::BetterUnsignedThreshold; // The repeat threshold of the offchain worker type OffchainRepeat = polymesh_runtime_common::OffChainRepeat; // The priority of the unsigned transaction submitted in the unsigned-phase @@ -673,18 +929,17 @@ macro_rules! misc_pallet_impls { type SignedMaxRefunds = polymesh_runtime_common::SignedMaxRefunds; // Base reward for a signed solution type SignedRewardBase = polymesh_runtime_common::SignedRewardBase; - // Base deposit for a signed solution - type SignedDepositBase = polymesh_runtime_common::SignedDepositBase; // Per-byte deposit for a signed solution type SignedDepositByte = polymesh_runtime_common::SignedDepositByte; // Per-weight deposit for a signed solution type SignedDepositWeight = (); - // The maximum number of electing voters to put in the snapshot - type MaxElectingVoters = polymesh_runtime_common::MaxElectingVoters; - // The maximum number of electable targets to put in the snapshot - type MaxElectableTargets = polymesh_runtime_common::MaxElectableTargets; // The maximum number of winners that can be elected by this `ElectionProvider` implementation type MaxWinners = polymesh_runtime_common::MaxActiveValidators; + // Base deposit for a signed solution + type SignedDepositBase = + pallet_election_provider_multi_phase::GeometricDepositBase; + /// The maximum number of electing voters and electable targets to put in the snapshot. + type ElectionBounds = polymesh_runtime_common::ElectionBoundsMultiPhase; // Handler for the slashed deposits type SlashHandler = (); // Handler for the rewards @@ -709,25 +964,28 @@ macro_rules! misc_pallet_impls { polymesh_runtime_common::impls::ElectionProviderBenchmarkConfig; // The weight of the pallet. type WeightInfo = pallet_election_provider_multi_phase::weights::SubstrateWeight; + type MaxBackersPerWinner = polymesh_runtime_common::MaxElectingVotersSolution; } impl pallet_election_provider_multi_phase::MinerConfig for Runtime { type AccountId = polymesh_primitives::AccountId; - type MaxLength = polymesh_runtime_common::MinerMaxLength; - type MaxWeight = polymesh_runtime_common::MinerMaxWeight; - type Solution = polymesh_runtime_common::NposSolution16; - type MaxVotesPerVoter = - <::DataProvider as frame_election_provider_support::ElectionDataProvider>::MaxVotesPerVoter; - - // The unsigned submissions have to respect the weight of the submit_unsigned call, thus their - // weight estimate function is wired to this call's weight. - fn solution_weight(v: u32, t: u32, a: u32, d: u32) -> Weight { - < - ::WeightInfo - as - pallet_election_provider_multi_phase::WeightInfo - >::submit_unsigned(v, t, a, d) - } + type MaxLength = polymesh_runtime_common::MinerMaxLength; + type MaxWeight = polymesh_runtime_common::MinerMaxWeight; + type Solution = polymesh_runtime_common::NposSolution16; + type MaxVotesPerVoter = + <::DataProvider as frame_election_provider_support::ElectionDataProvider>::MaxVotesPerVoter; + type MaxWinners = polymesh_runtime_common::MaxActiveValidators; + type MaxBackersPerWinner = polymesh_runtime_common::MaxElectingVotersSolution; + + // The unsigned submissions have to respect the weight of the submit_unsigned call, thus their + // weight estimate function is wired to this call's weight. + fn solution_weight(v: u32, t: u32, a: u32, d: u32) -> Weight { + < + ::WeightInfo + as + pallet_election_provider_multi_phase::WeightInfo + >::submit_unsigned(v, t, a, d) + } } }; } @@ -736,9 +994,11 @@ macro_rules! misc_pallet_impls { #[macro_export] macro_rules! runtime_apis { ($($extra:item)*) => { - use frame_support::dispatch::{GetStorageVersion, DispatchError}; + use frame_support::pallet_prelude::DispatchError; + use frame_support::traits::GetStorageVersion; use sp_inherents::{CheckInherentsResult, InherentData}; - use frame_support::dispatch::result::Result as FrameResult; + use sp_api::impl_runtime_apis; + use frame_support::dispatch::DispatchResult; use node_rpc_runtime_api::asset as rpc_api_asset; use pallet_identity::types::{AssetDidResult, CddStatus, RpcDidRecords}; @@ -750,7 +1010,7 @@ macro_rules! runtime_apis { use polymesh_primitives::settlement::{InstructionId, ExecuteInstructionInfo}; use polymesh_primitives::transfer_compliance::TransferCondition; use polymesh_primitives::compliance_manager::{AssetComplianceResult, ComplianceReport}; - use polymesh_primitives::{IdentityId, Index, NFTs, PortfolioId}; + use polymesh_primitives::{IdentityId, Nonce, NFTs, PortfolioId}; use polymesh_primitives::{Signatory, Ticker, WeightMeter, IdentityClaim}; /// The address format for describing accounts. @@ -764,47 +1024,98 @@ macro_rules! runtime_apis { /// BlockId type as expected by this runtime. pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. - pub type SignedExtra = ( - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, + pub type TxExtension = ( + ( + frame_system::AuthorizeCall, + frame_system::CheckNonZeroSender, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + ), frame_system::CheckEra, frame_system::CheckNonce, frame_system::CheckWeight, - pallet_transaction_payment::ChargeTransactionPayment, + polymesh_transaction_payment::ChargeTransactionPayment, pallet_permissions::StoreCallMetadata, + frame_metadata_hash_extension::CheckMetadataHash, + pallet_revive::evm::tx_extension::SetOrigin, + frame_system::WeightReclaim, ); + + #[derive(Clone, PartialEq, Eq, Debug)] + pub struct EthExtraImpl; + + impl pallet_revive::evm::runtime::EthExtra for EthExtraImpl { + type Config = Runtime; + type Extension = TxExtension; + + fn get_eth_extension(nonce: u32, tip: Balance) -> Self::Extension { + ( + ( + frame_system::AuthorizeCall::::new(), + frame_system::CheckNonZeroSender::::new(), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + ), + frame_system::CheckEra::::from(generic::Era::Immortal), + frame_system::CheckNonce::::from(nonce), + frame_system::CheckWeight::::new(), + polymesh_transaction_payment::ChargeTransactionPayment::::from(tip), + pallet_permissions::StoreCallMetadata::new(), + frame_metadata_hash_extension::CheckMetadataHash::::new(false), + pallet_revive::evm::tx_extension::SetOrigin::::new_from_eth_transaction(), + frame_system::WeightReclaim::::new(), + ) + } + } + /// Unchecked extrinsic type as expected by this runtime. - pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; + pub type UncheckedExtrinsic = pallet_revive::evm::runtime::UncheckedExtrinsic; /// The payload being signed in transactions. - pub type SignedPayload = generic::SignedPayload; + pub type SignedPayload = generic::SignedPayload; /// Extrinsic type that has already been checked. - pub type CheckedExtrinsic = generic::CheckedExtrinsic; + pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Executive: handles dispatch to the various modules. - pub type Executive = pallet_executive::Executive< + pub type Executive = frame_executive::Executive< Runtime, Block, frame_system::ChainContext, Runtime, - AllPalletsWithSystem, - ( - pallet_scheduler::migration::v4::CleanupAgendas, - pallet_contracts::Migration, - polymesh_runtime_common::migration::RemovePallet::DbWeight>, - ) + AllPalletsWithSystem >; - sp_api::impl_runtime_apis! { + type EventRecord = frame_system::EventRecord< + ::RuntimeEvent, + ::Hash, + >; + + /// MMR helper types. + mod mmr { + use super::*; + pub use pallet_mmr::primitives::*; + + pub type Leaf = <::LeafData as LeafDataProvider>::LeafData; + pub type Hash = ::Output; + pub type Hashing = ::Hashing; + } + + pallet_revive::impl_runtime_apis_plus_revive_traits!( + Runtime, + Revive, + Executive, + EthExtraImpl, + impl sp_api::Core for Runtime { fn version() -> RuntimeVersion { VERSION } - fn execute_block(block: Block) { + fn execute_block(block: ::LazyBlock) { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -813,6 +1124,14 @@ macro_rules! runtime_apis { fn metadata() -> sp_core::OpaqueMetadata { sp_core::OpaqueMetadata::new(Runtime::metadata().into()) } + + fn metadata_at_version(version: u32) -> Option { + Runtime::metadata_at_version(version) + } + + fn metadata_versions() -> sp_std::vec::Vec { + Runtime::metadata_versions() + } } impl sp_block_builder::BlockBuilder for Runtime { @@ -828,7 +1147,7 @@ macro_rules! runtime_apis { data.create_extrinsics() } - fn check_inherents(block: Block, data: InherentData) -> CheckInherentsResult { + fn check_inherents(block: ::LazyBlock, data: InherentData) -> CheckInherentsResult { data.check_extrinsics(&block) } } @@ -940,8 +1259,8 @@ macro_rules! runtime_apis { } } - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: polymesh_primitives::AccountId) -> Index { + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: polymesh_primitives::AccountId) -> Nonce { System::account_nonce(account) } } @@ -952,6 +1271,7 @@ macro_rules! runtime_apis { Balance, BlockNumber, polymesh_primitives::Hash, + EventRecord, > for Runtime { fn call( origin: polymesh_primitives::AccountId, @@ -960,9 +1280,19 @@ macro_rules! runtime_apis { gas_limit: Option, storage_deposit_limit: Option, input_data: Vec, - ) -> pallet_contracts_primitives::ContractExecResult { + ) -> pallet_contracts::ContractExecResult { let gas_limit = gas_limit.unwrap_or(polymesh_runtime_common::RuntimeBlockWeights::get().max_block); - Contracts::bare_call(origin, dest, value, gas_limit, storage_deposit_limit, input_data, true, pallet_contracts::Determinism::Deterministic) + Contracts::bare_call( + origin, + dest, + value, + gas_limit, + storage_deposit_limit, + input_data, + pallet_contracts::DebugInfo::UnsafeDebug, + pallet_contracts::CollectEvents::UnsafeCollect, + pallet_contracts::Determinism::Enforced, + ) } fn instantiate( @@ -970,12 +1300,22 @@ macro_rules! runtime_apis { value: Balance, gas_limit: Option, storage_deposit_limit: Option, - code: pallet_contracts_primitives::Code, + code: pallet_contracts::Code, data: Vec, salt: Vec, - ) -> pallet_contracts_primitives::ContractInstantiateResult { + ) -> pallet_contracts::ContractInstantiateResult { let gas_limit = gas_limit.unwrap_or(polymesh_runtime_common::RuntimeBlockWeights::get().max_block); - Contracts::bare_instantiate(origin, value, gas_limit, storage_deposit_limit, code, data, salt, true) + Contracts::bare_instantiate( + origin, + value, + gas_limit, + storage_deposit_limit, + code, + data, + salt, + pallet_contracts::DebugInfo::UnsafeDebug, + pallet_contracts::CollectEvents::UnsafeCollect, + ) } fn upload_code( @@ -983,14 +1323,14 @@ macro_rules! runtime_apis { code: Vec, storage_deposit_limit: Option, determinism: pallet_contracts::Determinism, - ) -> pallet_contracts_primitives::CodeUploadResult { + ) -> pallet_contracts::CodeUploadResult { Contracts::bare_upload_code(origin, code, storage_deposit_limit, determinism) } fn get_storage( address: polymesh_primitives::AccountId, key: Vec, - ) -> pallet_contracts_primitives::GetStorageResult { + ) -> pallet_contracts::GetStorageResult { Contracts::get_storage(address, key) } } @@ -999,13 +1339,11 @@ macro_rules! runtime_apis { Block, > for Runtime { fn query_info(uxt: ::Extrinsic, len: u32) -> RuntimeDispatchInfo { - let actual = uxt.function.get_actual_weight(); - TransactionPayment::query_info(uxt, len, actual) + TransactionPayment::query_info(uxt, len) } fn query_fee_details(uxt: ::Extrinsic, len: u32) -> pallet_transaction_payment::FeeDetails { - let actual = uxt.function.get_actual_weight(); - TransactionPayment::query_fee_details(uxt, len, actual) + TransactionPayment::query_fee_details(uxt, len) } } @@ -1013,12 +1351,10 @@ macro_rules! runtime_apis { for Runtime { fn query_call_info(call: RuntimeCall, len: u32) -> RuntimeDispatchInfo { - let actual = call.get_actual_weight(); - TransactionPayment::query_call_info(call, len, actual) + TransactionPayment::query_call_info(call, len) } fn query_call_fee_details(call: RuntimeCall, len: u32) -> pallet_transaction_payment::FeeDetails { - let actual = call.get_actual_weight(); - TransactionPayment::query_call_fee_details(call, len, actual) + TransactionPayment::query_call_fee_details(call, len) } } @@ -1034,9 +1370,17 @@ macro_rules! runtime_apis { } } - impl pallet_staking_rpc_runtime_api::StakingApi for Runtime { - fn get_curve() -> Vec<(Perbill, Perbill)> { - RewardCurve::get().points.to_vec() + impl pallet_staking_runtime_api::StakingApi for Runtime { + fn nominations_quota(balance: Balance) -> u32 { + Staking::api_nominations_quota(balance) + } + + fn eras_stakers_page_count(era: sp_staking::EraIndex, account: polymesh_primitives::AccountId) -> sp_staking::Page { + Staking::api_eras_stakers_page_count(era, account) + } + + fn pending_rewards(era: sp_staking::EraIndex, account: polymesh_primitives::AccountId) -> bool { + Staking::api_pending_rewards(era, account) } } @@ -1208,7 +1552,7 @@ macro_rules! runtime_apis { asset_id: &AssetId, sender_identity: &IdentityId, receiver_identity: &IdentityId, - ) -> FrameResult { + ) -> Result { let mut weight_meter = WeightMeter::max_limit_no_minimum(); ComplianceManager::compliance_report( asset_id, @@ -1226,7 +1570,7 @@ macro_rules! runtime_apis { sender_did: &IdentityId, receiver_did: &IdentityId, transfer_amount: Balance, - ) -> FrameResult, DispatchError> { + ) -> Result, DispatchError> { let mut weight_meter = WeightMeter::max_limit_no_minimum(); Statistics::transfer_restrictions_report( asset_id, @@ -1238,7 +1582,141 @@ macro_rules! runtime_apis { } } + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn build_state(config: Vec) -> sp_genesis_builder::Result { + frame_support::genesis_builder_helper::build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + frame_support::genesis_builder_helper::get_preset::(id, |_| None) + } + + + fn preset_names() -> Vec { + vec![] + } + } + + #[api_version(6)] + impl sp_consensus_beefy::BeefyApi for Runtime { + fn beefy_genesis() -> Option { + pallet_beefy::GenesisBlock::::get() + } + + fn validator_set() -> Option> { + Beefy::validator_set() + } + + fn submit_report_double_voting_unsigned_extrinsic( + equivocation_proof: sp_consensus_beefy::DoubleVotingProof< + BlockNumber, + BeefyId, + BeefySignature, + >, + key_owner_proof: sp_consensus_beefy::OpaqueKeyOwnershipProof, + ) -> Option<()> { + let key_owner_proof = key_owner_proof.decode()?; + + Beefy::submit_unsigned_double_voting_report( + equivocation_proof, + key_owner_proof, + ) + } + + fn submit_report_fork_voting_unsigned_extrinsic( + equivocation_proof: + sp_consensus_beefy::ForkVotingProof< + ::Header, + BeefyId, + sp_runtime::OpaqueValue + >, + key_owner_proof: sp_consensus_beefy::OpaqueKeyOwnershipProof, + ) -> Option<()> { + Beefy::submit_unsigned_fork_voting_report( + equivocation_proof.try_into()?, + key_owner_proof.decode()?, + ) + } + + fn submit_report_future_block_voting_unsigned_extrinsic( + equivocation_proof: sp_consensus_beefy::FutureBlockVotingProof, + key_owner_proof: sp_consensus_beefy::OpaqueKeyOwnershipProof, + ) -> Option<()> { + Beefy::submit_unsigned_future_block_voting_report( + equivocation_proof, + key_owner_proof.decode()?, + ) + } + + fn generate_key_ownership_proof( + _set_id: sp_consensus_beefy::ValidatorSetId, + authority_id: BeefyId, + ) -> Option { + Historical::prove((sp_consensus_beefy::KEY_TYPE, authority_id)) + .map(|p| p.encode()) + .map(sp_consensus_beefy::OpaqueKeyOwnershipProof::new) + } + } + + #[api_version(3)] + impl pallet_mmr::primitives::MmrApi< + Block, + mmr::Hash, + BlockNumber, + > for Runtime { + fn mmr_root() -> Result { + Ok(pallet_mmr::RootHash::::get()) + } + + fn mmr_leaf_count() -> Result { + Ok(pallet_mmr::NumberOfLeaves::::get()) + } + + fn generate_proof( + block_numbers: Vec, + best_known_block_number: Option, + ) -> Result<(Vec, mmr::LeafProof), mmr::Error> { + Mmr::generate_proof(block_numbers, best_known_block_number).map( + |(leaves, proof)| { + ( + leaves + .into_iter() + .map(|leaf| mmr::EncodableOpaqueLeaf::from_leaf(&leaf)) + .collect(), + proof, + ) + }, + ) + } + + fn verify_proof(leaves: Vec, proof: mmr::LeafProof) + -> Result<(), mmr::Error> + { + let leaves = leaves.into_iter().map(|leaf| + leaf.into_opaque_leaf() + .try_decode() + .ok_or(mmr::Error::Verify)).collect::, mmr::Error>>()?; + Mmr::verify_leaves(leaves, proof) + } + + fn generate_ancestry_proof( + prev_block_number: BlockNumber, + best_known_block_number: Option, + ) -> Result, mmr::Error> { + Mmr::generate_ancestry_proof(prev_block_number, best_known_block_number) + } + + fn verify_proof_stateless( + root: mmr::Hash, + leaves: Vec, + proof: mmr::LeafProof + ) -> Result<(), mmr::Error> { + let nodes = leaves.into_iter().map(|leaf|mmr::DataOrHash::Data(leaf.into_opaque_leaf())).collect(); + pallet_mmr::verify_leaves_proof::(root, nodes, proof) + } + } + $($extra)* - } + ); } } diff --git a/pallets/runtime/develop/Cargo.toml b/pallets/runtime/develop/Cargo.toml index f4ad8eb883..e1c9549200 100644 --- a/pallets/runtime/develop/Cargo.toml +++ b/pallets/runtime/develop/Cargo.toml @@ -33,81 +33,87 @@ pallet-protocol-fee = { workspace = true, default-features = false } pallet-relayer = { workspace = true, default-features = false } pallet-sto = { workspace = true, default-features = false } pallet-settlement = { workspace = true, default-features = false } -pallet-staking = { workspace = true, default-features = false } -pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false } +pallet-validators = { workspace = true, default-features = false } pallet-statistics = { workspace = true, default-features = false } pallet-transaction-payment = { workspace = true, default-features = false } pallet-treasury = { workspace = true, default-features = false } pallet-utility = { workspace = true, default-features = false } -pallet-sudo = { workspace = true, default-features = false } polymesh-contracts = { workspace = true, default-features = false } +polymesh-stable-api-precompiles = { workspace = true, default-features = false } +polymesh-transaction-payment = { workspace = true, default-features = false } # Others serde = { version = "1.0.104", default-features = false } -log = "0.4.8" +log = { version = "0.4.8", default-features = false } # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-inherents = { version = "4.0.0-dev", default-features = false } -sp-offchain = { version = "4.0.0-dev", default-features = false } -sp-staking = { version = "4.0.0-dev", default-features = false } -sp-consensus-babe = { version = "0.10.0-dev", default-features = false } -sp-consensus-grandpa = { version = "4.0.0-dev", default-features = false } -sp-session = { version = "4.0.0-dev", default-features = false } -sp-authority-discovery = { version = "4.0.0-dev", default-features = false } -sp-transaction-pool = { version = "4.0.0-dev", default-features = false } -sp-block-builder = { version = "4.0.0-dev", default-features = false } -sp-arithmetic = { version = "6.0.0", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } +sp-inherents = { workspace = true, default-features = false } +sp-offchain = { workspace = true, default-features = false } +sp-staking = { workspace = true, default-features = false } +sp-consensus-babe = { workspace = true, default-features = false } +sp-consensus-beefy = { workspace = true, default-features = false } +sp-consensus-grandpa = { workspace = true, default-features = false } +sp-session = { workspace = true, default-features = false } +sp-authority-discovery = { workspace = true, default-features = false } +sp-transaction-pool = { workspace = true, default-features = false } +sp-block-builder = { workspace = true, default-features = false } +sp-arithmetic = { workspace = true, default-features = false } +sp-genesis-builder = { workspace = true, default-features = false } # -pallet-authorship = { version = "4.0.0-dev", default-features = false } -pallet-contracts = { version = "4.0.0-dev", default-features = false } -pallet-contracts-primitives = { version = "7.0.0", default-features = false } -pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false } -pallet-executive = { package = "frame-executive", version = "4.0.0-dev", default-features = false } -pallet-grandpa = { version = "4.0.0-dev", default-features = false } -pallet-im-online = { version = "4.0.0-dev", default-features = false } -pallet-indices = { version = "4.0.0-dev", default-features = false } -pallet-offences = { version = "4.0.0-dev", default-features = false } -pallet-preimage = { version = "4.0.0-dev", default-features = false } -pallet-session = { version = "4.0.0-dev", default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } -pallet-babe = { version = "4.0.0-dev", default-features = false } -pallet-authority-discovery = { version = "4.0.0-dev", default-features = false } -pallet-insecure-randomness-collective-flip = { version = "4.0.0-dev", default-features = false } -pallet-scheduler = { version = "4.0.0-dev", default-features = false } - -frame-election-provider-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } +pallet-authority-discovery = { workspace = true, default-features = false } +pallet-authorship = { workspace = true, default-features = false } +pallet-babe = { workspace = true, default-features = false } +pallet-beefy = { workspace = true, default-features = false } +pallet-beefy-mmr = { workspace = true, default-features = false } +pallet-contracts = { workspace = true, default-features = false } +pallet-election-provider-multi-phase = { workspace = true, default-features = false } +pallet-grandpa = { workspace = true, default-features = false } +pallet-im-online = { workspace = true, default-features = false } +pallet-indices = { workspace = true, default-features = false } +pallet-mmr = { workspace = true, default-features = false } +pallet-offences = { workspace = true, default-features = false } +pallet-preimage = { workspace = true, default-features = false } +pallet-revive = { workspace = true, default-features = false } +pallet-scheduler = { workspace = true, default-features = false } +pallet-session = { workspace = true, default-features = false } +pallet-staking = { workspace = true, default-features = false } +pallet-staking-reward-curve = { workspace = true, default-features = false } +pallet-sudo = { workspace = true, default-features = false } +pallet-timestamp = { workspace = true, default-features = false } + +frame-metadata-hash-extension = { workspace = true, default-features = false } +frame-executive = { workspace = true, default-features = false } +frame-election-provider-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } # RPC -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false } +frame-system-rpc-runtime-api = { workspace = true, default-features = false } pallet-group-rpc-runtime-api = { workspace = true, default-features = false } pallet-protocol-fee-rpc-runtime-api = { workspace = true, default-features = false } -pallet-staking-rpc-runtime-api = { workspace = true, default-features = false } +pallet-staking-runtime-api = { workspace = true, default-features = false } node-rpc-runtime-api = { workspace = true, default-features = false } # Used for runtime benchmarking -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } -frame-system-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } -hex-literal = { version = "0.3.1", optional = true } - -# Import 'getrandom' here to enable feature `getrandom/js` for wasm builds. -getrandom = { version = "0.2.6", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } +frame-system-benchmarking = { workspace = true, default-features = false, optional = true } +hex-literal = { version = "0.3.1", default-features = false, optional = true } [build-dependencies] -polymesh-build-tool = { workspace = true, default-features = false } +polymesh-build-tool = { workspace = true, default-features = false, optional = true } [features] default = ["std", "equalize"] -disable_fees = ["pallet-transaction-payment/disable_fees"] +testing = [] +disable_fees = ["polymesh-transaction-payment/disable_fees"] equalize = [] ci-runtime = [] @@ -115,132 +121,118 @@ ci-runtime = [] # Backends u64_backend = ["polymesh-primitives/u64_backend"] -no_std = [ - "polymesh-primitives/no_std", - "u64_backend" -] +no_std = ["polymesh-primitives/no_std", "u64_backend"] std = [ - "polymesh-build-tool/std", - "u64_backend", - "codec/std", - "frame-benchmarking?/std", + "polymesh-build-tool/std", + "frame-metadata-hash-extension/std", "frame-election-provider-support/std", + "frame-executive/std", "frame-support/std", - "frame-system-rpc-runtime-api/std", - "frame-system-benchmarking?/std", "frame-system/std", + "frame-system-rpc-runtime-api/std", "node-rpc-runtime-api/std", "pallet-asset/std", "pallet-authority-discovery/std", - "pallet-authorship/std", - "pallet-base/std", "pallet-babe/std", + "pallet-beefy/std", + "pallet-beefy-mmr/std", + "pallet-mmr/std", "pallet-balances/std", - "pallet-sto/std", "pallet-committee/std", - "pallet-compliance-manager/std", "pallet-contracts/std", "pallet-corporate-actions/std", - "pallet-election-provider-multi-phase/std", - "pallet-executive/std", - "pallet-external-agents/std", "pallet-grandpa/std", - "pallet-group-rpc-runtime-api/std", "pallet-group/std", - "pallet-identity/std", + "pallet-group-rpc-runtime-api/std", "pallet-im-online/std", "pallet-indices/std", "pallet-multisig/std", "pallet-nft/std", - "pallet-offences/std", - "pallet-permissions/std", - "pallet-preimage/std", "pallet-pips/std", "pallet-portfolio/std", - "pallet-protocol-fee-rpc-runtime-api/std", "pallet-protocol-fee/std", - "pallet-relayer/std", - "pallet-insecure-randomness-collective-flip/std", - "pallet-scheduler/std", + "pallet-protocol-fee-rpc-runtime-api/std", + "pallet-revive/std", "pallet-session/std", "pallet-settlement/std", - "pallet-staking-rpc-runtime-api/std", "pallet-staking/std", + "pallet-staking-runtime-api/std", "pallet-statistics/std", + "pallet-sto/std", "pallet-sudo/std", - "pallet-timestamp/std", "pallet-transaction-payment/std", - "pallet-treasury/std", + "polymesh-transaction-payment/std", "pallet-utility/std", - "polymesh-primitives/std", - "polymesh-common-utilities/std", + "pallet-validators/std", + "polymesh-contracts/std", + "polymesh-stable-api-precompiles/std", "polymesh-runtime-common/std", "polymesh-weights/std", - "serde/std", "sp-api/std", - "sp-arithmetic/std", - "sp-authority-discovery/std", "sp-block-builder/std", "sp-consensus-babe/std", "sp-consensus-grandpa/std", - "sp-core/std", - "sp-inherents/std", - "sp-io/std", - "sp-offchain/std", - "sp-runtime/std", + "sp-genesis-builder/std", "sp-session/std", - "sp-staking/std", - "sp-std/std", "sp-transaction-pool/std", - "sp-version/std", - "polymesh-contracts/std", ] runtime-benchmarks = [ - "getrandom/js", - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", + "frame-benchmarking", "frame-system-benchmarking/runtime-benchmarks", + "frame-election-provider-support/runtime-benchmarks", + "frame-support/runtime-benchmarks", "frame-system/runtime-benchmarks", - "pallet-babe/runtime-benchmarks", - "pallet-indices/runtime-benchmarks", - "pallet-grandpa/runtime-benchmarks", - "pallet-preimage/runtime-benchmarks", - "pallet-scheduler/runtime-benchmarks", "hex-literal", "pallet-asset/runtime-benchmarks", + "pallet-babe/runtime-benchmarks", "pallet-balances/runtime-benchmarks", + "pallet-beefy-mmr/runtime-benchmarks", + "pallet-mmr/runtime-benchmarks", "pallet-committee/runtime-benchmarks", - "pallet-compliance-manager/runtime-benchmarks", "pallet-contracts/runtime-benchmarks", "pallet-corporate-actions/runtime-benchmarks", - "pallet-external-agents/runtime-benchmarks", + "pallet-grandpa/runtime-benchmarks", "pallet-group/runtime-benchmarks", - "pallet-identity/runtime-benchmarks", - "pallet-multisig/runtime-benchmarks", "pallet-im-online/runtime-benchmarks", - "pallet-permissions/runtime-benchmarks", + "pallet-indices/runtime-benchmarks", + "pallet-multisig/runtime-benchmarks", + "pallet-nft/runtime-benchmarks", "pallet-pips/runtime-benchmarks", "pallet-portfolio/runtime-benchmarks", + "pallet-preimage/runtime-benchmarks", "pallet-protocol-fee/runtime-benchmarks", "pallet-relayer/runtime-benchmarks", + "pallet-revive/runtime-benchmarks", + "pallet-scheduler/runtime-benchmarks", "pallet-settlement/runtime-benchmarks", - "pallet-sto/runtime-benchmarks", "pallet-staking/runtime-benchmarks", "pallet-statistics/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", + "pallet-sto/runtime-benchmarks", + "pallet-transaction-payment/runtime-benchmarks", + "polymesh-transaction-payment/runtime-benchmarks", "pallet-treasury/runtime-benchmarks", "pallet-utility/runtime-benchmarks", - "pallet-staking/runtime-benchmarks", + "pallet-validators/runtime-benchmarks", "polymesh-contracts/runtime-benchmarks", - "polymesh-primitives/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "pallet-nft/runtime-benchmarks", - "frame-election-provider-support/runtime-benchmarks", - "pallet-election-provider-multi-phase/runtime-benchmarks", + "polymesh-stable-api-precompiles/runtime-benchmarks", + "polymesh-runtime-common/runtime-benchmarks", ] running-ci = [ "pallet-statistics/running-ci", "pallet-pips/running-ci", "pallet-identity/running-ci", ] + +# Enable the metadata hash generation. +# +# This is hidden behind a feature because it increases the compile time. +# The wasm binary needs to be compiled twice, once to fetch the metadata, +# generate the metadata hash and then a second time with the +# `RUNTIME_METADATA_HASH` environment variable set for the `CheckMetadataHash` +# extension. +metadata-hash = ["polymesh-build-tool?/metadata-hash"] + +# A convenience feature for enabling things when doing a build +# for an on-chain release. +on-chain-release-build = ["metadata-hash", "sp-api/disable-logging"] diff --git a/pallets/runtime/develop/src/benchmarks/pallet_session.rs b/pallets/runtime/develop/src/benchmarks/pallet_session.rs index 7a4cfa13b5..5a3cc32616 100644 --- a/pallets/runtime/develop/src/benchmarks/pallet_session.rs +++ b/pallets/runtime/develop/src/benchmarks/pallet_session.rs @@ -22,27 +22,25 @@ // - It uses our Staking pallet. use codec::Decode; -use core::convert::TryInto; use frame_benchmarking::benchmarks; -use frame_support::traits::{Currency, Get, OnInitialize}; +use frame_support::traits::OnInitialize; +use frame_system::pallet_prelude::BlockNumberFor; use frame_system::RawOrigin; -use pallet_session::{Call, Pallet as Session}; -use pallet_staking::benchmarking::create_validator_with_nominators; -use pallet_staking::RewardDestination; +use sp_core::Get; use sp_runtime::traits::TrailingZeroInput; use sp_std::prelude::*; use sp_std::vec; -use polymesh_primitives::constants::currency::POLY; +use pallet_session::historical::Config as HistoricalConfig; +use pallet_session::{Call, Config as SessionConfig, Pallet as Session}; +use pallet_staking::benchmarking::create_validator_with_nominators; +use pallet_staking::{Config as StakingConfig, MaxNominationsOf, RewardDestination}; pub struct Pallet(Session); -pub trait Config: - pallet_session::Config + pallet_session::historical::Config + pallet_staking::Config -{ -} +pub trait Config: SessionConfig + HistoricalConfig + StakingConfig {} -impl OnInitialize for Pallet { - fn on_initialize(n: T::BlockNumber) -> frame_support::weights::Weight { +impl OnInitialize> for Pallet { + fn on_initialize(n: BlockNumberFor) -> frame_support::weights::Weight { Session::::on_initialize(n) } } @@ -54,23 +52,16 @@ struct ValidatorInfo { } impl ValidatorInfo { - pub fn build(nominators: u32) -> Result, &'static str> - where - <::Currency as Currency< - ::AccountId, - >>::Balance: From, - { - let balance: u32 = (4_000 * POLY).try_into().unwrap(); + pub fn build(nominators: u32) -> Result, &'static str> { let stash = create_validator_with_nominators::( nominators, - ::MaxNominations::get(), + MaxNominationsOf::::get(), + false, false, RewardDestination::Staked, - Some(balance), ) .unwrap() - .0 - .account(); + .0; let controller = pallet_staking::Pallet::::bonded(&stash).expect("not stash"); let keys = T::Keys::decode(&mut TrailingZeroInput::zeroes()).unwrap(); @@ -89,13 +80,8 @@ impl ValidatorInfo { } benchmarks! { - where_clause { - where - <::Currency as Currency<::AccountId>>::Balance: From, - } - set_keys { - let n = ::MaxNominations::get() as u32; + let n = MaxNominationsOf::::get(); let validator = ValidatorInfo::::build(n).unwrap(); let proof = validator.proof.clone(); let keys = validator.keys.clone(); @@ -103,7 +89,7 @@ benchmarks! { }: _(RawOrigin::Signed(validator.controller), keys, proof) purge_keys { - let n = ::MaxNominations::get() as u32; + let n = MaxNominationsOf::::get(); let validator = ValidatorInfo::::build(n).unwrap(); let controller = RawOrigin::Signed(validator.controller.clone()); diff --git a/pallets/runtime/develop/src/lib.rs b/pallets/runtime/develop/src/lib.rs index ce50ba6285..0abe67d0b9 100644 --- a/pallets/runtime/develop/src/lib.rs +++ b/pallets/runtime/develop/src/lib.rs @@ -1,6 +1,6 @@ #![cfg_attr(not(feature = "std"), no_std)] // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] +#![recursion_limit = "1024"] #[cfg(feature = "runtime-benchmarks")] #[macro_use] @@ -18,10 +18,10 @@ pub use pallet_staking::StakerStatus; #[cfg(feature = "std")] pub use runtime::{native_version, WASM_BINARY}; +pub use sp_runtime::{Perbill, Permill}; + pub use runtime::{ api, Asset, Authorship, Balances, BalancesCall, CheckedExtrinsic, MinimumPeriod, ProtocolFee, Runtime, RuntimeApi, RuntimeCall, SessionKeys, System, SystemCall, TransactionPayment, - UncheckedExtrinsic, + TxExtension, UncheckedExtrinsic, }; - -pub use sp_runtime::{Perbill, Permill}; diff --git a/pallets/runtime/develop/src/runtime.rs b/pallets/runtime/develop/src/runtime.rs index 346f0d2160..8613dc7e7e 100644 --- a/pallets/runtime/develop/src/runtime.rs +++ b/pallets/runtime/develop/src/runtime.rs @@ -8,16 +8,13 @@ pub use sp_runtime::BuildStorage; use codec::Encode; use core::convert::TryFrom; -use frame_support::traits::KeyOwnerProofSystem; +use frame_support::parameter_types; +use frame_support::traits::{ConstBool, KeyOwnerProofSystem}; use frame_support::weights::Weight; -use frame_support::{construct_runtime, parameter_types}; -use sp_runtime::create_runtime_str; use sp_runtime::curve::PiecewiseLinear; -use sp_runtime::traits::{ - BlakeTwo256, Block as BlockT, Extrinsic, NumberFor, StaticLookup, Verify, -}; +use sp_runtime::traits::{BlakeTwo256, Block as BlockT, NumberFor, StaticLookup, Verify}; use sp_runtime::transaction_validity::TransactionPriority; -use sp_runtime::{Perbill, Permill}; +use sp_runtime::{Cow, Perbill, Permill}; use sp_std::prelude::*; use sp_version::RuntimeVersion; @@ -30,7 +27,7 @@ use polymesh_common_utilities::protocol_fee::ProtocolOp; use polymesh_primitives::constants::currency::*; use polymesh_primitives::constants::ENSURED_MAX_LEN; use polymesh_primitives::settlement::Leg; -use polymesh_primitives::{Balance, BlockNumber, Moment}; +use polymesh_primitives::{AccountId, Balance, BlockNumber, Moment}; use polymesh_runtime_common::impls::Author; use polymesh_runtime_common::merge_active_and_inactive; use polymesh_runtime_common::runtime::{GovernanceCommittee, BENCHMARK_MAX_INCREASE, VMO}; @@ -44,22 +41,27 @@ pub use pallet_balances::Call as BalancesCall; pub use pallet_staking::StakerStatus; pub use pallet_timestamp::Call as TimestampCall; +/// 100% goes to the block author. +pub type DealWithFees = Author; +pub type CddHandler = polymesh_runtime_common::fee_details::CddHandler; + // Make the WASM binary available. #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); /// Runtime version. +#[sp_version::runtime_version] pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("polymesh_dev"), - impl_name: create_runtime_str!("polymesh_dev"), + spec_name: Cow::Borrowed("polymesh_dev"), + impl_name: Cow::Borrowed("polymesh_dev"), authoring_version: 1, // `spec_version: aaa_bbb_ccd` should match node version v`aaa.bbb.cc` // N.B. `d` is unpinned from the binary version - spec_version: 7_004_000, + spec_version: 8_000_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 7, - state_version: 1, + transaction_version: 8, + system_version: 1, }; parameter_types! { @@ -81,7 +83,11 @@ parameter_types! { // Balances: pub const ExistentialDeposit: Balance = 0u128; + pub const BenchmarkEd: Balance = 1; pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; + pub const MaxHolds: u32 = 32; + pub const MaxFreezes: u32 = 32; // Timestamp: pub const MinimumPeriod: Moment = SLOT_DURATION / 2; @@ -106,7 +112,6 @@ parameter_types! { pub const MaxAuthorities: u32 = 100_000; pub const MaxKeys: u32 = 10_000; pub const MaxPeerInHeartbeats: u32 = 10_000; - pub const MaxPeerDataEncodingSize: u32 = 1_000; // Assets: pub const AssetNameMaxLength: u32 = 128; @@ -138,8 +143,6 @@ parameter_types! { // Contracts: pub Schedule: pallet_contracts::Schedule = Default::default(); - pub DeletionWeightLimit: Weight = Weight::from_ref_time(500_000_000_000); - pub DeletionQueueDepth: u32 = 1024; pub MaxInLen: u32 = 8 * 1024; pub MaxOutLen: u32 = 8 * 1024; @@ -150,17 +153,28 @@ parameter_types! { pub const MaxNumberOfFungibleMoves: u32 = 10; pub const MaxNumberOfNFTsMoves: u32 = 100; - // State trie Migration - pub const MigrationSignedDepositPerItem: Balance = 1_000; - pub const MigrationSignedDepositBase: Balance = 1_000_000; - pub const MaxKeyLen: u32 = 2048; - // PIPs pub const MaxRefundsAndVotesPruned: u32 = 128; -} -/// 100% goes to the block author. -pub type DealWithFees = Author; + // Staking + pub const SessionsPerEra: sp_staking::SessionIndex = 3; + pub const BondingDuration: sp_staking::EraIndex = 7; + pub const SlashDeferDuration: sp_staking::EraIndex = 4; + pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; + + // Validators + pub const MaxVariableInflationTotalIssuance: Balance = 1_000_000_000 * ONE_POLY; + pub const MaxValidatorPerIdentity: Permill = Permill::from_percent(33); + pub const FixedYearlyReward: Balance = 140_000_000 * ONE_POLY; + + // Babe + pub const MaxNominatorRewardedPerValidator: u32 = 1_024; + pub const ReportLongevity: u64 = + BondingDuration::get() as u64 * SessionsPerEra::get() as u64 * EpochDuration::get(); + + // Election Provider Multi Phase + pub const UnsignedPhase: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 4; +} // Staking: pallet_staking_reward_curve::build! { @@ -173,34 +187,8 @@ pallet_staking_reward_curve::build! { test_precision: 0_005_000, ); } -parameter_types! { - pub const SessionsPerEra: sp_staking::SessionIndex = 3; - pub const BondingDuration: sp_staking::EraIndex = 7; - pub const SlashDeferDuration: sp_staking::EraIndex = 4; - pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - pub const MaxNominatorRewardedPerValidator: u32 = 1_024; - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); - pub const UnsignedPhase: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 4; - pub const MaxIterations: u32 = 10; - pub const MaxValidatorPerIdentity: Permill = Permill::from_percent(33); - // 0.05%. The higher the value, the more strict solution acceptance becomes. - pub MinSolutionScoreBump: Perbill = Perbill::from_rational(5u32, 10_000); - pub const MaxVariableInflationTotalIssuance: Balance = 1_000_000_000 * ONE_POLY; - pub const FixedYearlyReward: Balance = 140_000_000 * ONE_POLY; - pub const MinimumBond: Balance = ONE_POLY; - /// We prioritize im-online heartbeats over election solution submission. - pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2; - - pub const ReportLongevity: u64 = - BondingDuration::get() as u64 * SessionsPerEra::get() as u64 * EpochDuration::get(); -} - -polymesh_runtime_common::misc_pallet_impls!(); - -pub type CddHandler = polymesh_runtime_common::fee_details::CddHandler; impl pallet_identity::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type Proposal = RuntimeCall; type CddServiceProviders = CddServiceProviders; type Balances = pallet_balances::Pallet; @@ -215,6 +203,7 @@ impl pallet_identity::Config for Runtime { type InitialPOLYX = InitialPOLYX; type MaxGivenAuths = MaxGivenAuths; type MaxAuthRetries = MaxAuthRetries; + type Randomness = pallet_babe::RandomnessFromOneEpochAgo; } impl pallet_committee::Config for Runtime { @@ -222,13 +211,11 @@ impl pallet_committee::Config for Runtime { type Proposal = RuntimeCall; type CommitteeOrigin = VMO; type VoteThresholdOrigin = Self::CommitteeOrigin; - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_committee::SubstrateWeight; } /// PolymeshCommittee as an instance of group impl pallet_group::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type LimitOrigin = polymesh_primitives::EnsureRoot; type AddOrigin = Self::LimitOrigin; type RemoveOrigin = Self::LimitOrigin; @@ -247,11 +234,10 @@ macro_rules! committee_config { // Can act upon itself. type CommitteeOrigin = VMO; type VoteThresholdOrigin = Self::CommitteeOrigin; - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_committee::SubstrateWeight; } + impl pallet_group::Config for Runtime { - type RuntimeEvent = RuntimeEvent; // Committee cannot alter its own active membership limit. type LimitOrigin = polymesh_primitives::EnsureRoot; // Can manage its own addition, deletion, and swapping of membership... @@ -276,18 +262,16 @@ impl pallet_pips::Config for Runtime { type GovernanceCommittee = PolymeshCommittee; type TechnicalCommitteeVMO = VMO; type UpgradeCommitteeVMO = VMO; - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_pips::SubstrateWeight; type Scheduler = Scheduler; type SchedulerCall = RuntimeCall; type MaxRefundsAndVotesPruned = MaxRefundsAndVotesPruned; + type SchedulerPreimage = Preimage; } /// CddProviders instance of group impl pallet_group::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - // Cannot alter its own active membership limit. - type LimitOrigin = polymesh_primitives::EnsureRoot; + type LimitOrigin = polymesh_primitives::EnsureRoot; // Cannot alter its own active membership limit. type AddOrigin = polymesh_primitives::EnsureRoot; type RemoveOrigin = polymesh_primitives::EnsureRoot; type SwapOrigin = polymesh_primitives::EnsureRoot; @@ -300,6 +284,206 @@ impl pallet_group::Config for Runtime { impl pallet_sudo::Config for Runtime { type RuntimeEvent = RuntimeEvent; type RuntimeCall = RuntimeCall; + type WeightInfo = pallet_sudo::weights::SubstrateWeight; +} + +pub struct OnChainSeqPhragmen; + +impl frame_election_provider_support::onchain::Config for OnChainSeqPhragmen { + type Sort = ConstBool; + type System = Runtime; + type Solver = frame_election_provider_support::SequentialPhragmen< + polymesh_primitives::AccountId, + pallet_election_provider_multi_phase::SolutionAccuracyOf, + >; + type DataProvider = ::DataProvider; + type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; + type Bounds = polymesh_runtime_common::ElectionBoundsOnChain; + type MaxBackersPerWinner = polymesh_runtime_common::MaxElectingVotersSolution; + type MaxWinnersPerPage = polymesh_runtime_common::MaxActiveValidators; +} + +polymesh_runtime_common::misc_pallet_impls!(); + +#[frame_support::runtime] +mod runtime { + use super::*; + + #[runtime::runtime] + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason + )] + pub struct Runtime; + + #[runtime::pallet_index(0)] + pub type System = frame_system::Pallet; + + #[runtime::pallet_index(1)] + pub type Babe = pallet_babe::Pallet; + + #[runtime::pallet_index(2)] + pub type Timestamp = pallet_timestamp::Pallet; + + #[runtime::pallet_index(3)] + pub type Indices = pallet_indices::Pallet; + + #[runtime::pallet_index(4)] + pub type Authorship = pallet_authorship::Pallet; + + #[runtime::pallet_index(5)] + pub type Balances = pallet_balances::Pallet; + + #[runtime::pallet_index(6)] + pub type TransactionPayment = pallet_transaction_payment::Pallet; + + #[runtime::pallet_index(51)] + pub type PolymeshTransactionPayment = polymesh_transaction_payment::Pallet; + + #[runtime::pallet_index(7)] + pub type Identity = pallet_identity::Pallet; + + #[runtime::pallet_index(8)] + pub type CddServiceProviders = pallet_group::Pallet; + + #[runtime::pallet_index(9)] + pub type PolymeshCommittee = pallet_committee::Pallet; + + #[runtime::pallet_index(10)] + pub type CommitteeMembership = pallet_group::Pallet; + + #[runtime::pallet_index(11)] + pub type TechnicalCommittee = pallet_committee::Pallet; + + #[runtime::pallet_index(12)] + pub type TechnicalCommitteeMembership = pallet_group::Pallet; + + #[runtime::pallet_index(13)] + pub type UpgradeCommittee = pallet_committee::Pallet; + + #[runtime::pallet_index(14)] + pub type UpgradeCommitteeMembership = pallet_group::Pallet; + + #[runtime::pallet_index(15)] + pub type MultiSig = pallet_multisig::Pallet; + + #[runtime::pallet_index(16)] + pub type Validators = pallet_validators::Pallet; + + #[runtime::pallet_index(17)] + pub type Staking = pallet_staking::Pallet; + + #[runtime::pallet_index(18)] + pub type Offences = pallet_offences::Pallet; + + #[runtime::pallet_index(19)] + pub type Session = pallet_session::Pallet; + + #[runtime::pallet_index(20)] + pub type AuthorityDiscovery = pallet_authority_discovery::Pallet; + + #[runtime::pallet_index(21)] + pub type Grandpa = pallet_grandpa::Pallet; + + #[runtime::pallet_index(22)] + pub type Historical = pallet_session_historical::Pallet; + + #[runtime::pallet_index(23)] + pub type ImOnline = pallet_im_online::Pallet; + + #[runtime::pallet_index(25)] + pub type Sudo = pallet_sudo::Pallet; + + #[runtime::pallet_index(26)] + pub type Asset = pallet_asset::Pallet; + + #[runtime::pallet_index(27)] + pub type CapitalDistribution = pallet_capital_distribution::Pallet; + + #[runtime::pallet_index(28)] + pub type Checkpoint = pallet_checkpoint::Pallet; + + #[runtime::pallet_index(29)] + pub type ComplianceManager = pallet_compliance_manager::Pallet; + + #[runtime::pallet_index(30)] + pub type CorporateAction = pallet_corporate_actions::Pallet; + + #[runtime::pallet_index(31)] + pub type CorporateBallot = pallet_corporate_ballot::Pallet; + + #[runtime::pallet_index(32)] + pub type Permissions = pallet_permissions::Pallet; + + #[runtime::pallet_index(33)] + pub type Pips = pallet_pips::Pallet; + + #[runtime::pallet_index(34)] + pub type Portfolio = pallet_portfolio::Pallet; + + #[runtime::pallet_index(35)] + pub type ProtocolFee = pallet_protocol_fee::Pallet; + + #[runtime::pallet_index(36)] + pub type Scheduler = pallet_scheduler::Pallet; + + #[runtime::pallet_index(37)] + pub type Settlement = pallet_settlement::Pallet; + + #[runtime::pallet_index(38)] + pub type Statistics = pallet_statistics::Pallet; + + #[runtime::pallet_index(39)] + pub type Sto = pallet_sto::Pallet; + + #[runtime::pallet_index(40)] + pub type Treasury = pallet_treasury::Pallet; + + #[runtime::pallet_index(41)] + pub type Utility = pallet_utility::Pallet; + + #[runtime::pallet_index(42)] + pub type Base = pallet_base::Pallet; + + #[runtime::pallet_index(43)] + pub type ExternalAgents = pallet_external_agents::Pallet; + + #[runtime::pallet_index(44)] + pub type Relayer = pallet_relayer::Pallet; + + #[runtime::pallet_index(46)] + pub type Contracts = pallet_contracts::Pallet; + + #[runtime::pallet_index(47)] + pub type PolymeshContracts = polymesh_contracts::Pallet; + + #[runtime::pallet_index(48)] + pub type Preimage = pallet_preimage::Pallet; + + #[runtime::pallet_index(49)] + pub type Nft = pallet_nft::Pallet; + + #[runtime::pallet_index(50)] + pub type ElectionProviderMultiPhase = pallet_election_provider_multi_phase::Pallet; + + #[runtime::pallet_index(52)] + pub type Beefy = pallet_beefy::Pallet; + + // MMR leaf construction must be after session in order to have a leaf's next_auth_set + // refer to block. See issue polkadot-fellows/runtimes#160 for details. + #[runtime::pallet_index(53)] + pub type Mmr = pallet_mmr::Pallet; + + #[runtime::pallet_index(54)] + pub type MmrLeaf = pallet_beefy_mmr::Pallet; + + #[runtime::pallet_index(80)] + pub type Revive = pallet_revive::Pallet; } #[cfg(feature = "runtime-benchmarks")] @@ -309,6 +493,7 @@ mod benches { [frame_benchmarking, BaselineBench::] [pallet_asset, Asset] [pallet_balances, Balances] + [pallet_beefy_mmr, MmrLeaf] [pallet_identity, Identity] [pallet_pips, Pips] [pallet_multisig, MultiSig] @@ -339,117 +524,24 @@ mod benches { [pallet_grandpa, Grandpa] [pallet_scheduler, Scheduler] [pallet_staking, Staking] + [pallet_validators, Validators] + [polymesh_transaction_payment, PolymeshTransactionPayment] [polymesh_contracts, PolymeshContracts] [pallet_nft, Nft] [pallet_contracts, Contracts] + [pallet_revive, Revive] ); } -construct_runtime!( - pub enum Runtime where - Block = Block, - NodeBlock = polymesh_primitives::Block, - UncheckedExtrinsic = UncheckedExtrinsic - { - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - Babe: pallet_babe::{Pallet, Call, Storage, Config, ValidateUnsigned} = 1, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2, - Indices: pallet_indices::{Pallet, Call, Storage, Config, Event} = 3, - Authorship: pallet_authorship = 4, - - // Balance: Genesis config dependencies: System. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 5, - - // TransactionPayment: Genesis config dependencies: Balance. - TransactionPayment: pallet_transaction_payment::{Pallet, Call, Event, Storage} = 6, - - // Identity: Genesis config deps: Timestamp. - Identity: pallet_identity::{Pallet, Call, Storage, Event, Config} = 7, - - // Polymesh Committees - - // CddServiceProviders (group only): Genesis config deps: Identity - CddServiceProviders: pallet_group::::{Pallet, Call, Storage, Event, Config} = 8, - - // Governance Council (committee) - PolymeshCommittee: pallet_committee::::{Pallet, Call, Storage, Origin, Event, Config} = 9, - // CommitteeMembership: Genesis config deps: PolymeshCommittee, Identity. - CommitteeMembership: pallet_group::::{Pallet, Call, Storage, Event, Config} = 10, - - // Technical Committee - TechnicalCommittee: pallet_committee::::{Pallet, Call, Storage, Origin, Event, Config} = 11, - // TechnicalCommitteeMembership: Genesis config deps: TechnicalCommittee, Identity - TechnicalCommitteeMembership: pallet_group::::{Pallet, Call, Storage, Event, Config} = 12, - - // Upgrade Committee - UpgradeCommittee: pallet_committee::::{Pallet, Call, Storage, Origin, Event, Config} = 13, - // UpgradeCommitteeMembership: Genesis config deps: UpgradeCommittee, Identity - UpgradeCommitteeMembership: pallet_group::::{Pallet, Call, Storage, Event, Config} = 14, - - MultiSig: pallet_multisig::{Pallet, Call, Config, Storage, Event} = 15, - - // Removed: - //Bridge = 16, - - // Staking: Genesis config deps: Bridge, Balances, Indices, Identity, Babe, Timestamp, Committees - Staking: pallet_staking::{Pallet, Call, Config, Storage, Event} = 17, - - Offences: pallet_offences::{Pallet, Storage, Event} = 18, - - // Session: Genesis config deps: System. - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 19, - AuthorityDiscovery: pallet_authority_discovery::{Pallet, Config} = 20, - Grandpa: pallet_grandpa::{Pallet, Call, Storage, Config, Event} = 21, - Historical: pallet_session_historical::{Pallet} = 22, - ImOnline: pallet_im_online::{Pallet, Call, Storage, Event, ValidateUnsigned, Config} = 23, - RandomnessCollectiveFlip: pallet_insecure_randomness_collective_flip::{Pallet, Storage} = 24, - - // Sudo. Usable initially. - Sudo: pallet_sudo::{Pallet, Call, Config, Storage, Event} = 25, - - // Asset: Genesis config deps: Timestamp, - Asset: pallet_asset::{Pallet, Call, Storage, Config, Event} = 26, - CapitalDistribution: pallet_capital_distribution::{Pallet, Call, Storage, Event, Config} = 27, - Checkpoint: pallet_checkpoint::{Pallet, Call, Storage, Event, Config} = 28, - ComplianceManager: pallet_compliance_manager::{Pallet, Call, Storage, Event} = 29, - CorporateAction: pallet_corporate_actions::{Pallet, Call, Storage, Event, Config} = 30, - CorporateBallot: pallet_corporate_ballot::{Pallet, Call, Storage, Event, Config} = 31, - Permissions: pallet_permissions::{Pallet} = 32, - Pips: pallet_pips::{Pallet, Call, Storage, Event, Config} = 33, - Portfolio: pallet_portfolio::{Pallet, Call, Storage, Event, Config} = 34, - ProtocolFee: pallet_protocol_fee::{Pallet, Call, Storage, Event, Config} = 35, - Scheduler: pallet_scheduler::{Pallet, Call, Storage, Event} = 36, - Settlement: pallet_settlement::{Pallet, Call, Storage, Event, Config} = 37, - Statistics: pallet_statistics::{Pallet, Call, Storage, Event, Config} = 38, - Sto: pallet_sto::{Pallet, Call, Storage, Event} = 39, - Treasury: pallet_treasury::{Pallet, Call, Event} = 40, - Utility: pallet_utility::{Pallet, Call, Storage, Event} = 41, - Base: pallet_base::{Pallet, Call, Event} = 42, - ExternalAgents: pallet_external_agents::{Pallet, Call, Storage, Event} = 43, - Relayer: pallet_relayer::{Pallet, Call, Storage, Event} = 44, - // Removed pallet_rewards = 45, - - // Contracts - Contracts: pallet_contracts::{Pallet, Call, Storage, Event} = 46, - PolymeshContracts: polymesh_contracts::{Pallet, Call, Storage, Event, Config} = 47, - - // Preimage register. Used by `pallet_scheduler`. - Preimage: pallet_preimage::{Pallet, Call, Storage, Event} = 48, - - Nft: pallet_nft::{Pallet, Call, Storage, Event} = 49, - - ElectionProviderMultiPhase: pallet_election_provider_multi_phase::{Pallet, Call, Storage, Event, ValidateUnsigned} = 50, - } -); - polymesh_runtime_common::runtime_apis! { #[cfg(feature = "runtime-benchmarks")] impl frame_benchmarking::Benchmark for Runtime { - #[allow(non_local_definitions)] + #[allow(non_local_definitions, deprecated)] fn dispatch_benchmark( config: frame_benchmarking::BenchmarkConfig ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{baseline, Benchmarking, BenchmarkBatch, TrackedStorageKey}; + use frame_benchmarking::{baseline, BenchmarkBatch}; + use frame_support::traits::TrackedStorageKey; use crate::benchmarks::pallet_session::Pallet as SessionBench; use frame_system_benchmarking::Pallet as SystemBench; @@ -484,7 +576,7 @@ polymesh_runtime_common::runtime_apis! { Vec, Vec, ) { - use frame_benchmarking::{baseline, Benchmarking, BenchmarkList}; + use frame_benchmarking::{baseline, BenchmarkList}; use frame_support::traits::StorageInfoTrait; use crate::benchmarks::pallet_session::Pallet as SessionBench; @@ -500,18 +592,3 @@ polymesh_runtime_common::runtime_apis! { } } } - -pub struct OnChainSeqPhragmen; - -impl frame_election_provider_support::onchain::Config for OnChainSeqPhragmen { - type System = Runtime; - type Solver = frame_election_provider_support::SequentialPhragmen< - polymesh_primitives::AccountId, - pallet_election_provider_multi_phase::SolutionAccuracyOf, - >; - type DataProvider = ::DataProvider; - type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; - type MaxWinners = ::MaxWinners; - type VotersBound = polymesh_runtime_common::MaxOnChainElectingVoters; - type TargetsBound = polymesh_runtime_common::MaxOnChainElectableTargets; -} diff --git a/pallets/runtime/mainnet/Cargo.toml b/pallets/runtime/mainnet/Cargo.toml index 8817641f41..0052520761 100644 --- a/pallets/runtime/mainnet/Cargo.toml +++ b/pallets/runtime/mainnet/Cargo.toml @@ -23,7 +23,6 @@ pallet-compliance-manager = { workspace = true, default-features = false } pallet-corporate-actions = { workspace = true, default-features = false } pallet-external-agents = { workspace = true, default-features = false } pallet-group = { workspace = true, default-features = false } -pallet-group-rpc-runtime-api = { workspace = true, default-features = false } pallet-identity = { workspace = true, default-features = false } pallet-multisig = { workspace = true, default-features = false } pallet-nft = { workspace = true, default-features = false } @@ -33,75 +32,85 @@ pallet-portfolio = { workspace = true, default-features = false } pallet-protocol-fee = { workspace = true, default-features = false } pallet-relayer = { workspace = true, default-features = false } pallet-settlement = { workspace = true, default-features = false } -pallet-staking = { workspace = true, default-features = false } +pallet-validators = { workspace = true, default-features = false } pallet-statistics = { workspace = true, default-features = false } pallet-sto = { workspace = true, default-features = false } -pallet-sudo = { workspace = true, default-features = false } pallet-transaction-payment = { workspace = true, default-features = false } pallet-treasury = { workspace = true, default-features = false } pallet-utility = { workspace = true, default-features = false } polymesh-contracts = { workspace = true, default-features = false } - -# RPC -node-rpc-runtime-api = { workspace = true, default-features = false } -pallet-staking-rpc-runtime-api = { workspace = true, default-features = false } -pallet-protocol-fee-rpc-runtime-api = { workspace = true, default-features = false } +polymesh-stable-api-precompiles = { workspace = true, default-features = false } +polymesh-transaction-payment = { workspace = true, default-features = false } # Others log = "0.4.8" -lazy_static = { version = "1.4.0", default-features = false } serde = { version = "1.0.104", default-features = false } serde_derive = { version = "1.0.104", optional = true } smallvec = "1.4.0" # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false } -pallet-authority-discovery = { version = "4.0.0-dev", default-features = false } -pallet-authorship = { version = "4.0.0-dev", default-features = false } -pallet-babe = { version = "4.0.0-dev", default-features = false } -pallet-contracts = { version = "4.0.0-dev", default-features = false } -pallet-contracts-primitives = { version = "7.0.0", default-features = false} -pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false } -pallet-executive = { package = "frame-executive", version = "4.0.0-dev", default-features = false } -pallet-grandpa = { version = "4.0.0-dev", default-features = false } -pallet-im-online = { version = "4.0.0-dev", default-features = false } -pallet-indices = { version = "4.0.0-dev", default-features = false } -pallet-offences = { version = "4.0.0-dev", default-features = false } -pallet-preimage = { version = "4.0.0-dev", default-features = false } -pallet-insecure-randomness-collective-flip = { version = "4.0.0-dev", default-features = false } -pallet-scheduler = { version = "4.0.0-dev", default-features = false } -pallet-session = { version = "4.0.0-dev", default-features = false } -pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-arithmetic = { version = "6.0.0", default-features = false } -sp-authority-discovery = { version = "4.0.0-dev", default-features = false } -sp-block-builder = { version = "4.0.0-dev", default-features = false } -sp-consensus-babe = { version = "0.10.0-dev", default-features = false } -sp-consensus-grandpa = { version = "4.0.0-dev", default-features = false } -sp-core = { version = "7.0.0", default-features = false } -sp-inherents = { version = "4.0.0-dev", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-offchain = { version = "4.0.0-dev", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-session = { version = "4.0.0-dev", default-features = false } -sp-staking = { version = "4.0.0-dev", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-transaction-pool = { version = "4.0.0-dev", default-features = false } -sp-version = { version = "5.0.0", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } +sp-inherents = { workspace = true, default-features = false } +sp-offchain = { workspace = true, default-features = false } +sp-staking = { workspace = true, default-features = false } +sp-consensus-babe = { workspace = true, default-features = false } +sp-consensus-beefy = { workspace = true, default-features = false } +sp-consensus-grandpa = { workspace = true, default-features = false } +sp-session = { workspace = true, default-features = false } +sp-authority-discovery = { workspace = true, default-features = false } +sp-transaction-pool = { workspace = true, default-features = false } +sp-block-builder = { workspace = true, default-features = false } +sp-arithmetic = { workspace = true, default-features = false } +sp-genesis-builder = { workspace = true, default-features = false } +# +pallet-authority-discovery = { workspace = true, default-features = false } +pallet-authorship = { workspace = true, default-features = false } +pallet-babe = { workspace = true, default-features = false } +pallet-beefy = { workspace = true, default-features = false } +pallet-beefy-mmr = { workspace = true, default-features = false } +pallet-contracts = { workspace = true, default-features = false } +pallet-election-provider-multi-phase = { workspace = true, default-features = false } +pallet-grandpa = { workspace = true, default-features = false } +pallet-im-online = { workspace = true, default-features = false } +pallet-indices = { workspace = true, default-features = false } +pallet-mmr = { workspace = true, default-features = false } +pallet-offences = { workspace = true, default-features = false } +pallet-preimage = { workspace = true, default-features = false } +pallet-revive = { workspace = true, default-features = false } +pallet-scheduler = { workspace = true, default-features = false } +pallet-session = { workspace = true, default-features = false } +pallet-staking = { workspace = true, default-features = false } +pallet-staking-reward-curve = { workspace = true, default-features = false } +pallet-timestamp = { workspace = true, default-features = false } + +frame-metadata-hash-extension = { workspace = true, default-features = false } +frame-executive = { workspace = true, default-features = false } +frame-election-provider-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } + +# RPC +frame-system-rpc-runtime-api = { workspace = true, default-features = false } +pallet-group-rpc-runtime-api = { workspace = true, default-features = false } +pallet-protocol-fee-rpc-runtime-api = { workspace = true, default-features = false } +pallet-staking-runtime-api = { workspace = true, default-features = false } +node-rpc-runtime-api = { workspace = true, default-features = false } [build-dependencies] -polymesh-build-tool = { workspace = true, default-features = false } +polymesh-build-tool = { workspace = true, default-features = false, optional = true } [features] default = ["std", "equalize"] -disable_fees = ["pallet-transaction-payment/disable_fees"] +disable_fees = ["polymesh-transaction-payment/disable_fees"] equalize = [] +testing = [] # Backends u64_backend = ["polymesh-primitives/u64_backend"] @@ -115,6 +124,7 @@ std = [ "polymesh-build-tool/std", "u64_backend", "codec/std", + "frame-metadata-hash-extension/std", "frame-election-provider-support/std", "frame-support/std", "frame-system-rpc-runtime-api/std", @@ -126,11 +136,14 @@ std = [ "pallet-base/std", "pallet-babe/std", "pallet-balances/std", + "pallet-beefy/std", + "pallet-beefy-mmr/std", + "pallet-mmr/std", "pallet-committee/std", "pallet-compliance-manager/std", "pallet-contracts/std", "pallet-election-provider-multi-phase/std", - "pallet-executive/std", + "frame-executive/std", "pallet-external-agents/std", "pallet-grandpa/std", "pallet-group-rpc-runtime-api/std", @@ -147,20 +160,22 @@ std = [ "pallet-protocol-fee-rpc-runtime-api/std", "pallet-protocol-fee/std", "pallet-relayer/std", - "pallet-insecure-randomness-collective-flip/std", + "pallet-revive/std", "pallet-scheduler/std", "pallet-session/std", "pallet-settlement/std", - "pallet-staking-rpc-runtime-api/std", + "pallet-staking-runtime-api/std", "pallet-staking/std", + "pallet-validators/std", "pallet-statistics/std", "pallet-sto/std", - "pallet-sudo/std", "pallet-timestamp/std", "pallet-transaction-payment/std", + "polymesh-transaction-payment/std", "pallet-treasury/std", "pallet-utility/std", "polymesh-contracts/std", + "polymesh-stable-api-precompiles/std", "polymesh-primitives/std", "polymesh-common-utilities/std", "polymesh-runtime-common/std", @@ -182,4 +197,57 @@ std = [ "sp-std/std", "sp-transaction-pool/std", "sp-version/std", + "sp-genesis-builder/std", ] + +runtime-benchmarks = [ + "frame-election-provider-support/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-asset/runtime-benchmarks", + "pallet-babe/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-beefy-mmr/runtime-benchmarks", + "pallet-mmr/runtime-benchmarks", + "pallet-committee/runtime-benchmarks", + "pallet-contracts/runtime-benchmarks", + "pallet-corporate-actions/runtime-benchmarks", + "pallet-grandpa/runtime-benchmarks", + "pallet-group/runtime-benchmarks", + "pallet-im-online/runtime-benchmarks", + "pallet-indices/runtime-benchmarks", + "pallet-multisig/runtime-benchmarks", + "pallet-nft/runtime-benchmarks", + "pallet-pips/runtime-benchmarks", + "pallet-portfolio/runtime-benchmarks", + "pallet-preimage/runtime-benchmarks", + "pallet-protocol-fee/runtime-benchmarks", + "pallet-relayer/runtime-benchmarks", + "pallet-revive/runtime-benchmarks", + "pallet-scheduler/runtime-benchmarks", + "pallet-settlement/runtime-benchmarks", + "pallet-staking/runtime-benchmarks", + "pallet-statistics/runtime-benchmarks", + "pallet-sto/runtime-benchmarks", + "pallet-transaction-payment/runtime-benchmarks", + "polymesh-transaction-payment/runtime-benchmarks", + "pallet-treasury/runtime-benchmarks", + "pallet-utility/runtime-benchmarks", + "pallet-validators/runtime-benchmarks", + "polymesh-contracts/runtime-benchmarks", + "polymesh-stable-api-precompiles/runtime-benchmarks", + "polymesh-runtime-common/runtime-benchmarks", +] + +# Enable the metadata hash generation. +# +# This is hidden behind a feature because it increases the compile time. +# The wasm binary needs to be compiled twice, once to fetch the metadata, +# generate the metadata hash and then a second time with the +# `RUNTIME_METADATA_HASH` environment variable set for the `CheckMetadataHash` +# extension. +metadata-hash = ["polymesh-build-tool?/metadata-hash"] + +# A convenience feature for enabling things when doing a build +# for an on-chain release. +on-chain-release-build = ["metadata-hash", "sp-api/disable-logging"] diff --git a/pallets/runtime/mainnet/src/lib.rs b/pallets/runtime/mainnet/src/lib.rs index 4909e0202e..5ccc513681 100644 --- a/pallets/runtime/mainnet/src/lib.rs +++ b/pallets/runtime/mainnet/src/lib.rs @@ -1,6 +1,6 @@ #![cfg_attr(not(feature = "std"), no_std)] // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] +#![recursion_limit = "1024"] pub mod constants; pub mod runtime; @@ -12,8 +12,8 @@ pub use runtime::{native_version, WASM_BINARY}; pub use runtime::{ api, Asset, Authorship, Balances, BalancesCall, CheckedExtrinsic, MinimumPeriod, ProtocolFee, - Runtime, RuntimeApi, RuntimeCall, SessionKeys, SignedExtra, System, SystemCall, - TransactionPayment, UncheckedExtrinsic, + Runtime, RuntimeApi, RuntimeCall, SessionKeys, System, SystemCall, TransactionPayment, + TxExtension, UncheckedExtrinsic, }; pub use sp_runtime::{Perbill, Permill}; diff --git a/pallets/runtime/mainnet/src/runtime.rs b/pallets/runtime/mainnet/src/runtime.rs index 0818d3d795..6b9e30db62 100644 --- a/pallets/runtime/mainnet/src/runtime.rs +++ b/pallets/runtime/mainnet/src/runtime.rs @@ -7,17 +7,15 @@ use sp_version::NativeVersion; pub use sp_runtime::BuildStorage; use codec::Encode; -use frame_support::traits::KeyOwnerProofSystem; +use frame_support::parameter_types; +use frame_support::traits::{ConstBool, KeyOwnerProofSystem}; use frame_support::weights::Weight; pub use frame_support::StorageValue; -use frame_support::{construct_runtime, parameter_types}; pub use frame_system::Call as SystemCall; -use sp_runtime::create_runtime_str; use sp_runtime::curve::PiecewiseLinear; -use sp_runtime::traits::{ - BlakeTwo256, Block as BlockT, Extrinsic, NumberFor, StaticLookup, Verify, -}; +use sp_runtime::traits::{BlakeTwo256, Block as BlockT, NumberFor, StaticLookup, Verify}; use sp_runtime::transaction_validity::TransactionPriority; +use sp_runtime::Cow; use sp_runtime::{Perbill, Permill}; use sp_std::prelude::*; use sp_version::RuntimeVersion; @@ -34,7 +32,7 @@ use polymesh_common_utilities::protocol_fee::ProtocolOp; use polymesh_primitives::constants::currency::*; use polymesh_primitives::constants::ENSURED_MAX_LEN; use polymesh_primitives::settlement::Leg; -use polymesh_primitives::{Balance, BlockNumber, Moment}; +use polymesh_primitives::{AccountId, Balance, BlockNumber, Moment}; use polymesh_runtime_common::impls::Author; use polymesh_runtime_common::merge_active_and_inactive; use polymesh_runtime_common::runtime::{GovernanceCommittee, BENCHMARK_MAX_INCREASE, VMO}; @@ -42,22 +40,27 @@ use polymesh_runtime_common::{AvailableBlockRatio, MaximumBlockWeight}; use crate::constants::time::*; +/// 100% goes to the block author. +pub type DealWithFees = Author; +pub type CddHandler = polymesh_runtime_common::fee_details::CddHandler; + // Make the WASM binary available. #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); /// Runtime version. +#[sp_version::runtime_version] pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("polymesh_mainnet"), - impl_name: create_runtime_str!("polymesh_mainnet"), + spec_name: Cow::Borrowed("polymesh_mainnet"), + impl_name: Cow::Borrowed("polymesh_mainnet"), authoring_version: 1, // `spec_version: aaa_bbb_ccd` should match node version v`aaa.bbb.cc` // N.B. `d` is unpinned from the binary version - spec_version: 7_004_000, + spec_version: 8_000_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 7, - state_version: 1, + transaction_version: 8, + system_version: 1, }; parameter_types! { @@ -79,7 +82,11 @@ parameter_types! { // Balances: pub const ExistentialDeposit: Balance = 0u128; + pub const BenchmarkEd: Balance = 1; pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; + pub const MaxHolds: u32 = 32; + pub const MaxFreezes: u32 = 32; // Timestamp: pub const MinimumPeriod: Moment = SLOT_DURATION / 2; @@ -104,7 +111,6 @@ parameter_types! { pub const MaxAuthorities: u32 = 100_000; pub const MaxKeys: u32 = 10_000; pub const MaxPeerInHeartbeats: u32 = 10_000; - pub const MaxPeerDataEncodingSize: u32 = 1_000; // Assets: pub const AssetNameMaxLength: u32 = 128; @@ -131,11 +137,11 @@ parameter_types! { // Identity: pub const InitialPOLYX: Balance = 0; + pub const MaxGivenAuths: u32 = 1024; + pub const MaxAuthRetries: u8 = 10; // Contracts: pub Schedule: pallet_contracts::Schedule = Default::default(); - pub DeletionWeightLimit: Weight = Weight::from_ref_time(500_000_000_000); - pub DeletionQueueDepth: u32 = 1024; pub MaxInLen: u32 = 8 * 1024; pub MaxOutLen: u32 = 8 * 1024; @@ -148,58 +154,40 @@ parameter_types! { // PIPs pub const MaxRefundsAndVotesPruned: u32 = 128; -} -/// 100% goes to the block author. -pub type DealWithFees = Author; - -// Staking: -pallet_staking_reward_curve::build! { - const REWARD_CURVE: PiecewiseLinear<'_> = curve!( - min_inflation: 0_025_000, - max_inflation: 0_140_000, - ideal_stake: 0_700_000, - falloff: 0_050_000, - max_piece_count: 40, - test_precision: 0_005_000, - ); -} -parameter_types! { + // Staking pub const SessionsPerEra: sp_staking::SessionIndex = 6; pub const BondingDuration: sp_staking::EraIndex = 28; pub const SlashDeferDuration: sp_staking::EraIndex = 14; // 1/2 the bonding duration. pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - pub const MaxNominatorRewardedPerValidator: u32 = 1_024; - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); - pub const UnsignedPhase: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 4; - pub const MaxIterations: u32 = 10; - pub const MaxValidatorPerIdentity: Permill = Permill::from_percent(33); - // 0.05%. The higher the value, the more strict solution acceptance becomes. - pub MinSolutionScoreBump: Perbill = Perbill::from_rational(5u32, 10_000); + + // Validators pub const MaxVariableInflationTotalIssuance: Balance = 1_000_000_000 * ONE_POLY; pub const FixedYearlyReward: Balance = 140_000_000 * ONE_POLY; - pub const MinimumBond: Balance = ONE_POLY; - /// We prioritize im-online heartbeats over election solution submission. - pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2; + pub const MaxValidatorPerIdentity: Permill = Permill::from_percent(33); + // Babe + pub const MaxNominatorRewardedPerValidator: u32 = 1_024; pub const ReportLongevity: u64 = BondingDuration::get() as u64 * SessionsPerEra::get() as u64 * EpochDuration::get(); - pub const MaxGivenAuths: u32 = 1024; - pub const MaxAuthRetries: u8 = 10; - - // State trie Migration - pub const MigrationSignedDepositPerItem: Balance = 0; - pub const MigrationSignedDepositBase: Balance = 0; - pub const MaxKeyLen: u32 = 2048; + // Election Provider Multi Phase + pub const UnsignedPhase: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 4; } -polymesh_runtime_common::misc_pallet_impls!(); - -type CddHandler = polymesh_runtime_common::fee_details::CddHandler; +// Staking +pallet_staking_reward_curve::build! { + const REWARD_CURVE: PiecewiseLinear<'_> = curve!( + min_inflation: 0_025_000, + max_inflation: 0_140_000, + ideal_stake: 0_700_000, + falloff: 0_050_000, + max_piece_count: 40, + test_precision: 0_005_000, + ); +} impl pallet_identity::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type Proposal = RuntimeCall; type CddServiceProviders = CddServiceProviders; type Balances = pallet_balances::Pallet; @@ -214,6 +202,7 @@ impl pallet_identity::Config for Runtime { type InitialPOLYX = InitialPOLYX; type MaxGivenAuths = MaxGivenAuths; type MaxAuthRetries = MaxAuthRetries; + type Randomness = pallet_babe::RandomnessFromOneEpochAgo; } impl pallet_committee::Config for Runtime { @@ -221,13 +210,11 @@ impl pallet_committee::Config for Runtime { type Proposal = RuntimeCall; type CommitteeOrigin = VMO; type VoteThresholdOrigin = Self::CommitteeOrigin; - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_committee::SubstrateWeight; } /// PolymeshCommittee as an instance of group impl pallet_group::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type LimitOrigin = polymesh_primitives::EnsureRoot; type AddOrigin = Self::LimitOrigin; type RemoveOrigin = Self::LimitOrigin; @@ -246,11 +233,9 @@ macro_rules! committee_config { // Can act upon itself. type CommitteeOrigin = VMO; type VoteThresholdOrigin = Self::CommitteeOrigin; - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_committee::SubstrateWeight; } impl pallet_group::Config for Runtime { - type RuntimeEvent = RuntimeEvent; // Committee cannot alter its own active membership limit. type LimitOrigin = polymesh_primitives::EnsureRoot; // Can manage its own addition, deletion, and swapping of membership... @@ -275,16 +260,15 @@ impl pallet_pips::Config for Runtime { type GovernanceCommittee = PolymeshCommittee; type TechnicalCommitteeVMO = VMO; type UpgradeCommitteeVMO = VMO; - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_pips::SubstrateWeight; type Scheduler = Scheduler; type SchedulerCall = RuntimeCall; type MaxRefundsAndVotesPruned = MaxRefundsAndVotesPruned; + type SchedulerPreimage = Preimage; } /// CddProviders instance of group impl pallet_group::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type LimitOrigin = polymesh_primitives::EnsureRoot; type AddOrigin = polymesh_primitives::EnsureRoot; type RemoveOrigin = polymesh_primitives::EnsureRoot; @@ -295,108 +279,10 @@ impl pallet_group::Config for Runtime { type WeightInfo = polymesh_weights::pallet_group::SubstrateWeight; } -construct_runtime!( - pub enum Runtime where - Block = Block, - NodeBlock = polymesh_primitives::Block, - UncheckedExtrinsic = UncheckedExtrinsic - { - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - Babe: pallet_babe::{Pallet, Call, Storage, Config, ValidateUnsigned} = 1, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2, - Indices: pallet_indices::{Pallet, Call, Storage, Config, Event} = 3, - Authorship: pallet_authorship = 4, - - // Balance: Genesis config dependencies: System. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 5, - - // TransactionPayment: Genesis config dependencies: Balance. - TransactionPayment: pallet_transaction_payment::{Pallet, Call, Event, Storage} = 6, - - // Identity: Genesis config deps: Timestamp. - Identity: pallet_identity::{Pallet, Call, Storage, Event, Config} = 7, - - // Polymesh Committees - - // CddServiceProviders (group only): Genesis config deps: Identity - CddServiceProviders: pallet_group::::{Pallet, Call, Storage, Event, Config} = 8, - - // Governance Council (committee) - PolymeshCommittee: pallet_committee::::{Pallet, Call, Storage, Origin, Event, Config} = 9, - // CommitteeMembership: Genesis config deps: PolymeshCommittee, Identity. - CommitteeMembership: pallet_group::::{Pallet, Call, Storage, Event, Config} = 10, - - // Technical Committee - TechnicalCommittee: pallet_committee::::{Pallet, Call, Storage, Origin, Event, Config} = 11, - // TechnicalCommitteeMembership: Genesis config deps: TechnicalCommittee, Identity - TechnicalCommitteeMembership: pallet_group::::{Pallet, Call, Storage, Event, Config} = 12, - - // Upgrade Committee - UpgradeCommittee: pallet_committee::::{Pallet, Call, Storage, Origin, Event, Config} = 13, - // UpgradeCommitteeMembership: Genesis config deps: UpgradeCommittee, Identity - UpgradeCommitteeMembership: pallet_group::::{Pallet, Call, Storage, Event, Config} = 14, - - MultiSig: pallet_multisig::{Pallet, Call, Config, Storage, Event} = 15, - - // Removed: - //Bridge = 16, - - // Staking: Genesis config deps: Bridge, Balances, Indices, Identity, Babe, Timestamp, Committees - Staking: pallet_staking::{Pallet, Call, Config, Storage, Event} = 17, - - Offences: pallet_offences::{Pallet, Storage, Event} = 18, - - // Session: Genesis config deps: System. - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 19, - AuthorityDiscovery: pallet_authority_discovery::{Pallet, Config} = 20, - Grandpa: pallet_grandpa::{Pallet, Call, Storage, Config, Event} = 21, - Historical: pallet_session_historical::{Pallet} = 22, - ImOnline: pallet_im_online::{Pallet, Call, Storage, Event, ValidateUnsigned, Config} = 23, - RandomnessCollectiveFlip: pallet_insecure_randomness_collective_flip::{Pallet, Storage} = 24, - - // Sudo. Usable initially. - // Sudo: pallet_sudo::{Pallet, Call, Config, Storage, Event} = 25, - - // Asset: Genesis config deps: Timestamp, - Asset: pallet_asset::{Pallet, Call, Storage, Config, Event} = 26, - CapitalDistribution: pallet_capital_distribution::{Pallet, Call, Storage, Event, Config} = 27, - Checkpoint: pallet_checkpoint::{Pallet, Call, Storage, Event, Config} = 28, - ComplianceManager: pallet_compliance_manager::{Pallet, Call, Storage, Event} = 29, - CorporateAction: pallet_corporate_actions::{Pallet, Call, Storage, Event, Config} = 30, - CorporateBallot: pallet_corporate_ballot::{Pallet, Call, Storage, Event, Config} = 31, - Permissions: pallet_permissions::{Pallet} = 32, - Pips: pallet_pips::{Pallet, Call, Storage, Event, Config} = 33, - Portfolio: pallet_portfolio::{Pallet, Call, Storage, Event, Config} = 34, - ProtocolFee: pallet_protocol_fee::{Pallet, Call, Storage, Event, Config} = 35, - Scheduler: pallet_scheduler::{Pallet, Call, Storage, Event} = 36, - Settlement: pallet_settlement::{Pallet, Call, Storage, Event, Config} = 37, - Statistics: pallet_statistics::{Pallet, Call, Storage, Event, Config} = 38, - Sto: pallet_sto::{Pallet, Call, Storage, Event} = 39, - Treasury: pallet_treasury::{Pallet, Call, Event} = 40, - Utility: pallet_utility::{Pallet, Call, Storage, Event} = 41, - Base: pallet_base::{Pallet, Call, Event} = 42, - ExternalAgents: pallet_external_agents::{Pallet, Call, Storage, Event} = 43, - Relayer: pallet_relayer::{Pallet, Call, Storage, Event} = 44, - // Removed pallet_rewards = 45, - - // Contracts - Contracts: pallet_contracts::{Pallet, Call, Storage, Event} = 46, - PolymeshContracts: polymesh_contracts::{Pallet, Call, Storage, Event, Config} = 47, - - // Preimage register. Used by `pallet_scheduler`. - Preimage: pallet_preimage::{Pallet, Call, Storage, Event} = 48, - - Nft: pallet_nft::{Pallet, Call, Storage, Event} = 49, - - ElectionProviderMultiPhase: pallet_election_provider_multi_phase::{Pallet, Call, Storage, Event, ValidateUnsigned} = 50, - } -); - -polymesh_runtime_common::runtime_apis! {} - pub struct OnChainSeqPhragmen; impl frame_election_provider_support::onchain::Config for OnChainSeqPhragmen { + type Sort = ConstBool; type System = Runtime; type Solver = frame_election_provider_support::SequentialPhragmen< polymesh_primitives::AccountId, @@ -404,7 +290,189 @@ impl frame_election_provider_support::onchain::Config for OnChainSeqPhragmen { >; type DataProvider = ::DataProvider; type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; - type MaxWinners = ::MaxWinners; - type VotersBound = polymesh_runtime_common::MaxOnChainElectingVoters; - type TargetsBound = polymesh_runtime_common::MaxOnChainElectableTargets; + type Bounds = polymesh_runtime_common::ElectionBoundsOnChain; + type MaxBackersPerWinner = polymesh_runtime_common::MaxElectingVotersSolution; + type MaxWinnersPerPage = polymesh_runtime_common::MaxActiveValidators; +} + +polymesh_runtime_common::misc_pallet_impls!(); + +#[frame_support::runtime] +mod runtime { + use super::*; + + #[runtime::runtime] + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason + )] + pub struct Runtime; + + #[runtime::pallet_index(0)] + pub type System = frame_system::Pallet; + + #[runtime::pallet_index(1)] + pub type Babe = pallet_babe::Pallet; + + #[runtime::pallet_index(2)] + pub type Timestamp = pallet_timestamp::Pallet; + + #[runtime::pallet_index(3)] + pub type Indices = pallet_indices::Pallet; + + #[runtime::pallet_index(4)] + pub type Authorship = pallet_authorship::Pallet; + + #[runtime::pallet_index(5)] + pub type Balances = pallet_balances::Pallet; + + #[runtime::pallet_index(6)] + pub type TransactionPayment = pallet_transaction_payment::Pallet; + + #[runtime::pallet_index(51)] + pub type PolymeshTransactionPayment = polymesh_transaction_payment::Pallet; + + #[runtime::pallet_index(7)] + pub type Identity = pallet_identity::Pallet; + + #[runtime::pallet_index(8)] + pub type CddServiceProviders = pallet_group::Pallet; + + #[runtime::pallet_index(9)] + pub type PolymeshCommittee = pallet_committee::Pallet; + + #[runtime::pallet_index(10)] + pub type CommitteeMembership = pallet_group::Pallet; + + #[runtime::pallet_index(11)] + pub type TechnicalCommittee = pallet_committee::Pallet; + + #[runtime::pallet_index(12)] + pub type TechnicalCommitteeMembership = pallet_group::Pallet; + + #[runtime::pallet_index(13)] + pub type UpgradeCommittee = pallet_committee::Pallet; + + #[runtime::pallet_index(14)] + pub type UpgradeCommitteeMembership = pallet_group::Pallet; + + #[runtime::pallet_index(15)] + pub type MultiSig = pallet_multisig::Pallet; + + #[runtime::pallet_index(16)] + pub type Validators = pallet_validators::Pallet; + + #[runtime::pallet_index(17)] + pub type Staking = pallet_staking::Pallet; + + #[runtime::pallet_index(18)] + pub type Offences = pallet_offences::Pallet; + + #[runtime::pallet_index(19)] + pub type Session = pallet_session::Pallet; + + #[runtime::pallet_index(20)] + pub type AuthorityDiscovery = pallet_authority_discovery::Pallet; + + #[runtime::pallet_index(21)] + pub type Grandpa = pallet_grandpa::Pallet; + + #[runtime::pallet_index(22)] + pub type Historical = pallet_session_historical::Pallet; + + #[runtime::pallet_index(23)] + pub type ImOnline = pallet_im_online::Pallet; + + #[runtime::pallet_index(26)] + pub type Asset = pallet_asset::Pallet; + + #[runtime::pallet_index(27)] + pub type CapitalDistribution = pallet_capital_distribution::Pallet; + + #[runtime::pallet_index(28)] + pub type Checkpoint = pallet_checkpoint::Pallet; + + #[runtime::pallet_index(29)] + pub type ComplianceManager = pallet_compliance_manager::Pallet; + + #[runtime::pallet_index(30)] + pub type CorporateAction = pallet_corporate_actions::Pallet; + + #[runtime::pallet_index(31)] + pub type CorporateBallot = pallet_corporate_ballot::Pallet; + + #[runtime::pallet_index(32)] + pub type Permissions = pallet_permissions::Pallet; + + #[runtime::pallet_index(33)] + pub type Pips = pallet_pips::Pallet; + + #[runtime::pallet_index(34)] + pub type Portfolio = pallet_portfolio::Pallet; + + #[runtime::pallet_index(35)] + pub type ProtocolFee = pallet_protocol_fee::Pallet; + + #[runtime::pallet_index(36)] + pub type Scheduler = pallet_scheduler::Pallet; + + #[runtime::pallet_index(37)] + pub type Settlement = pallet_settlement::Pallet; + + #[runtime::pallet_index(38)] + pub type Statistics = pallet_statistics::Pallet; + + #[runtime::pallet_index(39)] + pub type Sto = pallet_sto::Pallet; + + #[runtime::pallet_index(40)] + pub type Treasury = pallet_treasury::Pallet; + + #[runtime::pallet_index(41)] + pub type Utility = pallet_utility::Pallet; + + #[runtime::pallet_index(42)] + pub type Base = pallet_base::Pallet; + + #[runtime::pallet_index(43)] + pub type ExternalAgents = pallet_external_agents::Pallet; + + #[runtime::pallet_index(44)] + pub type Relayer = pallet_relayer::Pallet; + + #[runtime::pallet_index(46)] + pub type Contracts = pallet_contracts::Pallet; + + #[runtime::pallet_index(47)] + pub type PolymeshContracts = polymesh_contracts::Pallet; + + #[runtime::pallet_index(48)] + pub type Preimage = pallet_preimage::Pallet; + + #[runtime::pallet_index(49)] + pub type Nft = pallet_nft::Pallet; + + #[runtime::pallet_index(50)] + pub type ElectionProviderMultiPhase = pallet_election_provider_multi_phase::Pallet; + + #[runtime::pallet_index(52)] + pub type Beefy = pallet_beefy::Pallet; + + // MMR leaf construction must be after session in order to have a leaf's next_auth_set + // refer to block. See issue polkadot-fellows/runtimes#160 for details. + #[runtime::pallet_index(53)] + pub type Mmr = pallet_mmr::Pallet; + + #[runtime::pallet_index(54)] + pub type MmrLeaf = pallet_beefy_mmr::Pallet; + + #[runtime::pallet_index(80)] + pub type Revive = pallet_revive::Pallet; } + +polymesh_runtime_common::runtime_apis! {} diff --git a/pallets/runtime/testnet/Cargo.toml b/pallets/runtime/testnet/Cargo.toml index 871738d78a..b52ade1537 100644 --- a/pallets/runtime/testnet/Cargo.toml +++ b/pallets/runtime/testnet/Cargo.toml @@ -24,7 +24,6 @@ pallet-compliance-manager = { workspace = true, default-features = false } pallet-corporate-actions = { workspace = true, default-features = false } pallet-external-agents = { workspace = true, default-features = false } pallet-group = { workspace = true, default-features = false } -pallet-group-rpc-runtime-api = { workspace = true, default-features = false } pallet-identity = { workspace = true, default-features = false } pallet-multisig = { workspace = true, default-features = false } pallet-nft = { workspace = true, default-features = false } @@ -34,76 +33,85 @@ pallet-portfolio = { workspace = true, default-features = false } pallet-protocol-fee = { workspace = true, default-features = false } pallet-relayer = { workspace = true, default-features = false } pallet-settlement = { workspace = true, default-features = false } -pallet-staking = { workspace = true, default-features = false } +pallet-validators = { workspace = true, default-features = false } pallet-statistics = { workspace = true, default-features = false } pallet-transaction-payment = { workspace = true, default-features = false } pallet-treasury = { workspace = true, default-features = false } pallet-utility = { workspace = true, default-features = false } pallet-sudo = { workspace = true, default-features = false } polymesh-contracts = { workspace = true, default-features = false } - -# RPC -node-rpc-runtime-api = { workspace = true, default-features = false } -pallet-staking-rpc-runtime-api = { workspace = true, default-features = false } -pallet-protocol-fee-rpc-runtime-api = { workspace = true, default-features = false } +polymesh-stable-api-precompiles = { workspace = true, default-features = false } +polymesh-transaction-payment = { workspace = true, default-features = false } # Others -lazy_static = { version = "1.4.0", default-features = false } log = "0.4.8" serde = { version = "1.0.104", default-features = false } serde_derive = { version = "1.0.104", optional = true } +smallvec = "1.4.0" # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-inherents = { version = "4.0.0-dev", default-features = false } -sp-offchain = { version = "4.0.0-dev", default-features = false } -sp-staking = { version = "4.0.0-dev", default-features = false } -sp-consensus-babe = { version = "0.10.0-dev", default-features = false } -sp-consensus-grandpa = { version = "4.0.0-dev", default-features = false } -sp-session = { version = "4.0.0-dev", default-features = false } -sp-authority-discovery = { version = "4.0.0-dev", default-features = false } -sp-transaction-pool = { version = "4.0.0-dev", default-features = false } -sp-block-builder = { version = "4.0.0-dev", default-features = false } -sp-arithmetic = { version = "6.0.0", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } +sp-inherents = { workspace = true, default-features = false } +sp-offchain = { workspace = true, default-features = false } +sp-staking = { workspace = true, default-features = false } +sp-consensus-babe = { workspace = true, default-features = false } +sp-consensus-beefy = { workspace = true, default-features = false } +sp-consensus-grandpa = { workspace = true, default-features = false } +sp-session = { workspace = true, default-features = false } +sp-authority-discovery = { workspace = true, default-features = false } +sp-transaction-pool = { workspace = true, default-features = false } +sp-block-builder = { workspace = true, default-features = false } +sp-arithmetic = { workspace = true, default-features = false } +sp-genesis-builder = { workspace = true, default-features = false } +# +pallet-authority-discovery = { workspace = true, default-features = false } +pallet-authorship = { workspace = true, default-features = false } +pallet-babe = { workspace = true, default-features = false } +pallet-beefy = { workspace = true, default-features = false } +pallet-beefy-mmr = { workspace = true, default-features = false } +pallet-contracts = { workspace = true, default-features = false } +pallet-election-provider-multi-phase = { workspace = true, default-features = false } +pallet-grandpa = { workspace = true, default-features = false } +pallet-im-online = { workspace = true, default-features = false } +pallet-indices = { workspace = true, default-features = false } +pallet-mmr = { workspace = true, default-features = false } +pallet-offences = { workspace = true, default-features = false } +pallet-preimage = { workspace = true, default-features = false } +pallet-revive = { workspace = true, default-features = false } +pallet-scheduler = { workspace = true, default-features = false } +pallet-session = { workspace = true, default-features = false } +pallet-staking = { workspace = true, default-features = false } +pallet-staking-reward-curve = { workspace = true, default-features = false } +pallet-timestamp = { workspace = true, default-features = false } -pallet-authorship = { version = "4.0.0-dev", default-features = false } -pallet-contracts = { version = "4.0.0-dev", default-features = false } -pallet-contracts-primitives = { version = "7.0.0", default-features = false} -pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false } -pallet-executive = { package = "frame-executive", version = "4.0.0-dev", default-features = false } -pallet-grandpa = { version = "4.0.0-dev", default-features = false } -pallet-im-online = { version = "4.0.0-dev", default-features = false } -pallet-indices = { version = "4.0.0-dev", default-features = false } -pallet-offences = { version = "4.0.0-dev", default-features = false } -pallet-preimage = { version = "4.0.0-dev", default-features = false } -pallet-session = { version = "4.0.0-dev", default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } -pallet-babe = { version = "4.0.0-dev", default-features = false } -pallet-authority-discovery = { version = "4.0.0-dev", default-features = false } -pallet-insecure-randomness-collective-flip = { version = "4.0.0-dev", default-features = false } -pallet-scheduler = { version = "4.0.0-dev", default-features = false } -pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false } +frame-metadata-hash-extension = { workspace = true, default-features = false } +frame-executive = { workspace = true, default-features = false } +frame-election-provider-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false } -smallvec = "1.4.0" +# RPC +frame-system-rpc-runtime-api = { workspace = true, default-features = false } +pallet-group-rpc-runtime-api = { workspace = true, default-features = false } +pallet-protocol-fee-rpc-runtime-api = { workspace = true, default-features = false } +pallet-staking-runtime-api = { workspace = true, default-features = false } +node-rpc-runtime-api = { workspace = true, default-features = false } [build-dependencies] -polymesh-build-tool = { workspace = true, default-features = false } +polymesh-build-tool = { workspace = true, default-features = false, optional = true } [features] default = ["std", "equalize"] -disable_fees = ["pallet-transaction-payment/disable_fees"] +disable_fees = ["polymesh-transaction-payment/disable_fees"] equalize = [] +testing = [] # Backends u64_backend = ["polymesh-primitives/u64_backend"] @@ -117,6 +125,7 @@ std = [ "polymesh-build-tool/std", "u64_backend", "codec/std", + "frame-metadata-hash-extension/std", "frame-election-provider-support/std", "frame-support/std", "frame-system-rpc-runtime-api/std", @@ -128,12 +137,15 @@ std = [ "pallet-base/std", "pallet-babe/std", "pallet-balances/std", + "pallet-beefy/std", + "pallet-beefy-mmr/std", + "pallet-mmr/std", "pallet-sto/std", "pallet-committee/std", "pallet-compliance-manager/std", "pallet-contracts/std", "pallet-election-provider-multi-phase/std", - "pallet-executive/std", + "frame-executive/std", "pallet-external-agents/std", "pallet-grandpa/std", "pallet-group-rpc-runtime-api/std", @@ -151,16 +163,17 @@ std = [ "pallet-protocol-fee-rpc-runtime-api/std", "pallet-protocol-fee/std", "pallet-relayer/std", - "pallet-insecure-randomness-collective-flip/std", + "pallet-revive/std", "pallet-scheduler/std", "pallet-session/std", "pallet-settlement/std", - "pallet-staking-rpc-runtime-api/std", + "pallet-staking-runtime-api/std", "pallet-staking/std", + "pallet-validators/std", "pallet-statistics/std", - "pallet-sudo/std", "pallet-timestamp/std", "pallet-transaction-payment/std", + "polymesh-transaction-payment/std", "pallet-treasury/std", "pallet-utility/std", "polymesh-primitives/std", @@ -185,10 +198,57 @@ std = [ "sp-transaction-pool/std", "sp-version/std", "polymesh-contracts/std", + "polymesh-stable-api-precompiles/std", + "sp-genesis-builder/std", ] - runtime-benchmarks = [ "frame-election-provider-support/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", "pallet-asset/runtime-benchmarks", - "pallet-election-provider-multi-phase/runtime-benchmarks", + "pallet-babe/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-beefy-mmr/runtime-benchmarks", + "pallet-mmr/runtime-benchmarks", + "pallet-committee/runtime-benchmarks", + "pallet-contracts/runtime-benchmarks", + "pallet-corporate-actions/runtime-benchmarks", + "pallet-grandpa/runtime-benchmarks", + "pallet-group/runtime-benchmarks", + "pallet-im-online/runtime-benchmarks", + "pallet-indices/runtime-benchmarks", + "pallet-multisig/runtime-benchmarks", + "pallet-nft/runtime-benchmarks", + "pallet-pips/runtime-benchmarks", + "pallet-portfolio/runtime-benchmarks", + "pallet-preimage/runtime-benchmarks", + "pallet-protocol-fee/runtime-benchmarks", + "pallet-relayer/runtime-benchmarks", + "pallet-revive/runtime-benchmarks", + "pallet-scheduler/runtime-benchmarks", + "pallet-settlement/runtime-benchmarks", + "pallet-staking/runtime-benchmarks", + "pallet-statistics/runtime-benchmarks", + "pallet-sto/runtime-benchmarks", + "pallet-transaction-payment/runtime-benchmarks", + "polymesh-transaction-payment/runtime-benchmarks", + "pallet-treasury/runtime-benchmarks", + "pallet-utility/runtime-benchmarks", + "pallet-validators/runtime-benchmarks", + "polymesh-contracts/runtime-benchmarks", + "polymesh-stable-api-precompiles/runtime-benchmarks", + "polymesh-runtime-common/runtime-benchmarks", ] + +# Enable the metadata hash generation. +# +# This is hidden behind a feature because it increases the compile time. +# The wasm binary needs to be compiled twice, once to fetch the metadata, +# generate the metadata hash and then a second time with the +# `RUNTIME_METADATA_HASH` environment variable set for the `CheckMetadataHash` +# extension. +metadata-hash = ["polymesh-build-tool?/metadata-hash"] + +# A convenience feature for enabling things when doing a build +# for an on-chain release. +on-chain-release-build = ["metadata-hash", "sp-api/disable-logging"] diff --git a/pallets/runtime/testnet/src/lib.rs b/pallets/runtime/testnet/src/lib.rs index e7b27f0a0f..e53a4055d6 100644 --- a/pallets/runtime/testnet/src/lib.rs +++ b/pallets/runtime/testnet/src/lib.rs @@ -1,6 +1,6 @@ #![cfg_attr(not(feature = "std"), no_std)] // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] +#![recursion_limit = "1024"] pub mod constants; pub mod runtime; diff --git a/pallets/runtime/testnet/src/runtime.rs b/pallets/runtime/testnet/src/runtime.rs index e9b939f973..514b96d365 100644 --- a/pallets/runtime/testnet/src/runtime.rs +++ b/pallets/runtime/testnet/src/runtime.rs @@ -9,18 +9,16 @@ use sp_version::NativeVersion; use codec::Encode; use core::convert::TryFrom; -use frame_support::traits::KeyOwnerProofSystem; +use frame_support::parameter_types; +use frame_support::traits::{ConstBool, KeyOwnerProofSystem}; use frame_support::weights::Weight; pub use frame_support::StorageValue; -use frame_support::{construct_runtime, parameter_types}; pub use frame_system::limits::BlockWeights; pub use frame_system::Call as SystemCall; use sp_runtime::curve::PiecewiseLinear; -use sp_runtime::traits::{ - BlakeTwo256, Block as BlockT, Extrinsic, NumberFor, StaticLookup, Verify, -}; +use sp_runtime::traits::{BlakeTwo256, Block as BlockT, NumberFor, StaticLookup, Verify}; use sp_runtime::transaction_validity::TransactionPriority; -use sp_runtime::{create_runtime_str, Perbill, Permill}; +use sp_runtime::{Cow, Perbill, Permill}; use sp_std::prelude::*; use sp_version::RuntimeVersion; @@ -36,7 +34,7 @@ use polymesh_common_utilities::protocol_fee::ProtocolOp; use polymesh_primitives::constants::currency::*; use polymesh_primitives::constants::ENSURED_MAX_LEN; use polymesh_primitives::settlement::Leg; -use polymesh_primitives::{Balance, BlockNumber, Moment}; +use polymesh_primitives::{AccountId, Balance, BlockNumber, Moment}; use polymesh_runtime_common::impls::Author; use polymesh_runtime_common::merge_active_and_inactive; use polymesh_runtime_common::runtime::{GovernanceCommittee, BENCHMARK_MAX_INCREASE, VMO}; @@ -44,22 +42,27 @@ use polymesh_runtime_common::{AvailableBlockRatio, MaximumBlockWeight}; use crate::constants::time::*; +/// 100% goes to the block author. +type DealWithFees = Author; +type CddHandler = polymesh_runtime_common::fee_details::CddHandler; + // Make the WASM binary available. #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); /// Runtime version. +#[sp_version::runtime_version] pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("polymesh_testnet"), - impl_name: create_runtime_str!("polymesh_testnet"), + spec_name: Cow::Borrowed("polymesh_testnet"), + impl_name: Cow::Borrowed("polymesh_testnet"), authoring_version: 1, // `spec_version: aaa_bbb_ccd` should match node version v`aaa.bbb.cc` // N.B. `d` is unpinned from the binary version - spec_version: 7_004_000, + spec_version: 8_000_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 7, - state_version: 1, + transaction_version: 8, + system_version: 1, }; parameter_types! { @@ -82,7 +85,11 @@ parameter_types! { // Balances: pub const ExistentialDeposit: Balance = 0u128; + pub const BenchmarkEd: Balance = 1; pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; + pub const MaxHolds: u32 = 32; + pub const MaxFreezes: u32 = 32; // Timestamp: pub const MinimumPeriod: Moment = SLOT_DURATION / 2; @@ -107,7 +114,6 @@ parameter_types! { pub const MaxAuthorities: u32 = 100_000; pub const MaxKeys: u32 = 10_000; pub const MaxPeerInHeartbeats: u32 = 10_000; - pub const MaxPeerDataEncodingSize: u32 = 1_000; // Assets: pub const AssetNameMaxLength: u32 = 128; @@ -134,11 +140,11 @@ parameter_types! { // Identity: pub const InitialPOLYX: Balance = 100_000 * ONE_POLY; + pub const MaxGivenAuths: u32 = 1024; + pub MaxAuthRetries: u8 = 10; // Contracts: pub Schedule: pallet_contracts::Schedule = Default::default(); - pub DeletionWeightLimit: Weight = Weight::from_ref_time(500_000_000_000); - pub DeletionQueueDepth: u32 = 1024; pub MaxInLen: u32 = 8 * 1024; pub MaxOutLen: u32 = 8 * 1024; @@ -156,53 +162,40 @@ parameter_types! { // PIPs pub const MaxRefundsAndVotesPruned: u32 = 128; -} - -/// 100% goes to the block author. -pub type DealWithFees = Author; -// Staking: -pallet_staking_reward_curve::build! { - const REWARD_CURVE: PiecewiseLinear<'_> = curve!( - min_inflation: 0_025_000, - max_inflation: 0_140_000, - ideal_stake: 0_700_000, - falloff: 0_050_000, - max_piece_count: 40, - test_precision: 0_005_000, - ); -} -parameter_types! { + // Staking pub const SessionsPerEra: sp_staking::SessionIndex = 6; pub const BondingDuration: sp_staking::EraIndex = 28; pub const SlashDeferDuration: sp_staking::EraIndex = 14; // 1/2 the bonding duration. pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; - pub const MaxNominatorRewardedPerValidator: u32 = 1_024; - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); - pub const UnsignedPhase: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 4; - pub const MaxIterations: u32 = 10; - pub const MaxValidatorPerIdentity: Permill = Permill::from_percent(33); - // 0.05%. The higher the value, the more strict solution acceptance becomes. - pub MinSolutionScoreBump: Perbill = Perbill::from_rational(5u32, 10_000); + + // Validators pub const MaxVariableInflationTotalIssuance: Balance = 1_000_000_000 * ONE_POLY; pub const FixedYearlyReward: Balance = 140_000_000 * ONE_POLY; - pub const MinimumBond: Balance = ONE_POLY; - /// We prioritize im-online heartbeats over election solution submission. - pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2; + pub const MaxValidatorPerIdentity: Permill = Permill::from_percent(33); + // Babe + pub const MaxNominatorRewardedPerValidator: u32 = 1_024; pub const ReportLongevity: u64 = BondingDuration::get() as u64 * SessionsPerEra::get() as u64 * EpochDuration::get(); - pub MaxGivenAuths: u32 = 1024; - pub MaxAuthRetries: u8 = 10; + // Election Provider Multi Phase + pub const UnsignedPhase: BlockNumber = EPOCH_DURATION_IN_BLOCKS / 4; } -polymesh_runtime_common::misc_pallet_impls!(); - -type CddHandler = polymesh_runtime_common::fee_details::CddHandler; +// Staking: +pallet_staking_reward_curve::build! { + const REWARD_CURVE: PiecewiseLinear<'_> = curve!( + min_inflation: 0_025_000, + max_inflation: 0_140_000, + ideal_stake: 0_700_000, + falloff: 0_050_000, + max_piece_count: 40, + test_precision: 0_005_000, + ); +} impl pallet_identity::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type Proposal = RuntimeCall; type CddServiceProviders = CddServiceProviders; type Balances = pallet_balances::Pallet; @@ -217,6 +210,7 @@ impl pallet_identity::Config for Runtime { type InitialPOLYX = InitialPOLYX; type MaxGivenAuths = MaxGivenAuths; type MaxAuthRetries = MaxAuthRetries; + type Randomness = pallet_babe::RandomnessFromOneEpochAgo; } impl pallet_committee::Config for Runtime { @@ -224,13 +218,11 @@ impl pallet_committee::Config for Runtime { type Proposal = RuntimeCall; type CommitteeOrigin = VMO; type VoteThresholdOrigin = Self::CommitteeOrigin; - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_committee::SubstrateWeight; } /// PolymeshCommittee as an instance of group impl pallet_group::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type LimitOrigin = polymesh_primitives::EnsureRoot; type AddOrigin = Self::LimitOrigin; type RemoveOrigin = Self::LimitOrigin; @@ -249,11 +241,9 @@ macro_rules! committee_config { // Can act upon itself. type CommitteeOrigin = VMO; type VoteThresholdOrigin = Self::CommitteeOrigin; - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_committee::SubstrateWeight; } impl pallet_group::Config for Runtime { - type RuntimeEvent = RuntimeEvent; // Committee cannot alter its own active membership limit. type LimitOrigin = polymesh_primitives::EnsureRoot; // Can manage its own addition, deletion, and swapping of membership... @@ -278,16 +268,15 @@ impl pallet_pips::Config for Runtime { type GovernanceCommittee = PolymeshCommittee; type TechnicalCommitteeVMO = VMO; type UpgradeCommitteeVMO = VMO; - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_pips::SubstrateWeight; type Scheduler = Scheduler; type SchedulerCall = RuntimeCall; type MaxRefundsAndVotesPruned = MaxRefundsAndVotesPruned; + type SchedulerPreimage = Preimage; } /// CddProviders instance of group impl pallet_group::Config for Runtime { - type RuntimeEvent = RuntimeEvent; type LimitOrigin = polymesh_primitives::EnsureRoot; type AddOrigin = polymesh_primitives::EnsureRoot; type RemoveOrigin = polymesh_primitives::EnsureRoot; @@ -298,105 +287,201 @@ impl pallet_group::Config for Runtime { type WeightInfo = polymesh_weights::pallet_group::SubstrateWeight; } -pub type AllModulesExported = AllPalletsWithSystem; - -construct_runtime!( - pub enum Runtime where - Block = Block, - NodeBlock = polymesh_primitives::Block, - UncheckedExtrinsic = UncheckedExtrinsic - { - - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - Babe: pallet_babe::{Pallet, Call, Storage, Config, ValidateUnsigned} = 1, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2, - Indices: pallet_indices::{Pallet, Call, Storage, Config, Event} = 3, - Authorship: pallet_authorship = 4, - - // Balance: Genesis config dependencies: System. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 5, - - // TransactionPayment: Genesis config dependencies: Balance. - TransactionPayment: pallet_transaction_payment::{Pallet, Call, Event, Storage} = 6, - - // Identity: Genesis config deps: Timestamp. - Identity: pallet_identity::{Pallet, Call, Storage, Event, Config} = 7, - - // Polymesh Committees - - // CddServiceProviders (group only): Genesis config deps: Identity - CddServiceProviders: pallet_group::::{Pallet, Call, Storage, Event, Config} = 8, - - // Governance Council (committee) - PolymeshCommittee: pallet_committee::::{Pallet, Call, Storage, Origin, Event, Config} = 9, - // CommitteeMembership: Genesis config deps: PolymeshCommittee, Identity. - CommitteeMembership: pallet_group::::{Pallet, Call, Storage, Event, Config} = 10, - - // Technical Committee - TechnicalCommittee: pallet_committee::::{Pallet, Call, Storage, Origin, Event, Config} = 11, - // TechnicalCommitteeMembership: Genesis config deps: TechnicalCommittee, Identity - TechnicalCommitteeMembership: pallet_group::::{Pallet, Call, Storage, Event, Config} = 12, - - // Upgrade Committee - UpgradeCommittee: pallet_committee::::{Pallet, Call, Storage, Origin, Event, Config} = 13, - // UpgradeCommitteeMembership: Genesis config deps: UpgradeCommittee, Identity - UpgradeCommitteeMembership: pallet_group::::{Pallet, Call, Storage, Event, Config} = 14, - - MultiSig: pallet_multisig::{Pallet, Call, Config, Storage, Event} = 15, - - // Removed: - //Bridge = 16, - - // Staking: Genesis config deps: Bridge, Balances, Indices, Identity, Babe, Timestamp, Committees - Staking: pallet_staking::{Pallet, Call, Config, Storage, Event} = 17, - - Offences: pallet_offences::{Pallet, Storage, Event} = 18, - - // Session: Genesis config deps: System. - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 19, - AuthorityDiscovery: pallet_authority_discovery::{Pallet, Config} = 20, - Grandpa: pallet_grandpa::{Pallet, Call, Storage, Config, Event} = 21, - Historical: pallet_session_historical::{Pallet} = 22, - ImOnline: pallet_im_online::{Pallet, Call, Storage, Event, ValidateUnsigned, Config} = 23, - RandomnessCollectiveFlip: pallet_insecure_randomness_collective_flip::{Pallet, Storage} = 24, - - // Sudo. Usable initially. - // Sudo: pallet_sudo::{Pallet, Call, Config, Storage, Event} = 25, - - // Asset: Genesis config deps: Timestamp, - Asset: pallet_asset::{Pallet, Call, Storage, Config, Event} = 26, - CapitalDistribution: pallet_capital_distribution::{Pallet, Call, Storage, Event, Config} = 27, - Checkpoint: pallet_checkpoint::{Pallet, Call, Storage, Event, Config} = 28, - ComplianceManager: pallet_compliance_manager::{Pallet, Call, Storage, Event} = 29, - CorporateAction: pallet_corporate_actions::{Pallet, Call, Storage, Event, Config} = 30, - CorporateBallot: pallet_corporate_ballot::{Pallet, Call, Storage, Event, Config} = 31, - Permissions: pallet_permissions::{Pallet} = 32, - Pips: pallet_pips::{Pallet, Call, Storage, Event, Config} = 33, - Portfolio: pallet_portfolio::{Pallet, Call, Storage, Event, Config} = 34, - ProtocolFee: pallet_protocol_fee::{Pallet, Call, Storage, Event, Config} = 35, - Scheduler: pallet_scheduler::{Pallet, Call, Storage, Event} = 36, - Settlement: pallet_settlement::{Pallet, Call, Storage, Event, Config} = 37, - Statistics: pallet_statistics::{Pallet, Call, Storage, Event, Config} = 38, - Sto: pallet_sto::{Pallet, Call, Storage, Event} = 39, - Treasury: pallet_treasury::{Pallet, Call, Event} = 40, - Utility: pallet_utility::{Pallet, Call, Storage, Event} = 41, - Base: pallet_base::{Pallet, Call, Event} = 42, - ExternalAgents: pallet_external_agents::{Pallet, Call, Storage, Event} = 43, - Relayer: pallet_relayer::{Pallet, Call, Storage, Event} = 44, - // Removed pallet_rewards = 45, - - // Contracts - Contracts: pallet_contracts::{Pallet, Call, Storage, Event} = 46, - PolymeshContracts: polymesh_contracts::{Pallet, Call, Storage, Event, Config} = 47, - - // Preimage register. Used by `pallet_scheduler`. - Preimage: pallet_preimage::{Pallet, Call, Storage, Event} = 48, - - Nft: pallet_nft::{Pallet, Call, Storage, Event} = 49, - - ElectionProviderMultiPhase: pallet_election_provider_multi_phase::{Pallet, Call, Storage, Event, ValidateUnsigned} = 50, - } -); +pub struct OnChainSeqPhragmen; + +impl frame_election_provider_support::onchain::Config for OnChainSeqPhragmen { + type Sort = ConstBool; + type System = Runtime; + type Solver = frame_election_provider_support::SequentialPhragmen< + polymesh_primitives::AccountId, + pallet_election_provider_multi_phase::SolutionAccuracyOf, + >; + type DataProvider = ::DataProvider; + type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; + type Bounds = polymesh_runtime_common::ElectionBoundsOnChain; + type MaxBackersPerWinner = polymesh_runtime_common::MaxElectingVotersSolution; + type MaxWinnersPerPage = polymesh_runtime_common::MaxActiveValidators; +} + +polymesh_runtime_common::misc_pallet_impls!(); + +#[frame_support::runtime] +mod runtime { + use super::*; + + #[runtime::runtime] + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason + )] + pub struct Runtime; + + #[runtime::pallet_index(0)] + pub type System = frame_system::Pallet; + + #[runtime::pallet_index(1)] + pub type Babe = pallet_babe::Pallet; + + #[runtime::pallet_index(2)] + pub type Timestamp = pallet_timestamp::Pallet; + + #[runtime::pallet_index(3)] + pub type Indices = pallet_indices::Pallet; + + #[runtime::pallet_index(4)] + pub type Authorship = pallet_authorship::Pallet; + + #[runtime::pallet_index(5)] + pub type Balances = pallet_balances::Pallet; + + #[runtime::pallet_index(6)] + pub type TransactionPayment = pallet_transaction_payment::Pallet; + + #[runtime::pallet_index(51)] + pub type PolymeshTransactionPayment = polymesh_transaction_payment::Pallet; + + #[runtime::pallet_index(7)] + pub type Identity = pallet_identity::Pallet; + + #[runtime::pallet_index(8)] + pub type CddServiceProviders = pallet_group::Pallet; + + #[runtime::pallet_index(9)] + pub type PolymeshCommittee = pallet_committee::Pallet; + + #[runtime::pallet_index(10)] + pub type CommitteeMembership = pallet_group::Pallet; + + #[runtime::pallet_index(11)] + pub type TechnicalCommittee = pallet_committee::Pallet; + + #[runtime::pallet_index(12)] + pub type TechnicalCommitteeMembership = pallet_group::Pallet; + + #[runtime::pallet_index(13)] + pub type UpgradeCommittee = pallet_committee::Pallet; + + #[runtime::pallet_index(14)] + pub type UpgradeCommitteeMembership = pallet_group::Pallet; + + #[runtime::pallet_index(15)] + pub type MultiSig = pallet_multisig::Pallet; + + #[runtime::pallet_index(16)] + pub type Validators = pallet_validators::Pallet; + + #[runtime::pallet_index(17)] + pub type Staking = pallet_staking::Pallet; + + #[runtime::pallet_index(18)] + pub type Offences = pallet_offences::Pallet; + + #[runtime::pallet_index(19)] + pub type Session = pallet_session::Pallet; + + #[runtime::pallet_index(20)] + pub type AuthorityDiscovery = pallet_authority_discovery::Pallet; + + #[runtime::pallet_index(21)] + pub type Grandpa = pallet_grandpa::Pallet; + + #[runtime::pallet_index(22)] + pub type Historical = pallet_session_historical::Pallet; + + #[runtime::pallet_index(23)] + pub type ImOnline = pallet_im_online::Pallet; + + #[runtime::pallet_index(26)] + pub type Asset = pallet_asset::Pallet; + + #[runtime::pallet_index(27)] + pub type CapitalDistribution = pallet_capital_distribution::Pallet; + + #[runtime::pallet_index(28)] + pub type Checkpoint = pallet_checkpoint::Pallet; + + #[runtime::pallet_index(29)] + pub type ComplianceManager = pallet_compliance_manager::Pallet; + + #[runtime::pallet_index(30)] + pub type CorporateAction = pallet_corporate_actions::Pallet; + + #[runtime::pallet_index(31)] + pub type CorporateBallot = pallet_corporate_ballot::Pallet; + + #[runtime::pallet_index(32)] + pub type Permissions = pallet_permissions::Pallet; + + #[runtime::pallet_index(33)] + pub type Pips = pallet_pips::Pallet; + + #[runtime::pallet_index(34)] + pub type Portfolio = pallet_portfolio::Pallet; + + #[runtime::pallet_index(35)] + pub type ProtocolFee = pallet_protocol_fee::Pallet; + + #[runtime::pallet_index(36)] + pub type Scheduler = pallet_scheduler::Pallet; + + #[runtime::pallet_index(37)] + pub type Settlement = pallet_settlement::Pallet; + + #[runtime::pallet_index(38)] + pub type Statistics = pallet_statistics::Pallet; + + #[runtime::pallet_index(39)] + pub type Sto = pallet_sto::Pallet; + + #[runtime::pallet_index(40)] + pub type Treasury = pallet_treasury::Pallet; + + #[runtime::pallet_index(41)] + pub type Utility = pallet_utility::Pallet; + + #[runtime::pallet_index(42)] + pub type Base = pallet_base::Pallet; + + #[runtime::pallet_index(43)] + pub type ExternalAgents = pallet_external_agents::Pallet; + + #[runtime::pallet_index(44)] + pub type Relayer = pallet_relayer::Pallet; + + #[runtime::pallet_index(46)] + pub type Contracts = pallet_contracts::Pallet; + + #[runtime::pallet_index(47)] + pub type PolymeshContracts = polymesh_contracts::Pallet; + + #[runtime::pallet_index(48)] + pub type Preimage = pallet_preimage::Pallet; + + #[runtime::pallet_index(49)] + pub type Nft = pallet_nft::Pallet; + + #[runtime::pallet_index(50)] + pub type ElectionProviderMultiPhase = pallet_election_provider_multi_phase::Pallet; + + #[runtime::pallet_index(52)] + pub type Beefy = pallet_beefy::Pallet; + + // MMR leaf construction must be after session in order to have a leaf's next_auth_set + // refer to block. See issue polkadot-fellows/runtimes#160 for details. + #[runtime::pallet_index(53)] + pub type Mmr = pallet_mmr::Pallet; + + #[runtime::pallet_index(54)] + pub type MmrLeaf = pallet_beefy_mmr::Pallet; + + #[runtime::pallet_index(80)] + pub type Revive = pallet_revive::Pallet; +} polymesh_runtime_common::runtime_apis! {} @@ -414,18 +499,3 @@ impl DryRunRuntimeUpgrade for Runtime { ::on_runtime_upgrade() } } - -pub struct OnChainSeqPhragmen; - -impl frame_election_provider_support::onchain::Config for OnChainSeqPhragmen { - type System = Runtime; - type Solver = frame_election_provider_support::SequentialPhragmen< - polymesh_primitives::AccountId, - pallet_election_provider_multi_phase::SolutionAccuracyOf, - >; - type DataProvider = ::DataProvider; - type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; - type MaxWinners = ::MaxWinners; - type VotersBound = polymesh_runtime_common::MaxOnChainElectingVoters; - type TargetsBound = polymesh_runtime_common::MaxOnChainElectableTargets; -} diff --git a/pallets/runtime/tests/Cargo.toml b/pallets/runtime/tests/Cargo.toml index b57f1a65e8..eea3bbdd66 100644 --- a/pallets/runtime/tests/Cargo.toml +++ b/pallets/runtime/tests/Cargo.toml @@ -5,7 +5,14 @@ authors = ["PolymeshAssociation"] edition = "2021" [dependencies] -node-rpc-runtime-api = { workspace = true, default-features = false } +# Common +polymesh-runtime-common = { workspace = true, default-features = false } +polymesh-runtime-develop = { workspace = true } +polymesh-common-utilities = { workspace = true, default-features = false } +polymesh-primitives = { workspace = true, default-features = false } +polymesh-weights = { workspace = true, default-features = false } + +# Our pallets pallet-asset = { workspace = true, default-features = false } pallet-balances = { workspace = true, default-features = false } pallet-base = { workspace = true, default-features = false } @@ -14,7 +21,6 @@ pallet-compliance-manager = { workspace = true, default-features = false } pallet-corporate-actions = { workspace = true, default-features = false } pallet-external-agents = { workspace = true, default-features = false } pallet-group = { workspace = true, default-features = false } -pallet-group-rpc-runtime-api = { workspace = true, default-features = false } pallet-identity = { workspace = true, default-features = false, features = ["no_cdd"] } pallet-multisig = { workspace = true, default-features = false } pallet-nft = { workspace = true, default-features = false } @@ -22,113 +28,117 @@ pallet-permissions = { workspace = true, default-features = false } pallet-pips = { workspace = true, default-features = false } pallet-portfolio = { workspace = true, default-features = false } pallet-protocol-fee = { workspace = true, default-features = false } -pallet-protocol-fee-rpc-runtime-api = { workspace = true, default-features = false } pallet-relayer = { workspace = true, default-features = false } +pallet-sto = { workspace = true, default-features = false } pallet-settlement = { workspace = true, default-features = false } -pallet-staking = { workspace = true, default-features = false } -pallet-staking-rpc-runtime-api = { workspace = true, default-features = false } +pallet-validators = { workspace = true, default-features = false } pallet-statistics = { workspace = true, default-features = false } -pallet-sto = { workspace = true, default-features = false } -pallet-sudo = { workspace = true, default-features = false } pallet-transaction-payment = { workspace = true, default-features = false } +polymesh-transaction-payment = { workspace = true, default-features = false } pallet-treasury = { workspace = true, default-features = false } pallet-utility = { workspace = true, default-features = false } polymesh-contracts = { workspace = true, default-features = false } -polymesh-common-utilities = { workspace = true, default-features = false } -polymesh-primitives = { workspace = true, default-features = false } -polymesh-runtime-common = { workspace = true, default-features = false, features = ["testing"] } -polymesh-runtime-develop = { workspace = true } -polymesh-weights = { workspace = true, default-features = false } +polymesh-stable-api-precompiles = { workspace = true, default-features = false } polymesh-exec-macro = { path = "exec_macro" } -# General +# Others serde = { version = "1.0.104", default-features = false } -rand = { version = "0.7.3", default-features = false } -chrono = { version = "0.4", default-features = false } -hex-literal = "0.3.0" -smallvec = "1.4.1" -lazy_static = "1.4.0" -parking_lot = "0.12.0" -env_logger = "0.7" -serde_json = '1.0.48' -log = "0.4.8" +log = { version = "0.4.8", default-features = false } +rand = { version = "0.8", default-features = false } +chrono = { version = "0.4", default-features = false, features = ["now"]} +lazy_static = "1.4" # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -frame-benchmarking = { version = "4.0.0-dev", optional = true } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-system-rpc-runtime-api = { version = "4.0.0-dev", default-features = false } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false } -ink_primitives = { git = "https://github.com/paritytech/ink", tag = "v2.1.0", default-features = false } -pallet-authority-discovery = { version = "4.0.0-dev", default-features = false } -pallet-authorship = { version = "4.0.0-dev", default-features = false } -pallet-babe = { version = "4.0.0-dev", default-features = false } -pallet-contracts = { version = "4.0.0-dev", default-features = false } -pallet-contracts-primitives = { version = "7.0.0", default-features = false } -pallet-election-provider-multi-phase = { version = "4.0.0-dev", default-features = false } -pallet-executive = { package = "frame-executive", version = "4.0.0-dev", default-features = false } -pallet-grandpa = { version = "4.0.0-dev", default-features = false } -pallet-im-online = { version = "4.0.0-dev", default-features = false } -pallet-indices = { version = "4.0.0-dev", default-features = false } -pallet-offences = { version = "4.0.0-dev", default-features = false } -pallet-preimage = { version = "4.0.0-dev", default-features = false } -pallet-insecure-randomness-collective-flip = { version = "4.0.0-dev", default-features = false } -pallet-scheduler = { version = "4.0.0-dev", default-features = false } -pallet-session = { version = "4.0.0-dev", default-features = false, features = ["historical"] } -pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-arithmetic = { version = "6.0.0", default-features = false } -sp-authority-discovery = { version = "4.0.0-dev", default-features = false } -sp-block-builder = { version = "4.0.0-dev", default-features = false } -sp-consensus-babe = { version = "0.10.0-dev", default-features = false } -sp-consensus-grandpa = { version = "4.0.0-dev", default-features = false } -sp-core = { version = "7.0.0", default-features = false } -sp-inherents = { version = "4.0.0-dev", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-npos-elections = { version = "4.0.0-dev", default-features = false } -sp-offchain = { version = "4.0.0-dev", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-session = { version = "4.0.0-dev", default-features = false } -sp-staking = { version = "4.0.0-dev", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-transaction-pool = { version = "4.0.0-dev", default-features = false } -sp-version = { version = "5.0.0", default-features = false } -sp-keyring = { version = "7.0.0" } -substrate-test-utils = { version = "4.0.0-dev", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false, features = ["full_crypto"] } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-npos-elections = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } +sp-inherents = { workspace = true, default-features = false } +sp-offchain = { workspace = true, default-features = false } +sp-staking = { workspace = true, default-features = false } +sp-consensus-babe = { workspace = true, default-features = false } +sp-consensus-beefy = { workspace = true, default-features = false } +sp-consensus-grandpa = { workspace = true, default-features = false } +sp-session = { workspace = true, default-features = false } +sp-authority-discovery = { workspace = true, default-features = false } +sp-transaction-pool = { workspace = true, default-features = false } +sp-block-builder = { workspace = true, default-features = false } +sp-arithmetic = { workspace = true, default-features = false } +sp-genesis-builder = { workspace = true, default-features = false } +sp-keyring = { workspace = true } +# +pallet-authority-discovery = { workspace = true, default-features = false } +pallet-authorship = { workspace = true, default-features = false } +pallet-babe = { workspace = true, default-features = false } +pallet-beefy = { workspace = true, default-features = false } +pallet-beefy-mmr = { workspace = true, default-features = false } +pallet-contracts = { workspace = true, default-features = false } +pallet-election-provider-multi-phase = { workspace = true, default-features = false } +pallet-grandpa = { workspace = true, default-features = false } +pallet-im-online = { workspace = true, default-features = false } +pallet-indices = { workspace = true, default-features = false } +pallet-mmr = { workspace = true, default-features = false } +pallet-offences = { workspace = true, default-features = false } +pallet-preimage = { workspace = true, default-features = false } +pallet-revive = { workspace = true, default-features = false } +pallet-scheduler = { workspace = true, default-features = false } +pallet-session = { workspace = true, default-features = false, features = ["historical"] } +pallet-staking = { workspace = true, default-features = false } +pallet-staking-reward-curve = { workspace = true, default-features = false } +pallet-sudo = { workspace = true, default-features = false } +pallet-timestamp = { workspace = true, default-features = false } + +frame-metadata-hash-extension = { workspace = true, default-features = false } +frame-executive = { workspace = true, default-features = false } +frame-election-provider-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +substrate-test-utils = { workspace = true, default-features = false } + +# Runtime APIs +node-rpc-runtime-api = { workspace = true, default-features = false } +pallet-group-rpc-runtime-api = { workspace = true, default-features = false } +pallet-protocol-fee-rpc-runtime-api = { workspace = true, default-features = false } +pallet-staking-runtime-api = { workspace = true, default-features = false } +frame-system-rpc-runtime-api = { workspace = true, default-features = false } [dev-dependencies] -libsecp256k1 = { version = "0.7", default-features = false } wat = "1.0" -sp-tracing = { version = "6.0.0", default-features = false, features = ["std"] } +sp-tracing = { workspace = true, default-features = false, features = ["std"] } [features] -default = ["std", "testing", "equalize"] +default = ["std", "equalize", "testing"] + +testing = ["polymesh-runtime-common/testing", "pallet-staking/testing"] -testing = [] equalize = [] only-staking = [] # Backends u64_backend = ["polymesh-primitives/u64_backend"] -no_std = [ - "u64_backend" -] +no_std = ["u64_backend"] std = [ "u64_backend", "frame-support/std", "frame-system/std", + "frame-metadata-hash-extension/std", "frame-election-provider-support/std", - "ink_primitives/std", "pallet-asset/std", "pallet-authorship/std", + "pallet-authority-discovery/std", "pallet-base/std", "pallet-babe/std", "pallet-balances/std", + "pallet-beefy/std", + "pallet-beefy-mmr/std", + "pallet-mmr/std", "pallet-sto/std", "pallet-committee/std", "pallet-compliance-manager/std", @@ -137,7 +147,6 @@ std = [ "pallet-election-provider-multi-phase/std", "pallet-external-agents/std", "polymesh-weights/std", - "pallet-group-rpc-runtime-api/std", "pallet-group/std", "pallet-identity/std", "pallet-multisig/std", @@ -147,21 +156,24 @@ std = [ "pallet-pips/std", "pallet-portfolio/std", "pallet-relayer/std", - "pallet-insecure-randomness-collective-flip/std", + "pallet-revive/std", "pallet-scheduler/std", "pallet-session/std", "pallet-staking/std", + "pallet-validators/std", "pallet-statistics/std", "pallet-timestamp/std", "pallet-transaction-payment/std", + "polymesh-transaction-payment/std", "pallet-treasury/std", "pallet-sudo/std", "polymesh-primitives/std", "polymesh-common-utilities/std", "polymesh-runtime-common/std", "polymesh-contracts/std", - "polymesh-weights/std", + "polymesh-stable-api-precompiles/std", "serde/std", + "sp-authority-discovery/std", "sp-arithmetic/std", "sp-core/std", "sp-io/std", @@ -169,8 +181,10 @@ std = [ "sp-runtime/std", "sp-staking/std", "sp-std/std", + "sp-genesis-builder/std", + "rand/std", ] -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", -] + +runtime-benchmarks = [] + try-runtime = [] diff --git a/pallets/runtime/tests/src/asset_metadata_test.rs b/pallets/runtime/tests/src/asset_metadata_test.rs index da83c32fd1..cdac1e1021 100644 --- a/pallets/runtime/tests/src/asset_metadata_test.rs +++ b/pallets/runtime/tests/src/asset_metadata_test.rs @@ -1,18 +1,18 @@ -use super::{ - asset_pallet::setup::create_and_issue_sample_asset, - asset_test::set_timestamp, - exec_noop, exec_ok, - storage::{TestStorage, User}, - ExtBuilder, -}; -use frame_support::{assert_noop, assert_ok, dispatch::DispatchError}; +use frame_support::pallet_prelude::DispatchError; +use frame_support::traits::UnixTime; +use frame_support::{assert_noop, assert_ok}; +use sp_keyring::Sr25519Keyring; + use pallet_asset::{AssetMetadataGlobalNameToKey, AssetMetadataLocalNameToKey}; use polymesh_primitives::asset::AssetId; -use polymesh_primitives::asset_metadata::{ - AssetMetadataKey, AssetMetadataLockStatus, AssetMetadataName, AssetMetadataSpec, - AssetMetadataValue, AssetMetadataValueDetail, -}; -use sp_keyring::AccountKeyring; +use polymesh_primitives::asset_metadata::{AssetMetadataKey, AssetMetadataLockStatus}; +use polymesh_primitives::asset_metadata::{AssetMetadataName, AssetMetadataValueDetail}; +use polymesh_primitives::asset_metadata::{AssetMetadataSpec, AssetMetadataValue}; + +use super::asset_pallet::setup::create_and_issue_sample_asset; +use super::asset_test::set_timestamp; +use super::storage::{TestStorage, User}; +use super::{exec_noop, exec_ok, ExtBuilder}; type Origin = ::RuntimeOrigin; type Moment = ::Moment; @@ -109,8 +109,8 @@ fn register_metadata_type(owner: User, asset_id: Option, name: &str) -> #[test] fn set_asset_metadata_local_type() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Dave); - let other = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Dave); + let other = User::new(Sr25519Keyring::Alice); // Create asset. let asset_id = create_and_issue_sample_asset(&owner); @@ -307,8 +307,8 @@ fn set_asset_metadata_local_type() { #[test] fn register_and_set_local_asset_metadata() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Dave); - let other = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Dave); + let other = User::new(Sr25519Keyring::Alice); // Create asset. let asset_id = create_and_issue_sample_asset(&owner); @@ -358,8 +358,8 @@ fn register_and_set_local_asset_metadata() { #[test] fn register_asset_metadata_local_type() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Dave); - let other = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Dave); + let other = User::new(Sr25519Keyring::Alice); // Create asset. let asset_id = create_and_issue_sample_asset(&owner); @@ -396,7 +396,7 @@ fn register_asset_metadata_local_type() { #[test] fn register_asset_metadata_global_type() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let root = Origin::from(frame_system::RawOrigin::Root); let (name, spec) = make_metadata_type("TEST"); @@ -425,7 +425,7 @@ fn register_asset_metadata_global_type() { #[test] fn register_asset_metadata_local_type_limits() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Dave); + let owner = User::new(Sr25519Keyring::Dave); // Create asset. let asset_id = create_and_issue_sample_asset(&owner); @@ -508,7 +508,7 @@ fn register_asset_metadata_global_type_limits() { #[test] fn check_locked_until() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Dave); + let owner = User::new(Sr25519Keyring::Dave); // Create asset. let asset_id = create_and_issue_sample_asset(&owner); @@ -537,7 +537,7 @@ fn check_locked_until() { details.clone() )); - let unlock_timestamp = Timestamp::now() + 1_000_000_000; + let unlock_timestamp = Timestamp::now().as_millis() as u64 + 1_000_000_000; let details_locked_until = AssetMetadataValueDetail { expire: None, lock_status: AssetMetadataLockStatus::LockedUntil(unlock_timestamp), diff --git a/pallets/runtime/tests/src/asset_pallet/accept_ticker_transfer.rs b/pallets/runtime/tests/src/asset_pallet/accept_ticker_transfer.rs index 7cd98a4feb..f2bdff9292 100644 --- a/pallets/runtime/tests/src/asset_pallet/accept_ticker_transfer.rs +++ b/pallets/runtime/tests/src/asset_pallet/accept_ticker_transfer.rs @@ -1,5 +1,5 @@ use frame_support::{assert_noop, assert_ok}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use pallet_asset::{ TickerConfig, TickerRegistration, TickersOwnedByUser, UniqueTickerRegistration, @@ -19,8 +19,8 @@ type IdentityError = pallet_identity::Error; #[test] fn accept_ticker_transfer() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); assert_ok!(Asset::register_unique_ticker(alice.origin(), ticker,)); @@ -55,8 +55,8 @@ fn accept_ticker_transfer() { #[test] fn accept_ticker_transfer_missing_auth() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); assert_ok!(Asset::register_unique_ticker(alice.origin(), ticker,)); @@ -70,8 +70,8 @@ fn accept_ticker_transfer_missing_auth() { #[test] fn accept_ticker_transfer_asset_exists() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); create_and_issue_sample_asset_linked_to_ticker(&alice, ticker); @@ -94,8 +94,8 @@ fn accept_ticker_transfer_asset_exists() { fn accept_ticker_transfer_auth_expired() { ExtBuilder::default().build().execute_with(|| { set_timestamp(now()); - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); assert_ok!(Asset::register_unique_ticker(alice.origin(), ticker,)); @@ -117,8 +117,8 @@ fn accept_ticker_transfer_auth_expired() { //fn accept_ticker_transfer_registration_expired() { // ExtBuilder::default().build().execute_with(|| { // set_time_to_now(); -// let bob = User::new(AccountKeyring::Bob); -// let alice = User::new(AccountKeyring::Alice); +// let bob = User::new(Sr25519Keyring::Bob); +// let alice = User::new(Sr25519Keyring::Alice); // let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); // // assert_ok!(Asset::register_ticker(alice.origin(), ticker,)); @@ -139,9 +139,9 @@ fn accept_ticker_transfer_auth_expired() { #[test] fn accept_ticker_transfer_illegal_auth() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); assert_ok!(Asset::register_unique_ticker(alice.origin(), ticker,)); @@ -170,8 +170,8 @@ fn accept_ticker_transfer_illegal_auth() { #[test] fn accept_ticker_transfer_bad_type() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); assert_ok!(Asset::register_unique_ticker(alice.origin(), ticker,)); diff --git a/pallets/runtime/tests/src/asset_pallet/asset_ownership_transfer.rs b/pallets/runtime/tests/src/asset_pallet/asset_ownership_transfer.rs index 41a96eb883..aa3894bd87 100644 --- a/pallets/runtime/tests/src/asset_pallet/asset_ownership_transfer.rs +++ b/pallets/runtime/tests/src/asset_pallet/asset_ownership_transfer.rs @@ -1,5 +1,5 @@ use frame_support::assert_ok; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use pallet_asset::SecurityTokensOwnedByUser; use pallet_external_agents::GroupOfAgent; @@ -13,9 +13,9 @@ use crate::storage::{TestStorage, User}; #[test] fn transfer_token_ownership_agents_check() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&alice); diff --git a/pallets/runtime/tests/src/asset_pallet/base_transfer.rs b/pallets/runtime/tests/src/asset_pallet/base_transfer.rs index 126455df28..a15f399721 100644 --- a/pallets/runtime/tests/src/asset_pallet/base_transfer.rs +++ b/pallets/runtime/tests/src/asset_pallet/base_transfer.rs @@ -1,5 +1,5 @@ use frame_support::{assert_noop, assert_ok}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use pallet_asset::{AssetBalance, BalanceOf}; use pallet_portfolio::PortfolioAssetBalances; @@ -27,8 +27,8 @@ type System = frame_system::Pallet; #[test] fn base_transfer() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId::new(alice.did, PortfolioKind::Default); let bob_user_portfolio = PortfolioId::new(bob.did, PortfolioKind::User(PortfolioNumber(1))); @@ -75,8 +75,8 @@ fn base_transfer() { #[test] fn base_transfer_invalid_token_type() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let bob_default_portfolio = PortfolioId { did: bob.did, kind: PortfolioKind::Default, @@ -107,8 +107,8 @@ fn base_transfer_invalid_token_type() { #[test] fn base_transfer_invalid_granularity() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let bob_default_portfolio = PortfolioId { did: bob.did, kind: PortfolioKind::Default, @@ -155,8 +155,8 @@ fn base_transfer_invalid_granularity() { #[test] fn base_transfer_insufficient_balance() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let bob_default_portfolio = PortfolioId { did: bob.did, kind: PortfolioKind::Default, @@ -195,8 +195,8 @@ fn base_transfer_insufficient_balance() { #[test] fn base_transfer_locked_asset() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let bob_default_portfolio = PortfolioId { did: bob.did, kind: PortfolioKind::Default, @@ -249,8 +249,8 @@ fn base_transfer_locked_asset() { #[test] fn base_transfer_invalid_portfolio() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId { did: alice.did, kind: PortfolioKind::Default, @@ -281,9 +281,9 @@ fn base_transfer_invalid_portfolio() { #[test] fn base_transfer_invalid_compliance() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); - let dave: User = User::new(AccountKeyring::Dave); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let dave: User = User::new(Sr25519Keyring::Dave); let alice_default_portfolio = PortfolioId { did: alice.did, kind: PortfolioKind::Default, @@ -333,8 +333,8 @@ fn base_transfer_invalid_compliance() { #[test] fn base_transfer_frozen_asset() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId { did: alice.did, kind: PortfolioKind::Default, @@ -370,8 +370,8 @@ fn base_transfer_frozen_asset() { #[test] fn base_acc_transfer() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let alice_acc_portfolio = PortfolioId::new(alice.did, PortfolioKind::AccountId(alice.acc())); let bob_acc_portfolio = PortfolioId::new(bob.did, PortfolioKind::AccountId(bob.acc())); diff --git a/pallets/runtime/tests/src/asset_pallet/controller_transfer.rs b/pallets/runtime/tests/src/asset_pallet/controller_transfer.rs index 18d1896a64..0dfcbba9b1 100644 --- a/pallets/runtime/tests/src/asset_pallet/controller_transfer.rs +++ b/pallets/runtime/tests/src/asset_pallet/controller_transfer.rs @@ -1,5 +1,5 @@ use frame_support::{assert_noop, assert_ok}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use polymesh_primitives::agent::AgentGroup; use polymesh_primitives::settlement::{ @@ -24,8 +24,8 @@ type System = frame_system::Pallet; #[test] fn controller_transfer_locked_asset() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let bob_default_portfolio = PortfolioId { did: bob.did, kind: PortfolioKind::Default, diff --git a/pallets/runtime/tests/src/asset_pallet/issue.rs b/pallets/runtime/tests/src/asset_pallet/issue.rs index ee21027d47..21063ce645 100644 --- a/pallets/runtime/tests/src/asset_pallet/issue.rs +++ b/pallets/runtime/tests/src/asset_pallet/issue.rs @@ -1,5 +1,5 @@ use frame_support::{assert_noop, assert_ok}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use pallet_asset::{AssetBalance, Assets, BalanceOf, LockedBalance}; use pallet_portfolio::{PortfolioAssetBalances, PortfolioAssetCount, PortfolioLockedAssets}; @@ -23,7 +23,7 @@ type Settlement = pallet_settlement::Pallet; #[test] fn issue_tokens_default_portfolio() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId::new(alice.did, PortfolioKind::Default); let asset_id = create_and_issue_sample_asset(&alice); @@ -53,7 +53,7 @@ fn issue_tokens_default_portfolio() { #[test] fn issue_tokens_user_portfolio() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_user_portfolio = PortfolioId { did: alice.did, kind: PortfolioKind::User(PortfolioNumber(1)), @@ -102,7 +102,7 @@ fn issue_tokens_user_portfolio() { #[test] fn issue_tokens_invalid_portfolio() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_user_portfolio = PortfolioKind::User(PortfolioNumber(1)); let asset_id = Asset::generate_asset_id(alice.acc(), false); @@ -125,8 +125,8 @@ fn issue_tokens_invalid_portfolio() { #[test] fn issue_tokens_assigned_custody() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let portfolio_kind = PortfolioKind::User(PortfolioNumber(1)); let portfolio_id = PortfolioId::new(alice.did, portfolio_kind.clone()); @@ -177,7 +177,7 @@ fn issue_tokens_assigned_custody() { #[test] fn issue_tokens_no_asset() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); assert_noop!( Asset::issue( alice.origin(), @@ -193,8 +193,8 @@ fn issue_tokens_no_asset() { #[test] fn issue_tokens_no_auth() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(alice.acc(), false); assert_ok!(Asset::create_asset( @@ -215,7 +215,7 @@ fn issue_tokens_no_auth() { #[test] fn issue_tokens_not_granular() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(alice.acc(), false); assert_ok!(Asset::create_asset( @@ -236,7 +236,7 @@ fn issue_tokens_not_granular() { #[test] fn issue_tokens_invalid_token_type() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(alice.acc(), false); assert_ok!(Asset::create_asset( @@ -258,7 +258,7 @@ fn issue_tokens_invalid_token_type() { #[test] fn issue_tokens_account_portfolio() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_portfolio_kind = PortfolioKind::AccountId(alice.acc()); let alice_acc_portfolio = PortfolioId::new(alice.did, alice_portfolio_kind); diff --git a/pallets/runtime/tests/src/asset_pallet/link_ticker_to_asset.rs b/pallets/runtime/tests/src/asset_pallet/link_ticker_to_asset.rs index dabaf6a04c..97a338a5c2 100644 --- a/pallets/runtime/tests/src/asset_pallet/link_ticker_to_asset.rs +++ b/pallets/runtime/tests/src/asset_pallet/link_ticker_to_asset.rs @@ -1,5 +1,5 @@ use frame_support::{assert_noop, assert_ok}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use pallet_asset::{AssetIdTicker, TickerAssetId}; use polymesh_primitives::Ticker; @@ -15,7 +15,7 @@ type ExternalAgentsError = pallet_external_agents::Error; #[test] fn link_ticker_to_asset_id_successfully() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(alice.acc(), false); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); @@ -44,8 +44,8 @@ fn link_ticker_to_asset_id_successfully() { #[test] fn link_ticker_to_asset_id_ticker_not_registered_to_caller() { ExtBuilder::default().build().execute_with(|| { - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(dave.acc(), false); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); @@ -70,8 +70,8 @@ fn link_ticker_to_asset_id_ticker_not_registered_to_caller() { #[test] fn link_ticker_to_asset_id_ticker_unauthorized_agent() { ExtBuilder::default().build().execute_with(|| { - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(dave.acc(), false); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); @@ -96,7 +96,7 @@ fn link_ticker_to_asset_id_ticker_unauthorized_agent() { #[test] fn link_ticker_to_asset_id_expired_ticker() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(alice.acc(), false); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); @@ -122,7 +122,7 @@ fn link_ticker_to_asset_id_expired_ticker() { #[test] fn link_ticker_to_asset_id_ticker_already_linked() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); assert_ok!(Asset::register_unique_ticker(alice.origin(), ticker,)); @@ -163,7 +163,7 @@ fn link_ticker_to_asset_id_ticker_already_linked() { #[test] fn link_ticker_to_asset_asset_already_linked() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(alice.acc(), false); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); let ticker_1: Ticker = Ticker::from_slice_truncated(b"TICKER1"); @@ -196,7 +196,7 @@ fn link_ticker_to_asset_asset_already_linked() { #[test] fn link_ticker_to_asset_id_after_unlink() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(alice.acc(), false); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); let ticker_1: Ticker = Ticker::from_slice_truncated(b"TICKER1"); diff --git a/pallets/runtime/tests/src/asset_pallet/register_metadata.rs b/pallets/runtime/tests/src/asset_pallet/register_metadata.rs index 65bc49f3e8..c45036378b 100644 --- a/pallets/runtime/tests/src/asset_pallet/register_metadata.rs +++ b/pallets/runtime/tests/src/asset_pallet/register_metadata.rs @@ -1,5 +1,5 @@ use frame_support::assert_ok; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use pallet_asset::{ AssetMetadataGlobalKeyToName, AssetMetadataGlobalNameToKey, AssetMetadataGlobalSpecs, @@ -63,7 +63,7 @@ fn register_multiple_global_metadata() { #[test] fn register_multiple_local_metadata() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&alice); diff --git a/pallets/runtime/tests/src/asset_pallet/register_ticker.rs b/pallets/runtime/tests/src/asset_pallet/register_ticker.rs index 7899ba20c9..90a2c88db9 100644 --- a/pallets/runtime/tests/src/asset_pallet/register_ticker.rs +++ b/pallets/runtime/tests/src/asset_pallet/register_ticker.rs @@ -1,6 +1,6 @@ use frame_support::{assert_noop, assert_ok}; use rand::Rng; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use sp_std::collections::btree_set::BTreeSet; use pallet_asset::{ @@ -32,7 +32,7 @@ fn verify_ticker_characters() { // Generates 10 random valid tickers for _ in 0..10 { let valid_ticker: Vec = (0..TICKER_LEN + 1) - .map(|_| all_valid_characters[rng.gen_range(0, all_valid_characters.len())]) + .map(|_| all_valid_characters[rng.gen_range(0..all_valid_characters.len())]) .collect(); assert_ok!(Asset::verify_ticker_characters( &Ticker::from_slice_truncated(&valid_ticker) @@ -46,10 +46,9 @@ fn verify_ticker_characters() { // Generates 10 random invalid tickers for _ in 0..10 { let mut invalid_ticker: Vec = (0..TICKER_LEN - 1) - .map(|_| all_valid_characters[rng.gen_range(0, all_valid_characters.len())]) + .map(|_| all_valid_characters[rng.gen_range(0..all_valid_characters.len())]) .collect(); - invalid_ticker.push(all_invalid_characters[rng.gen_range(0, all_invalid_characters.len())]); - + invalid_ticker.push(all_invalid_characters[rng.gen_range(0..all_invalid_characters.len())]); assert_eq!( Asset::verify_ticker_characters(&Ticker::from_slice_truncated(&invalid_ticker)) .unwrap_err(), @@ -73,7 +72,7 @@ fn verify_ticker_characters() { fn register_ticker() { ExtBuilder::default().build().execute_with(|| { let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); assert_ok!(Asset::register_unique_ticker(alice.origin(), ticker,)); @@ -98,7 +97,7 @@ fn register_ticker() { fn register_ticker_invalid_ticker_character() { ExtBuilder::default().build().execute_with(|| { let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER+"); - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); assert_noop!( Asset::register_unique_ticker(alice.origin(), ticker,), @@ -111,7 +110,7 @@ fn register_ticker_invalid_ticker_character() { fn register_ticker_already_linked() { ExtBuilder::default().build().execute_with(|| { let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(alice.acc(), false); assert_ok!(Asset::register_unique_ticker(alice.origin(), ticker,)); @@ -144,7 +143,7 @@ fn register_ticker_too_long() { let max_ticker_len = TickerConfig::::get().max_ticker_length; let ticker_bytes: Vec = (65..65 + max_ticker_len + 1).collect(); let ticker: Ticker = Ticker::from_slice_truncated(&ticker_bytes); - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); assert_noop!( Asset::register_unique_ticker(alice.origin(), ticker,), @@ -157,8 +156,8 @@ fn register_ticker_too_long() { fn register_ticker_already_registered() { ExtBuilder::default().build().execute_with(|| { let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER00"); - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); assert_ok!(Asset::register_unique_ticker(alice.origin(), ticker,)); assert_noop!( @@ -172,8 +171,8 @@ fn register_ticker_already_registered() { fn register_already_expired_ticker() { ExtBuilder::default().build().execute_with(|| { let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER00"); - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); assert_ok!(Asset::register_unique_ticker(alice.origin(), ticker,)); set_timestamp(now() + 10001); @@ -200,7 +199,7 @@ fn register_already_expired_ticker() { fn register_ticker_renewal() { ExtBuilder::default().build().execute_with(|| { let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER00"); - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); assert_ok!(Asset::register_unique_ticker(alice.origin(), ticker,)); let ticker_registration = UniqueTickerRegistration::::get(&ticker).unwrap(); diff --git a/pallets/runtime/tests/src/asset_pallet/unlink_ticker_from_asset.rs b/pallets/runtime/tests/src/asset_pallet/unlink_ticker_from_asset.rs index 063e142356..25cd552765 100644 --- a/pallets/runtime/tests/src/asset_pallet/unlink_ticker_from_asset.rs +++ b/pallets/runtime/tests/src/asset_pallet/unlink_ticker_from_asset.rs @@ -1,5 +1,5 @@ use frame_support::{assert_noop, assert_ok}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use pallet_asset::{AssetIdTicker, TickerAssetId, TickersOwnedByUser, UniqueTickerRegistration}; use polymesh_primitives::agent::AgentGroup; @@ -17,7 +17,7 @@ type Identity = pallet_identity::Pallet; #[test] fn unlink_ticker_from_asset_id_successfully() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(alice.acc(), false); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); @@ -57,8 +57,8 @@ fn unlink_ticker_from_asset_id_successfully() { #[test] fn unlink_ticker_from_asset_id_unauthorized_agent() { ExtBuilder::default().build().execute_with(|| { - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(alice.acc(), false); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); @@ -89,7 +89,7 @@ fn unlink_ticker_from_asset_id_unauthorized_agent() { #[test] fn unlink_ticker_from_asset_id_ticker_registration_not_found() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(alice.acc(), false); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); let ticker_1: Ticker = Ticker::from_slice_truncated(b"TICKER1"); @@ -121,8 +121,8 @@ fn unlink_ticker_from_asset_id_ticker_registration_not_found() { #[test] fn unlink_ticker_from_asset_id_ticker_not_registered_to_caller() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(alice.acc(), false); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); @@ -162,7 +162,7 @@ fn unlink_ticker_from_asset_id_ticker_not_registered_to_caller() { #[test] fn unlink_ticker_from_asset_id_ticker_not_linked() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = Asset::generate_asset_id(alice.acc(), false); let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER"); let ticker_1: Ticker = Ticker::from_slice_truncated(b"TICKER1"); diff --git a/pallets/runtime/tests/src/asset_test.rs b/pallets/runtime/tests/src/asset_test.rs index 31067bdf72..a2ac82e62d 100644 --- a/pallets/runtime/tests/src/asset_test.rs +++ b/pallets/runtime/tests/src/asset_test.rs @@ -1,8 +1,8 @@ use chrono::prelude::Utc; -use frame_support::dispatch::{DispatchError, DispatchResult}; +use frame_support::dispatch::DispatchResult; +use frame_support::pallet_prelude::DispatchError; +use frame_support::traits::UnixTime; use frame_support::{assert_noop, assert_ok}; -use hex_literal::hex; -use ink_primitives::hash as FunctionSelectorHasher; use rand::Rng; use sp_consensus_babe::Slot; use sp_runtime::AnySignature; @@ -49,7 +49,7 @@ use polymesh_primitives::{ FundDescription, IdentityId, Memo, Moment, NFTCollectionKeys, Permissions, PortfolioId, PortfolioKind, PortfolioName, PortfolioNumber, Signatory, Ticker, WeightMeter, }; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use crate::asset_pallet::setup::{ create_and_issue_sample_asset, create_and_issue_sample_asset_linked_to_ticker, create_asset, @@ -75,7 +75,7 @@ type OffChainSignature = AnySignature; type Origin = ::RuntimeOrigin; type DidRecords = pallet_identity::DidRecords; type Statistics = pallet_statistics::Pallet; -type AssetGenesis = pallet_asset::GenesisConfig; +type AssetGenesis = pallet_asset::GenesisConfig; type System = frame_system::Pallet; type ExternalAgents = pallet_external_agents::Pallet; type EAError = pallet_external_agents::Error; @@ -205,23 +205,10 @@ pub fn check_schedules(asset_id: AssetId, schedules: &[(ScheduleId, ScheduleChec } } -#[test] -fn check_the_test_hex() { - ExtBuilder::default().build().execute_with(|| { - let selector: [u8; 4] = (FunctionSelectorHasher::keccak256("verify_transfer".as_bytes()) - [0..4]) - .try_into() - .unwrap(); - println!("{:#X}", u32::from_be_bytes(selector)); - let data = hex!("D9386E41"); - println!("{:?}", data); - }); -} - #[test] fn issuers_can_create_and_rename_tokens() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Dave); + let owner = User::new(Sr25519Keyring::Dave); let asset_id = Asset::generate_asset_id(owner.acc(), false); let funding_round_name: FundingRoundName = b"MyFundingRound".into(); let sample_security_token = sample_security_token(owner.did); @@ -258,7 +245,7 @@ fn issuers_can_create_and_rename_tokens() { ); // Unauthorized agents cannot rename the token. - let eve = User::new(AccountKeyring::Eve); + let eve = User::new(Sr25519Keyring::Eve); assert_noop!( Asset::rename_asset(eve.origin(), asset_id, vec![0xde, 0xad, 0xbe, 0xef].into()), EAError::UnauthorizedAgent @@ -276,8 +263,8 @@ fn issuers_can_create_and_rename_tokens() { #[test] fn valid_transfers_pass() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&owner); @@ -301,8 +288,8 @@ fn valid_transfers_pass() { #[test] fn issuers_can_redeem_tokens() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Dave); - let bob = User::new(AccountKeyring::Bob); + let owner = User::new(Sr25519Keyring::Dave); + let bob = User::new(Sr25519Keyring::Bob); let owner_portfolio_id = PortfolioId { did: owner.did, kind: PortfolioKind::Default, @@ -357,8 +344,8 @@ fn checkpoints_fuzz_test() { // When fuzzing in local, feel free to bump this number to add more fuzz runs. ExtBuilder::default().build().execute_with(|| { set_timestamp(now()); - let owner = User::new(AccountKeyring::Dave); - let bob = User::new(AccountKeyring::Bob); + let owner = User::new(Sr25519Keyring::Dave); + let bob = User::new(Sr25519Keyring::Bob); let asset_id = create_and_issue_sample_asset(&owner); @@ -366,7 +353,7 @@ fn checkpoints_fuzz_test() { let mut bob_balance: [u128; 100] = [0; 100]; let mut rng = rand::thread_rng(); for j in 1..100 { - let transfers = rng.gen_range(0, 10); + let transfers = rng.gen_range(0..10); owner_balance[j] = owner_balance[j - 1]; bob_balance[j] = bob_balance[j - 1]; for _k in 0..transfers { @@ -400,8 +387,8 @@ fn checkpoints_fuzz_test() { #[test] fn controller_transfer() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&owner); @@ -435,9 +422,9 @@ fn transfer_token_ownership() { ExtBuilder::default().build().execute_with(|| { set_timestamp(now()); - let owner = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let owner = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let ticker = Ticker::from_slice_truncated(b"MYTICKER"); let asset_id = create_and_issue_sample_asset_linked_to_ticker(&owner, ticker); @@ -548,7 +535,7 @@ fn transfer_token_ownership() { #[test] fn update_identifiers() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Dave); + let owner = User::new(Sr25519Keyring::Dave); // Create: A correct entry was added. let asset_ident = Some(vec![cusip()]); @@ -590,7 +577,7 @@ fn update_identifiers() { #[test] fn adding_removing_documents() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Dave); + let owner = User::new(Sr25519Keyring::Dave); let asset_id = create_and_issue_sample_asset(&owner); @@ -640,8 +627,8 @@ fn adding_removing_documents() { #[test] fn freeze_unfreeze_asset() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let owner = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let asset_id = create_and_issue_sample_asset(&owner); @@ -684,9 +671,9 @@ fn freeze_unfreeze_asset() { fn frozen_secondary_keys_create_asset_we() { ExtBuilder::default().build().execute_with(|| { // 0. Create identities. - let alice = User::new(AccountKeyring::Alice); - let bob = User::new_with(alice.did, AccountKeyring::Bob); - let _charlie_id = register_keyring_account(AccountKeyring::Charlie).unwrap(); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); + let _charlie_id = register_keyring_account(Sr25519Keyring::Charlie).unwrap(); // 1. Add Bob as signatory to Alice ID. add_secondary_key(alice.did, bob.acc()); @@ -727,10 +714,13 @@ fn next_checkpoint_is_updated_we() { }; let period_ms = period_secs * 1000; set_timestamp(start); - assert_eq!(start, ::UnixTime::now()); + assert_eq!( + start as u128, + ::UnixTime::now().as_millis() + ); - let owner = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let owner = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let asset_id = create_and_issue_sample_asset(&owner); @@ -796,10 +786,13 @@ fn non_recurring_schedule_works_we() { // Non-recuring schedule. let period = CalendarPeriod::default(); set_timestamp(start); - assert_eq!(start, ::UnixTime::now()); + assert_eq!( + start as u128, + ::UnixTime::now().as_millis() + ); - let owner = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let owner = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let asset_id = create_and_issue_sample_asset(&owner); @@ -848,8 +841,8 @@ fn schedule_remaining_works() { let start = 1_000; set_timestamp(start); - let owner = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let owner = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let asset_id = create_and_issue_sample_asset(&owner); @@ -941,7 +934,7 @@ fn schedule_remaining_works() { fn mesh_1531_ts_collission_regression_test() { ExtBuilder::default().build().execute_with(|| { // Create the assets. - let owner = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&owner); let asset_id2 = create_and_issue_sample_asset(&owner); @@ -963,14 +956,14 @@ fn mesh_1531_ts_collission_regression_test() { #[test] fn secondary_key_not_authorized_for_asset_test() { - let charlie = vec![AccountKeyring::Charlie.to_account_id()]; + let charlie = vec![Sr25519Keyring::Charlie.to_account_id()]; ExtBuilder::default() .cdd_providers(charlie) .build() .execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new_with(alice.did, AccountKeyring::Bob); - let eve = User::new_with(alice.did, AccountKeyring::Eve); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); + let eve = User::new_with(alice.did, Sr25519Keyring::Eve); let asset_id = create_and_issue_sample_asset(&alice); let eve_permissions = Permissions { asset: AssetPermissions::elems(vec![AssetId::new([0; 16])]), @@ -1018,7 +1011,7 @@ fn bytes_of_len>>(e: u8, len: usize) -> R { #[test] fn create_asset_errors() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let create = |name, is_divisible, funding_name| { Asset::create_asset( @@ -1069,7 +1062,7 @@ fn create_asset_errors() { #[test] fn asset_type_custom_too_long() { ExtBuilder::default().build().execute_with(|| { - let user = User::new(AccountKeyring::Alice); + let user = User::new(Sr25519Keyring::Alice); let case = |add| Asset::register_custom_asset_type(user.origin(), max_len_bytes(add)); assert_too_long!(case(1)); assert_ok!(case(0)); @@ -1079,7 +1072,7 @@ fn asset_type_custom_too_long() { #[test] fn asset_type_custom_works() { ExtBuilder::default().build().execute_with(|| { - let user = User::new(AccountKeyring::Alice); + let user = User::new(Sr25519Keyring::Alice); let register = |ty: &str| Asset::register_custom_asset_type(user.origin(), ty.into()); let seq_is = |num| { assert_eq!(CustomTypeIdSequence::::get().0, num); @@ -1124,7 +1117,7 @@ fn asset_type_custom_works() { #[test] fn invalid_custom_asset_type_check() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Dave); + let owner = User::new(Sr25519Keyring::Dave); assert_noop!( Asset::create_asset( @@ -1143,7 +1136,7 @@ fn invalid_custom_asset_type_check() { #[test] fn asset_doc_field_too_long() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&owner); let add_doc = |doc| Asset::add_documents(owner.origin(), vec![doc], asset_id); assert_too_long!(add_doc(Document { @@ -1169,10 +1162,10 @@ fn asset_doc_field_too_long() { #[track_caller] fn test_with_owner(test: impl FnOnce(User)) { - let owner = AccountKeyring::Alice; + let owner = Sr25519Keyring::Alice; ExtBuilder::default() .add_regular_users_from_accounts(&[owner.to_account_id()]) - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(|| test(User::existing(owner))); } @@ -1222,15 +1215,15 @@ fn update_identifiers_errors_test() { #[test] fn issuers_can_redeem_tokens_from_portfolio() { - let alice = AccountKeyring::Alice.to_account_id(); + let alice = Sr25519Keyring::Alice.to_account_id(); ExtBuilder::default() .cdd_providers(vec![alice.clone()]) .build() .execute_with(|| { set_timestamp(now()); - let owner = User::new(AccountKeyring::Dave); - let bob = User::new(AccountKeyring::Bob); + let owner = User::new(Sr25519Keyring::Dave); + let bob = User::new(Sr25519Keyring::Bob); // Create asset. let asset_id = create_and_issue_sample_asset(&owner); @@ -1368,8 +1361,8 @@ fn issuers_can_redeem_tokens_from_portfolio() { #[test] fn issuers_can_change_asset_type() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); // Create an asset let asset_id = create_and_issue_sample_asset(&owner); @@ -1405,7 +1398,7 @@ fn issuers_can_change_asset_type() { #[test] fn prevent_locking_an_empty_key() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&alice); let asset_metadata_name = AssetMetadataName(b"mylocalkey".to_vec()); let asset_metadata_spec = AssetMetadataSpec { @@ -1440,7 +1433,7 @@ fn prevent_locking_an_empty_key() { #[test] fn remove_local_metadata_key_missing_key() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&alice); let local_key = AssetMetadataLocalKey(1); assert_noop!( @@ -1454,7 +1447,7 @@ fn remove_local_metadata_key_missing_key() { #[test] fn remove_local_metadata_key_locked_value() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&alice); let asset_metadata_name = AssetMetadataName(b"mylocalkey".to_vec()); let asset_metadata_spec = AssetMetadataSpec { @@ -1497,7 +1490,7 @@ fn remove_local_metadata_key_locked_value() { #[test] fn remove_nft_collection_metada_key() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_metada_key = AssetMetadataKey::Local(AssetMetadataLocalKey(1)); let collection_keys: NFTCollectionKeys = vec![asset_metada_key.clone()].into(); let asset_id = create_nft_collection( @@ -1523,7 +1516,7 @@ fn remove_nft_collection_metada_key() { #[test] fn remove_local_metadata_key() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&alice); let asset_metadata_name = AssetMetadataName(b"mylocalkey".to_vec()); let asset_metadata_spec = AssetMetadataSpec { @@ -1573,7 +1566,7 @@ fn remove_local_metadata_key() { #[test] fn remove_local_metadata_value_missing_key() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&alice); assert_noop!( Asset::remove_metadata_value( @@ -1590,7 +1583,7 @@ fn remove_local_metadata_value_missing_key() { #[test] fn remove_local_metadata_value_locked_value() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&alice); let asset_metadata_name = AssetMetadataName(b"mylocalkey".to_vec()); let asset_metadata_spec = AssetMetadataSpec { @@ -1633,7 +1626,7 @@ fn remove_local_metadata_value_locked_value() { #[test] fn remove_metadata_value() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&alice); let asset_metadata_name = AssetMetadataName(b"mylocalkey".to_vec()); let asset_metadata_spec = AssetMetadataSpec { @@ -1683,7 +1676,7 @@ fn remove_metadata_value() { fn issue_token_unassigned_custody() { ExtBuilder::default().build().execute_with(|| { let issued_amount = ONE_UNIT; - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_user_portfolio = PortfolioKind::User(PortfolioNumber(1)); assert_ok!(Portfolio::create_portfolio( @@ -1716,7 +1709,7 @@ fn issue_token_unassigned_custody() { #[test] fn redeem_token_unassigned_custody() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&alice); assert_ok!(Asset::redeem( alice.origin(), @@ -1731,8 +1724,8 @@ fn redeem_token_unassigned_custody() { #[test] fn redeem_token_assigned_custody() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let portfolio_kind = PortfolioKind::User(PortfolioNumber(1)); let portfolio_id = PortfolioId::new(alice.did, portfolio_kind.clone()); @@ -1766,7 +1759,7 @@ fn redeem_token_assigned_custody() { fn pre_approve_asset() { ExtBuilder::default().build().execute_with(|| { let asset_id = AssetId::new([0; 16]); - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); Asset::pre_approve_asset(alice.origin(), asset_id).unwrap(); assert!(PreApprovedAsset::::get(alice.did, asset_id)); @@ -1779,7 +1772,7 @@ fn pre_approve_asset() { fn remove_asset_pre_approval() { ExtBuilder::default().build().execute_with(|| { let asset_id = AssetId::new([0; 16]); - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); Asset::pre_approve_asset(alice.origin(), asset_id).unwrap(); Asset::remove_asset_pre_approval(alice.origin(), asset_id).unwrap(); @@ -1793,7 +1786,7 @@ fn remove_asset_pre_approval() { fn unauthorized_custodian_ticker_exemption() { ExtBuilder::default().build().execute_with(|| { let asset_id = AssetId::new([0; 16]); - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); assert_noop!( Asset::exempt_asset_affirmation(alice.origin(), asset_id), @@ -1820,8 +1813,8 @@ fn unauthorized_custodian_ticker_exemption() { #[test] fn unauthorized_add_mandatory_mediators() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let max_mediators = ::MaxAssetMediators::get(); let mediators: BTreeSet = (0..max_mediators) .map(|i| IdentityId::from(i as u128)) @@ -1838,7 +1831,7 @@ fn unauthorized_add_mandatory_mediators() { #[test] fn successfully_add_mandatory_mediators() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let max_mediators = ::MaxAssetMediators::get(); let mediators: BTreeSet = (0..max_mediators) .map(|i| IdentityId::from(i as u128)) @@ -1864,7 +1857,7 @@ fn successfully_add_mandatory_mediators() { #[test] fn add_mandatory_mediators_exceed_limit() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let max_mediators = ::MaxAssetMediators::get(); let mediators: BTreeSet = (0..max_mediators) .map(|i| IdentityId::from(i as u128)) @@ -1892,8 +1885,8 @@ fn add_mandatory_mediators_exceed_limit() { #[test] fn unauthorized_remove_mediators() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let max_mediators = ::MaxAssetMediators::get(); let mediators: BTreeSet = (0..max_mediators) .map(|i| IdentityId::from(i as u128)) @@ -1914,7 +1907,7 @@ fn unauthorized_remove_mediators() { #[test] fn successfully_remove_mediators() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let max_mediators = ::MaxAssetMediators::get(); let mediators: BTreeSet = (0..max_mediators) .map(|i| IdentityId::from(i as u128)) @@ -1946,8 +1939,8 @@ fn successfully_remove_mediators() { #[test] fn controller_transfer_locked_asset() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let bob_default_portfolio = PortfolioId { did: bob.did, kind: PortfolioKind::Default, @@ -2007,7 +2000,7 @@ fn controller_transfer_locked_asset() { #[test] fn issue_tokens_user_portfolio() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_user_portfolio = PortfolioId { did: alice.did, kind: PortfolioKind::User(PortfolioNumber(1)), diff --git a/pallets/runtime/tests/src/balances_test.rs b/pallets/runtime/tests/src/balances_test.rs index 3ad412ff9f..13ddb62b43 100644 --- a/pallets/runtime/tests/src/balances_test.rs +++ b/pallets/runtime/tests/src/balances_test.rs @@ -1,21 +1,18 @@ -use super::{ - storage::{register_keyring_account, EventTest, TestStorage}, - ExtBuilder, -}; +use frame_support::assert_ok; +use frame_support::dispatch::DispatchInfo; +use frame_support::traits::Currency; +use frame_support::weights::Weight; +use sp_keyring::Sr25519Keyring; +use sp_runtime::traits::{TransactionExtension, TxBaseImplication}; +use sp_runtime::transaction_validity::TransactionSource; + use pallet_balances::{self as balances, Event as BalancesRawEvent}; use pallet_identity as identity; -use polymesh_runtime_develop::{runtime, Runtime}; +use polymesh_primitives::Memo; +use polymesh_transaction_payment::{ChargeTransactionPayment, Val}; -use frame_support::{ - assert_noop, assert_ok, - dispatch::{DispatchInfo, Weight}, - traits::Currency, -}; -use frame_system::{EventRecord, Phase}; -use pallet_transaction_payment::ChargeTransactionPayment; -use polymesh_primitives::{traits::BlockRewardsReserveCurrency, Memo}; -use sp_keyring::AccountKeyring; -use sp_runtime::traits::SignedExtension; +use super::storage::{RuntimeCall as StorageRuntimeCall, TestStorage}; +use super::ExtBuilder; pub type Balances = balances::Pallet; pub type System = frame_system::Pallet; @@ -26,7 +23,7 @@ type Error = balances::Error; /// create a transaction info struct from weight. Handy to avoid building the whole struct. pub fn info_from_weight(w: u64) -> DispatchInfo { DispatchInfo { - weight: Weight::from_ref_time(w), + call_weight: Weight::from_parts(w, 0), ..Default::default() } } @@ -40,33 +37,34 @@ fn signed_extension_charge_transaction_payment_work() { .monied(true) .build() .execute_with(|| { - let len = 10; - let alice_id = AccountKeyring::Alice.to_account_id(); - - let call = runtime::RuntimeCall::System(frame_system::Call::remark { remark: vec![] }); - - assert!( - as SignedExtension>::pre_dispatch( - ChargeTransactionPayment::from(0), - &alice_id, + let alice_acc = Sr25519Keyring::Alice.to_account_id(); + let charge_tx_payment = ChargeTransactionPayment::::from(0); + let call = StorageRuntimeCall::System(frame_system::Call::remark { remark: vec![] }); + + assert!(charge_tx_payment + .clone() + .prepare( + Val::NoCharge, + &Origin::signed(alice_acc.clone()), &call, &info_from_weight(5), - len + 10 ) - .is_ok() - ); - assert_eq!(Balances::free_balance(&alice_id), 100 - 20 - 25); - assert!( - as SignedExtension>::pre_dispatch( - ChargeTransactionPayment::from(0 /* 0 tip */), - &alice_id, + .is_ok()); + + assert_eq!(Balances::free_balance(&alice_acc), 100 - 20 - 25); + + assert!(charge_tx_payment + .prepare( + Val::NoCharge, + &Origin::signed(alice_acc.clone()), &call, &info_from_weight(3), - len + 10 ) - .is_ok() - ); - assert_eq!(Balances::free_balance(&alice_id), 100 - 20 - 25 - 20 - 15); + .is_ok()); + + assert_eq!(Balances::free_balance(&alice_acc), 100 - 20 - 25 - 20 - 15); }); } @@ -78,184 +76,33 @@ fn tipping_fails() { .monied(true) .build() .execute_with(|| { - let alice_id = AccountKeyring::Alice.to_account_id(); - let call = runtime::RuntimeCall::System(frame_system::Call::remark { remark: vec![] }); - let len = 10; - assert!( - as SignedExtension>::pre_dispatch( - ChargeTransactionPayment::from(5 /* 5 tip */), - &alice_id, - &call, + assert!(ChargeTransactionPayment::::from(5) + .validate( + Origin::signed(Sr25519Keyring::Alice.to_account_id()), + &StorageRuntimeCall::System(frame_system::Call::remark { remark: vec![] }), &info_from_weight(3), - len + 10, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, ) - .is_err() - ); - }); -} -#[test] -fn mint_subsidy_works() { - ExtBuilder::default() - .monied(true) - .cdd_providers(vec![AccountKeyring::Ferdie.to_account_id()]) - .build() - .execute_with(|| { - let brr = Balances::block_rewards_reserve(); - assert_eq!(Balances::free_balance(&brr), 0); - let alice = AccountKeyring::Alice.to_account_id(); - // Create Eve's identity for `Balances::deposit_block_reward_reserve_balance`. - let _ = register_keyring_account(AccountKeyring::Eve).unwrap(); - let mut balance_alice = Balances::free_balance(&alice); - let mut ti = Balances::total_issuance(); - - // When there is no balance in BRR, minting should increase total supply - assert_ok!(Balances::deposit_into_existing(&alice, 10).map(drop)); - assert_eq!(Balances::free_balance(&alice), balance_alice + 10); - assert_eq!(Balances::total_issuance(), ti + 10); - ti = ti + 10; - balance_alice = balance_alice + 10; - - // Funding BRR - let eve_signed = Origin::signed(AccountKeyring::Eve.to_account_id()); - assert_ok!(Balances::deposit_block_reward_reserve_balance( - eve_signed, 500, - )); - assert_eq!(Balances::free_balance(&brr), 500); - assert_eq!(Balances::total_issuance(), ti); - - // When BRR has enough funds to subsidize a mint fully, it should subsidize it. - assert_ok!(Balances::deposit_into_existing(&alice, 100).map(drop)); - assert_eq!(Balances::free_balance(&brr), 400); - assert_eq!(Balances::free_balance(&alice), balance_alice + 100); - assert_eq!(Balances::total_issuance(), ti); - balance_alice = balance_alice + 100; - - // When BRR has funds to subsidize a mint partially, it should subsidize it and rest should be minted. - assert_ok!(Balances::deposit_into_existing(&alice, 1000).map(drop)); - assert_eq!(Balances::free_balance(&brr), 0); - assert_eq!(Balances::free_balance(&alice), balance_alice + 1000); - // 400 subsidized, 600 minted. - assert_eq!(Balances::total_issuance(), ti + 600); - ti = ti + 600; - balance_alice = balance_alice + 1000; - - // When BRR has no funds to subsidize a mint, it should be fully minted. - assert_ok!(Balances::deposit_into_existing(&alice, 100).map(drop)); - assert_eq!(Balances::free_balance(&brr), 0); - assert_eq!(Balances::free_balance(&alice), balance_alice + 100); - assert_eq!(Balances::total_issuance(), ti + 100); - }); -} - -#[test] -fn issue_must_work() { - ExtBuilder::default() - .monied(true) - .cdd_providers(vec![AccountKeyring::Ferdie.to_account_id()]) - .build() - .execute_with(|| { - // Create Eve's identity for `Balances::deposit_block_reward_reserve_balance`. - let _ = register_keyring_account(AccountKeyring::Eve).unwrap(); - let init_total_issuance = Balances::total_issuance(); - let imbalance = Balances::burn(10); - assert_eq!(Balances::total_issuance(), init_total_issuance - 10); - drop(imbalance); - assert_eq!(Balances::total_issuance(), init_total_issuance); - - let brr = Balances::block_rewards_reserve(); - assert_eq!(Balances::free_balance(&brr), 0); - let mut ti = Balances::total_issuance(); - let _alice = AccountKeyring::Alice.to_account_id(); - - // When there is no balance in BRR, issuance should increase total supply - // NOTE: dropping negative imbalance is equivalent to burning. It will decrease total supply. - let imbalance = Balances::issue_using_block_rewards_reserve(10); - assert_eq!(Balances::total_issuance(), ti + 10); - drop(imbalance); - assert_eq!(Balances::total_issuance(), ti); - - // Funding BRR - let eve_signed = Origin::signed(AccountKeyring::Eve.to_account_id()); - assert_ok!(Balances::deposit_block_reward_reserve_balance( - eve_signed, 500, - )); - assert_eq!(Balances::free_balance(&brr), 500); - assert_eq!(Balances::total_issuance(), ti); - - // When BRR has enough funds to subsidize a mint fully, it should subsidize it. - let imbalance2 = Balances::issue_using_block_rewards_reserve(100); - assert_eq!(Balances::total_issuance(), ti); - assert_eq!(Balances::free_balance(&brr), 400); - drop(imbalance2); - assert_eq!(Balances::total_issuance(), ti - 100); - ti = ti - 100; - - // When BRR has funds to subsidize a mint partially, it should subsidize it and rest should be minted. - let imbalance3 = Balances::issue_using_block_rewards_reserve(1000); - assert_eq!(Balances::total_issuance(), ti + 600); - assert_eq!(Balances::free_balance(&brr), 0); - drop(imbalance3); - // NOTE: Since burned POLYX reduces total supply rather than increasing BRR balance, - // the new total supply is 1000 less after dropping. - assert_eq!(Balances::total_issuance(), ti - 400); - ti = ti - 400; - - // When BRR has no funds to subsidize a mint, it should be fully minted. - let imbalance4 = Balances::issue_using_block_rewards_reserve(100); - assert_eq!(Balances::total_issuance(), ti + 100); - drop(imbalance4); - assert_eq!(Balances::total_issuance(), ti); + .is_err()); }); } -#[test] -fn burn_account_balance_works() { - ExtBuilder::default().monied(true).build().execute_with(|| { - let alice_pub = AccountKeyring::Alice.to_account_id(); - let _ = register_keyring_account(AccountKeyring::Alice).unwrap(); - let total_issuance0 = Balances::total_issuance(); - let alice_free_balance0 = Balances::free_balance(&alice_pub); - let burn_amount = 100_000; - assert_ok!(Balances::burn_account_balance( - Origin::signed(alice_pub.clone()), - burn_amount - )); - let alice_free_balance1 = Balances::free_balance(&alice_pub); - assert_eq!(alice_free_balance1, alice_free_balance0 - burn_amount); - let total_issuance1 = Balances::total_issuance(); - assert_eq!(total_issuance1, total_issuance0 - burn_amount); - let fat_finger_burn_amount = std::u128::MAX; - assert_noop!( - Balances::burn_account_balance( - Origin::signed(alice_pub.clone()), - fat_finger_burn_amount - ), - Error::InsufficientBalance - ); - let alice_free_balance2 = Balances::free_balance(&alice_pub); - // None of Alice's free balance is burned. - assert_eq!(alice_free_balance2, alice_free_balance1); - let total_issuance2 = Balances::total_issuance(); - // The total issuance is unchanged either. - assert_eq!(total_issuance2, total_issuance1); - }); -} - #[test] fn transfer_with_memo() { ExtBuilder::default() .balance_factor(1_000) .monied(true) - .cdd_providers(vec![AccountKeyring::Ferdie.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Ferdie.to_account_id()]) .build() .execute_with(transfer_with_memo_we); } fn transfer_with_memo_we() { - let alice = AccountKeyring::Alice.to_account_id(); - let alice_id = register_keyring_account(AccountKeyring::Alice).unwrap(); - let bob = AccountKeyring::Bob.to_account_id(); - let bob_id = register_keyring_account(AccountKeyring::Bob).unwrap(); + let alice = Sr25519Keyring::Alice.to_account_id(); + let bob = Sr25519Keyring::Bob.to_account_id(); let memo_1 = Some(Memo([7u8; 32])); assert_ok!(Balances::transfer_with_memo( @@ -287,35 +134,40 @@ fn transfer_with_memo_we() { None )); - let expected_events = vec![ - EventRecord { - phase: Phase::Initialization, - event: EventTest::Balances(BalancesRawEvent::Transfer( - Some(alice_id), - alice.clone(), - Some(bob_id), - bob.clone(), - 200, - memo_2, - )), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: EventTest::Balances(BalancesRawEvent::Transfer( - Some(alice_id), - alice, - Some(bob_id), - bob, - 300, - None, - )), - topics: vec![], - }, - ]; - // Ignoring `frame_system` events - let system_events = System::events(); - expected_events.into_iter().for_each(|expected| { - assert!(system_events.contains(&expected)); - }); + //// Ignoring `frame_system` events + let mut system_events = System::events(); + assert_eq!( + system_events.pop().unwrap().event, + crate::storage::RuntimeEvent::Balances(BalancesRawEvent::TransferWithMemo { + from: Sr25519Keyring::Alice.to_account_id(), + to: Sr25519Keyring::Bob.to_account_id(), + amount: 300, + memo: None + }) + ); + assert_eq!( + system_events.pop().unwrap().event, + crate::storage::RuntimeEvent::Balances(BalancesRawEvent::Transfer { + from: Sr25519Keyring::Alice.to_account_id(), + to: Sr25519Keyring::Bob.to_account_id(), + amount: 300, + }) + ); + assert_eq!( + system_events.pop().unwrap().event, + crate::storage::RuntimeEvent::Balances(BalancesRawEvent::TransferWithMemo { + from: Sr25519Keyring::Alice.to_account_id(), + to: Sr25519Keyring::Bob.to_account_id(), + amount: 200, + memo: memo_2 + }) + ); + assert_eq!( + system_events.pop().unwrap().event, + crate::storage::RuntimeEvent::Balances(BalancesRawEvent::Transfer { + from: Sr25519Keyring::Alice.to_account_id(), + to: Sr25519Keyring::Bob.to_account_id(), + amount: 200, + }) + ); } diff --git a/pallets/runtime/tests/src/committee_test.rs b/pallets/runtime/tests/src/committee_test.rs index ae75187bd1..1e5180dbe0 100644 --- a/pallets/runtime/tests/src/committee_test.rs +++ b/pallets/runtime/tests/src/committee_test.rs @@ -1,27 +1,21 @@ -use super::{ - ext_builder::{ExtBuilder, COOL_OFF_PERIOD}, - storage::{ - fast_forward_blocks, get_identity_id, register_keyring_account, root, EventTest, - RuntimeCall, TestStorage, - }, -}; -use frame_support::{ - assert_noop, assert_ok, - dispatch::{DispatchError, DispatchResult}, -}; +use frame_support::pallet_prelude::DispatchError; +use frame_support::{assert_noop, assert_ok, dispatch::DispatchResult}; use frame_system::{EventRecord, Phase}; -use pallet_committee::{ - self as committee, Event as CommitteeRawEvent, Members, PolymeshVotes, Proposals, - ReleaseCoordinator, VoteThreshold, Voting, -}; +use sp_core::H256; +use sp_keyring::Sr25519Keyring; +use sp_runtime::traits::Hash; +use std::convert::TryFrom; + +use pallet_committee::{self as committee, Event as CommitteeRawEvent, Members}; +use pallet_committee::{PolymeshVotes, Proposals, ReleaseCoordinator, VoteThreshold, Voting}; use pallet_group as group; use pallet_identity as identity; use pallet_pips::{PipId, ProposalState, ProposalStates, SnapshotResult}; use polymesh_primitives::{IdentityId, MaybeBlock}; -use sp_core::H256; -use sp_keyring::AccountKeyring; -use sp_runtime::traits::Hash; -use std::convert::TryFrom; + +use super::ext_builder::{ExtBuilder, COOL_OFF_PERIOD}; +use super::storage::{fast_forward_blocks, get_identity_id, register_keyring_account}; +use super::storage::{root, EventTest, RuntimeCall, TestStorage}; type Committee = committee::Pallet; type CommitteeGroup = group::Pallet; @@ -33,8 +27,8 @@ type Origin = ::RuntimeOrigin; #[test] fn motions_basic_environment_works() { let committee = [ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), ] .to_vec(); ExtBuilder::default() @@ -44,7 +38,7 @@ fn motions_basic_environment_works() { } fn motions_basic_environment_works_we() { - let mut committee = [AccountKeyring::Alice, AccountKeyring::Bob] + let mut committee = [Sr25519Keyring::Alice, Sr25519Keyring::Bob] .iter() .map(|key| get_identity_id(*key).unwrap()) .collect::>(); @@ -93,7 +87,7 @@ fn abdicate_membership(who: IdentityId, signer: &Origin, n: u32) { assert_mem_len(n - 1); } -fn prepare_proposal(ring: AccountKeyring) { +fn prepare_proposal(ring: Sr25519Keyring) { let proposal = make_proposal(42); let acc = ring.to_account_id(); assert_ok!(Pips::propose( @@ -142,7 +136,7 @@ fn single_member_committee_works() { fn single_member_committee_works_we() { System::set_block_number(1); - let alice_ring = AccountKeyring::Alice; + let alice_ring = Sr25519Keyring::Alice; let alice_signer = Origin::signed(alice_ring.to_account_id()); let alice_did = register_keyring_account(alice_ring).unwrap(); @@ -181,7 +175,7 @@ fn preventing_motions_from_non_members_works() { fn preventing_motions_from_non_members_works_we() { System::set_block_number(1); - let alice_ring = AccountKeyring::Alice; + let alice_ring = Sr25519Keyring::Alice; let alice_signer = Origin::signed(alice_ring.to_account_id()); let _ = register_keyring_account(alice_ring).unwrap(); @@ -210,11 +204,11 @@ fn preventing_voting_from_non_members_works() { fn preventing_voting_from_non_members_works_we() { System::set_block_number(1); - let alice_ring = AccountKeyring::Alice; + let alice_ring = Sr25519Keyring::Alice; let alice_signer = Origin::signed(alice_ring.to_account_id()); let alice_did = register_keyring_account(alice_ring).unwrap(); - let bob_signer = Origin::signed(AccountKeyring::Bob.to_account_id()); - let _ = register_keyring_account(AccountKeyring::Bob).unwrap(); + let bob_signer = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let _ = register_keyring_account(Sr25519Keyring::Bob).unwrap(); set_members(vec![alice_did]); prepare_proposal(alice_ring); @@ -239,13 +233,13 @@ fn motions_revoting_works() { fn motions_revoting_works_we() { System::set_block_number(1); - let alice_ring = AccountKeyring::Alice; + let alice_ring = Sr25519Keyring::Alice; let alice_signer = Origin::signed(alice_ring.to_account_id()); let alice_did = register_keyring_account(alice_ring).unwrap(); - let _bob_signer = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_did = register_keyring_account(AccountKeyring::Bob).unwrap(); - let _charlie_signer = Origin::signed(AccountKeyring::Charlie.to_account_id()); - let charlie_did = register_keyring_account(AccountKeyring::Charlie).unwrap(); + let _bob_signer = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_did = register_keyring_account(Sr25519Keyring::Bob).unwrap(); + let _charlie_signer = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); + let charlie_did = register_keyring_account(Sr25519Keyring::Charlie).unwrap(); set_members(vec![alice_did, bob_did, charlie_did]); prepare_proposal(alice_ring); @@ -295,10 +289,10 @@ fn first_vote_cannot_be_reject() { fn first_vote_cannot_be_reject_we() { System::set_block_number(1); - let alice_ring = AccountKeyring::Alice; + let alice_ring = Sr25519Keyring::Alice; let alice_did = register_keyring_account(alice_ring).unwrap(); - let bob_did = register_keyring_account(AccountKeyring::Bob).unwrap(); - let charlie_did = register_keyring_account(AccountKeyring::Charlie).unwrap(); + let bob_did = register_keyring_account(Sr25519Keyring::Bob).unwrap(); + let charlie_did = register_keyring_account(Sr25519Keyring::Charlie).unwrap(); set_members(vec![alice_did, bob_did, charlie_did]); prepare_proposal(alice_ring); @@ -326,10 +320,10 @@ pub fn gc_vmo() -> Origin { } fn changing_vote_threshold_works_we() { - let alice_signer = Origin::signed(AccountKeyring::Alice.to_account_id()); - let alice_did = register_keyring_account(AccountKeyring::Alice).unwrap(); - let bob_signer = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_did = register_keyring_account(AccountKeyring::Bob).unwrap(); + let alice_signer = Origin::signed(Sr25519Keyring::Alice.to_account_id()); + let alice_did = register_keyring_account(Sr25519Keyring::Alice).unwrap(); + let bob_signer = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_did = register_keyring_account(Sr25519Keyring::Bob).unwrap(); set_members(vec![alice_did, bob_did]); assert_eq!( @@ -367,16 +361,16 @@ fn rage_quit() { fn rage_quit_we() { // 1. Add members to committee - let alice_ring = AccountKeyring::Alice; + let alice_ring = Sr25519Keyring::Alice; let alice_signer = Origin::signed(alice_ring.to_account_id()); - let alice_did = register_keyring_account(AccountKeyring::Alice).unwrap(); - let bob_signer = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_did = register_keyring_account(AccountKeyring::Bob).unwrap(); - let charlie_signer = Origin::signed(AccountKeyring::Charlie.to_account_id()); - let charlie_did = register_keyring_account(AccountKeyring::Charlie).unwrap(); - let dave_did = register_keyring_account(AccountKeyring::Dave).unwrap(); - let ferdie_signer = Origin::signed(AccountKeyring::Ferdie.to_account_id()); - let ferdie_did = register_keyring_account(AccountKeyring::Ferdie).unwrap(); + let alice_did = register_keyring_account(Sr25519Keyring::Alice).unwrap(); + let bob_signer = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_did = register_keyring_account(Sr25519Keyring::Bob).unwrap(); + let charlie_signer = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); + let charlie_did = register_keyring_account(Sr25519Keyring::Charlie).unwrap(); + let dave_did = register_keyring_account(Sr25519Keyring::Dave).unwrap(); + let ferdie_signer = Origin::signed(Sr25519Keyring::Ferdie.to_account_id()); + let ferdie_did = register_keyring_account(Sr25519Keyring::Ferdie).unwrap(); set_members(vec![alice_did, bob_did, charlie_did, dave_did]); assert_mem_len(4); @@ -487,8 +481,8 @@ fn rage_quit_we() { #[test] fn release_coordinator() { let committee = [ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), ] .to_vec(); ExtBuilder::default() @@ -499,11 +493,11 @@ fn release_coordinator() { } fn release_coordinator_we() { - let alice = Origin::signed(AccountKeyring::Alice.to_account_id()); - let alice_id = get_identity_id(AccountKeyring::Alice).expect("Alice is part of the committee"); - let bob = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_id = get_identity_id(AccountKeyring::Bob).expect("Bob is part of the committee"); - let charlie_id = register_keyring_account(AccountKeyring::Charlie).unwrap(); + let alice = Origin::signed(Sr25519Keyring::Alice.to_account_id()); + let alice_id = get_identity_id(Sr25519Keyring::Alice).expect("Alice is part of the committee"); + let bob = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_id = get_identity_id(Sr25519Keyring::Bob).expect("Bob is part of the committee"); + let charlie_id = register_keyring_account(Sr25519Keyring::Charlie).unwrap(); assert_eq!( ReleaseCoordinator::::get(), @@ -543,8 +537,8 @@ fn release_coordinator_we() { #[test] fn release_coordinator_majority() { let committee = [ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), ] .to_vec(); ExtBuilder::default() @@ -555,9 +549,9 @@ fn release_coordinator_majority() { } fn release_coordinator_majority_we() { - let alice = Origin::signed(AccountKeyring::Alice.to_account_id()); - let bob = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_id = get_identity_id(AccountKeyring::Bob).expect("Bob is part of the committee"); + let alice = Origin::signed(Sr25519Keyring::Alice.to_account_id()); + let bob = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_id = get_identity_id(Sr25519Keyring::Bob).expect("Bob is part of the committee"); assert_eq!( ReleaseCoordinator::::get(), @@ -594,9 +588,9 @@ fn release_coordinator_majority_we() { #[test] fn enact() { let committee = vec![ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id(), - AccountKeyring::Charlie.to_account_id(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), + Sr25519Keyring::Charlie.to_account_id(), ]; ExtBuilder::default() .governance_committee(committee) @@ -607,13 +601,13 @@ fn enact() { fn enact_we() { System::set_block_number(1); - let alice = AccountKeyring::Alice; + let alice = Sr25519Keyring::Alice; let alice_signer = Origin::signed(alice.to_account_id()); let _ = register_keyring_account(alice); - let bob = AccountKeyring::Bob.to_account_id(); - let _ = register_keyring_account(AccountKeyring::Bob); - let dave = AccountKeyring::Dave.to_account_id(); - let _ = register_keyring_account(AccountKeyring::Dave); + let bob = Sr25519Keyring::Bob.to_account_id(); + let _ = register_keyring_account(Sr25519Keyring::Bob); + let dave = Sr25519Keyring::Dave.to_account_id(); + let _ = register_keyring_account(Sr25519Keyring::Dave); // 1. Create the PIP. prepare_proposal(alice); @@ -638,10 +632,10 @@ fn mesh_1065_regression_test() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let alice_did = register_keyring_account(AccountKeyring::Alice).unwrap(); - let bob_signer = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_did = register_keyring_account(AccountKeyring::Bob).unwrap(); - let charlie_did = register_keyring_account(AccountKeyring::Charlie).unwrap(); + let alice_did = register_keyring_account(Sr25519Keyring::Alice).unwrap(); + let bob_signer = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_did = register_keyring_account(Sr25519Keyring::Bob).unwrap(); + let charlie_did = register_keyring_account(Sr25519Keyring::Charlie).unwrap(); set_members(vec![alice_did, bob_did, charlie_did]); assert_mem_len(3); @@ -684,13 +678,13 @@ fn expiry_works() { assert_ok!(Committee::set_expires_after(gc_vmo(), MaybeBlock::Some(13))); - let alice_ring = AccountKeyring::Alice; + let alice_ring = Sr25519Keyring::Alice; let alice_signer = Origin::signed(alice_ring.to_account_id()); let alice_did = register_keyring_account(alice_ring).unwrap(); - let _bob_signer = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_did = register_keyring_account(AccountKeyring::Bob).unwrap(); - let _charlie_signer = Origin::signed(AccountKeyring::Charlie.to_account_id()); - let charlie_did = register_keyring_account(AccountKeyring::Charlie).unwrap(); + let _bob_signer = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_did = register_keyring_account(Sr25519Keyring::Bob).unwrap(); + let _charlie_signer = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); + let charlie_did = register_keyring_account(Sr25519Keyring::Charlie).unwrap(); set_members(vec![alice_did, bob_did, charlie_did]); prepare_proposal(alice_ring); diff --git a/pallets/runtime/tests/src/compliance_manager_test.rs b/pallets/runtime/tests/src/compliance_manager_test.rs index c72d0c5ae0..aec8b9731b 100644 --- a/pallets/runtime/tests/src/compliance_manager_test.rs +++ b/pallets/runtime/tests/src/compliance_manager_test.rs @@ -12,7 +12,7 @@ use polymesh_primitives::{ CountryCode, IdentityId, PortfolioId, Scope, Signatory, TargetIdentity, TrustedFor, WeightMeter, }; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use crate::asset_pallet::setup::ISSUE_AMOUNT; @@ -86,9 +86,9 @@ fn should_add_and_verify_compliance_requirement() { fn should_add_and_verify_compliance_requirement_we() { // 0. Create accounts let root = Origin::from(frame_system::RawOrigin::Root); - let owner = User::new(AccountKeyring::Alice); - let token_rec = User::new(AccountKeyring::Charlie); - let cdd = User::new(AccountKeyring::Eve); + let owner = User::new(Sr25519Keyring::Alice); + let token_rec = User::new(Sr25519Keyring::Charlie); + let cdd = User::new(Sr25519Keyring::Eve); assert_ok!(CDDGroup::reset_members(root, vec![cdd.did])); // Create & mint token @@ -96,9 +96,9 @@ fn should_add_and_verify_compliance_requirement_we() { Balances::make_free_balance_be(&owner.acc(), 1_000_000); - let claim_issuer = User::new(AccountKeyring::Bob); + let claim_issuer = User::new(Sr25519Keyring::Bob); Balances::make_free_balance_be(&claim_issuer.acc(), 1_000_000); - let ferdie = User::new(AccountKeyring::Ferdie); + let ferdie = User::new(Sr25519Keyring::Ferdie); let claim = Claim::Blocked(asset_id.into()); assert_ok!(Identity::add_claim( @@ -430,7 +430,7 @@ fn should_replace_asset_compliance() { } fn should_replace_asset_compliance_we() { - let owner = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Alice); // Create & mint token let asset_id = create_and_issue_sample_asset(&owner); @@ -473,7 +473,7 @@ fn test_dedup_replace_asset_compliance() { } fn test_dedup_replace_asset_compliance_we() { - let owner = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Alice); // Create & mint token let asset_id = create_and_issue_sample_asset(&owner); @@ -521,7 +521,7 @@ fn should_reset_asset_compliance() { } fn should_reset_asset_compliance_we() { - let owner = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Alice); // Create & mint token let asset_id = create_and_issue_sample_asset(&owner); @@ -546,15 +546,15 @@ fn should_reset_asset_compliance_we() { #[test] fn pause_resume_asset_compliance() { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(pause_resume_asset_compliance_we); } fn pause_resume_asset_compliance_we() { // 0. Create accounts - let owner = User::new(AccountKeyring::Alice); - let receiver = User::new(AccountKeyring::Charlie); + let owner = User::new(Sr25519Keyring::Alice); + let receiver = User::new(Sr25519Keyring::Charlie); // 1. Create & mint token let asset_id = create_and_issue_sample_asset(&owner); @@ -614,11 +614,11 @@ fn should_successfully_add_and_use_default_issuers() { fn should_successfully_add_and_use_default_issuers_we() { // 0. Create accounts let root = Origin::from(frame_system::RawOrigin::Root); - let owner = User::new(AccountKeyring::Alice); - let trusted_issuer = User::new(AccountKeyring::Charlie); - let receiver = User::new(AccountKeyring::Dave); - let eve = User::new(AccountKeyring::Eve); - let ferdie = User::new(AccountKeyring::Ferdie); + let owner = User::new(Sr25519Keyring::Alice); + let trusted_issuer = User::new(Sr25519Keyring::Charlie); + let receiver = User::new(Sr25519Keyring::Dave); + let eve = User::new(Sr25519Keyring::Eve); + let ferdie = User::new(Sr25519Keyring::Ferdie); assert_ok!(CDDGroup::reset_members(root, vec![trusted_issuer.did])); @@ -732,10 +732,10 @@ fn should_modify_vector_of_trusted_issuer() { fn should_modify_vector_of_trusted_issuer_we() { // 0. Create accounts let root = Origin::from(frame_system::RawOrigin::Root); - let owner = User::new(AccountKeyring::Alice); - let trusted_issuer_1 = User::new(AccountKeyring::Charlie); - let trusted_issuer_2 = User::new(AccountKeyring::Ferdie); - let receiver = User::new(AccountKeyring::Dave); + let owner = User::new(Sr25519Keyring::Alice); + let trusted_issuer_1 = User::new(Sr25519Keyring::Charlie); + let trusted_issuer_2 = User::new(Sr25519Keyring::Ferdie); + let receiver = User::new(Sr25519Keyring::Dave); // Providing a random DID to root but in real world Root should posses a DID assert_ok!(CDDGroup::reset_members( @@ -893,15 +893,15 @@ fn should_modify_vector_of_trusted_issuer_we() { #[test] fn jurisdiction_asset_compliance() { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(jurisdiction_asset_compliance_we); } fn jurisdiction_asset_compliance_we() { // 0. Create accounts - let owner = User::new(AccountKeyring::Alice); - let cdd = User::new(AccountKeyring::Bob); - let user = User::new(AccountKeyring::Charlie); + let owner = User::new(Sr25519Keyring::Alice); + let cdd = User::new(Sr25519Keyring::Bob); + let user = User::new(Sr25519Keyring::Charlie); // 1. Create & mint token let asset_id = create_and_issue_sample_asset(&owner); @@ -951,15 +951,15 @@ fn jurisdiction_asset_compliance_we() { #[test] fn scope_asset_compliance() { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(scope_asset_compliance_we); } fn scope_asset_compliance_we() { // 0. Create accounts - let owner = User::new(AccountKeyring::Alice); - let cdd = User::new(AccountKeyring::Bob); - let user = User::new(AccountKeyring::Charlie); + let owner = User::new(Sr25519Keyring::Alice); + let cdd = User::new(Sr25519Keyring::Bob); + let user = User::new(Sr25519Keyring::Charlie); // 1. Create a token. let asset_id = create_and_issue_sample_asset(&owner); @@ -992,7 +992,7 @@ fn scope_asset_compliance_we() { #[test] fn ensure_custom_scopes_limited() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&owner); let fill = Condition::from_dids( @@ -1061,15 +1061,15 @@ fn ensure_custom_scopes_limited() { #[test] fn cm_test_case_9() { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::One.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::One.to_account_id()]) .build() .execute_with(cm_test_case_9_we); } /// Is any of: KYC’d, Affiliate, Accredited, Exempted fn cm_test_case_9_we() { // 0. Create accounts - let owner = User::new(AccountKeyring::Alice); - let issuer = User::new(AccountKeyring::Bob); + let owner = User::new(Sr25519Keyring::Alice); + let issuer = User::new(Sr25519Keyring::Bob); // 1. Create a token. let asset_id = create_and_issue_sample_asset(&owner); @@ -1092,10 +1092,10 @@ fn cm_test_case_9_we() { )); // 3. Validate behaviour. - let charlie = User::new(AccountKeyring::Charlie); - let dave = User::new(AccountKeyring::Dave); - let eve = User::new(AccountKeyring::Eve); - let ferdie = User::new(AccountKeyring::Ferdie); + let charlie = User::new(Sr25519Keyring::Charlie); + let dave = User::new(Sr25519Keyring::Dave); + let eve = User::new(Sr25519Keyring::Eve); + let ferdie = User::new(Sr25519Keyring::Ferdie); let get_compliance_report = |user: User, claim| { assert_ok!(Identity::add_claim(issuer.origin(), user.did, claim, None)); @@ -1172,7 +1172,7 @@ fn cm_test_case_9_we() { #[test] fn cm_test_case_11() { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::Ferdie.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Ferdie.to_account_id()]) .build() .execute_with(cm_test_case_11_we); } @@ -1180,8 +1180,8 @@ fn cm_test_case_11() { // Is any of: KYC’d, Affiliate, Accredited, Exempted, is none of: Jurisdiction=x, y, z, fn cm_test_case_11_we() { // 0. Create accounts - let owner = User::new(AccountKeyring::Alice); - let issuer = User::new(AccountKeyring::Bob); + let owner = User::new(Sr25519Keyring::Alice); + let issuer = User::new(Sr25519Keyring::Bob); // 1. Create a token. let asset_id = create_and_issue_sample_asset(&owner); @@ -1213,9 +1213,9 @@ fn cm_test_case_11_we() { )); // 3. Validate behaviour. - let charlie = User::new(AccountKeyring::Charlie); - let dave = User::new(AccountKeyring::Dave); - let eve = User::new(AccountKeyring::Eve); + let charlie = User::new(Sr25519Keyring::Charlie); + let dave = User::new(Sr25519Keyring::Dave); + let eve = User::new(Sr25519Keyring::Eve); // 3.1. Charlie has a 'KnowYourCustomer' Claim. assert_ok!(Identity::add_claim( @@ -1262,7 +1262,7 @@ fn cm_test_case_11_we() { #[test] fn cm_test_case_13() { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::Ferdie.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Ferdie.to_account_id()]) .build() .execute_with(cm_test_case_13_we); } @@ -1270,8 +1270,8 @@ fn cm_test_case_13() { // Must be KYC’d, is any of: Affiliate, Exempted, Accredited, is none of: Jurisdiction=x, y, z, etc. fn cm_test_case_13_we() { // 0. Create accounts - let owner = User::new(AccountKeyring::Alice); - let issuer = User::new(AccountKeyring::Bob); + let owner = User::new(Sr25519Keyring::Alice); + let issuer = User::new(Sr25519Keyring::Bob); // 1. Create a token. let asset_id = create_and_issue_sample_asset(&owner); @@ -1306,9 +1306,9 @@ fn cm_test_case_13_we() { )); // 3. Validate behaviour. - let charlie = User::new(AccountKeyring::Charlie); - let dave = User::new(AccountKeyring::Dave); - let eve = User::new(AccountKeyring::Eve); + let charlie = User::new(Sr25519Keyring::Charlie); + let dave = User::new(Sr25519Keyring::Dave); + let eve = User::new(Sr25519Keyring::Eve); // 3.1. Charlie has a 'KnowYourCustomer' Claim BUT he does not have any of { 'Affiliate', // 'Accredited', 'Exempted'}. @@ -1369,15 +1369,15 @@ fn cm_test_case_13_we() { #[test] fn can_verify_restriction_with_primary_issuance_agent() { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(can_verify_restriction_with_primary_issuance_agent_we); } fn can_verify_restriction_with_primary_issuance_agent_we() { - let owner = User::new(AccountKeyring::Alice); - let issuer = User::new(AccountKeyring::Bob); - let other = User::new(AccountKeyring::Charlie); + let owner = User::new(Sr25519Keyring::Alice); + let issuer = User::new(Sr25519Keyring::Bob); + let other = User::new(Sr25519Keyring::Charlie); // 1. Create a token. let asset_id = create_and_issue_sample_asset(&owner); @@ -1439,7 +1439,7 @@ fn should_limit_compliance_requirement_complexity() { } fn should_limit_compliance_requirements_complexity_we() { - let owner = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Alice); // 1. Create & mint token let asset_id = create_and_issue_sample_asset(&owner); @@ -1479,7 +1479,7 @@ fn should_limit_compliance_requirements_complexity_we() { )); // Complexity = 30*1 + 15*2 = 60 - let other = User::new(AccountKeyring::Bob); + let other = User::new(Sr25519Keyring::Bob); assert_noop!( ComplianceManager::add_default_trusted_claim_issuer( owner.origin(), @@ -1497,8 +1497,8 @@ fn should_limit_compliance_requirements_complexity_we() { fn check_new_return_type_of_rpc() { ExtBuilder::default().build().execute_with(|| { // 0. Create accounts - let owner = User::new(AccountKeyring::Alice); - let receiver = User::new(AccountKeyring::Charlie); + let owner = User::new(Sr25519Keyring::Alice); + let receiver = User::new(Sr25519Keyring::Charlie); // 1. Create & mint token let asset_id = create_and_issue_sample_asset(&owner); diff --git a/pallets/runtime/tests/src/contracts_test.rs b/pallets/runtime/tests/src/contracts_test.rs index beec647114..3ef308e4fd 100644 --- a/pallets/runtime/tests/src/contracts_test.rs +++ b/pallets/runtime/tests/src/contracts_test.rs @@ -1,18 +1,17 @@ use codec::Encode; -use frame_support::dispatch::{DispatchError, Weight}; +use frame_support::pallet_prelude::DispatchError; +use frame_support::weights::Weight; use frame_support::{assert_err_ignore_postinfo, assert_noop, assert_ok, assert_storage_noop}; -use polymesh_contracts::{ - Api, ApiCodeHash, ApiNextUpgrade, ChainVersion, ExtrinsicId, NextUpgrade, -}; -use sp_keyring::AccountKeyring; +use polymesh_contracts::{Api, ApiCodeHash, ApiNextUpgrade}; +use polymesh_contracts::{ChainVersion, ExtrinsicId, NextUpgrade}; +use sp_keyring::Sr25519Keyring; use sp_runtime::traits::Hash; use pallet_asset::TickersOwnedByUser; use pallet_identity::ParentDid; -use polymesh_primitives::{ - constants::currency::POLY, ExtrinsicPermissions, Gas, Permissions, PortfolioPermissions, - SubsetRestriction, Ticker, -}; +use polymesh_primitives::constants::currency::POLY; +use polymesh_primitives::{ExtrinsicPermissions, SubsetRestriction, Ticker}; +use polymesh_primitives::{Gas, Permissions, PortfolioPermissions}; use polymesh_runtime_common::Currency; use crate::ext_builder::ExtBuilder; @@ -23,7 +22,7 @@ use crate::storage::{root, TestStorage, User}; // and instead focus on the particulars of our contracts pallet. // This includes testing CDD, permissions, and what the chain extension does. -const GAS_LIMIT: Gas = Weight::from_ref_time(100_000_000_000).set_proof_size(3 * 1024 * 1024); +const GAS_LIMIT: Gas = Weight::from_parts(100_000_000_000, 3 * 1024 * 1024); type Asset = pallet_asset::Pallet; type FrameContracts = pallet_contracts::Pallet; @@ -60,7 +59,7 @@ fn update_call_runtime_whitelist(extrinsics: Vec<(ExtrinsicId, bool)>) { #[test] fn deploy_as_secondary_key() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); Balances::make_free_balance_be(&alice.acc(), 1_000_000 * POLY); let permissions = Permissions { @@ -107,8 +106,8 @@ fn deploy_as_secondary_key() { #[test] fn chain_extension_calls() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let ticker = Ticker::from_slice_truncated(b"A" as &[u8]); Balances::make_free_balance_be(&alice.acc(), 1_000_000 * POLY); @@ -204,7 +203,7 @@ fn deploy_as_child_identity() { let salt = vec![0xFF]; let (code, _) = chain_extension(); let hash = Hashing::hash(&code); - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); Balances::make_free_balance_be(&alice.acc(), 1_000_000 * POLY); assert_ok!(Contracts::instantiate_with_code_as_primary_key( @@ -226,7 +225,7 @@ fn deploy_as_child_identity() { #[test] fn upgrade_api_unauthorized_caller() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let api = Api::new(*b"POLY", 6); let chain_version = ChainVersion::new(6, 0); let api_code_hash = ApiCodeHash { diff --git a/pallets/runtime/tests/src/corporate_actions_test.rs b/pallets/runtime/tests/src/corporate_actions_test.rs index 7ee005f0d1..52b9aaa9f9 100644 --- a/pallets/runtime/tests/src/corporate_actions_test.rs +++ b/pallets/runtime/tests/src/corporate_actions_test.rs @@ -1,41 +1,39 @@ -use super::{ - asset_test::max_len_bytes, - storage::{root, Balance, Checkpoint, MaxDidWhts, MaxTargetIds, TestStorage, User}, - ExtBuilder, -}; -use crate::asset_pallet::setup::create_and_issue_sample_asset; -use crate::asset_test::{check_schedules, next_schedule_id, set_timestamp}; +use std::convert::TryInto; + use core::iter; -use frame_support::{ - assert_noop, assert_ok, - dispatch::{DispatchError, DispatchResult}, -}; -use pallet_asset::checkpoint::{ - CheckpointIdSequence, ScheduleIdSequence, SchedulePoints, ScheduleRefCount, Timestamps, -}; +use frame_support::pallet_prelude::DispatchError; +use frame_support::{assert_noop, assert_ok, dispatch::DispatchResult}; +use sp_arithmetic::Permill; +use sp_keyring::Sr25519Keyring; + +use pallet_asset::checkpoint::{CheckpointIdSequence, ScheduleIdSequence}; +use pallet_asset::checkpoint::{SchedulePoints, ScheduleRefCount, Timestamps}; use pallet_asset::{Assets, BalanceOf}; -use pallet_corporate_actions::{ - ballot::{ - BallotMeta, BallotTimeRange, BallotVote, Metas, Motion, MotionNumChoices, Results, - TimeRanges, Votes, RCV, - }, - distribution::{self, Distribution, Distributions, PER_SHARE_PRECISION}, - CACheckpoint, CADetails, CADocLink, CAId, CAKind, CorporateAction, DefaultTargetIdentities, - DefaultWithholdingTax, DidWithholdingTax, LocalCAId, MaxDetailsLength, RecordDate, - RecordDateSpec, TargetIdentities, TargetTreatment, - TargetTreatment::{Exclude, Include}, - Tax, -}; +use pallet_corporate_actions::ballot::{BallotMeta, BallotTimeRange, BallotVote}; +use pallet_corporate_actions::ballot::{Metas, Motion, MotionNumChoices, Results}; +use pallet_corporate_actions::ballot::{TimeRanges, Votes, RCV}; +use pallet_corporate_actions::distribution::{self, Distribution}; +use pallet_corporate_actions::distribution::{Distributions, PER_SHARE_PRECISION}; +use pallet_corporate_actions::TargetTreatment::{Exclude, Include}; +use pallet_corporate_actions::{CACheckpoint, CADetails, DefaultWithholdingTax}; +use pallet_corporate_actions::{CADocLink, CAId, CAKind, CorporateAction, DefaultTargetIdentities}; +use pallet_corporate_actions::{DidWithholdingTax, LocalCAId, MaxDetailsLength, RecordDate}; +use pallet_corporate_actions::{RecordDateSpec, TargetIdentities, TargetTreatment, Tax}; use polymesh_common_utilities::checkpoint::{ScheduleCheckpoints, ScheduleId}; +use polymesh_primitives::agent::AgentGroup; use polymesh_primitives::asset::AssetId; -use polymesh_primitives::{ - agent::AgentGroup, asset::CheckpointId, constants::currency::ONE_UNIT, AuthorizationData, - Claim, ClaimType, Condition, ConditionType, CountryCode, Document, DocumentId, IdentityId, - Moment, PortfolioId, PortfolioNumber, Scope, Signatory, TrustedFor, TrustedIssuer, -}; -use sp_arithmetic::Permill; -use sp_keyring::AccountKeyring; -use std::convert::TryInto; +use polymesh_primitives::asset::CheckpointId; +use polymesh_primitives::constants::currency::ONE_UNIT; +use polymesh_primitives::{AuthorizationData, Claim, ClaimType, Condition}; +use polymesh_primitives::{ConditionType, CountryCode, Document}; +use polymesh_primitives::{DocumentId, IdentityId, Moment, PortfolioId, PortfolioNumber}; +use polymesh_primitives::{Scope, Signatory, TrustedFor, TrustedIssuer}; + +use super::asset_test::max_len_bytes; +use super::storage::{root, Balance, Checkpoint, MaxDidWhts, MaxTargetIds, TestStorage, User}; +use super::ExtBuilder; +use crate::asset_pallet::setup::create_and_issue_sample_asset; +use crate::asset_test::{check_schedules, next_schedule_id, set_timestamp}; type System = frame_system::Pallet; type Origin = ::RuntimeOrigin; @@ -63,7 +61,7 @@ type Details = pallet_corporate_actions::Details; type CAIdSequence = pallet_corporate_actions::CAIdSequence; type CorporateActions = pallet_corporate_actions::CorporateActions; -const CDDP: AccountKeyring = AccountKeyring::Eve; +const CDDP: Sr25519Keyring = Sr25519Keyring::Eve; const P0: Permill = Permill::zero(); const P25: Permill = Permill::from_percent(25); @@ -79,15 +77,15 @@ fn test(logic: impl FnOnce(AssetId, [User; 3])) { System::set_block_number(1); // Create some users. - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); // Create the asset. let asset_id = create_and_issue_sample_asset(&alice); // Execute the test. - logic(asset_id, [alice, bob, charlie]) + logic(asset_id, [alice, charlie, bob]) }); } @@ -476,7 +474,7 @@ fn set_did_withholding_tax_works() { #[test] fn set_max_details_length_only_root() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice).origin(); + let alice = User::new(Sr25519Keyring::Alice).origin(); assert_noop!( CA::set_max_details_length(alice, 5), DispatchError::BadOrigin, @@ -2029,7 +2027,7 @@ fn dist_claim_misc_bad() { owner.origin(), asset_id2 )); - let dave = User::new(AccountKeyring::Dave); + let dave = User::new(Sr25519Keyring::Dave); assert_ok!(ComplianceManager::add_compliance_requirement( owner.origin(), asset_id2, @@ -2084,7 +2082,7 @@ fn dist_claim_not_targeted() { #[test] fn dist_claim_works() { currency_test(|asset_id, currency, [owner, foo, bar]| { - let baz = User::new(AccountKeyring::Dave); + let baz = User::new(Sr25519Keyring::Dave); // Transfer 500 to `foo`, 1000 to `bar`, and `500` to `baz`. transfer(&asset_id, owner, foo); @@ -2172,7 +2170,7 @@ fn dist_claim_works() { #[test] fn dist_claim_rounding_indivisible() { currency_test(|asset_id, currency, [owner, foo, bar]| { - let baz = User::new(AccountKeyring::Dave); + let baz = User::new(Sr25519Keyring::Dave); // Make `currency` indivisible. // This the crucial aspect different about this test. diff --git a/pallets/runtime/tests/src/ext_builder.rs b/pallets/runtime/tests/src/ext_builder.rs index f7183da544..b06e6e7f87 100644 --- a/pallets/runtime/tests/src/ext_builder.rs +++ b/pallets/runtime/tests/src/ext_builder.rs @@ -1,6 +1,11 @@ -use crate::TestStorage; -use frame_support::dispatch::Weight; -use frame_support::pallet_prelude::GenesisBuild; +use sp_std::prelude::Vec; +use sp_std::{cell::RefCell, convert::From, iter}; + +use frame_support::weights::Weight; +use sp_io::TestExternalities; +use sp_keyring::Sr25519Keyring; +use sp_runtime::{BuildStorage, Storage}; + use pallet_asset::{self as asset, TickerRegistrationConfig}; use pallet_balances as balances; use pallet_committee as committee; @@ -8,15 +13,11 @@ use pallet_group as group; use pallet_identity as identity; use pallet_pips as pips; use polymesh_common_utilities::protocol_fee::ProtocolOp; +use polymesh_primitives::identity_id::GenesisIdentityRecord; use polymesh_primitives::{constants::currency::POLY, SystematicIssuers, GC_DID}; -use polymesh_primitives::{ - identity_id::GenesisIdentityRecord, AccountId, IdentityId, PosRatio, SecondaryKey, -}; -use sp_io::TestExternalities; -use sp_keyring::AccountKeyring; -use sp_runtime::Storage; -use sp_std::prelude::Vec; -use sp_std::{cell::RefCell, convert::From, iter}; +use polymesh_primitives::{AccountId, IdentityId, PosRatio, SecondaryKey}; + +use crate::TestStorage; /// Identity information. #[derive(Clone, PartialEq, Debug)] @@ -124,7 +125,7 @@ thread_local! { impl ExtBuilder { /// Sets the minimum weight for the extrinsic (see also `weight_fee`). pub fn base_weight(mut self, extrinsic_base_weight: u64) -> Self { - self.extrinsic_base_weight = Weight::from_ref_time(extrinsic_base_weight); + self.extrinsic_base_weight = Weight::from_parts(extrinsic_base_weight, 0); self } @@ -240,24 +241,24 @@ impl ExtBuilder { if self.monied { vec![ ( - AccountKeyring::Alice.to_account_id(), + Sr25519Keyring::Alice.to_account_id(), 1_000 * POLY * self.balance_factor, ), ( - AccountKeyring::Bob.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), 2_000 * POLY * self.balance_factor, ), ( - AccountKeyring::Charlie.to_account_id(), + Sr25519Keyring::Charlie.to_account_id(), 3_000 * POLY * self.balance_factor, ), ( - AccountKeyring::Dave.to_account_id(), + Sr25519Keyring::Dave.to_account_id(), 4_000 * POLY * self.balance_factor, ), // CDD Accounts - (AccountKeyring::Eve.to_account_id(), 1_000_000), - (AccountKeyring::Ferdie.to_account_id(), 1_000_000), + (Sr25519Keyring::Eve.to_account_id(), 1_000_000), + (Sr25519Keyring::Ferdie.to_account_id(), 1_000_000), ] } else { vec![] @@ -316,6 +317,7 @@ impl ExtBuilder { fn build_balances_genesis(&self, storage: &mut Storage) { balances::GenesisConfig:: { balances: self.make_balances(), + dev_accounts: None, } .assimilate_storage(storage) .unwrap(); @@ -326,12 +328,14 @@ impl ExtBuilder { max_ticker_length: 8, registration_length: Some(10000), }; - let genesis = asset::GenesisConfig { + asset::GenesisConfig:: { ticker_registration_config, reserved_country_currency_codes: vec![], asset_metadata: vec![], - }; - GenesisBuild::::assimilate_storage(&genesis, storage).unwrap(); + ..Default::default() + } + .assimilate_storage(storage) + .unwrap(); } /// For each `cdd_providers`: @@ -392,11 +396,13 @@ impl ExtBuilder { } fn build_protocol_fee_genesis(&self, storage: &mut Storage) { - let genesis = pallet_protocol_fee::GenesisConfig { + pallet_protocol_fee::GenesisConfig:: { base_fees: self.protocol_base_fees.0.clone(), coefficient: self.protocol_coefficient, - }; - GenesisBuild::::assimilate_storage(&genesis, storage).unwrap(); + ..Default::default() + } + .assimilate_storage(storage) + .unwrap(); } fn build_pips_genesis(&self, storage: &mut Storage) { @@ -476,8 +482,8 @@ impl ExtBuilder { .collect(); // Create storage and assimilate each genesis. - let mut storage = frame_system::GenesisConfig::default() - .build_storage::() + let mut storage = frame_system::GenesisConfig::::default() + .build_storage() .expect("TestStorage cannot build its own storage"); self.build_identity_genesis(&mut storage, identities); diff --git a/pallets/runtime/tests/src/external_agents_test.rs b/pallets/runtime/tests/src/external_agents_test.rs index 2a3af2468f..b0f30b711f 100644 --- a/pallets/runtime/tests/src/external_agents_test.rs +++ b/pallets/runtime/tests/src/external_agents_test.rs @@ -5,7 +5,7 @@ use pallet_permissions::StoreCallMetadata; use polymesh_primitives::agent::{AGId, AgentGroup}; use polymesh_primitives::asset::AssetId; use polymesh_primitives::{AuthorizationData, ExtrinsicPermissions, PalletPermissions, Signatory}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use crate::asset_pallet::setup::create_and_issue_sample_asset; use crate::ext_builder::ExtBuilder; @@ -59,7 +59,7 @@ fn add_become_agent( #[test] fn create_group_set_perms_works() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Alice); assert_noop!( ExternalAgents::create_group(owner.origin(), [0; 16].into(), <_>::default()), @@ -88,7 +88,7 @@ fn create_group_set_perms_works() { }); // Still, `other` doesn't have agent permissions. - let other = User::new(AccountKeyring::Bob); + let other = User::new(Sr25519Keyring::Bob); let other_create = |perms| ExternalAgents::create_group(other.origin(), asset_id, perms); let other_set = |id, perms| ExternalAgents::set_group_permissions(other.origin(), asset_id, id, perms); @@ -141,8 +141,8 @@ fn create_group_set_perms_works() { #[test] fn remove_abdicate_change_works() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Alice); - let other = User::new(AccountKeyring::Bob); + let owner = User::new(Sr25519Keyring::Alice); + let other = User::new(Sr25519Keyring::Bob); // No asset made, so cannot remove non-agent. assert_noop!( @@ -249,10 +249,10 @@ fn remove_abdicate_change_works() { #[test] fn add_works() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); - let dave = User::new(AccountKeyring::Dave); + let owner = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); + let dave = User::new(Sr25519Keyring::Dave); let asset_id = create_and_issue_sample_asset(&owner); let check_num = |n| assert_eq!(NumFullAgents::get(asset_id), n); @@ -315,10 +315,10 @@ fn add_works() { #[test] fn agent_of_mapping_works() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); - let dave = User::new(AccountKeyring::Dave); + let owner = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); + let dave = User::new(Sr25519Keyring::Dave); let mut assets = (b'A'..b'Z') .map(|_| create_and_issue_sample_asset(&owner)) .collect::>(); @@ -381,8 +381,8 @@ fn agent_of_mapping_works() { #[test] fn atredis_multi_group_perms() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Alice); - let other = User::new(AccountKeyring::Bob); + let owner = User::new(Sr25519Keyring::Alice); + let other = User::new(Sr25519Keyring::Bob); let asset_id = create_and_issue_sample_asset(&owner); // Helpers for creating and setting permissions. @@ -426,7 +426,7 @@ fn atredis_multi_group_perms() { #[test] fn except_permissions_not_allowed() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&alice); let ext_perms = ExtrinsicPermissions::except([PalletPermissions::entire_pallet( @@ -443,7 +443,7 @@ fn except_permissions_not_allowed() { #[test] fn except_permissions_not_allowed_set() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let asset_id = create_and_issue_sample_asset(&alice); let ext_perms = ExtrinsicPermissions::these([PalletPermissions::entire_pallet( diff --git a/pallets/runtime/tests/src/fee_details.rs b/pallets/runtime/tests/src/fee_details.rs index 76f1b43f5e..5619e4f7c3 100644 --- a/pallets/runtime/tests/src/fee_details.rs +++ b/pallets/runtime/tests/src/fee_details.rs @@ -1,5 +1,5 @@ use frame_support::assert_noop; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use sp_runtime::transaction_validity::InvalidTransaction; use pallet_balances as balances; @@ -21,18 +21,18 @@ type Origin = ::RuntimeOrigin; #[test] fn cdd_checks() { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::Bob.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Bob.to_account_id()]) .monied(true) .build() .execute_with(|| { // alice does not have cdd - make_account_without_cdd(AccountKeyring::Alice.to_account_id()).unwrap(); - let alice_account = AccountKeyring::Alice.to_account_id(); + make_account_without_cdd(Sr25519Keyring::Alice.to_account_id()).unwrap(); + let alice_account = Sr25519Keyring::Alice.to_account_id(); let alice_signatory = Signatory::Account(alice_account.clone()); // charlie has valid cdd - let _ = register_keyring_account(AccountKeyring::Charlie).unwrap(); - let charlie_account = AccountKeyring::Charlie.to_account_id(); + let _ = register_keyring_account(Sr25519Keyring::Charlie).unwrap(); + let charlie_account = Sr25519Keyring::Charlie.to_account_id(); let charlie_signatory = Signatory::Account(charlie_account.clone()); assert_eq!( @@ -42,7 +42,7 @@ fn cdd_checks() { }), alice_account.clone() ), - Ok(Some(AccountKeyring::Alice.to_account_id())) + Ok(Some(Sr25519Keyring::Alice.to_account_id())) ); // call to accept being a multisig signer should fail when invalid auth @@ -68,7 +68,7 @@ fn cdd_checks() { }), alice_account.clone() ), - Ok(Some(AccountKeyring::Charlie.to_account_id())) + Ok(Some(Sr25519Keyring::Charlie.to_account_id())) ); assert_eq!( @@ -80,7 +80,7 @@ fn cdd_checks() { }), alice_account.clone() ), - Ok(Some(AccountKeyring::Charlie.to_account_id())) + Ok(Some(Sr25519Keyring::Charlie.to_account_id())) ); assert_eq!( @@ -92,7 +92,7 @@ fn cdd_checks() { }), alice_account.clone() ), - Ok(Some(AccountKeyring::Alice.to_account_id())) + Ok(Some(Sr25519Keyring::Alice.to_account_id())) ); // check that authorisation can be removed correctly @@ -112,7 +112,7 @@ fn cdd_checks() { }), alice_account.clone() ), - Ok(Some(AccountKeyring::Alice.to_account_id())) + Ok(Some(Sr25519Keyring::Alice.to_account_id())) ); assert_eq!( @@ -124,7 +124,7 @@ fn cdd_checks() { }), alice_account.clone() ), - Ok(Some(AccountKeyring::Charlie.to_account_id())) + Ok(Some(Sr25519Keyring::Charlie.to_account_id())) ); // create an authorisation where the target has a CDD claim and the issuer does not @@ -144,7 +144,7 @@ fn cdd_checks() { }), charlie_account.clone() ), - Ok(Some(AccountKeyring::Alice.to_account_id())) + Ok(Some(Sr25519Keyring::Alice.to_account_id())) ); // call to remove authorisation with caller paying should succeed as caller has CDD @@ -157,7 +157,7 @@ fn cdd_checks() { }), charlie_account.clone() ), - Ok(Some(AccountKeyring::Charlie.to_account_id())) + Ok(Some(Sr25519Keyring::Charlie.to_account_id())) ); // call to accept being a multisig signer should succeed when authorizer has a valid cdd but signer key does not @@ -176,7 +176,7 @@ fn cdd_checks() { }), alice_account.clone() ), - Ok(Some(AccountKeyring::Charlie.to_account_id())) + Ok(Some(Sr25519Keyring::Charlie.to_account_id())) ); // normal tx with cdd should succeed @@ -187,7 +187,7 @@ fn cdd_checks() { }), charlie_account ), - Ok(Some(AccountKeyring::Charlie.to_account_id())) + Ok(Some(Sr25519Keyring::Charlie.to_account_id())) ); }); } diff --git a/pallets/runtime/tests/src/group_test.rs b/pallets/runtime/tests/src/group_test.rs index 3d879b4b29..48c41ac996 100644 --- a/pallets/runtime/tests/src/group_test.rs +++ b/pallets/runtime/tests/src/group_test.rs @@ -1,14 +1,14 @@ -use super::{ - storage::{get_identity_id, register_keyring_account, TestStorage}, - ExtBuilder, -}; +use frame_support::pallet_prelude::DispatchError; +use frame_support::{assert_noop, assert_ok}; +use sp_keyring::Sr25519Keyring; + use pallet_group::{self as group}; use pallet_identity as identity; use polymesh_primitives::traits::group::GroupTrait; use polymesh_primitives::IdentityId; -use frame_support::{assert_noop, assert_ok, dispatch::DispatchError}; -use sp_keyring::AccountKeyring; +use super::storage::{get_identity_id, register_keyring_account, TestStorage}; +use super::ExtBuilder; type CommitteeGroup = group::Pallet; type Origin = ::RuntimeOrigin; @@ -16,10 +16,9 @@ type Identity = identity::Pallet; #[test] fn query_membership_works() { - // TODO(Centril): This `let` is duplicated across the file. Let's dedup. let committee = [ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), ] .to_vec(); @@ -28,8 +27,8 @@ fn query_membership_works() { .build() .execute_with(|| { let committee = [ - get_identity_id(AccountKeyring::Bob).unwrap(), - get_identity_id(AccountKeyring::Alice).unwrap(), + get_identity_id(Sr25519Keyring::Bob).unwrap(), + get_identity_id(Sr25519Keyring::Alice).unwrap(), ] .to_vec(); @@ -39,7 +38,7 @@ fn query_membership_works() { #[test] fn add_member_works() { - let committee = [AccountKeyring::Alice.to_account_id()].to_vec(); + let committee = [Sr25519Keyring::Alice.to_account_id()].to_vec(); ExtBuilder::default() .governance_committee(committee) .build() @@ -48,14 +47,14 @@ fn add_member_works() { fn add_member_works_we() { let root = Origin::from(frame_system::RawOrigin::Root); - let non_root = Origin::signed(AccountKeyring::Bob.to_account_id()); + let non_root = Origin::signed(Sr25519Keyring::Bob.to_account_id()); assert_noop!( CommitteeGroup::add_member(non_root, IdentityId::from(3)), DispatchError::BadOrigin ); - let alice_id = get_identity_id(AccountKeyring::Alice).unwrap(); + let alice_id = get_identity_id(Sr25519Keyring::Alice).unwrap(); assert_noop!( CommitteeGroup::add_member(root.clone(), alice_id), @@ -74,12 +73,12 @@ fn add_member_works_we() { #[test] fn active_limit_works() { ExtBuilder::default() - .governance_committee([AccountKeyring::Alice.to_account_id()].to_vec()) + .governance_committee([Sr25519Keyring::Alice.to_account_id()].to_vec()) .build() .execute_with(|| { let root = Origin::from(frame_system::RawOrigin::Root); - let alice_signer = Origin::signed(AccountKeyring::Alice.to_account_id()); - let alice_id = get_identity_id(AccountKeyring::Alice).unwrap(); + let alice_signer = Origin::signed(Sr25519Keyring::Alice.to_account_id()); + let alice_id = get_identity_id(Sr25519Keyring::Alice).unwrap(); assert_ok!(CommitteeGroup::add_member( root.clone(), @@ -90,8 +89,8 @@ fn active_limit_works() { vec![alice_id, IdentityId::from(4)] ); - let bob_id = register_keyring_account(AccountKeyring::Bob).unwrap(); - let charlie_id = register_keyring_account(AccountKeyring::Charlie).unwrap(); + let bob_id = register_keyring_account(Sr25519Keyring::Bob).unwrap(); + let charlie_id = register_keyring_account(Sr25519Keyring::Charlie).unwrap(); assert_ok!(CommitteeGroup::set_active_members_limit(root.clone(), 1)); assert_noop!( CommitteeGroup::add_member(root.clone(), bob_id), @@ -151,8 +150,8 @@ fn active_limit_works() { #[test] fn remove_member_works() { let committee = [ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), ] .to_vec(); @@ -164,7 +163,7 @@ fn remove_member_works() { fn remove_member_works_we() { let root = Origin::from(frame_system::RawOrigin::Root); - let non_root = Origin::signed(AccountKeyring::Charlie.to_account_id()); + let non_root = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); assert_noop!( CommitteeGroup::remove_member(non_root, IdentityId::from(3)), @@ -174,8 +173,8 @@ fn remove_member_works_we() { CommitteeGroup::remove_member(root.clone(), IdentityId::from(5)), group::Error::::NoSuchMember ); - let alice_id = get_identity_id(AccountKeyring::Alice).unwrap(); - let bob_id = get_identity_id(AccountKeyring::Bob).unwrap(); + let alice_id = get_identity_id(Sr25519Keyring::Alice).unwrap(); + let bob_id = get_identity_id(Sr25519Keyring::Bob).unwrap(); assert_ok!(CommitteeGroup::remove_member(root, alice_id)); assert_eq!(CommitteeGroup::get_members(), [bob_id].to_vec()); } @@ -183,8 +182,8 @@ fn remove_member_works_we() { #[test] fn swap_member_works() { let committee = [ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), ] .to_vec(); @@ -196,10 +195,10 @@ fn swap_member_works() { fn swap_member_works_we() { let root = Origin::from(frame_system::RawOrigin::Root); - let non_root = Origin::signed(AccountKeyring::Charlie.to_account_id()); - let alice_id = get_identity_id(AccountKeyring::Alice).unwrap(); - let bob_id = get_identity_id(AccountKeyring::Bob).unwrap(); - let charlie_id = register_keyring_account(AccountKeyring::Charlie).unwrap(); + let non_root = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); + let alice_id = get_identity_id(Sr25519Keyring::Alice).unwrap(); + let bob_id = get_identity_id(Sr25519Keyring::Bob).unwrap(); + let charlie_id = register_keyring_account(Sr25519Keyring::Charlie).unwrap(); assert_noop!( CommitteeGroup::swap_member(non_root, alice_id, IdentityId::from(5)), @@ -226,8 +225,8 @@ fn swap_member_works_we() { #[test] fn reset_members_works() { let committee = [ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), ] .to_vec(); ExtBuilder::default() @@ -238,7 +237,7 @@ fn reset_members_works() { fn reset_members_works_we() { let root = Origin::from(frame_system::RawOrigin::Root); - let non_root = Origin::signed(AccountKeyring::Bob.to_account_id()); + let non_root = Origin::signed(Sr25519Keyring::Bob.to_account_id()); let new_committee = (4..=6).map(IdentityId::from).collect::>(); assert_noop!( CommitteeGroup::reset_members(non_root, new_committee.clone()), @@ -257,14 +256,14 @@ fn rage_quit_we() { let root = Origin::from(frame_system::RawOrigin::Root); // 1. Add members to committee - let alice_signer = Origin::signed(AccountKeyring::Alice.to_account_id()); - let alice_did = register_keyring_account(AccountKeyring::Alice).unwrap(); - let bob_signer = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_did = register_keyring_account(AccountKeyring::Bob).unwrap(); - let charlie_signer = Origin::signed(AccountKeyring::Charlie.to_account_id()); - let charlie_did = register_keyring_account(AccountKeyring::Charlie).unwrap(); - let ferdie_signer = Origin::signed(AccountKeyring::Ferdie.to_account_id()); - let ferdie_did = register_keyring_account(AccountKeyring::Ferdie).unwrap(); + let alice_signer = Origin::signed(Sr25519Keyring::Alice.to_account_id()); + let alice_did = register_keyring_account(Sr25519Keyring::Alice).unwrap(); + let bob_signer = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_did = register_keyring_account(Sr25519Keyring::Bob).unwrap(); + let charlie_signer = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); + let charlie_did = register_keyring_account(Sr25519Keyring::Charlie).unwrap(); + let ferdie_signer = Origin::signed(Sr25519Keyring::Ferdie.to_account_id()); + let ferdie_did = register_keyring_account(Sr25519Keyring::Ferdie).unwrap(); // 0. Threshold is 2/3 let committee = vec![alice_did, bob_did, charlie_did]; @@ -306,9 +305,9 @@ fn disable_member() { fn disable_member_we() { let root = Origin::from(frame_system::RawOrigin::Root); - let alice_id = register_keyring_account(AccountKeyring::Alice).unwrap(); - let bob_id = register_keyring_account(AccountKeyring::Bob).unwrap(); - let charlie_id = register_keyring_account(AccountKeyring::Charlie).unwrap(); + let alice_id = register_keyring_account(Sr25519Keyring::Alice).unwrap(); + let bob_id = register_keyring_account(Sr25519Keyring::Bob).unwrap(); + let charlie_id = register_keyring_account(Sr25519Keyring::Charlie).unwrap(); let mut committee = vec![alice_id, bob_id, charlie_id]; committee.sort(); @@ -326,10 +325,10 @@ fn disable_member_we() { None, None )); - assert_eq!(CommitteeGroup::get_members(), vec![charlie_id, alice_id]); + assert_eq!(CommitteeGroup::get_members(), vec![alice_id, charlie_id]); assert_eq!( CommitteeGroup::get_valid_members(), - vec![charlie_id, alice_id, bob_id] + vec![alice_id, charlie_id, bob_id] ); // Revoke at diff --git a/pallets/runtime/tests/src/identity_test.rs b/pallets/runtime/tests/src/identity_test.rs index 59cada316c..6cf16d61f9 100644 --- a/pallets/runtime/tests/src/identity_test.rs +++ b/pallets/runtime/tests/src/identity_test.rs @@ -33,7 +33,7 @@ use polymesh_primitives::{ }; use polymesh_runtime_develop::runtime::{CddHandler, RuntimeCall}; use sp_core::H512; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use sp_std::iter; use std::convert::From; @@ -107,12 +107,12 @@ macro_rules! assert_add_cdd_claim { #[test] fn only_primary_or_secondary_keys_can_authenticate_as_an_identity() { ExtBuilder::default().monied(true).build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); // Add charlie's key as a secondary key of bob. - let charlie = User::new_with(bob.did, AccountKeyring::Charlie); + let charlie = User::new_with(bob.did, Sr25519Keyring::Charlie); add_secondary_key(bob.did, charlie.acc()); // Check primary key. @@ -134,7 +134,7 @@ fn only_primary_or_secondary_keys_can_authenticate_as_an_identity() { #[test] fn gc_add_remove_cdd_claim() { ExtBuilder::default().build().execute_with(|| { - let target = User::new(AccountKeyring::Charlie); + let target = User::new(Sr25519Keyring::Charlie); let fetch = || Identity::fetch_claim(target.did, ClaimType::CustomerDueDiligence, GC_DID, None); @@ -159,9 +159,9 @@ fn gc_add_remove_cdd_claim() { #[test] fn revoking_claims() { ExtBuilder::default().build().execute_with(|| { - let _owner = User::new(AccountKeyring::Alice); - let _issuer = User::new(AccountKeyring::Bob); - let claim_issuer = User::new(AccountKeyring::Charlie); + let _owner = User::new(Sr25519Keyring::Alice); + let _issuer = User::new(Sr25519Keyring::Bob); + let claim_issuer = User::new(Sr25519Keyring::Charlie); let scope = Scope::from(IdentityId::from(0)); let fetch = || { @@ -192,9 +192,9 @@ fn revoking_claims() { #[test] fn revoking_batch_claims() { ExtBuilder::default().build().execute_with(|| { - let _owner = User::new(AccountKeyring::Alice); - let _issuer = User::new(AccountKeyring::Bob); - let claim_issuer = User::new(AccountKeyring::Charlie); + let _owner = User::new(Sr25519Keyring::Alice); + let _issuer = User::new(Sr25519Keyring::Bob); + let claim_issuer = User::new(Sr25519Keyring::Charlie); let scope = Scope::from(IdentityId::from(0)); let add = |claim, scope| { @@ -232,9 +232,9 @@ fn only_primary_key_can_add_secondary_key_permissions() { .execute_with(&only_primary_key_can_add_secondary_key_permissions_with_externalities); } fn only_primary_key_can_add_secondary_key_permissions_with_externalities() { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new_with(alice.did, AccountKeyring::Bob); - let charlie = User::new_with(alice.did, AccountKeyring::Charlie); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); + let charlie = User::new_with(alice.did, Sr25519Keyring::Charlie); add_secondary_key(alice.did, charlie.acc()); add_secondary_key(alice.did, bob.acc()); @@ -268,8 +268,8 @@ fn add_permissions_to_multiple_tokens() { .execute_with(&do_add_permissions_to_multiple_tokens); } fn do_add_permissions_to_multiple_tokens() { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new_with(alice.did, AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); // Add bob with default permissions. add_secondary_key(alice.did, bob.acc()); @@ -308,8 +308,8 @@ fn do_add_permissions_to_multiple_tokens() { #[test] fn set_secondary_key_permissions_with_bad_perms() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new_with(alice.did, AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); add_secondary_key(alice.did, bob.acc()); test_with_bad_perms(alice.did, |perms| { assert_too_long!(Identity::set_secondary_key_permissions( @@ -331,11 +331,11 @@ fn freeze_secondary_keys_test() { } fn freeze_secondary_keys_with_externalities() { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let [bob, charlie, dave] = [ - AccountKeyring::Bob, - AccountKeyring::Charlie, - AccountKeyring::Dave, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, ] .map(|r| User::new_with(alice.did, r)); @@ -385,9 +385,9 @@ fn remove_frozen_secondary_keys_test() { } fn remove_frozen_secondary_keys_with_externalities() { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new_with(alice.did, AccountKeyring::Bob); - let charlie = User::new_with(alice.did, AccountKeyring::Charlie); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); + let charlie = User::new_with(alice.did, Sr25519Keyring::Charlie); // Add secondary keys. add_secondary_key(alice.did, bob.acc()); @@ -418,13 +418,13 @@ fn frozen_secondary_keys_cdd_verification_test() { fn frozen_secondary_keys_cdd_verification_test_we() { // 0. Create identity for Alice and secondary key from Bob. - let alice = AccountKeyring::Alice.to_account_id(); - let bob = AccountKeyring::Bob.to_account_id(); - let charlie = AccountKeyring::Charlie.to_account_id(); + let alice = Sr25519Keyring::Alice.to_account_id(); + let bob = Sr25519Keyring::Bob.to_account_id(); + let charlie = Sr25519Keyring::Charlie.to_account_id(); TestStorage::set_payer_context(Some(alice.clone())); - let alice_id = register_keyring_account(AccountKeyring::Alice).unwrap(); + let alice_id = register_keyring_account(Sr25519Keyring::Alice).unwrap(); TestStorage::set_payer_context(Some(charlie.clone())); - let _charlie_id = register_keyring_account_with_balance(AccountKeyring::Charlie, 100).unwrap(); + let _charlie_id = register_keyring_account_with_balance(Sr25519Keyring::Charlie, 100).unwrap(); assert_eq!(Balances::free_balance(charlie.clone()), 100); // 1. Add Bob as signatory to Alice ID. @@ -457,11 +457,11 @@ fn frozen_secondary_keys_cdd_verification_test_we() { // Balances::transfer_with_memo(Origin::signed(bob), charlie, 1_000, None), let payer = CddHandler::get_valid_payer( &RuntimeCall::Balances(balances::Call::transfer_with_memo { - dest: AccountKeyring::Charlie.to_account_id().into(), + dest: Sr25519Keyring::Charlie.to_account_id().into(), value: 1_000, memo: None, }), - AccountKeyring::Bob.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), ); assert!(payer.is_ok()); @@ -490,7 +490,7 @@ fn frozen_secondary_keys_cdd_verification_test_we() { fn run_add_secondary_key_with_perm_test( add_key_with_perms: impl Fn(User, Permissions) -> DispatchResult, ) { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let perm1 = Permissions::empty(); let perm2 = Permissions::from_pallet_permissions(vec![PalletPermissions::entire_pallet( @@ -527,7 +527,7 @@ fn join_identity_as_key_with_perm_test() { fn do_join_identity_as_key_with_perm_test() { // Use `add_auth` and `join_identity_as_key` to add a secondary key. run_add_secondary_key_with_perm_test(move |alice, perms| { - let bob = User::new_with(alice.did, AccountKeyring::Bob); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); let data = AuthorizationData::JoinIdentity(perms); let auth_id = Identity::add_auth(alice.did, bob.signatory_acc(), data, None).unwrap(); Identity::join_identity_as_key(bob.origin(), auth_id) @@ -543,8 +543,8 @@ fn add_secondary_keys_with_permissions_test() { } fn do_add_secondary_keys_with_permissions_test() { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new_with(alice.did, AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); // Add bob with default permissions add_secondary_key(alice.did, bob.acc()); @@ -613,9 +613,9 @@ fn remove_secondary_keys_test() { } fn do_remove_secondary_keys_test() { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new_with(alice.did, AccountKeyring::Bob); - let dave = User::new_with(alice.did, AccountKeyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); + let dave = User::new_with(alice.did, Sr25519Keyring::Dave); add_secondary_key(alice.did, bob.acc()); add_secondary_key(alice.did, dave.acc()); @@ -683,12 +683,12 @@ fn remove_secondary_keys_test_with_externalities() { } fn do_remove_secondary_keys_test_with_externalities() { - let bob_key = AccountKeyring::Bob.to_account_id(); - let alice = User::new(AccountKeyring::Alice); - let bob = User::new_with(alice.did, AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); - let dave_key = AccountKeyring::Dave.to_account_id(); - let ferdie_key = AccountKeyring::Ferdie.to_account_id(); + let bob_key = Sr25519Keyring::Bob.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); + let dave_key = Sr25519Keyring::Dave.to_account_id(); + let ferdie_key = Sr25519Keyring::Ferdie.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), @@ -704,7 +704,7 @@ fn do_remove_secondary_keys_test_with_externalities() { add_secondary_key(alice.did, bob.acc()); // Fund the multisig - assert_ok!(Balances::transfer( + assert_ok!(Balances::transfer_allow_death( alice.origin(), ms_address.clone().into(), 2 * POLY @@ -749,7 +749,7 @@ fn do_remove_secondary_keys_test_with_externalities() { ); // Transfer funds back to Alice - assert_ok!(Balances::transfer( + assert_ok!(Balances::transfer_allow_death( Origin::signed(ms_address.clone()), alice.acc().into(), 2 * POLY @@ -779,12 +779,12 @@ fn leave_identity_test() { } fn leave_identity_test_with_externalities() { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new_with(alice.did, AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); let bob_sk = SecondaryKey::new(bob.acc(), Permissions::empty()); - let dave_key = AccountKeyring::Dave.to_account_id(); - let ferdie_key = AccountKeyring::Ferdie.to_account_id(); + let dave_key = Sr25519Keyring::Dave.to_account_id(); + let ferdie_key = Sr25519Keyring::Ferdie.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), @@ -814,7 +814,7 @@ fn leave_identity_test_with_externalities() { assert_eq!(Identity::get_identity(&ms_address), Some(alice.did)); // send funds to multisig - assert_ok!(Balances::transfer( + assert_ok!(Balances::transfer_allow_death( alice.origin(), ms_address.clone().into(), 2 * POLY @@ -831,7 +831,7 @@ fn leave_identity_test_with_externalities() { ); // send funds back to alice from multisig - assert_ok!(Balances::transfer( + assert_ok!(Balances::transfer_allow_death( Origin::signed(ms_address.clone()), alice.acc().into(), 2 * POLY @@ -860,11 +860,11 @@ fn enforce_uniqueness_keys_in_identity_tests() { fn enforce_uniqueness_keys_in_identity() { // Register identities. - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); // Check external signed key uniqueness. - let charlie = User::new_with(alice.did, AccountKeyring::Charlie); + let charlie = User::new_with(alice.did, Sr25519Keyring::Charlie); add_secondary_key(alice.did, charlie.acc()); let auth_id = Identity::add_auth( alice.did, @@ -900,15 +900,15 @@ fn one_step_join_id() { } fn one_step_join_id_with_ext() { - let a = User::new(AccountKeyring::Alice); + let a = User::new(Sr25519Keyring::Alice); let (authorization, expires_at) = target_id_auth(a); let auth_encoded = authorization.encode(); let keys = [ - AccountKeyring::Bob, - AccountKeyring::Charlie, - AccountKeyring::Dave, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, ]; let users @ [b, c, _] = keys.map(|r| User::new_with(a.did, r)); let secondary_keys_with_auth = secondary_keys_with_auth(&users, &auth_encoded); @@ -937,11 +937,11 @@ fn one_step_join_id_with_ext() { System::inc_account_nonce(a.acc()); set_timestamp(expires_at); - let f = User::new(AccountKeyring::Ferdie); + let f = User::new(Sr25519Keyring::Ferdie); let (ferdie_auth, _) = target_id_auth(a); let ferdie_secondary_key_with_auth = SecondaryKeyWithAuth { secondary_key: SecondaryKey::from_account_id(f.acc()).into(), - auth_signature: H512::from(AccountKeyring::Eve.sign(ferdie_auth.encode().as_slice())), + auth_signature: H512::from(Sr25519Keyring::Eve.sign(ferdie_auth.encode().as_slice())), }; assert_noop!( @@ -1003,8 +1003,8 @@ pub(crate) fn test_with_bad_perms(did: IdentityId, test: impl Fn(Permissions)) { #[test] fn add_secondary_keys_with_authorization_duplicate_keys() { ExtBuilder::default().build().execute_with(|| { - let user = User::new(AccountKeyring::Alice); - let bob = User::new_with(user.did, AccountKeyring::Bob); + let user = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(user.did, Sr25519Keyring::Bob); let expires_at = 100; let auth = || { @@ -1040,8 +1040,8 @@ fn add_secondary_keys_with_authorization_duplicate_keys() { #[test] fn add_secondary_keys_with_authorization_too_many_sks() { ExtBuilder::default().build().execute_with(|| { - let user = User::new(AccountKeyring::Alice); - let bob = User::new_with(user.did, AccountKeyring::Bob); + let user = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(user.did, Sr25519Keyring::Bob); let expires_at = 100; let auth = || { @@ -1095,14 +1095,14 @@ fn secondary_key_with_bad_permissions() { .balance_factor(1_000) .monied(true) .cdd_providers(vec![ - AccountKeyring::Eve.to_account_id(), - AccountKeyring::Ferdie.to_account_id(), + Sr25519Keyring::Eve.to_account_id(), + Sr25519Keyring::Ferdie.to_account_id(), ]) .build() .execute_with(|| { - let cdd1 = AccountKeyring::Eve.to_account_id(); - let alice = User::new(AccountKeyring::Alice); - let bob = User::new_with(alice.did, AccountKeyring::Bob); + let cdd1 = Sr25519Keyring::Eve.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); test_with_bad_perms(bob.did, |perms| { let bob_sk = SecondaryKey::new(bob.acc(), perms); @@ -1121,7 +1121,7 @@ fn secondary_key_with_bad_permissions() { #[test] fn adding_authorizations_bad_perms() { ExtBuilder::default().build().execute_with(|| { - let user = User::new(AccountKeyring::Alice); + let user = User::new(Sr25519Keyring::Alice); test_with_bad_perms(user.did, |perms| { assert_too_long!(Identity::add_authorization( user.origin(), @@ -1136,8 +1136,8 @@ fn adding_authorizations_bad_perms() { #[test] fn adding_authorizations() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let ticker50 = Ticker::from_slice_truncated(&[0x50][..]); let mut auth_id = Identity::add_auth( alice.did, @@ -1201,8 +1201,8 @@ fn adding_authorizations() { #[test] fn removing_authorizations() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let ticker50 = Ticker::from_slice_truncated(&[0x50][..]); let auth_id = Identity::add_auth( alice.did, @@ -1239,20 +1239,20 @@ fn removing_authorizations() { fn changing_primary_key() { ExtBuilder::default() .monied(true) - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(changing_primary_key_we); } fn changing_primary_key_we() { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); // Primary key matches Alice's key let alice_pk = || get_primary_key(alice.did); assert_eq!(alice_pk(), alice.acc()); - let add = |ring: AccountKeyring| { + let add = |ring: Sr25519Keyring| { Identity::add_auth( alice.did, Signatory::Account(ring.to_account_id()), @@ -1261,7 +1261,7 @@ fn changing_primary_key_we() { ) .unwrap() }; - let accept = |ring: AccountKeyring, auth| { + let accept = |ring: Sr25519Keyring, auth| { Identity::accept_primary_key(Origin::signed(ring.to_account_id()), auth, None) }; @@ -1276,7 +1276,7 @@ fn changing_primary_key_we() { // Do it again, but for Charlie, who isn't attached to a DID. // Alice's primary key will be Charlie's.' - let charlie = AccountKeyring::Charlie; + let charlie = Sr25519Keyring::Charlie; assert_ok!(accept(charlie, add(charlie))); assert_eq!(alice_pk(), charlie.to_account_id()); assert_ok!(Identity::ensure_key_did_unlinked(&alice.acc())); @@ -1301,17 +1301,17 @@ fn changing_primary_key_we() { fn changing_primary_key_with_cdd_auth() { ExtBuilder::default() .monied(true) - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(|| changing_primary_key_with_cdd_auth_we()); } fn changing_primary_key_with_cdd_auth_we() { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_pk = || get_primary_key(alice.did); - let new = User::new_with(alice.did, AccountKeyring::Bob); + let new = User::new_with(alice.did, Sr25519Keyring::Bob); - let cdd_did = get_identity_id(AccountKeyring::Eve).unwrap(); + let cdd_did = get_identity_id(Sr25519Keyring::Eve).unwrap(); // Primary key matches Alice's key assert_eq!(alice_pk(), alice.acc()); @@ -1356,21 +1356,21 @@ fn changing_primary_key_with_cdd_auth_we() { )); // Alice's primary key is now Bob's - assert_eq!(alice_pk(), AccountKeyring::Bob.to_account_id()); + assert_eq!(alice_pk(), Sr25519Keyring::Bob.to_account_id()); } #[test] fn rotating_primary_key_to_secondary() { ExtBuilder::default() .monied(true) - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(rotating_primary_key_to_secondary_we); } fn rotating_primary_key_to_secondary_we() { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let charlie = AccountKeyring::Charlie; + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let charlie = Sr25519Keyring::Charlie; let charlie_origin = Origin::signed(charlie.to_account_id()); // Primary key matches Alice's key @@ -1424,22 +1424,22 @@ fn rotating_primary_key_to_secondary_we() { fn rotating_primary_key_to_secondary_with_cdd_auth() { ExtBuilder::default() .monied(true) - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(|| rotating_primary_key_to_secondary_with_cdd_auth_we()); } fn rotating_primary_key_to_secondary_with_cdd_auth_we() { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_pk = || get_primary_key(alice.did); - let charlie = AccountKeyring::Charlie; + let charlie = Sr25519Keyring::Charlie; let charlie_origin = Origin::signed(charlie.to_account_id()); let rotate = |from: Origin, auth_id: u64, cdd: Option| { Identity::rotate_primary_key_to_secondary(from, auth_id, cdd) }; - let cdd_did = get_identity_id(AccountKeyring::Eve).unwrap(); + let cdd_did = get_identity_id(Sr25519Keyring::Eve).unwrap(); let rotate_auth = Identity::add_auth( alice.did, @@ -1487,20 +1487,20 @@ fn cdd_register_did_test() { .balance_factor(1_000) .monied(true) .cdd_providers(vec![ - AccountKeyring::Eve.to_account_id(), - AccountKeyring::Ferdie.to_account_id(), + Sr25519Keyring::Eve.to_account_id(), + Sr25519Keyring::Ferdie.to_account_id(), ]) .build() .execute_with(|| cdd_register_did_test_we()); } fn cdd_register_did_test_we() { - let cdd1 = Origin::signed(AccountKeyring::Eve.to_account_id()); - let cdd2 = Origin::signed(AccountKeyring::Ferdie.to_account_id()); - let non_id = Origin::signed(AccountKeyring::Charlie.to_account_id()); + let cdd1 = Origin::signed(Sr25519Keyring::Eve.to_account_id()); + let cdd2 = Origin::signed(Sr25519Keyring::Ferdie.to_account_id()); + let non_id = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); - let alice = AccountKeyring::Alice.to_account_id(); - let bob_acc = AccountKeyring::Bob.to_account_id(); + let alice = Sr25519Keyring::Alice.to_account_id(); + let bob_acc = Sr25519Keyring::Bob.to_account_id(); // CDD 1 registers correctly the Alice's ID. assert_ok!(Identity::cdd_register_did( @@ -1508,7 +1508,7 @@ fn cdd_register_did_test_we() { alice.clone(), vec![] )); - let alice_id = get_identity_id(AccountKeyring::Alice).unwrap(); + let alice_id = get_identity_id(Sr25519Keyring::Alice).unwrap(); assert_add_cdd_claim!(cdd1.clone(), alice_id); // Check that Alice's ID is attested by CDD 1. @@ -1523,7 +1523,7 @@ fn cdd_register_did_test_we() { // CDD 2 registers properly Bob's ID. assert_ok!(Identity::cdd_register_did(cdd2.clone(), bob_acc, vec![])); - let bob_id = get_identity_id(AccountKeyring::Bob).unwrap(); + let bob_id = get_identity_id(Sr25519Keyring::Bob).unwrap(); assert_add_cdd_claim!(cdd2, bob_id); assert_eq!(Identity::has_valid_cdd(bob_id), true); @@ -1531,8 +1531,8 @@ fn cdd_register_did_test_we() { // Register with secondary_keys // ============================================== // Register Charlie with secondary keys. - let charlie = AccountKeyring::Charlie.to_account_id(); - let dave = AccountKeyring::Dave.to_account_id(); + let charlie = Sr25519Keyring::Charlie.to_account_id(); + let dave = Sr25519Keyring::Dave.to_account_id(); let dave_si = SecondaryKey::from_account_id(dave.clone()); let secondary_keys = vec![dave_si.clone().into()]; assert_ok!(Identity::cdd_register_did( @@ -1540,7 +1540,7 @@ fn cdd_register_did_test_we() { charlie.clone(), secondary_keys )); - let charlie_id = get_identity_id(AccountKeyring::Charlie).unwrap(); + let charlie_id = get_identity_id(Sr25519Keyring::Charlie).unwrap(); assert_add_cdd_claim!(cdd1.clone(), charlie_id); Balances::make_free_balance_be(&charlie, 10_000_000_000); @@ -1560,12 +1560,12 @@ fn cdd_register_did_test_we() { #[test] fn cdd_register_did_duplicate_keys_test() { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(|| { - let cdd = Origin::signed(AccountKeyring::Eve.to_account_id()); - let alice = AccountKeyring::Alice.to_account_id(); - let bob_acc = AccountKeyring::Bob.to_account_id(); + let cdd = Origin::signed(Sr25519Keyring::Eve.to_account_id()); + let alice = Sr25519Keyring::Alice.to_account_id(); + let bob_acc = Sr25519Keyring::Bob.to_account_id(); let secondary_key = SecondaryKey::new(bob_acc, Permissions::default()); let secondary_keys = vec![secondary_key.clone().into(), secondary_key.into()]; @@ -1579,10 +1579,10 @@ fn cdd_register_did_duplicate_keys_test() { #[test] fn add_identity_signers() { ExtBuilder::default().monied(true).build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new_with(alice.did, AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); - let dave = User::new_with(alice.did, AccountKeyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); + let dave = User::new_with(alice.did, Sr25519Keyring::Dave); let add_auth = |from: User, to| { let data = AuthorizationData::JoinIdentity(Permissions::default()); @@ -1624,7 +1624,7 @@ fn add_identity_signers() { let alice_secondary_keys = get_secondary_keys(alice.did); let charlie_secondary_keys = get_secondary_keys(charlie.did); - let mut dave_sk = SecondaryKey::from_account_id(AccountKeyring::Dave.to_account_id()); + let mut dave_sk = SecondaryKey::from_account_id(Sr25519Keyring::Dave.to_account_id()); // Correct the permissions to ones set by `add_secondary_key`. dave_sk.permissions = Permissions::default(); assert!(alice_secondary_keys @@ -1652,8 +1652,8 @@ fn invalidate_cdd_claims() { .balance_factor(1_000) .monied(true) .cdd_providers(vec![ - AccountKeyring::Eve.to_account_id(), - AccountKeyring::Ferdie.to_account_id(), + Sr25519Keyring::Eve.to_account_id(), + Sr25519Keyring::Ferdie.to_account_id(), ]) .build() .execute_with(invalidate_cdd_claims_we); @@ -1661,15 +1661,15 @@ fn invalidate_cdd_claims() { fn invalidate_cdd_claims_we() { let root = Origin::from(frame_system::RawOrigin::Root); - let cdd = AccountKeyring::Eve.to_account_id(); - let alice_acc = AccountKeyring::Alice.to_account_id(); - let bob_acc = AccountKeyring::Bob.to_account_id(); + let cdd = Sr25519Keyring::Eve.to_account_id(); + let alice_acc = Sr25519Keyring::Alice.to_account_id(); + let bob_acc = Sr25519Keyring::Bob.to_account_id(); assert_ok!(Identity::cdd_register_did( Origin::signed(cdd.clone()), alice_acc, vec![] )); - let alice_id = get_identity_id(AccountKeyring::Alice).unwrap(); + let alice_id = get_identity_id(Sr25519Keyring::Alice).unwrap(); assert_add_cdd_claim!(Origin::signed(cdd.clone()), alice_id); // Check that Alice's ID is attested by CDD 1. @@ -1700,8 +1700,8 @@ fn invalidate_cdd_claims_we() { #[test] fn cdd_provider_with_systematic_cdd_claims() { let cdd_providers = [ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), ] .to_vec(); @@ -1715,9 +1715,9 @@ fn cdd_provider_with_systematic_cdd_claims() { fn cdd_provider_with_systematic_cdd_claims_we() { // 0. Get Bob & Alice IDs. let root = Origin::from(frame_system::RawOrigin::Root); - let bob_id = get_identity_id(AccountKeyring::Bob).expect("Bob should be one of CDD providers"); + let bob_id = get_identity_id(Sr25519Keyring::Bob).expect("Bob should be one of CDD providers"); let alice_id = - get_identity_id(AccountKeyring::Alice).expect("Bob should be one of CDD providers"); + get_identity_id(Sr25519Keyring::Alice).expect("Bob should be one of CDD providers"); // 1. Each CDD provider has a *systematic* CDD claim. let cdd_providers = CddServiceProviders::get_members(); @@ -1736,8 +1736,8 @@ fn cdd_provider_with_systematic_cdd_claims_we() { // 3. Add DID with CDD claim to CDD providers, and check that systematic CDD claim was added. // Then remove that DID from CDD provides, it should keep its previous CDD claim. - let alice = Origin::signed(AccountKeyring::Alice.to_account_id()); - let charlie_acc = AccountKeyring::Charlie.to_account_id(); + let alice = Origin::signed(Sr25519Keyring::Alice.to_account_id()); + let charlie_acc = Sr25519Keyring::Charlie.to_account_id(); // 3.1. Add CDD claim to Charlie, by Alice. assert_ok!(Identity::cdd_register_did( @@ -1746,7 +1746,7 @@ fn cdd_provider_with_systematic_cdd_claims_we() { vec![] )); let charlie_id = - get_identity_id(AccountKeyring::Charlie).expect("Charlie should have an Identity Id"); + get_identity_id(Sr25519Keyring::Charlie).expect("Charlie should have an Identity Id"); assert_add_cdd_claim!(alice, charlie_id); let charlie_cdd_claim = @@ -1766,13 +1766,13 @@ fn cdd_provider_with_systematic_cdd_claims_we() { #[test] fn gc_with_systematic_cdd_claims() { let cdd_providers = [ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), ] .to_vec(); let governance_committee = [ - AccountKeyring::Charlie.to_account_id(), - AccountKeyring::Dave.to_account_id(), + Sr25519Keyring::Charlie.to_account_id(), + Sr25519Keyring::Dave.to_account_id(), ] .to_vec(); @@ -1787,9 +1787,9 @@ fn gc_with_systematic_cdd_claims() { fn gc_with_systematic_cdd_claims_we() { // 0. let root = Origin::from(frame_system::RawOrigin::Root); - let charlie_id = get_identity_id(AccountKeyring::Charlie) + let charlie_id = get_identity_id(Sr25519Keyring::Charlie) .expect("Charlie should be a Governance Committee member"); - let dave_id = get_identity_id(AccountKeyring::Dave) + let dave_id = get_identity_id(Sr25519Keyring::Dave) .expect("Dave should be a Governance Committee member"); // 1. Each GC member has a *systematic* CDD claim. @@ -1809,8 +1809,8 @@ fn gc_with_systematic_cdd_claims_we() { // 3. Add DID with CDD claim to CDD providers, and check that systematic CDD claim was added. // Then remove that DID from CDD provides, it should keep its previous CDD claim. - let alice = Origin::signed(AccountKeyring::Alice.to_account_id()); - let ferdie_acc = AccountKeyring::Ferdie.to_account_id(); + let alice = Origin::signed(Sr25519Keyring::Alice.to_account_id()); + let ferdie_acc = Sr25519Keyring::Ferdie.to_account_id(); // 3.1. Add CDD claim to Ferdie, by Alice. assert_ok!(Identity::cdd_register_did( @@ -1819,7 +1819,7 @@ fn gc_with_systematic_cdd_claims_we() { vec![] )); let ferdie_id = - get_identity_id(AccountKeyring::Ferdie).expect("Ferdie should have an Identity Id"); + get_identity_id(Sr25519Keyring::Ferdie).expect("Ferdie should have an Identity Id"); assert_add_cdd_claim!(alice, ferdie_id); let ferdie_cdd_claim = @@ -1839,8 +1839,8 @@ fn gc_with_systematic_cdd_claims_we() { #[test] fn gc_and_cdd_with_systematic_cdd_claims() { let gc_and_cdd_providers = [ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), ] .to_vec(); @@ -1855,7 +1855,7 @@ fn gc_and_cdd_with_systematic_cdd_claims() { fn gc_and_cdd_with_systematic_cdd_claims_we() { // 0. Accounts let root = Origin::from(frame_system::RawOrigin::Root); - let alice_id = get_identity_id(AccountKeyring::Alice) + let alice_id = get_identity_id(Sr25519Keyring::Alice) .expect("Alice should be a Governance Committee member"); // 1. Alice should have 2 systematic CDD claims: One as GC member & another one as CDD @@ -1880,15 +1880,15 @@ fn add_permission_with_secondary_key() { .balance_factor(1_000) .monied(true) .cdd_providers(vec![ - AccountKeyring::Eve.to_account_id(), - AccountKeyring::Ferdie.to_account_id(), + Sr25519Keyring::Eve.to_account_id(), + Sr25519Keyring::Ferdie.to_account_id(), ]) .build() .execute_with(|| { - let cdd_1_acc = AccountKeyring::Eve.to_account_id(); - let alice_acc = AccountKeyring::Alice.to_account_id(); - let bob_acc = AccountKeyring::Bob.to_account_id(); - let charlie_acc = AccountKeyring::Charlie.to_account_id(); + let cdd_1_acc = Sr25519Keyring::Eve.to_account_id(); + let alice_acc = Sr25519Keyring::Alice.to_account_id(); + let bob_acc = Sr25519Keyring::Bob.to_account_id(); + let charlie_acc = Sr25519Keyring::Charlie.to_account_id(); // Add secondary keys. let sk = |acc: &AccountId| SecondaryKey { @@ -1930,7 +1930,7 @@ fn add_permission_with_secondary_key() { #[test] fn ensure_custom_scopes_limited() { ExtBuilder::default().build().execute_with(|| { - let user = User::new(AccountKeyring::Alice); + let user = User::new(Sr25519Keyring::Alice); let data = |n| Scope::Custom([b'1'].repeat(n)); let add = |n| Identity::add_claim(user.origin(), user.did, Claim::Affiliate(data(n)), None); // Check <= 32. @@ -1944,7 +1944,7 @@ fn ensure_custom_scopes_limited() { #[test] fn custom_claim_type_too_long() { ExtBuilder::default().build().execute_with(|| { - let user = User::new(AccountKeyring::Alice); + let user = User::new(Sr25519Keyring::Alice); let case = |add| Identity::register_custom_claim_type(user.origin(), max_len_bytes(add)); assert_too_long!(case(1)); assert_ok!(case(0)); @@ -1954,7 +1954,7 @@ fn custom_claim_type_too_long() { #[test] fn custom_claim_type_works() { ExtBuilder::default().build().execute_with(|| { - let user = User::new(AccountKeyring::Alice); + let user = User::new(Sr25519Keyring::Alice); let register = |ty: &str| Identity::register_custom_claim_type(user.origin(), ty.into()); let seq_is = |num| { assert_eq!(CustomClaimIdSequence::::get().0, num); @@ -1999,7 +1999,7 @@ fn custom_claim_type_works() { #[test] fn invalid_custom_claim_type() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); assert_noop!( Identity::base_add_claim( alice.did, @@ -2015,23 +2015,23 @@ fn invalid_custom_claim_type() { #[test] fn cdd_register_did_events() { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(|| { System::set_block_number(1); // Register an Identity for alice with two secundary keys - let cdd_provider = Origin::signed(AccountKeyring::Eve.to_account_id()); - let alice_account_id = AccountKeyring::Alice.to_account_id(); + let cdd_provider = Origin::signed(Sr25519Keyring::Eve.to_account_id()); + let alice_account_id = Sr25519Keyring::Alice.to_account_id(); let alice_secundary_keys = vec![ - SecondaryKey::from_account_id(AccountKeyring::Dave.to_account_id()), - SecondaryKey::from_account_id(AccountKeyring::Charlie.to_account_id()), + SecondaryKey::from_account_id(Sr25519Keyring::Dave.to_account_id()), + SecondaryKey::from_account_id(Sr25519Keyring::Charlie.to_account_id()), ]; assert_ok!(Identity::cdd_register_did( cdd_provider, alice_account_id.clone(), alice_secundary_keys.clone() )); - let alice_did = get_identity_id(AccountKeyring::Alice).unwrap(); + let alice_did = get_identity_id(Sr25519Keyring::Alice).unwrap(); // Make sure one Authorization event was sent for each secundary key let mut system_events = System::events(); assert_eq!( @@ -2039,7 +2039,7 @@ fn cdd_register_did_events() { super::storage::EventTest::Identity(Event::AuthorizationAdded( alice_did, None, - Some(AccountKeyring::Charlie.to_account_id()), + Some(Sr25519Keyring::Charlie.to_account_id()), CurrentAuthId::::get(), AuthorizationData::JoinIdentity(alice_secundary_keys[1].permissions.clone()), None, @@ -2050,7 +2050,7 @@ fn cdd_register_did_events() { super::storage::EventTest::Identity(Event::AuthorizationAdded( alice_did, None, - Some(AccountKeyring::Dave.to_account_id()), + Some(Sr25519Keyring::Dave.to_account_id()), CurrentAuthId::::get() - 1, AuthorizationData::JoinIdentity(alice_secundary_keys[0].permissions.clone()), None, @@ -2073,18 +2073,18 @@ fn child_identity_test() { ExtBuilder::default() .balance_factor(1_000) .monied(true) - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(&do_child_identity_test); } fn do_child_identity_test() { - let cdd = Origin::signed(AccountKeyring::Eve.to_account_id()); - let alice = User::new(AccountKeyring::Alice); - let bob = User::new_with(alice.did, AccountKeyring::Bob); - let dave = User::new_with(alice.did, AccountKeyring::Dave); + let cdd = Origin::signed(Sr25519Keyring::Eve.to_account_id()); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); + let dave = User::new_with(alice.did, Sr25519Keyring::Dave); - let charlie = User::new(AccountKeyring::Charlie); + let charlie = User::new(Sr25519Keyring::Charlie); // Helper functions. let did_of = |u: User| Identity::get_identity(&u.acc()); @@ -2134,7 +2134,7 @@ fn do_child_identity_test() { exec_ok!(Identity::create_child_identity(alice.origin(), bob.acc())); // Update bob's identity. let bob_did = did_of(bob).expect("Bob's new identity"); - let bob = User::new_with(bob_did, AccountKeyring::Bob); + let bob = User::new_with(bob_did, Sr25519Keyring::Bob); // Ensure bob has a new identity. assert!(valid_cdd(bob)); @@ -2143,7 +2143,7 @@ fn do_child_identity_test() { assert_eq!(ChildDid::::get(alice.did, bob.did), true); // Attach secondary key to child identity. - let ferdie = User::new_with(bob.did, AccountKeyring::Ferdie); + let ferdie = User::new_with(bob.did, Sr25519Keyring::Ferdie); add_secondary_key(bob.did, ferdie.acc()); // Child identity can't create a child identity. @@ -2213,7 +2213,7 @@ fn do_child_identity_test() { exec_ok!(Identity::create_child_identity(bob.origin(), ferdie.acc())); // Update ferdie's identity. let ferdie_did = did_of(ferdie).expect("Ferdie's new identity"); - let ferdie = User::new_with(ferdie_did, AccountKeyring::Ferdie); + let ferdie = User::new_with(ferdie_did, Sr25519Keyring::Ferdie); assert!(valid_cdd(ferdie)); assert_eq!(ParentDid::::get(ferdie.did), Some(bob.did)); assert_eq!(ChildDid::::get(bob.did, ferdie.did), true); @@ -2224,14 +2224,14 @@ fn create_child_identities_with_auth_test() { ExtBuilder::default() .balance_factor(1_000) .monied(true) - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(&do_create_child_identities_with_auth_test); } fn do_create_child_identities_with_auth_test() { - let alice = User::new(AccountKeyring::Alice); - let charlie = User::new_with(alice.did, AccountKeyring::Charlie); + let alice = User::new(Sr25519Keyring::Alice); + let charlie = User::new_with(alice.did, Sr25519Keyring::Charlie); // Create some secondary keys. add_secondary_key(alice.did, charlie.acc()); @@ -2244,7 +2244,7 @@ fn do_create_child_identities_with_auth_test() { }; auth.encode() }; - let create_with_auth = |child: AccountKeyring| { + let create_with_auth = |child: Sr25519Keyring| { let auth_encoded = auth(); CreateChildIdentityWithAuth { key: child.to_account_id(), @@ -2261,10 +2261,10 @@ fn do_create_child_identities_with_auth_test() { // Repeat a key. let child_keys = vec![ - create_with_auth(AccountKeyring::Bob), - create_with_auth(AccountKeyring::Dave), - create_with_auth(AccountKeyring::Ferdie), - create_with_auth(AccountKeyring::Bob), // Duplicate key. + create_with_auth(Sr25519Keyring::Bob), + create_with_auth(Sr25519Keyring::Dave), + create_with_auth(Sr25519Keyring::Ferdie), + create_with_auth(Sr25519Keyring::Bob), // Duplicate key. ]; assert_noop!( Identity::create_child_identities(alice.origin(), child_keys, expires_at), @@ -2273,9 +2273,9 @@ fn do_create_child_identities_with_auth_test() { // Create multiple child identities from unlinked keys. let child_keys = vec![ - create_with_auth(AccountKeyring::Bob), - create_with_auth(AccountKeyring::Dave), - create_with_auth(AccountKeyring::Ferdie), + create_with_auth(Sr25519Keyring::Bob), + create_with_auth(Sr25519Keyring::Dave), + create_with_auth(Sr25519Keyring::Ferdie), ]; assert_ok!(Identity::create_child_identities( alice.origin(), diff --git a/pallets/runtime/tests/src/lib.rs b/pallets/runtime/tests/src/lib.rs index 0c7b8ae822..7bdd4e658e 100644 --- a/pallets/runtime/tests/src/lib.rs +++ b/pallets/runtime/tests/src/lib.rs @@ -1,15 +1,11 @@ #![allow(dead_code)] #![cfg(test)] +// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. +#![recursion_limit = "1024"] -pub mod storage; -pub use storage::{ - account_from, add_secondary_key, fast_forward_blocks, fast_forward_to_block, get_identity_id, - make_account, make_account_with_balance, make_account_without_cdd, next_block, - register_keyring_account_with_balance, TestStorage, -}; +pub(crate) use storage::{next_block, TestStorage}; -pub mod ext_builder; -pub use ext_builder::ExtBuilder; +pub(crate) use ext_builder::ExtBuilder; mod asset_pallet; #[macro_use] @@ -22,6 +18,7 @@ mod contracts_test; mod corporate_actions_test; #[macro_use] mod external_agents_test; +pub(crate) mod ext_builder; mod fee_details; mod group_test; mod identity_test; @@ -31,12 +28,13 @@ mod pips_test; mod portfolio; mod protocol_fee; mod relayer_test; +mod stable_api_v8_precompile_test; mod settlement_pallet; mod settlement_test; mod signed_extra; -mod staking; mod staking_extra_tests; mod sto_test; +pub(crate) mod storage; mod transaction_payment_test; mod transfer_compliance_test; mod treasury_test; diff --git a/pallets/runtime/tests/src/multisig.rs b/pallets/runtime/tests/src/multisig.rs index 2552d2e182..6916581065 100644 --- a/pallets/runtime/tests/src/multisig.rs +++ b/pallets/runtime/tests/src/multisig.rs @@ -11,7 +11,7 @@ use pallet_multisig::{ use polymesh_primitives::constants::currency::POLY; use polymesh_primitives::multisig::ProposalState; use polymesh_primitives::{AccountId, AuthorizationData, Permissions, SecondaryKey, Signatory}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use super::asset_test::set_timestamp; use super::next_block; @@ -86,9 +86,9 @@ fn create_multisig_result( #[test] fn create_multisig_required_signers() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let eve_signer = AccountKeyring::Eve.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let eve_signer = Sr25519Keyring::Eve.to_account_id(); let ms_address = MultiSig::get_next_multisig_address(alice.acc()).expect("Next MS"); @@ -107,18 +107,18 @@ fn create_multisig_required_signers() { #[test] fn join_multisig() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); - let ferdie_key = AccountKeyring::Ferdie.to_account_id(); + let ferdie_key = Sr25519Keyring::Ferdie.to_account_id(); let ferdie = Origin::signed(ferdie_key.clone()); let ferdie_signer = ferdie_key; - let bob = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie = User::new(AccountKeyring::Charlie); + let bob = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie = User::new(Sr25519Keyring::Charlie); // Add dave's key as a secondary key of charlie. - let dave = User::new_with(charlie.did, AccountKeyring::Dave); + let dave = User::new_with(charlie.did, Sr25519Keyring::Dave); add_secondary_key(charlie.did, dave.acc()); let ms_address = create_multisig_default_perms( @@ -202,11 +202,11 @@ fn join_multisig() { #[test] fn change_multisig_sigs_required() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie = Origin::signed(AccountKeyring::Charlie.to_account_id()); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), @@ -260,11 +260,11 @@ fn change_multisig_sigs_required() { #[test] fn remove_multisig_signers() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie = Origin::signed(AccountKeyring::Charlie.to_account_id()); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), @@ -300,7 +300,7 @@ fn remove_multisig_signers() { // No direct identity for Bob as he is only a signer assert_eq!( - Identity::get_identity(&AccountKeyring::Bob.to_account_id()), + Identity::get_identity(&Sr25519Keyring::Bob.to_account_id()), None ); @@ -329,7 +329,7 @@ fn remove_multisig_signers() { assert_eq!(MultiSig::ms_signers(ms_address.clone(), bob_signer), false); assert_eq!( - Identity::get_identity(&AccountKeyring::Bob.to_account_id()), + Identity::get_identity(&Sr25519Keyring::Bob.to_account_id()), None ); @@ -359,13 +359,13 @@ fn remove_multisig_signers() { #[test] fn add_multisig_signers() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie = Origin::signed(AccountKeyring::Charlie.to_account_id()); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); - let dave = Origin::signed(AccountKeyring::Dave.to_account_id()); - let dave_signer = AccountKeyring::Dave.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); + let dave = Origin::signed(Sr25519Keyring::Dave.to_account_id()); + let dave_signer = Sr25519Keyring::Dave.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), @@ -459,16 +459,16 @@ fn add_multisig_signers() { #[test] fn multisig_as_primary() { ExtBuilder::default().monied(true).build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let ferdie_key = AccountKeyring::Ferdie.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let ferdie_key = Sr25519Keyring::Ferdie.to_account_id(); let ms_address = create_multisig_default_perms(alice.acc(), create_signers(vec![ferdie_key]), 1); assert_eq!( get_primary_key(alice.did), - AccountKeyring::Alice.to_account_id() + Sr25519Keyring::Alice.to_account_id() ); assert_err!( @@ -485,10 +485,10 @@ fn multisig_as_primary() { #[test] fn rotate_multisig_primary_key_with_balance() { ExtBuilder::default().monied(true).build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let dave_key = AccountKeyring::Dave.to_account_id(); - let charlie_key = AccountKeyring::Charlie.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave_key = Sr25519Keyring::Dave.to_account_id(); + let charlie_key = Sr25519Keyring::Charlie.to_account_id(); let ms_address = create_multisig_default_perms(alice.acc(), create_signers(vec![dave_key]), 1); @@ -509,7 +509,7 @@ fn rotate_multisig_primary_key_with_balance() { assert_eq!(get_primary_key(alice.did), ms_address); // Fund the MultiSig. - assert_ok!(Balances::transfer( + assert_ok!(Balances::transfer_allow_death( bob.origin(), ms_address.clone().into(), 2 * POLY @@ -536,8 +536,8 @@ fn rotate_multisig_primary_key_with_balance() { #[test] fn multisig_as_secondary_key_default_perms() { ExtBuilder::default().monied(true).build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let ferdie_key = AccountKeyring::Ferdie.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let ferdie_key = Sr25519Keyring::Ferdie.to_account_id(); let ms_address = create_multisig_default_perms(alice.acc(), create_signers(vec![ferdie_key]), 1); @@ -550,12 +550,12 @@ fn multisig_as_secondary_key_default_perms() { #[test] fn remove_multisig_signers_via_admin() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie = Origin::signed(AccountKeyring::Charlie.to_account_id()); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); - let dave = User::new(AccountKeyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); + let bob = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); + let dave = User::new(Sr25519Keyring::Dave); let ms_address = create_multisig_default_perms( alice.acc(), @@ -646,12 +646,12 @@ fn remove_multisig_signers_via_admin() { #[test] fn add_multisig_signers_via_admin() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie = Origin::signed(AccountKeyring::Charlie.to_account_id()); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); - let dave = User::new(AccountKeyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); + let bob = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); + let dave = User::new(Sr25519Keyring::Dave); let ms_address = create_multisig_default_perms( alice.acc(), @@ -720,12 +720,12 @@ fn add_multisig_signers_via_admin() { #[test] fn check_for_approval_closure() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie = Origin::signed(AccountKeyring::Charlie.to_account_id()); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); - let dave = Origin::signed(AccountKeyring::Dave.to_account_id()); - let dave_signer = AccountKeyring::Dave.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); + let dave = Origin::signed(Sr25519Keyring::Dave.to_account_id()); + let dave_signer = Sr25519Keyring::Dave.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), @@ -799,21 +799,21 @@ fn check_for_approval_closure() { #[test] fn reject_proposals() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); - let bob_key = AccountKeyring::Bob.to_account_id(); + let bob_key = Sr25519Keyring::Bob.to_account_id(); let bob = Origin::signed(bob_key.clone()); - let charlie_key = AccountKeyring::Charlie.to_account_id(); + let charlie_key = Sr25519Keyring::Charlie.to_account_id(); let charlie = Origin::signed(charlie_key.clone()); - let dave_key = AccountKeyring::Dave.to_account_id(); + let dave_key = Sr25519Keyring::Dave.to_account_id(); let dave = Origin::signed(dave_key.clone()); - let ferdie_key = AccountKeyring::Ferdie.to_account_id(); + let ferdie_key = Sr25519Keyring::Ferdie.to_account_id(); let ferdie = Origin::signed(ferdie_key.clone()); - let eve_key = AccountKeyring::Eve.to_account_id(); + let eve_key = Sr25519Keyring::Eve.to_account_id(); let eve = Origin::signed(eve_key.clone()); let ms_address = setup_multisig( @@ -907,11 +907,11 @@ fn reject_proposals() { fn add_signers_via_admin_removed_controls() { ExtBuilder::default().build().execute_with(|| { // Multisig creator - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); // Multisig signers - let ferdie_signer = AccountKeyring::Ferdie.to_account_id(); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); + let ferdie_signer = Sr25519Keyring::Ferdie.to_account_id(); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), @@ -935,11 +935,11 @@ fn add_signers_via_admin_removed_controls() { fn remove_signers_via_admin_removed_controls() { ExtBuilder::default().build().execute_with(|| { // Multisig creator - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); // Multisig signers - let ferdie_signer = AccountKeyring::Ferdie.to_account_id(); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); + let ferdie_signer = Sr25519Keyring::Ferdie.to_account_id(); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), @@ -963,13 +963,13 @@ fn remove_signers_via_admin_removed_controls() { fn change_sigs_required_via_admin_id_not_creator() { ExtBuilder::default().build().execute_with(|| { // Multisig creator - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); // Multisig signers - let ferdie_signer = AccountKeyring::Ferdie.to_account_id(); - let bob = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); - let dave = User::new(AccountKeyring::Dave); + let ferdie_signer = Sr25519Keyring::Ferdie.to_account_id(); + let bob = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); + let dave = User::new(Sr25519Keyring::Dave); let ms_address = create_multisig_default_perms( alice.acc(), @@ -993,11 +993,11 @@ fn change_sigs_required_via_admin_id_not_creator() { fn change_sigs_required_via_admin_removed_controls() { ExtBuilder::default().build().execute_with(|| { // Multisig creator - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); // Multisig signers - let ferdie_signer = AccountKeyring::Ferdie.to_account_id(); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); + let ferdie_signer = Sr25519Keyring::Ferdie.to_account_id(); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), @@ -1017,12 +1017,12 @@ fn change_sigs_required_via_admin_removed_controls() { fn change_sigs_required_via_admin_not_enough_signers() { ExtBuilder::default().build().execute_with(|| { // Multisig creator - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); // Multisig signers - let ferdie_signer = AccountKeyring::Ferdie.to_account_id(); - let bob = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); + let ferdie_signer = Sr25519Keyring::Ferdie.to_account_id(); + let bob = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), @@ -1045,12 +1045,12 @@ fn change_sigs_required_via_admin_not_enough_signers() { fn change_sigs_required_via_admin_successfully() { ExtBuilder::default().build().execute_with(|| { // Multisig creator - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); // Multisig signers - let ferdie_signer = AccountKeyring::Ferdie.to_account_id(); - let bob = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); + let ferdie_signer = Sr25519Keyring::Ferdie.to_account_id(); + let bob = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), @@ -1073,13 +1073,13 @@ fn change_sigs_required_via_admin_successfully() { fn remove_admin_via_admin_id_not_creator() { ExtBuilder::default().build().execute_with(|| { // Multisig creator - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); // Multisig signers - let ferdie_signer = AccountKeyring::Ferdie.to_account_id(); - let bob = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); - let dave = User::new(AccountKeyring::Dave); + let ferdie_signer = Sr25519Keyring::Ferdie.to_account_id(); + let bob = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); + let dave = User::new(Sr25519Keyring::Dave); let ms_address = create_multisig_default_perms( alice.acc(), @@ -1103,11 +1103,11 @@ fn remove_admin_via_admin_id_not_creator() { fn remove_admin_via_admin_successfully() { ExtBuilder::default().build().execute_with(|| { // Multisig creator - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); // Multisig signers - let ferdie_signer = AccountKeyring::Ferdie.to_account_id(); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); + let ferdie_signer = Sr25519Keyring::Ferdie.to_account_id(); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), @@ -1126,17 +1126,17 @@ fn remove_admin_via_admin_successfully() { #[test] fn proposal_owner_rejection() { ExtBuilder::default().build().execute_with(|| { - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); - let bob_key = AccountKeyring::Bob.to_account_id(); + let bob_key = Sr25519Keyring::Bob.to_account_id(); let bob = Origin::signed(bob_key.clone()); - let dave_key = AccountKeyring::Dave.to_account_id(); + let dave_key = Sr25519Keyring::Dave.to_account_id(); - let ferdie_key = AccountKeyring::Ferdie.to_account_id(); + let ferdie_key = Sr25519Keyring::Ferdie.to_account_id(); let ferdie = Origin::signed(ferdie_key.clone()); - let eve_key = AccountKeyring::Eve.to_account_id(); + let eve_key = Sr25519Keyring::Eve.to_account_id(); // Creates a multi-signature let ms_address = setup_multisig( @@ -1192,17 +1192,17 @@ fn proposal_owner_rejection() { #[test] fn proposal_owner_rejection_denied() { ExtBuilder::default().build().execute_with(|| { - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); - let bob_key = AccountKeyring::Bob.to_account_id(); + let bob_key = Sr25519Keyring::Bob.to_account_id(); let bob = Origin::signed(bob_key.clone()); - let dave_key = AccountKeyring::Dave.to_account_id(); + let dave_key = Sr25519Keyring::Dave.to_account_id(); - let ferdie_key = AccountKeyring::Ferdie.to_account_id(); + let ferdie_key = Sr25519Keyring::Ferdie.to_account_id(); let ferdie = Origin::signed(ferdie_key.clone()); - let eve_key = AccountKeyring::Eve.to_account_id(); + let eve_key = Sr25519Keyring::Eve.to_account_id(); // Creates a multi-signature let ms_address = setup_multisig( @@ -1261,11 +1261,11 @@ fn proposal_owner_rejection_denied() { fn remove_admin_successfully() { ExtBuilder::default().build().execute_with(|| { // Multisig creator - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); // Multisig signers - let ferdie_signer = AccountKeyring::Ferdie.to_account_id(); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); + let ferdie_signer = Sr25519Keyring::Ferdie.to_account_id(); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), @@ -1283,11 +1283,11 @@ fn remove_admin_successfully() { fn remove_admin_not_multsig() { ExtBuilder::default().build().execute_with(|| { // Multisig creator - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); // Multisig signers - let ferdie_signer = AccountKeyring::Ferdie.to_account_id(); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); + let ferdie_signer = Sr25519Keyring::Ferdie.to_account_id(); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); create_multisig_default_perms( alice.acc(), @@ -1304,15 +1304,15 @@ fn remove_admin_not_multsig() { fn expired_proposals() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); - let bob_key = AccountKeyring::Bob.to_account_id(); + let bob_key = Sr25519Keyring::Bob.to_account_id(); let bob = Origin::signed(bob_key.clone()); - let ferdie_key = AccountKeyring::Ferdie.to_account_id(); + let ferdie_key = Sr25519Keyring::Ferdie.to_account_id(); let ferdie = Origin::signed(ferdie_key.clone()); - let charlie_key = AccountKeyring::Charlie.to_account_id(); + let charlie_key = Sr25519Keyring::Charlie.to_account_id(); let charlie = Origin::signed(charlie_key.clone()); let ms_address = setup_multisig( @@ -1399,9 +1399,9 @@ fn expired_proposals() { #[test] fn multisig_nesting_not_allowed() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let dave = Origin::signed(AccountKeyring::Dave.to_account_id()); - let dave_signer = AccountKeyring::Dave.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let dave = Origin::signed(Sr25519Keyring::Dave.to_account_id()); + let dave_signer = Sr25519Keyring::Dave.to_account_id(); // Created the first top-level multisig. let ms1_address = create_multisig_default_perms( @@ -1447,11 +1447,11 @@ fn multisig_nesting_not_allowed() { #[test] fn create_expired_proposal() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob_key = AccountKeyring::Bob.to_account_id(); - let ferdie_key = AccountKeyring::Ferdie.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob_key = Sr25519Keyring::Bob.to_account_id(); + let ferdie_key = Sr25519Keyring::Ferdie.to_account_id(); let ferdie = Origin::signed(ferdie_key.clone()); - let charlie_key = AccountKeyring::Charlie.to_account_id(); + let charlie_key = Sr25519Keyring::Charlie.to_account_id(); let ms_address = setup_multisig( alice.acc(), @@ -1478,11 +1478,11 @@ fn create_expired_proposal() { #[test] fn invalidate_proposals_change_sigs_required() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob_key = AccountKeyring::Bob.to_account_id(); - let ferdie_key = AccountKeyring::Ferdie.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob_key = Sr25519Keyring::Bob.to_account_id(); + let ferdie_key = Sr25519Keyring::Ferdie.to_account_id(); let ferdie = Origin::signed(ferdie_key.clone()); - let charlie_key = AccountKeyring::Charlie.to_account_id(); + let charlie_key = Sr25519Keyring::Charlie.to_account_id(); let ms_address = setup_multisig( alice.acc(), @@ -1528,12 +1528,12 @@ fn invalidate_proposals_change_sigs_required() { #[test] fn invalidate_proposals_add_signer() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob_key = AccountKeyring::Bob.to_account_id(); - let ferdie_key = AccountKeyring::Ferdie.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob_key = Sr25519Keyring::Bob.to_account_id(); + let ferdie_key = Sr25519Keyring::Ferdie.to_account_id(); let ferdie = Origin::signed(ferdie_key.clone()); - let charlie = Origin::signed(AccountKeyring::Charlie.to_account_id()); - let charlie_key = AccountKeyring::Charlie.to_account_id(); + let charlie = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); + let charlie_key = Sr25519Keyring::Charlie.to_account_id(); let ms_address = setup_multisig(alice.acc(), 2, create_signers(vec![ferdie_key, bob_key])); @@ -1583,11 +1583,11 @@ fn invalidate_proposals_add_signer() { #[test] fn invalidate_proposals_remove_signer() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob_key = AccountKeyring::Bob.to_account_id(); - let ferdie_key = AccountKeyring::Ferdie.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob_key = Sr25519Keyring::Bob.to_account_id(); + let ferdie_key = Sr25519Keyring::Ferdie.to_account_id(); let ferdie = Origin::signed(ferdie_key.clone()); - let charlie_key = AccountKeyring::Charlie.to_account_id(); + let charlie_key = Sr25519Keyring::Charlie.to_account_id(); let ms_address = setup_multisig( alice.acc(), @@ -1633,11 +1633,11 @@ fn invalidate_proposals_remove_signer() { #[test] fn invalidate_proposals_via_executed_proposal() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = Origin::signed(AccountKeyring::Bob.to_account_id()); - let bob_signer = AccountKeyring::Bob.to_account_id(); - let charlie = Origin::signed(AccountKeyring::Charlie.to_account_id()); - let charlie_signer = AccountKeyring::Charlie.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob = Origin::signed(Sr25519Keyring::Bob.to_account_id()); + let bob_signer = Sr25519Keyring::Bob.to_account_id(); + let charlie = Origin::signed(Sr25519Keyring::Charlie.to_account_id()); + let charlie_signer = Sr25519Keyring::Charlie.to_account_id(); let ms_address = create_multisig_default_perms( alice.acc(), diff --git a/pallets/runtime/tests/src/nft.rs b/pallets/runtime/tests/src/nft.rs index e7ad6f6f36..6293a1b210 100644 --- a/pallets/runtime/tests/src/nft.rs +++ b/pallets/runtime/tests/src/nft.rs @@ -19,7 +19,7 @@ use polymesh_primitives::{ PortfolioKind, PortfolioName, PortfolioNumber, PortfolioUpdateReason, Scope, Signatory, TrustedFor, TrustedIssuer, WeightMeter, }; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use super::asset_test::{get_asset_details, set_timestamp}; use crate::asset_pallet::setup::{create_and_issue_sample_asset, create_and_issue_sample_nft}; @@ -43,7 +43,7 @@ fn create_collection_unregistered_ticker() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let nft_type = NonFungibleType::Derivative; let collection_keys: NFTCollectionKeys = vec![].into(); @@ -68,7 +68,7 @@ fn create_collection_invalid_asset_type() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let collection_keys: NFTCollectionKeys = vec![].into(); let asset_id = create_and_issue_sample_asset(&alice); @@ -85,7 +85,7 @@ fn create_collection_already_registered() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let nft_type = NonFungibleType::Derivative; let collection_keys: NFTCollectionKeys = vec![].into(); @@ -108,7 +108,7 @@ fn create_collection_max_keys_exceeded() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let nft_type = NonFungibleType::Derivative; let collection_keys: Vec = (0..256) .map(|key| AssetMetadataKey::Local(AssetMetadataLocalKey(key))) @@ -131,7 +131,7 @@ fn create_collection_duplicate_key() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let nft_type = NonFungibleType::Derivative; let collection_keys: NFTCollectionKeys = vec![ AssetMetadataKey::Local(AssetMetadataLocalKey(0)), @@ -157,7 +157,7 @@ fn create_collection_unregistered_key() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let nft_type = NonFungibleType::Derivative; let collection_keys: NFTCollectionKeys = @@ -225,7 +225,7 @@ fn mint_nft_collection_not_found() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); assert_noop!( NFT::issue_nft( alice.origin(), @@ -247,7 +247,7 @@ fn mint_nft_duplicate_key() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let collection_keys: NFTCollectionKeys = vec![ AssetMetadataKey::Local(AssetMetadataLocalKey(1)), AssetMetadataKey::Local(AssetMetadataLocalKey(2)), @@ -286,7 +286,7 @@ fn mint_nft_wrong_number_of_keys() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let collection_keys: NFTCollectionKeys = vec![AssetMetadataKey::Local(AssetMetadataLocalKey(1))].into(); @@ -327,7 +327,7 @@ fn mint_nft_wrong_key() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let collection_keys: NFTCollectionKeys = vec![AssetMetadataKey::Local(AssetMetadataLocalKey(1))].into(); @@ -358,7 +358,7 @@ fn mint_nft_portfolio_not_found() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let collection_keys: NFTCollectionKeys = vec![AssetMetadataKey::Local(AssetMetadataLocalKey(1))].into(); @@ -388,7 +388,7 @@ fn mint_nft_successfully() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId::new(alice.did, PortfolioKind::Default); let collection_keys: NFTCollectionKeys = @@ -455,7 +455,7 @@ fn burn_nft_collection_not_found() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); assert_noop!( NFT::redeem_nft( alice.origin(), @@ -475,7 +475,7 @@ fn burn_nft_not_found() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let collection_keys: NFTCollectionKeys = vec![AssetMetadataKey::Local(AssetMetadataLocalKey(1))].into(); @@ -504,8 +504,8 @@ fn burn_nft_no_custody() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let bob: User = User::new(AccountKeyring::Bob); - let alice: User = User::new(AccountKeyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); let portfolio_kind = PortfolioKind::User(PortfolioNumber(1)); let portfolio_id = PortfolioId::new(alice.did, portfolio_kind.clone()); @@ -560,7 +560,7 @@ fn burn_nft() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let collection_keys: NFTCollectionKeys = vec![AssetMetadataKey::Local(AssetMetadataLocalKey(1))].into(); @@ -615,8 +615,8 @@ fn transfer_nft_without_collection() { ExtBuilder::default().build().execute_with(|| { set_timestamp(Utc::now().timestamp() as _); - let alice: User = User::new(AccountKeyring::Alice); - let bob: User = User::new(AccountKeyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); let mut weight_meter = WeightMeter::max_limit_no_minimum(); let sender_portfolio = PortfolioId { @@ -653,7 +653,7 @@ fn transfer_nft_same_portfolio() { set_timestamp(Utc::now().timestamp() as _); // Creates a collection - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let collection_keys: NFTCollectionKeys = vec![AssetMetadataKey::Local(AssetMetadataLocalKey(1))].into(); @@ -698,8 +698,8 @@ fn transfer_nft_invalid_count() { set_timestamp(Utc::now().timestamp() as _); // First we need to create a collection and mint one NFT - let alice: User = User::new(AccountKeyring::Alice); - let bob: User = User::new(AccountKeyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); let mut weight_meter = WeightMeter::max_limit_no_minimum(); let collection_keys: NFTCollectionKeys = @@ -754,8 +754,8 @@ fn transfer_nft_not_owned() { set_timestamp(Utc::now().timestamp() as _); // First we need to create a collection and mint one NFT - let alice: User = User::new(AccountKeyring::Alice); - let bob: User = User::new(AccountKeyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); let mut weight_meter = WeightMeter::max_limit_no_minimum(); let collection_keys: NFTCollectionKeys = @@ -810,9 +810,9 @@ fn transfer_nft_failing_compliance() { set_timestamp(Utc::now().timestamp() as _); // First we need to create a collection and mint one NFT - let bob: User = User::new(AccountKeyring::Bob); - let dave: User = User::new(AccountKeyring::Dave); - let alice: User = User::new(AccountKeyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); + let dave: User = User::new(Sr25519Keyring::Dave); + let alice: User = User::new(Sr25519Keyring::Alice); let mut weight_meter = WeightMeter::max_limit_no_minimum(); let collection_keys: NFTCollectionKeys = @@ -884,8 +884,8 @@ fn transfer_nft() { System::set_block_number(1); // First we need to create a collection and mint one NFT - let alice: User = User::new(AccountKeyring::Alice); - let bob: User = User::new(AccountKeyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); let mut weight_meter = WeightMeter::max_limit_no_minimum(); let collection_keys: NFTCollectionKeys = @@ -972,8 +972,8 @@ fn controller_transfer() { // First we need to create a collection and mint one NFT set_timestamp(Utc::now().timestamp() as _); System::set_block_number(1); - let alice: User = User::new(AccountKeyring::Alice); - let bob: User = User::new(AccountKeyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); let mut weight_meter = WeightMeter::max_limit_no_minimum(); @@ -1072,8 +1072,8 @@ fn controller_transfer() { fn controller_transfer_unauthorized_agent() { ExtBuilder::default().build().execute_with(|| { // First we need to create a collection and mint one NFT - let alice: User = User::new(AccountKeyring::Alice); - let bob: User = User::new(AccountKeyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); let asset_id = create_nft_collection( alice.clone(), @@ -1108,8 +1108,8 @@ fn controller_transfer_unauthorized_agent() { fn controller_transfer_nft_not_owned() { ExtBuilder::default().build().execute_with(|| { // First we need to create a collection and mint one NFT - let alice: User = User::new(AccountKeyring::Alice); - let bob: User = User::new(AccountKeyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); let asset_id = create_nft_collection( alice.clone(), @@ -1143,7 +1143,7 @@ fn controller_transfer_nft_not_owned() { #[test] fn redeem_wrong_number_of_keys() { ExtBuilder::default().build().execute_with(|| { - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let collection_keys: NFTCollectionKeys = vec![ AssetMetadataKey::Local(AssetMetadataLocalKey(1)), @@ -1188,8 +1188,8 @@ fn redeem_wrong_number_of_keys() { #[test] fn redeem_locked_nft() { ExtBuilder::default().build().execute_with(|| { - let bob: User = User::new(AccountKeyring::Bob); - let alice: User = User::new(AccountKeyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); let asset_id = create_nft_collection( alice.clone(), @@ -1230,8 +1230,8 @@ fn redeem_locked_nft() { #[test] fn reject_instruction_with_locked_asset() { ExtBuilder::default().build().execute_with(|| { - let bob: User = User::new(AccountKeyring::Bob); - let alice: User = User::new(AccountKeyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); let asset_id = create_nft_collection( alice.clone(), diff --git a/pallets/runtime/tests/src/pips_test.rs b/pallets/runtime/tests/src/pips_test.rs index 6bb1b7f23b..def0a4299a 100644 --- a/pallets/runtime/tests/src/pips_test.rs +++ b/pallets/runtime/tests/src/pips_test.rs @@ -9,7 +9,8 @@ use super::{ }; use frame_support::{ assert_noop, assert_ok, - dispatch::{DispatchError, DispatchResult}, + dispatch::DispatchResult, + pallet_prelude::DispatchError, traits::{LockableCurrency, WithdrawReasons}, }; use frame_system::{self, EventRecord}; @@ -23,7 +24,7 @@ use pallet_pips::{ }; use pallet_treasury as treasury; use polymesh_primitives::{AccountId, BlockNumber, MaybeBlock, Url, GC_DID}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use std::ops::Deref; type System = frame_system::Pallet; @@ -218,7 +219,7 @@ fn updating_pips_variables_works() { fn updating_pips_variables_only_root() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let signer = Origin::signed(AccountKeyring::Alice.to_account_id()); + let signer = Origin::signed(Sr25519Keyring::Alice.to_account_id()); System::reset_events(); assert_noop!( @@ -252,8 +253,8 @@ fn historical_prune_works() { // We just test one case for brevity. System::set_block_number(1); assert_ok!(Pips::set_prune_historical_pips(root(), true)); - let proposer = User::new(AccountKeyring::Alice); - let member = User::new(AccountKeyring::Bob); + let proposer = User::new(Sr25519Keyring::Alice); + let member = User::new(Sr25519Keyring::Bob); assert_pruned(rejected_proposal(proposer)); set_members(vec![member.did]); @@ -270,7 +271,7 @@ fn min_deposit_works() { let deposit = 40; assert_ok!(Pips::set_min_proposal_deposit(root(), deposit + 1)); - let alice = User::new(AccountKeyring::Alice).balance(300); + let alice = User::new(Sr25519Keyring::Alice).balance(300); // Error when min deposit requirements are not met. assert_eq!(PipIdSequence::::get(), PipId(0)); @@ -302,7 +303,7 @@ fn active_limit_works() { System::set_block_number(1); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); - let proposer = User::new(AccountKeyring::Alice); + let proposer = User::new(Sr25519Keyring::Alice); assert_eq!(PipIdSequence::::get(), PipId(0)); assert_eq!(ActivePipCount::::get(), 0); @@ -340,7 +341,7 @@ fn default_enactment_period_works_community() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let alice = User::new(AccountKeyring::Alice).balance(300); + let alice = User::new(Sr25519Keyring::Alice).balance(300); set_members(vec![alice.did]); let check_community = |period| { @@ -372,7 +373,7 @@ fn default_enactment_period_works_committee() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let alice = User::new(AccountKeyring::Alice).balance(300); + let alice = User::new(Sr25519Keyring::Alice).balance(300); set_members(vec![alice.did]); let check_committee = |period| { @@ -400,7 +401,7 @@ fn skip_limit_works() { System::set_block_number(1); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); - let alice = User::new(AccountKeyring::Alice).balance(300); + let alice = User::new(Sr25519Keyring::Alice).balance(300); set_members(vec![alice.did]); let snap = || Pips::snapshot(alice.origin()).unwrap(); @@ -461,7 +462,7 @@ fn proposal_details_are_correct() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(42); - let alice = User::new(AccountKeyring::Alice).balance(300); + let alice = User::new(Sr25519Keyring::Alice).balance(300); let call = make_remark_proposal(); let proposal_url: Url = b"www.abc.com".into(); @@ -496,7 +497,7 @@ fn proposal_details_are_correct() { created_at: 42, url: Some(proposal_url), description: Some(proposal_desc), - transaction_version: 7, + transaction_version: 8, expiry: <_>::default(), }; assert_eq!( @@ -513,7 +514,7 @@ fn proposal_details_are_correct() { fn proposal_limits_are_enforced() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(42); - let proposer = User::new(AccountKeyring::Alice).balance(300); + let proposer = User::new(Sr25519Keyring::Alice).balance(300); let propose = |url, desc| { proposal( &proposer.origin(), @@ -543,7 +544,7 @@ fn propose_committee_pip_only_zero_deposit() { fn vote_no_such_proposal() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let voter = User::new(AccountKeyring::Bob); + let voter = User::new(Sr25519Keyring::Bob); assert_no_pip!(Pips::vote(voter.origin(), PipId(0), false, 0)); }); } @@ -556,8 +557,8 @@ fn vote_not_pending() { assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); assert_ok!(Pips::set_prune_historical_pips(root(), false)); - let proposer = User::new(AccountKeyring::Alice); - let member = User::new(AccountKeyring::Bob); + let proposer = User::new(Sr25519Keyring::Alice); + let member = User::new(Sr25519Keyring::Bob); set_members(vec![member.did]); op_and_check(member.origin(), rejected_proposal(proposer)); @@ -582,7 +583,7 @@ fn vote_bond_additional_deposit_works() { System::set_block_number(1); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); - let proposer = User::new(AccountKeyring::Alice); + let proposer = User::new(Sr25519Keyring::Alice); let init_free = Balances::free_balance(&proposer.acc()); let init_amount = 300; let then_amount = 137; @@ -607,8 +608,8 @@ fn vote_owner_below_min_deposit() { let sub = min - 1; assert_ok!(Pips::set_min_proposal_deposit(root(), min)); - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); assert_ok!(community_proposal(alice, 100)); assert_noop!( @@ -646,7 +647,7 @@ fn vote_unbond_deposit_works() { System::set_block_number(1); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); - let proposer = User::new(AccountKeyring::Alice); + let proposer = User::new(Sr25519Keyring::Alice); let init_free = Balances::free_balance(&proposer.acc()); let init_amount = 200; let then_amount = 100; @@ -667,7 +668,7 @@ fn vote_on_community_only() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); assert_ok!(committee_proposal(0)); - let voter = User::new(AccountKeyring::Alice); + let voter = User::new(Sr25519Keyring::Alice); assert_noop!( Pips::vote(voter.origin(), PipId(0), false, 0), Error::NotFromCommunity @@ -680,7 +681,7 @@ fn vote_duplicate_ok() { ExtBuilder::default().monied(true).build().execute_with(|| { System::set_block_number(1); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); - let proposer = User::new(AccountKeyring::Alice); + let proposer = User::new(Sr25519Keyring::Alice); let vote = |aye, power| Pips::vote(proposer.origin(), PipId(0), aye, power); let res = || ProposalResult::::get(PipId(0)); @@ -738,8 +739,8 @@ fn vote_stake_overflow() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let alice = User::new(AccountKeyring::Alice).balance(u128::MAX); - let bob = User::new(AccountKeyring::Bob).balance(100); + let alice = User::new(Sr25519Keyring::Alice).balance(u128::MAX); + let bob = User::new(Sr25519Keyring::Bob).balance(100); let id = PipId(0); assert_ok!(community_proposal(alice, u128::MAX)); @@ -771,7 +772,7 @@ fn vote_insufficient_reserve() { .execute_with(|| { System::set_block_number(1); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); - let proposer = User::new(AccountKeyring::Alice).balance(0); + let proposer = User::new(Sr25519Keyring::Alice).balance(0); let id = PipId(0); assert_ok!(community_proposal(proposer, 0)); assert_noop!( @@ -790,10 +791,10 @@ fn vote_works() { ExtBuilder::default().monied(true).build().execute_with(|| { System::set_block_number(1); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let bob_balance = Balances::free_balance(&bob.acc()); - let charlie = User::new(AccountKeyring::Charlie); + let charlie = User::new(Sr25519Keyring::Charlie); let charlie_balance = Balances::free_balance(&charlie.acc()); let id = PipId(0); @@ -840,7 +841,7 @@ fn voting_for_pip_uses_stack_over_overlay() { assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); // Initialize with 100 POLYX. - let alice = User::new(AccountKeyring::Alice).balance(100); + let alice = User::new(Sr25519Keyring::Alice).balance(100); // Lock all but 10. Balances::set_lock(*b"deadbeef", &alice.acc(), 90, WithdrawReasons::all()); assert_balance(alice.acc(), 100, 90); @@ -862,8 +863,8 @@ fn approve_committee_proposal_not_pending() { assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); assert_ok!(Pips::set_prune_historical_pips(root(), false)); - let proposer = User::new(AccountKeyring::Bob); - let member = User::new(AccountKeyring::Alice); + let proposer = User::new(Sr25519Keyring::Bob); + let member = User::new(Sr25519Keyring::Alice); set_members(vec![member.did]); let acp_bad_state = |id| assert_bad_state!(Pips::approve_committee_proposal(gc_vmo(), id)); @@ -888,7 +889,7 @@ fn approve_committee_proposal_not_by_committee() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); - let proposer = User::new(AccountKeyring::Bob); + let proposer = User::new(Sr25519Keyring::Bob); assert_ok!(community_proposal(proposer, 0)); assert_noop!( Pips::approve_committee_proposal(gc_vmo(), PipId(0)), @@ -903,11 +904,11 @@ fn only_gc_majority_stuff() { System::set_block_number(1); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); - let proposer = User::new(AccountKeyring::Dave); + let proposer = User::new(Sr25519Keyring::Dave); - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); set_members(vec![bob.did, charlie.did]); // Make a proposal @@ -1116,8 +1117,8 @@ fn cannot_reject_incorrect_state() { assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); assert_ok!(Pips::set_prune_historical_pips(root(), false)); - let proposer = User::new(AccountKeyring::Alice); - let member = User::new(AccountKeyring::Bob); + let proposer = User::new(Sr25519Keyring::Alice); + let member = User::new(Sr25519Keyring::Bob); set_members(vec![member.did]); let reject_bad_state = |id| assert_bad_state!(Pips::reject_proposal(gc_vmo(), id)); @@ -1158,8 +1159,8 @@ fn can_prune_states_that_cannot_be_rejected() { assert_ok!(Pips::set_prune_historical_pips(root(), false)); let init_bal = 1000; - let proposer = User::new(AccountKeyring::Alice).balance(init_bal); - let member = User::new(AccountKeyring::Bob); + let proposer = User::new(Sr25519Keyring::Alice).balance(init_bal); + let member = User::new(Sr25519Keyring::Bob); set_members(vec![member.did]); // Can prune executed: @@ -1237,8 +1238,8 @@ fn cannot_prune_active() { System::set_block_number(1); let init_bal = 300; - let proposer = User::new(AccountKeyring::Bob).balance(init_bal); - let member = User::new(AccountKeyring::Alice); + let proposer = User::new(Sr25519Keyring::Bob).balance(init_bal); + let member = User::new(Sr25519Keyring::Alice); set_members(vec![member.did]); // Alice starts a proposal with some deposit. @@ -1278,8 +1279,8 @@ fn reject_proposal_works() { System::set_block_number(1); let init_bal = 300; - let proposer = User::new(AccountKeyring::Bob).balance(init_bal); - let member = User::new(AccountKeyring::Alice); + let proposer = User::new(Sr25519Keyring::Bob).balance(init_bal); + let member = User::new(Sr25519Keyring::Alice); set_members(vec![member.did]); // Alice starts a proposal with some deposit. @@ -1371,8 +1372,8 @@ fn reject_proposal_will_unsnapshot() { assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); assert_ok!(Pips::set_prune_historical_pips(root(), false)); - let proposer = User::new(AccountKeyring::Alice); - let member = User::new(AccountKeyring::Bob).balance(300); + let proposer = User::new(Sr25519Keyring::Alice); + let member = User::new(Sr25519Keyring::Bob).balance(300); set_members(vec![member.did]); let id = PipId(0); @@ -1391,7 +1392,7 @@ fn reject_proposal_will_unschedule() { assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); assert_ok!(Pips::set_prune_historical_pips(root(), false)); - let alice = User::new(AccountKeyring::Alice).balance(300); + let alice = User::new(Sr25519Keyring::Alice).balance(300); set_members(vec![alice.did]); let check = |id: PipId| { @@ -1425,9 +1426,9 @@ fn reschedule_execution_only_release_coordinator() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); set_members(vec![alice.did, bob.did, charlie.did]); assert_ok!(Committee::set_release_coordinator(gc_vmo(), charlie.did)); @@ -1456,7 +1457,7 @@ fn reschedule_execution_only_release_coordinator() { } fn init_rc() -> User { - let user = User::new(AccountKeyring::Alice); + let user = User::new(Sr25519Keyring::Alice); set_members(vec![user.did]); assert_ok!(Committee::set_release_coordinator(gc_vmo(), user.did)); user @@ -1476,7 +1477,7 @@ fn reschedule_execution_not_scheduled() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); let rc = init_rc(); - let proposer = User::new(AccountKeyring::Bob); + let proposer = User::new(Sr25519Keyring::Bob); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); let id = PipIdSequence::::get(); assert_ok!(community_proposal(proposer, 0)); @@ -1499,7 +1500,7 @@ fn reschedule_execution_in_the_past() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); let rc = init_rc(); - let proposer = User::new(AccountKeyring::Bob); + let proposer = User::new(Sr25519Keyring::Bob); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); let id = scheduled_proposal(proposer, rc, 0); let next = System::block_number() + 1; @@ -1521,7 +1522,7 @@ fn reschedule_execution_works() { // General setup. let rc = init_rc(); - let proposer = User::new(AccountKeyring::Bob); + let proposer = User::new(Sr25519Keyring::Bob); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); // Schedule a proposal and verify that it is. @@ -1560,7 +1561,7 @@ fn clear_snapshot_not_gc_member() { System::set_block_number(1); init_rc(); assert_bad_origin!(Pips::clear_snapshot(root())); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); assert_noop!( Pips::clear_snapshot(bob.origin()), Error::NotACommitteeMember, @@ -1581,7 +1582,7 @@ fn clear_snapshot_works() { assert_eq!(SnapshotMeta::::get(), None); // Make a snapshot with something and clear it. - let proposer = User::new(AccountKeyring::Bob); + let proposer = User::new(Sr25519Keyring::Bob); assert_ok!(community_proposal(proposer, 100)); assert_ok!(community_proposal(proposer, 200)); assert_ok!(community_proposal(proposer, 400)); @@ -1600,7 +1601,7 @@ fn snapshot_not_gc_member() { System::set_block_number(1); init_rc(); assert_bad_origin!(Pips::snapshot(root())); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); assert_noop!(Pips::snapshot(bob.origin()), Error::NotACommitteeMember); }); } @@ -1613,7 +1614,7 @@ fn snapshot_only_pending_hot_community() { assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); - let proposer = User::new(AccountKeyring::Bob); + let proposer = User::new(Sr25519Keyring::Bob); let r = rejected_proposal(proposer); let e = executed_community_proposal(proposer, rc); @@ -1644,12 +1645,12 @@ fn snapshot_works() { ExtBuilder::default().monied(true).build().execute_with(|| { System::set_block_number(1); - let proposer = User::new(AccountKeyring::Alice); + let proposer = User::new(Sr25519Keyring::Alice); let propose = |d| { assert_ok!(community_proposal(proposer, d)); }; - let member = User::new(AccountKeyring::Bob); + let member = User::new(Sr25519Keyring::Bob); set_members(vec![member.did]); let vote = |id, aye, deposit| Pips::vote(member.origin(), PipId(id), aye, deposit); let snapshot = || Pips::snapshot(member.origin()); @@ -1710,8 +1711,8 @@ fn enact_snapshot_results_input_too_large() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let proposer = User::new(AccountKeyring::Alice); - let member = User::new(AccountKeyring::Bob); + let proposer = User::new(Sr25519Keyring::Alice); + let member = User::new(Sr25519Keyring::Bob); set_members(vec![member.did]); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); @@ -1753,12 +1754,12 @@ fn enact_snapshot_results_id_mismatch() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let user = User::new(AccountKeyring::Bob); + let user = User::new(Sr25519Keyring::Bob); set_members(vec![user.did]); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); - let proposer = User::new(AccountKeyring::Alice); + let proposer = User::new(Sr25519Keyring::Alice); assert_ok!(community_proposal(proposer, 0)); assert_ok!(community_proposal(proposer, 0)); @@ -1785,12 +1786,12 @@ fn enact_snapshot_results_works() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let proposer = User::new(AccountKeyring::Alice); + let proposer = User::new(Sr25519Keyring::Alice); let propose = || { assert_ok!(community_proposal(proposer, 0)); }; - let member = User::new(AccountKeyring::Bob); + let member = User::new(Sr25519Keyring::Bob); set_members(vec![member.did]); assert_ok!(Pips::set_prune_historical_pips(root(), false)); @@ -1854,7 +1855,7 @@ fn expiry_works() { // Test non-prune logic. Prune logic is tested elsewhere. assert_ok!(Pips::set_prune_historical_pips(root(), false)); - let proposer = User::new(AccountKeyring::Bob); + let proposer = User::new(Sr25519Keyring::Bob); let id = expired_proposal(proposer, 13); assert_state(id, true, ProposalState::Expired); // Travel back in time, and ensure expiry is sticky. @@ -1865,7 +1866,7 @@ fn expiry_works() { // Make sure non-pending PIPs cannot expire. assert_ok!(Pips::set_prune_historical_pips(root(), false)); assert_ok!(Pips::set_pending_pip_expiry(root(), MaybeBlock::Some(13))); - let member = User::new(AccountKeyring::Alice); + let member = User::new(Sr25519Keyring::Alice); set_members(vec![member.did]); let r = rejected_proposal(proposer); let e = executed_community_proposal(proposer, member); @@ -1892,7 +1893,7 @@ fn propose_dupe_live_insert_panics() { // Returns an error since pip_id is already in the live queue assert_eq!( - community_proposal(User::new(AccountKeyring::Alice), 0).unwrap_err(), + community_proposal(User::new(Sr25519Keyring::Alice), 0).unwrap_err(), Error::InvalidPipId.into() ); }); @@ -1905,7 +1906,7 @@ fn execute_scheduled_pip() { assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); assert_ok!(Pips::set_prune_historical_pips(root(), true)); let pip_id = PipIdSequence::::get(); - let user = User::new(AccountKeyring::Alice); + let user = User::new(Sr25519Keyring::Alice); assert_ok!(remark_proposal(user, 0)); set_members(vec![user.did]); assert_ok!(Pips::snapshot(user.origin())); @@ -1926,7 +1927,7 @@ fn expire_scheduled_pip() { assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); assert_ok!(Pips::set_prune_historical_pips(root(), true)); let pip_id = PipIdSequence::::get(); - let user = User::new(AccountKeyring::Alice); + let user = User::new(Sr25519Keyring::Alice); assert_ok!(remark_proposal(user, 0)); assert_state(pip_id, false, ProposalState::Pending); assert_ok!(Pips::expire_scheduled_pip(root(), GC_DID, pip_id)); @@ -1940,7 +1941,7 @@ fn live_queue_off_by_one_insertion_regression_test() { System::set_block_number(1); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); - let proposer = User::new(AccountKeyring::Alice); + let proposer = User::new(Sr25519Keyring::Alice); assert_ok!(community_proposal(proposer, 2)); assert_ok!(community_proposal(proposer, 4)); assert_eq!( @@ -1948,7 +1949,7 @@ fn live_queue_off_by_one_insertion_regression_test() { vec![spip(0, true, 2), spip(1, true, 4)] ); - let user = User::new(AccountKeyring::Bob); + let user = User::new(Sr25519Keyring::Bob); assert_ok!(Pips::vote(user.origin(), PipId(0), true, 1)); assert_eq!( LiveQueue::::get(), @@ -1964,8 +1965,8 @@ fn live_queue_off_by_one_insertion_regression_test2() { assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); assert_ok!(Pips::set_active_pip_limit(root(), 0)); - let proposer = User::new(AccountKeyring::Alice); - let voter = User::new(AccountKeyring::Bob); + let proposer = User::new(Sr25519Keyring::Alice); + let voter = User::new(Sr25519Keyring::Bob); assert_ok!(community_proposal(proposer, 0)); // 0 assert_ok!(community_proposal(proposer, 0)); // 1 @@ -1982,9 +1983,9 @@ fn live_queue_off_by_one_insertion_regression_test2() { #[test] fn pips_rpcs() { ExtBuilder::default().monied(true).build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); System::set_block_number(1); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); @@ -2014,7 +2015,7 @@ fn pips_rpcs() { } ); assert_eq!( - Pips::proposed_by(Proposer::Community(AccountKeyring::Alice.to_account_id())), + Pips::proposed_by(Proposer::Community(Sr25519Keyring::Alice.to_account_id())), vec![pip_id1, pip_id0], ); assert_eq!(Pips::voted_on(bob.acc()), vec![pip_id1, pip_id0]); @@ -2027,10 +2028,10 @@ fn prune_data_with_leftover() { System::set_block_number(1); // Creates a proposal and 3 users vote on it - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); - let charlie = User::new(AccountKeyring::Charlie); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); + let charlie = User::new(Sr25519Keyring::Charlie); assert_ok!(Pips::set_min_proposal_deposit(root(), 0)); assert_ok!(community_proposal(alice, 0)); diff --git a/pallets/runtime/tests/src/portfolio.rs b/pallets/runtime/tests/src/portfolio.rs index c2337b6c43..6b356c31c4 100644 --- a/pallets/runtime/tests/src/portfolio.rs +++ b/pallets/runtime/tests/src/portfolio.rs @@ -1,5 +1,5 @@ use frame_support::{assert_noop, assert_ok}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use pallet_nft::NFTOwner; use pallet_portfolio::{ @@ -34,7 +34,7 @@ type Portfolio = pallet_portfolio::Pallet; type Settlement = pallet_settlement::Pallet; fn create_portfolio() -> (User, PortfolioNumber) { - let owner = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Alice); let name = PortfolioName::from([42u8].to_vec()); let num = NextPortfolioNumber::::get(&owner.did); assert_eq!(num, PortfolioNumber(1)); @@ -70,7 +70,7 @@ macro_rules! assert_owner_is_custodian { #[test] fn portfolio_name_too_long() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Alice); let id = NextPortfolioNumber::::get(owner.did); let create = |name| Portfolio::create_portfolio(owner.origin(), name); let rename = |name| Portfolio::rename_portfolio(owner.origin(), id, name); @@ -85,7 +85,7 @@ fn portfolio_name_too_long() { #[test] fn portfolio_name_taken() { ExtBuilder::default().build().execute_with(|| { - let owner = User::new(AccountKeyring::Alice); + let owner = User::new(Sr25519Keyring::Alice); let id = NextPortfolioNumber::::get(owner.did); let create = |name: &str| Portfolio::create_portfolio(owner.origin(), name.into()); let rename = |name: &str| Portfolio::rename_portfolio(owner.origin(), id, name.into()); @@ -235,7 +235,7 @@ fn do_move_asset_from_portfolio(memo: Option) { System::set_block_number(1); // This is needed to enable events. let (owner, num) = create_portfolio(); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); let asset_id = create_and_issue_sample_asset(&owner); assert_eq!( @@ -535,7 +535,7 @@ fn can_lock_unlock_assets() { fn can_take_custody_of_portfolios() { ExtBuilder::default().build().execute_with(|| { let (owner, num) = create_portfolio(); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); let owner_default_portfolio = PortfolioId::default_portfolio(owner.did); let owner_user_portfolio = PortfolioId::user_portfolio(owner.did, num); @@ -624,7 +624,7 @@ fn can_take_custody_of_portfolios() { fn quit_portfolio_custody() { ExtBuilder::default().build().execute_with(|| { let (alice, num) = create_portfolio(); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); let user_portfolio = PortfolioId::user_portfolio(alice.did, num); assert_noop!( @@ -646,7 +646,7 @@ fn quit_portfolio_custody() { fn delete_portfolio_with_nfts() { ExtBuilder::default().build().execute_with(|| { // First we need to create a collection and mint one NFT - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); Portfolio::create_portfolio( alice.clone().origin(), PortfolioName(b"MyPortfolio".to_vec()), @@ -682,8 +682,8 @@ fn delete_portfolio_with_nfts() { fn delete_portfolio_with_locked_nfts() { ExtBuilder::default().build().execute_with(|| { // First we need to create a collection, mint one NFT and lock it - let alice: User = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); Portfolio::create_portfolio( alice.clone().origin(), PortfolioName(b"MyPortfolio".to_vec()), @@ -743,7 +743,7 @@ fn delete_portfolio_with_locked_nfts() { fn move_nft_not_in_portfolio() { ExtBuilder::default().build().execute_with(|| { // First we need to create a collection, mint one NFT, and create one portfolio - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId { did: alice.did, kind: PortfolioKind::Default, @@ -794,7 +794,7 @@ fn move_nft_not_in_portfolio() { fn move_portfolio_nfts() { ExtBuilder::default().build().execute_with(|| { // First we need to create a collection, mint two NFTs, and create one portfolio - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId { did: alice.did, kind: PortfolioKind::Default, @@ -879,7 +879,7 @@ fn move_portfolio_nfts() { #[test] fn move_more_funds() { ExtBuilder::default().build().execute_with(|| { - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId { did: alice.did, kind: PortfolioKind::Default, @@ -929,7 +929,7 @@ fn move_more_funds() { #[test] fn empty_fungible_move() { ExtBuilder::default().build().execute_with(|| { - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId { did: alice.did, kind: PortfolioKind::Default, @@ -966,7 +966,7 @@ fn empty_fungible_move() { #[test] fn empty_nft_move() { ExtBuilder::default().build().execute_with(|| { - let alice: User = User::new(AccountKeyring::Alice); + let alice: User = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId { did: alice.did, kind: PortfolioKind::Default, @@ -1000,7 +1000,7 @@ fn empty_nft_move() { #[test] fn pre_approve_portfolio() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); let alice_user_porfolio = PortfolioId::user_portfolio(alice.did, PortfolioNumber(1)); Portfolio::create_portfolio(alice.origin(), b"AliceUserPortfolio".into()).unwrap(); @@ -1031,7 +1031,7 @@ fn pre_approve_portfolio() { #[test] fn remove_portfolio_pre_approval() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); let alice_user_porfolio = PortfolioId::user_portfolio(alice.did, PortfolioNumber(1)); Portfolio::create_portfolio(alice.origin(), b"AliceUserPortfolio".into()).unwrap(); @@ -1068,9 +1068,9 @@ fn remove_portfolio_pre_approval() { #[test] fn unauthorized_custodian_pre_approval() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let eve = User::new(AccountKeyring::Eve); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let eve = User::new(Sr25519Keyring::Eve); let alice_user_porfolio = PortfolioId::user_portfolio(alice.did, PortfolioNumber(1)); Portfolio::create_portfolio(alice.origin(), b"AliceUserPortfolio".into()).unwrap(); @@ -1098,8 +1098,8 @@ fn unauthorized_custodian_pre_approval() { #[test] fn create_custody_portfolio_missing_owners_permission() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let portfolio_name = PortfolioName("AliceOwnsBobControls".as_bytes().to_vec()); assert_noop!( @@ -1116,8 +1116,8 @@ fn create_custody_portfolio_missing_owners_permission() { #[test] fn create_custody_portfolio() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let portfolio_number = PortfolioNumber(1); let portfolio_name = PortfolioName("AliceOwnsBobControls".as_bytes().to_vec()); let portfolio_id = PortfolioId { @@ -1155,8 +1155,8 @@ fn create_custody_portfolio() { #[test] fn create_custody_portfolio_revoke_permission() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let portfolio_name = PortfolioName("AliceOwnsBobControls".as_bytes().to_vec()); assert_ok!(Portfolio::allow_identity_to_create_portfolios( @@ -1188,7 +1188,7 @@ fn create_custody_portfolio_revoke_permission() { #[test] fn allow_identity_to_create_portfolios_not_allowed() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); assert_noop!( Portfolio::allow_identity_to_create_portfolios(alice.origin(), alice.did), @@ -1200,8 +1200,8 @@ fn allow_identity_to_create_portfolios_not_allowed() { #[test] fn assign_custody_of_default_portfolio() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let portfolio_id = PortfolioId::new(alice.did, PortfolioKind::Default); let auth_id = Identity::add_auth( diff --git a/pallets/runtime/tests/src/protocol_fee.rs b/pallets/runtime/tests/src/protocol_fee.rs index f051848a2a..61dbf66e90 100644 --- a/pallets/runtime/tests/src/protocol_fee.rs +++ b/pallets/runtime/tests/src/protocol_fee.rs @@ -6,7 +6,7 @@ use super::{ use frame_support::{assert_noop, assert_ok}; use polymesh_common_utilities::protocol_fee::ProtocolOp; use polymesh_primitives::traits::CddAndFeeDetails; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; type Error = pallet_protocol_fee::Error; type ProtocolFee = pallet_protocol_fee::Pallet; @@ -25,12 +25,12 @@ fn can_compute_fee() { fn can_charge_fee_batch() { ExtBuilder::default().build().execute_with(|| { let _ = - register_keyring_account_with_balance(AccountKeyring::Alice, PROTOCOL_OP_BASE_FEE * 10) + register_keyring_account_with_balance(Sr25519Keyring::Alice, PROTOCOL_OP_BASE_FEE * 10) .unwrap(); - TestStorage::set_payer_context(Some(AccountKeyring::Alice.to_account_id())); + TestStorage::set_payer_context(Some(Sr25519Keyring::Alice.to_account_id())); assert_eq!( TestStorage::get_payer_from_context(), - Some(AccountKeyring::Alice.to_account_id()) + Some(Sr25519Keyring::Alice.to_account_id()) ); assert_ok!(ProtocolFee::batch_charge_fee(ProtocolOp::AssetIssue, 7)); assert_noop!( diff --git a/pallets/runtime/tests/src/relayer_test.rs b/pallets/runtime/tests/src/relayer_test.rs index ce7271db59..28aa5aa596 100644 --- a/pallets/runtime/tests/src/relayer_test.rs +++ b/pallets/runtime/tests/src/relayer_test.rs @@ -1,25 +1,23 @@ -use super::{ - storage::{get_last_auth_id, make_account_without_cdd, RuntimeCall, TestStorage, User}, - ExtBuilder, -}; -use frame_support::{ - assert_noop, assert_ok, - dispatch::{DispatchInfo, Pays, PostDispatchInfo, Weight}, -}; +use frame_support::dispatch::{DispatchInfo, Pays, PostDispatchInfo}; +use frame_support::weights::Weight; +use frame_support::{assert_noop, assert_ok}; use frame_system; +use sp_keyring::Sr25519Keyring; +use sp_runtime::traits::{Dispatchable, TransactionExtension, TxBaseImplication}; +use sp_runtime::transaction_validity::TransactionSource; +use sp_runtime::transaction_validity::{InvalidTransaction, TransactionValidityError}; +use sp_runtime::MultiAddress; + use pallet_relayer::Subsidy; use polymesh_common_utilities::protocol_fee::ProtocolOp; -use polymesh_primitives::{ - constants::currency::POLY, traits::CddAndFeeDetails, AccountId, Balance, Signatory, Ticker, - TransactionError, -}; +use polymesh_primitives::constants::currency::POLY; +use polymesh_primitives::traits::CddAndFeeDetails; +use polymesh_primitives::{AccountId, Balance, Signatory, Ticker, TransactionError}; use polymesh_runtime_develop::runtime::{CddHandler, RuntimeCall as DevRuntimeCall}; -use sp_keyring::AccountKeyring; -use sp_runtime::{ - traits::{Dispatchable, SignedExtension}, - transaction_validity::{InvalidTransaction, TransactionValidityError}, - MultiAddress, -}; +use polymesh_transaction_payment::Val; + +use super::storage::{get_last_auth_id, make_account_without_cdd, RuntimeCall, TestStorage, User}; +use super::ExtBuilder; type Relayer = pallet_relayer::Pallet; type Subsidies = pallet_relayer::Subsidies; @@ -28,16 +26,17 @@ type AccountKeyRefCount = pallet_identity::AccountKeyRefCount; type Balances = pallet_balances::Pallet; type ProtocolFee = pallet_protocol_fee::Pallet; type TransactionPayment = pallet_transaction_payment::Pallet; -type ChargeTransactionPayment = pallet_transaction_payment::ChargeTransactionPayment; +type ChargeTransactionPayment = polymesh_transaction_payment::ChargeTransactionPayment; type Error = pallet_relayer::Error; type IdentityError = pallet_identity::Error; +type RuntimeOrigin = ::RuntimeOrigin; // Relayer Test Helper functions // ======================================= fn call_balance_transfer(val: Balance) -> RuntimeCall { - RuntimeCall::Balances(pallet_balances::Call::transfer { - dest: MultiAddress::Id(AccountKeyring::Alice.to_account_id()), + RuntimeCall::Balances(pallet_balances::Call::transfer_allow_death { + dest: MultiAddress::Id(Sr25519Keyring::Alice.to_account_id()), value: val, }) } @@ -71,14 +70,14 @@ fn call_relayer_remove_paying_key(user_key: AccountId, paying_key: AccountId) -> /// create a transaction info struct from weight. Handy to avoid building the whole struct. pub fn info_from_weight(w: u64) -> DispatchInfo { DispatchInfo { - weight: Weight::from_ref_time(w), + call_weight: Weight::from_parts(w, 0), ..Default::default() } } fn post_info_from_weight(w: u64) -> PostDispatchInfo { PostDispatchInfo { - actual_weight: Some(Weight::from_ref_time(w)), + actual_weight: Some(Weight::from_parts(w, 0)), pays_fee: Pays::Yes, } } @@ -101,21 +100,34 @@ fn assert_subsidy(user: User, subsidy: Option<(User, Balance)>) { } fn assert_invalid_subsidy_call(caller: &AccountId, call: &RuntimeCall) { - let len = 10; + let origin = RuntimeOrigin::signed(caller.clone()); + let expected_err = TransactionValidityError::Invalid(InvalidTransaction::Custom( TransactionError::PalletNotSubsidised as u8, )); - // test `validate` let pre_err = ChargeTransactionPayment::from(0) - .validate(caller, call, &info_from_weight(5), len) + .validate( + origin.clone(), + call, + &info_from_weight(5), + 10, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) .map(|_| ()) .unwrap_err(); assert_eq!(pre_err, expected_err); - // test `pre_dispatch` + let val_charge = Val::Charge { + tip: 0, + who: caller.clone(), + fee_with_tip: 1, + subsidiser: None, + }; let pre_err = ChargeTransactionPayment::from(0) - .pre_dispatch(caller, call, &info_from_weight(5), len) + .prepare(val_charge, &origin, call, &info_from_weight(5), 10) .map(|_| ()) .unwrap_err(); assert_eq!(pre_err, expected_err); @@ -146,9 +158,9 @@ fn basic_relayer_paying_key_test() { .execute_with(&do_basic_relayer_paying_key_test); } fn do_basic_relayer_paying_key_test() { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); - let dave = User::new(AccountKeyring::Dave); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let dave = User::new(Sr25519Keyring::Dave); // Add authorization for using Alice as the paying key for Bob. assert_ok!(Relayer::set_paying_key(alice.origin(), bob.acc(), 10u128)); @@ -237,8 +249,8 @@ fn update_polyx_limit_test() { .execute_with(&do_update_polyx_limit_test); } fn do_update_polyx_limit_test() { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); enum Action { Set, @@ -293,9 +305,9 @@ fn accept_new_paying_key_test() { .execute_with(&do_accept_new_paying_key_test); } fn do_accept_new_paying_key_test() { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); - let dave = User::new(AccountKeyring::Dave); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let dave = User::new(Sr25519Keyring::Dave); let assert_usages = |bob_cnt, alice_cnt, dave_cnt| { assert_key_usage(bob, bob_cnt); @@ -335,8 +347,8 @@ fn user_remove_paying_key_test() { .execute_with(&do_user_remove_paying_key_test); } fn do_user_remove_paying_key_test() { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); setup_subsidy(bob, alice, 2000); @@ -364,8 +376,8 @@ fn relayer_user_key_without_cdd_test() { .execute_with(&do_relayer_user_key_without_cdd_test); } fn do_relayer_user_key_without_cdd_test() { - let alice = User::new(AccountKeyring::Alice); - let bob_acc = AccountKeyring::Bob.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob_acc = Sr25519Keyring::Bob.to_account_id(); let (bob_sign, _) = make_account_without_cdd(bob_acc.clone()).unwrap(); // Add authorization for using Alice as the paying key for Bob. @@ -388,8 +400,8 @@ fn relayer_paying_key_without_cdd_test() { .execute_with(&do_relayer_paying_key_without_cdd_test); } fn do_relayer_paying_key_without_cdd_test() { - let alice = User::new(AccountKeyring::Alice); - let bob_acc = AccountKeyring::Bob.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob_acc = Sr25519Keyring::Bob.to_account_id(); let (bob_sign, _) = make_account_without_cdd(bob_acc.clone()).unwrap(); // Add authorization for using Bob as the paying key for Alice. @@ -410,8 +422,8 @@ fn user_remove_paying_key_transaction_fee_test() { .execute_with(&do_user_remove_paying_key_transaction_fee_test); } fn do_user_remove_paying_key_transaction_fee_test() { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let prev_alice_balance = Balances::free_balance(&alice.acc()); let prev_bob_balance = Balances::free_balance(&bob.acc()); @@ -438,8 +450,26 @@ fn do_user_remove_paying_key_transaction_fee_test() { let transaction_fee = TransactionPayment::compute_fee(len as u32, &call_info, 0); // 1. Call `pre_dispatch`. + let val = ChargeTransactionPayment::from(0) + .validate( + RuntimeOrigin::signed(bob.acc()), + &call, + &call_info, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) + .unwrap(); + let pre = ChargeTransactionPayment::from(0) - .pre_dispatch(&bob.acc(), &call, &call_info, len) + .prepare( + val.1, + &RuntimeOrigin::signed(bob.acc()), + &call, + &call_info, + len, + ) .unwrap(); // 2. Execute extrinsic. @@ -447,9 +477,9 @@ fn do_user_remove_paying_key_transaction_fee_test() { // 3. Call `post_dispatch`. assert!(ChargeTransactionPayment::post_dispatch( - Some(pre), + pre, &call_info, - &post_info_from_weight(5), + &mut post_info_from_weight(5), len, &Ok(()) ) @@ -468,8 +498,8 @@ fn relayer_transaction_and_protocol_fees_test() { .execute_with(&do_relayer_transaction_and_protocol_fees_test); } fn do_relayer_transaction_and_protocol_fees_test() { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let prev_balance = Balances::free_balance(&alice.acc()); let remaining = 2_000 * POLY; @@ -491,10 +521,13 @@ fn do_relayer_transaction_and_protocol_fees_test() { // test `validate` let pre_err = ChargeTransactionPayment::from(0) .validate( - &bob.acc(), + RuntimeOrigin::signed(bob.acc()), &call_system_remark(42), &info_from_weight(5), len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, ) .map(|_| ()) .unwrap_err(); @@ -502,8 +535,14 @@ fn do_relayer_transaction_and_protocol_fees_test() { // test `pre_dispatch` let pre_err = ChargeTransactionPayment::from(0) - .pre_dispatch( - &bob.acc(), + .prepare( + Val::Charge { + tip: 0, + who: bob.acc(), + fee_with_tip: 1, + subsidiser: Some(alice.acc()), + }, + &RuntimeOrigin::signed(bob.acc()), &call_system_remark(42), &info_from_weight(5), len, @@ -528,8 +567,26 @@ fn do_relayer_transaction_and_protocol_fees_test() { let total_fee = transaction_fee + protocol_fee; // 1. Call `pre_dispatch`. + let val = ChargeTransactionPayment::from(0) + .validate( + RuntimeOrigin::signed(bob.acc()), + &call, + &call_info, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) + .unwrap(); + let pre = ChargeTransactionPayment::from(0) - .pre_dispatch(&bob.acc(), &call, &call_info, len) + .prepare( + val.1, + &RuntimeOrigin::signed(bob.acc()), + &call, + &call_info, + len, + ) .unwrap(); // 2. Execute extrinsic. @@ -537,9 +594,9 @@ fn do_relayer_transaction_and_protocol_fees_test() { // 3. Call `post_dispatch`. assert!(ChargeTransactionPayment::post_dispatch( - Some(pre), + pre, &call_info, - &post_info_from_weight(50), + &mut post_info_from_weight(50), len, &Ok(()) ) @@ -559,8 +616,8 @@ fn relayer_batched_subsidy_calls_test() { .execute_with(&do_relayer_batched_subsidy_calls_test); } fn do_relayer_batched_subsidy_calls_test() { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let prev_balance = Balances::free_balance(&alice.acc()); let remaining = 2_000 * POLY; @@ -633,8 +690,26 @@ fn do_relayer_batched_subsidy_calls_test() { let total_fee = transaction_fee + protocol_fee; // 1. Call `pre_dispatch`. + let val = ChargeTransactionPayment::from(0) + .validate( + RuntimeOrigin::signed(bob.acc()), + &call, + &call_info, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) + .unwrap(); + let pre = ChargeTransactionPayment::from(0) - .pre_dispatch(&bob.acc(), &call, &call_info, len) + .prepare( + val.1, + &RuntimeOrigin::signed(bob.acc()), + &call, + &call_info, + len, + ) .unwrap(); // 2. Execute extrinsic. @@ -642,9 +717,9 @@ fn do_relayer_batched_subsidy_calls_test() { // 3. Call `post_dispatch`. assert!(ChargeTransactionPayment::post_dispatch( - Some(pre), + pre, &call_info, - &post_info_from_weight(50), + &mut post_info_from_weight(50), len, &Ok(()) ) @@ -663,8 +738,8 @@ fn relayer_accept_cdd_and_fees_test() { .execute_with(&do_relayer_accept_cdd_and_fees_test); } fn do_relayer_accept_cdd_and_fees_test() { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let bob_sign = Signatory::Account(bob.acc()); // Alice creates authoration to subsidise for Bob. diff --git a/pallets/runtime/tests/src/settlement_pallet/execute_instruction.rs b/pallets/runtime/tests/src/settlement_pallet/execute_instruction.rs index ef77f1d13b..9660082790 100644 --- a/pallets/runtime/tests/src/settlement_pallet/execute_instruction.rs +++ b/pallets/runtime/tests/src/settlement_pallet/execute_instruction.rs @@ -1,5 +1,5 @@ use frame_support::assert_ok; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use pallet_asset::BalanceOf; use pallet_portfolio::PortfolioLockedAssets; @@ -27,9 +27,9 @@ type PortfolioError = pallet_portfolio::Error; fn storage_pruning() { ExtBuilder::default().build().execute_with(|| { let inst_id = InstructionId(0); - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let _ = add_and_affirm_simple_instruction( alice, @@ -80,8 +80,8 @@ fn storage_rollback() { System::set_block_number(1); let instruction_id = InstructionId(0); - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); diff --git a/pallets/runtime/tests/src/settlement_pallet/lock_instruction.rs b/pallets/runtime/tests/src/settlement_pallet/lock_instruction.rs index 88ef0cbf7c..864fed7d57 100644 --- a/pallets/runtime/tests/src/settlement_pallet/lock_instruction.rs +++ b/pallets/runtime/tests/src/settlement_pallet/lock_instruction.rs @@ -1,5 +1,5 @@ use frame_support::{assert_noop, assert_ok}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use sp_std::collections::btree_set::BTreeSet; use pallet_asset::BalanceOf; @@ -33,9 +33,9 @@ type NFTError = pallet_nft::Error; fn invalid_caller() { ExtBuilder::default().build().execute_with(|| { let inst_id = InstructionId(0); - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); @@ -70,9 +70,9 @@ fn invalid_caller() { fn mediator_has_not_affirmed() { ExtBuilder::default().build().execute_with(|| { let inst_id = InstructionId(0); - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); @@ -107,9 +107,9 @@ fn mediator_has_not_affirmed() { fn invalid_type() { ExtBuilder::default().build().execute_with(|| { let inst_id = InstructionId(0); - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); @@ -146,9 +146,9 @@ fn invalid_type() { fn missing_affirmation() { ExtBuilder::default().build().execute_with(|| { let inst_id = InstructionId(0); - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); @@ -184,9 +184,9 @@ fn missing_affirmation() { #[test] fn invalid_inst_status() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -203,9 +203,9 @@ fn invalid_inst_status() { #[test] fn expired_mediator_affirmation() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -221,9 +221,9 @@ fn expired_mediator_affirmation() { #[test] fn unauthorized_venue() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let (asset_id, _) = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -240,9 +240,9 @@ fn unauthorized_venue() { #[test] fn frozen_asset() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let (asset_id, _) = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -258,17 +258,17 @@ fn frozen_asset() { #[test] fn sender_missing_cdd_claim() { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); Identity::revoke_claim( - RuntimeOrigin::signed(AccountKeyring::Eve.to_account_id()), + RuntimeOrigin::signed(Sr25519Keyring::Eve.to_account_id()), alice.did, Claim::CustomerDueDiligence(Default::default()), ) @@ -284,17 +284,17 @@ fn sender_missing_cdd_claim() { #[test] fn rcv_missing_cdd_claim() { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); Identity::revoke_claim( - RuntimeOrigin::signed(AccountKeyring::Eve.to_account_id()), + RuntimeOrigin::signed(Sr25519Keyring::Eve.to_account_id()), bob.did, Claim::CustomerDueDiligence(Default::default()), ) @@ -311,9 +311,9 @@ fn rcv_missing_cdd_claim() { fn receivers_missing_portfolio() { ExtBuilder::default().build().execute_with(|| { let inst_id = InstructionId(0); - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let bob_portfolio = PortfolioId::new(bob.did, PortfolioKind::User(PortfolioNumber(1))); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); @@ -369,9 +369,9 @@ fn receivers_missing_portfolio() { #[test] fn receivers_not_compliant() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let (asset_id, _) = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -403,9 +403,9 @@ fn receivers_not_compliant() { #[test] fn sender_tokens_are_locked() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let (asset_id, _) = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -422,9 +422,9 @@ fn sender_tokens_are_locked() { #[test] fn sender_invalid_portfolio_balance() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let (asset_id, _) = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -445,9 +445,9 @@ fn sender_invalid_portfolio_balance() { #[test] fn sender_invalid_balance() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let (asset_id, _) = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -464,9 +464,9 @@ fn sender_invalid_balance() { #[test] fn senders_not_compliant() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let (asset_id, _) = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -500,9 +500,9 @@ fn invalid_weight() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -522,9 +522,9 @@ fn success() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -554,9 +554,9 @@ fn lock_twice_success() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); diff --git a/pallets/runtime/tests/src/settlement_pallet/manual_execution.rs b/pallets/runtime/tests/src/settlement_pallet/manual_execution.rs index b732c7b60f..938f406253 100644 --- a/pallets/runtime/tests/src/settlement_pallet/manual_execution.rs +++ b/pallets/runtime/tests/src/settlement_pallet/manual_execution.rs @@ -1,5 +1,5 @@ use frame_support::{assert_err_ignore_postinfo, assert_noop, assert_ok, assert_storage_noop}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use pallet_asset::BalanceOf; use pallet_nft::{NFTOwner, NumberOfNFTs}; @@ -27,10 +27,10 @@ type PortfolioError = pallet_portfolio::Error; #[test] fn invalid_caller() { ExtBuilder::default().build().execute_with(|| { - let eve = User::new(AccountKeyring::Eve); - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let eve = User::new(Sr25519Keyring::Eve); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -80,10 +80,10 @@ fn invalid_caller() { #[test] fn execute_settle_after_lock_before_lock() { ExtBuilder::default().build().execute_with(|| { - let eve = User::new(AccountKeyring::Eve); - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let eve = User::new(Sr25519Keyring::Eve); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -131,9 +131,9 @@ fn execute_settle_after_lock_before_lock() { #[test] fn exceeded_maximum_locking_period() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -159,9 +159,9 @@ fn exceeded_maximum_locking_period() { #[test] fn controller_transfer_nft_is_locked() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let (_, asset_id) = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -183,9 +183,9 @@ fn controller_transfer_nft_is_locked() { #[test] fn controller_transfer_insufficient_balance() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let (asset_id, _) = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -207,9 +207,9 @@ fn controller_transfer_insufficient_balance() { #[test] fn unexpected_settle_on_affirmation() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleOnAffirmation); @@ -231,9 +231,9 @@ fn unexpected_settle_on_affirmation() { #[test] fn unexpected_settle_on_block() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction( alice, @@ -260,9 +260,9 @@ fn unexpected_settle_on_block() { #[test] fn execute_before_lock() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -284,9 +284,9 @@ fn execute_before_lock() { #[test] fn successfully_execute_after_locking() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let (asset_id, nft_asset_id) = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); diff --git a/pallets/runtime/tests/src/settlement_pallet/reject_instruction.rs b/pallets/runtime/tests/src/settlement_pallet/reject_instruction.rs index 8bd9c3aeb1..f5c24cb8c9 100644 --- a/pallets/runtime/tests/src/settlement_pallet/reject_instruction.rs +++ b/pallets/runtime/tests/src/settlement_pallet/reject_instruction.rs @@ -1,5 +1,5 @@ use frame_support::{assert_noop, assert_ok}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use pallet_portfolio::PortfolioLockedAssets; use pallet_settlement::{AffirmsReceived, InstructionAffirmsPending, InstructionLegs}; @@ -21,10 +21,10 @@ type Timestamp = pallet_timestamp::Pallet; #[test] fn invalid_caller() { ExtBuilder::default().build().execute_with(|| { - let eve = User::new(AccountKeyring::Eve); - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let eve = User::new(Sr25519Keyring::Eve); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let _ = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -48,9 +48,9 @@ fn invalid_caller() { #[test] fn invalid_caller_locked_for_execution() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let _ = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -81,9 +81,9 @@ fn invalid_caller_locked_for_execution() { #[test] fn invalid_weight() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let _ = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -102,9 +102,9 @@ fn invalid_weight() { #[test] fn success() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let (asset_id, _) = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); @@ -166,9 +166,9 @@ fn success() { #[test] fn success_expired_lock() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let _ = add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); diff --git a/pallets/runtime/tests/src/settlement_pallet/withdraw_affirmation.rs b/pallets/runtime/tests/src/settlement_pallet/withdraw_affirmation.rs index 877abe72c0..253a4a80b6 100644 --- a/pallets/runtime/tests/src/settlement_pallet/withdraw_affirmation.rs +++ b/pallets/runtime/tests/src/settlement_pallet/withdraw_affirmation.rs @@ -1,5 +1,5 @@ use frame_support::{assert_noop, assert_ok}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use polymesh_primitives::settlement::{InstructionId, SettlementType}; use polymesh_primitives::PortfolioId; @@ -18,9 +18,9 @@ fn withdraw_after_locking() { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); add_and_affirm_simple_instruction(alice, bob, dave, SettlementType::SettleAfterLock); diff --git a/pallets/runtime/tests/src/settlement_test.rs b/pallets/runtime/tests/src/settlement_test.rs index d53936b91e..729c8463df 100644 --- a/pallets/runtime/tests/src/settlement_test.rs +++ b/pallets/runtime/tests/src/settlement_test.rs @@ -8,6 +8,7 @@ use frame_support::{ assert_err_ignore_postinfo, assert_noop, assert_ok, assert_storage_noop, traits::TryCollect, BoundedBTreeSet, }; +use frame_system::pallet_prelude::BlockNumberFor; use rand::{prelude::*, thread_rng}; use sp_runtime::{AccountId32, AnySignature}; use sp_std::collections::btree_set::BTreeSet; @@ -41,7 +42,7 @@ use polymesh_primitives::{ PortfolioId, PortfolioKind, PortfolioName, PortfolioNumber, Scope, Signatory, Ticker, TrustedFor, TrustedIssuer, WeightMeter, }; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use super::asset_pallet::setup::{create_and_issue_sample_asset, ISSUE_AMOUNT}; use super::asset_test::max_len_bytes; @@ -64,7 +65,7 @@ type AssetError = pallet_asset::Error; type OffChainSignature = AnySignature; type Origin = ::RuntimeOrigin; type Moment = ::Moment; -type BlockNumber = ::BlockNumber; +type BlockNumber = BlockNumberFor; type Settlement = pallet_settlement::Pallet; type System = frame_system::Pallet; type Error = pallet_settlement::Error; @@ -193,7 +194,7 @@ pub fn set_current_block_number(block: u32) { #[test] fn venue_details_length_limited() { ExtBuilder::default().build().execute_with(|| { - let actor = User::new(AccountKeyring::Alice); + let actor = User::new(Sr25519Keyring::Alice); let id = VenueCounter::::get(); let create = |d| Settlement::create_venue(actor.origin(), d, vec![], VenueType::Exchange); let update = |d| Settlement::update_venue_details(actor.origin(), id, d); @@ -221,14 +222,14 @@ fn user_venues(did: IdentityId) -> Vec { #[test] fn venue_registration() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let venue_counter = VenueCounter::::get(); assert_ok!(Settlement::create_venue( alice.origin(), VenueDetails::default(), vec![ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id() + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id() ], VenueType::Exchange )); @@ -250,13 +251,13 @@ fn venue_registration() { true ); assert_eq!( - VenueSigners::::get(venue_counter, AccountKeyring::Bob.to_account_id()), + VenueSigners::::get(venue_counter, Sr25519Keyring::Bob.to_account_id()), true ); assert_eq!( VenueSigners::::get( venue_counter, - AccountKeyring::Charlie.to_account_id() + Sr25519Keyring::Charlie.to_account_id() ), false ); @@ -265,7 +266,7 @@ fn venue_registration() { assert_ok!(Settlement::create_venue( alice.origin(), VenueDetails::default(), - vec![alice.acc(), AccountKeyring::Bob.to_account_id()], + vec![alice.acc(), Sr25519Keyring::Bob.to_account_id()], VenueType::Exchange )); assert_eq!( @@ -288,7 +289,7 @@ fn venue_registration() { } fn test_with_cdd_provider(test: impl FnOnce(AccountId)) { - let cdd = AccountKeyring::Eve.to_account_id(); + let cdd = Sr25519Keyring::Eve.to_account_id(); ExtBuilder::default() .cdd_providers(vec![cdd.clone()]) .build() @@ -298,8 +299,8 @@ fn test_with_cdd_provider(test: impl FnOnce(AccountId)) { #[test] fn basic_settlement() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let mut alice = UserWithBalance::new(alice, &[asset_id]); @@ -345,8 +346,8 @@ fn basic_settlement() { #[test] fn create_and_affirm_instruction() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let mut alice = UserWithBalance::new(alice, &[asset_id]); @@ -402,8 +403,8 @@ fn create_and_affirm_instruction() { #[test] fn overdraft_failure() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let mut alice = UserWithBalance::new(alice, &[asset_id]); @@ -445,8 +446,8 @@ fn overdraft_failure() { #[test] fn token_swap() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let asset_id2 = create_and_issue_sample_asset(&bob); @@ -572,8 +573,8 @@ fn token_swap() { #[test] fn settle_on_block() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let asset_id2 = create_and_issue_sample_asset(&bob); @@ -688,9 +689,9 @@ fn settle_on_block() { #[test] fn failed_execution() { ExtBuilder::default().build().execute_with(|| { - let dave: User = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let dave: User = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let asset_id2 = create_and_issue_sample_asset(&bob); @@ -699,7 +700,7 @@ fn failed_execution() { let instruction_id = InstructionCounter::::get(); assert_ok!(ComplianceManager::reset_asset_compliance( - Origin::signed(AccountKeyring::Bob.to_account_id()), + Origin::signed(Sr25519Keyring::Bob.to_account_id()), asset_id2, )); assert_ok!(ComplianceManager::add_compliance_requirement( @@ -853,8 +854,8 @@ fn failed_execution() { #[test] fn venue_filtering() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let block_number = System::block_number() + 1; let instruction_id = InstructionCounter::::get(); @@ -927,15 +928,15 @@ fn venue_filtering() { #[test] fn basic_fuzzing() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); - let dave = User::new(AccountKeyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); + let dave = User::new(Sr25519Keyring::Dave); let venue_counter = VenueCounter::::get(); assert_ok!(Settlement::create_venue( - Origin::signed(AccountKeyring::Alice.to_account_id()), + Origin::signed(Sr25519Keyring::Alice.to_account_id()), VenueDetails::default(), - vec![AccountKeyring::Alice.to_account_id()], + vec![Sr25519Keyring::Alice.to_account_id()], VenueType::Other )); let mut assets = Vec::with_capacity(40); @@ -1079,7 +1080,7 @@ fn basic_fuzzing() { let fail: bool = random(); let mut rng = thread_rng(); - let failed_user = rng.gen_range(0, 4); + let failed_user = rng.gen_range(0..4); if fail { assert_ok!(Settlement::withdraw_affirmation( users[failed_user].origin(), @@ -1171,8 +1172,8 @@ fn basic_fuzzing() { #[test] fn claim_multiple_receipts_during_authorization() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let ticker = Ticker::from_slice_truncated(b"TICKER".as_ref()); let ticker2 = Ticker::from_slice_truncated(b"TICKER2".as_ref()); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); @@ -1224,16 +1225,16 @@ fn claim_multiple_receipts_during_authorization() { 0, id, LegId(0), - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Alice.sign(&msg1.encode()).into(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Alice.sign(&msg1.encode()).into(), None ), ReceiptDetails::new( 0, id, LegId(0), - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Alice.sign(&msg2.encode()).into(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Alice.sign(&msg2.encode()).into(), None ), ], @@ -1250,16 +1251,16 @@ fn claim_multiple_receipts_during_authorization() { 0, id, LegId(0), - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Alice.sign(&msg1.encode()).into(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Alice.sign(&msg1.encode()).into(), None ), ReceiptDetails::new( 1, id, LegId(1), - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Alice.sign(&msg3.encode()).into(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Alice.sign(&msg3.encode()).into(), None ), ], @@ -1278,12 +1279,12 @@ fn claim_multiple_receipts_during_authorization() { assert_leg_status( id, LegId(0), - LegStatus::ExecutionToBeSkipped(AccountKeyring::Alice.to_account_id(), 0), + LegStatus::ExecutionToBeSkipped(Sr25519Keyring::Alice.to_account_id(), 0), ); assert_leg_status( id, LegId(1), - LegStatus::ExecutionToBeSkipped(AccountKeyring::Alice.to_account_id(), 1), + LegStatus::ExecutionToBeSkipped(Sr25519Keyring::Alice.to_account_id(), 1), ); assert_locked_assets(&asset_id, &alice, 0); @@ -1304,8 +1305,8 @@ fn claim_multiple_receipts_during_authorization() { #[test] fn overload_instruction() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let leg_limit = ::MaxNumberOfFungibleAssets::get() as usize; @@ -1362,23 +1363,23 @@ fn encode_receipt() { Ticker::from_slice_truncated(b"TICKER".as_ref()), 100, ); - println!("{:?}", AccountKeyring::Alice.sign(&msg1.encode())); + println!("{:?}", Sr25519Keyring::Alice.sign(&msg1.encode())); }); } #[test] fn test_weights_for_settlement_transaction() { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(|| { - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); - let bob = AccountKeyring::Bob.to_account_id(); + let bob = Sr25519Keyring::Bob.to_account_id(); let (bob_signed, bob_did) = make_account_with_balance(bob, 10_000).unwrap(); - let dave = AccountKeyring::Dave.to_account_id(); + let dave = Sr25519Keyring::Dave.to_account_id(); let (dave_signed, dave_did) = make_account_with_balance(dave, 10_000).unwrap(); let instruction_id = InstructionCounter::::get(); @@ -1468,8 +1469,8 @@ fn test_weights_for_settlement_transaction() { #[test] fn cross_portfolio_settlement() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let mut alice = UserWithBalance::new(alice, &[asset_id]); @@ -1546,8 +1547,8 @@ fn cross_portfolio_settlement() { #[test] fn multiple_portfolio_settlement() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let mut alice = UserWithBalance::new(alice, &[asset_id]); @@ -1688,8 +1689,8 @@ fn multiple_portfolio_settlement() { #[test] fn multiple_custodian_settlement() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let mut alice = UserWithBalance::new(alice, &[asset_id]); @@ -1857,9 +1858,9 @@ fn multiple_custodian_settlement() { #[test] fn reject_instruction() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let amount = 100u128; @@ -1928,8 +1929,8 @@ fn reject_instruction() { #[test] fn dirty_storage_with_tx() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let mut alice = UserWithBalance::new(alice, &[asset_id]); @@ -1990,9 +1991,9 @@ fn dirty_storage_with_tx() { #[test] fn reject_failed_instruction() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let amount = 100u128; @@ -2054,16 +2055,16 @@ fn reject_failed_instruction() { #[test] fn modify_venue_signers() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let charlie = User::new(AccountKeyring::Charlie); + let alice = User::new(Sr25519Keyring::Alice); + let charlie = User::new(Sr25519Keyring::Charlie); let venue_counter = VenueCounter::::get(); assert_ok!(Settlement::create_venue( alice.origin(), VenueDetails::default(), vec![ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id() + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id() ], VenueType::Exchange )); @@ -2073,7 +2074,7 @@ fn modify_venue_signers() { Settlement::update_venue_signers( charlie.origin(), venue_counter, - vec![AccountKeyring::Dave.to_account_id(),], + vec![Sr25519Keyring::Dave.to_account_id(),], true ), Error::Unauthorized @@ -2083,7 +2084,7 @@ fn modify_venue_signers() { assert_ok!(Settlement::update_venue_signers( alice.origin(), venue_counter, - vec![AccountKeyring::Charlie.to_account_id(),], + vec![Sr25519Keyring::Charlie.to_account_id(),], true )); @@ -2092,7 +2093,7 @@ fn modify_venue_signers() { Settlement::update_venue_signers( alice.origin(), venue_counter, - vec![AccountKeyring::Dave.to_account_id(),], + vec![Sr25519Keyring::Dave.to_account_id(),], false ), Error::SignerDoesNotExist @@ -2103,7 +2104,7 @@ fn modify_venue_signers() { Settlement::update_venue_signers( alice.origin(), venue_counter, - vec![AccountKeyring::Charlie.to_account_id(),], + vec![Sr25519Keyring::Charlie.to_account_id(),], true ), Error::SignerAlreadyExists @@ -2113,7 +2114,7 @@ fn modify_venue_signers() { assert_ok!(Settlement::update_venue_signers( alice.origin(), venue_counter, - vec![AccountKeyring::Charlie.to_account_id(),], + vec![Sr25519Keyring::Charlie.to_account_id(),], false )); @@ -2123,13 +2124,13 @@ fn modify_venue_signers() { true ); assert_eq!( - VenueSigners::::get(venue_counter, AccountKeyring::Bob.to_account_id()), + VenueSigners::::get(venue_counter, Sr25519Keyring::Bob.to_account_id()), true ); assert_eq!( VenueSigners::::get( venue_counter, - AccountKeyring::Charlie.to_account_id() + Sr25519Keyring::Charlie.to_account_id() ), false ); @@ -2139,9 +2140,9 @@ fn modify_venue_signers() { alice.origin(), venue_counter, vec![ - AccountKeyring::Charlie.to_account_id(), - AccountKeyring::Dave.to_account_id(), - AccountKeyring::Eve.to_account_id(), + Sr25519Keyring::Charlie.to_account_id(), + Sr25519Keyring::Dave.to_account_id(), + Sr25519Keyring::Eve.to_account_id(), ], true )); @@ -2151,9 +2152,9 @@ fn modify_venue_signers() { alice.origin(), venue_counter, vec![ - AccountKeyring::Charlie.to_account_id(), - AccountKeyring::Dave.to_account_id(), - AccountKeyring::Eve.to_account_id(), + Sr25519Keyring::Charlie.to_account_id(), + Sr25519Keyring::Dave.to_account_id(), + Sr25519Keyring::Eve.to_account_id(), ], false )); @@ -2164,10 +2165,10 @@ fn modify_venue_signers() { alice.origin(), venue_counter, vec![ - AccountKeyring::Charlie.to_account_id(), - AccountKeyring::Dave.to_account_id(), - AccountKeyring::Eve.to_account_id(), - AccountKeyring::Bob.to_account_id() + Sr25519Keyring::Charlie.to_account_id(), + Sr25519Keyring::Dave.to_account_id(), + Sr25519Keyring::Eve.to_account_id(), + Sr25519Keyring::Bob.to_account_id() ], true ), @@ -2179,22 +2180,22 @@ fn modify_venue_signers() { true ); assert_eq!( - VenueSigners::::get(venue_counter, AccountKeyring::Bob.to_account_id()), + VenueSigners::::get(venue_counter, Sr25519Keyring::Bob.to_account_id()), true ); assert_eq!( VenueSigners::::get( venue_counter, - AccountKeyring::Charlie.to_account_id() + Sr25519Keyring::Charlie.to_account_id() ), false ); assert_eq!( - VenueSigners::::get(venue_counter, AccountKeyring::Dave.to_account_id()), + VenueSigners::::get(venue_counter, Sr25519Keyring::Dave.to_account_id()), false ); assert_eq!( - VenueSigners::::get(venue_counter, AccountKeyring::Eve.to_account_id()), + VenueSigners::::get(venue_counter, Sr25519Keyring::Eve.to_account_id()), false ); }); @@ -2206,7 +2207,7 @@ fn assert_number_of_venue_signers() { let max_signers = ::MaxNumberOfVenueSigners::get(); let venue_id = VenueId(0); - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let initial_signers: Vec = (0..max_signers as u8) .map(|i| AccountId32::from([i; 32])) .collect(); @@ -2271,8 +2272,8 @@ fn assert_number_of_venue_signers() { #[test] fn reject_instruction_with_zero_amount() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let mut alice = UserWithBalance::new(alice, &[asset_id]); @@ -2307,8 +2308,8 @@ fn reject_instruction_with_zero_amount() { #[test] fn basic_settlement_with_memo() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let mut alice = UserWithBalance::new(alice, &[asset_id]); @@ -2386,8 +2387,8 @@ fn create_instruction( #[test] fn settle_manual_instruction() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let mut alice = UserWithBalance::new(alice, &[asset_id]); @@ -2490,9 +2491,9 @@ fn settle_manual_instruction() { #[test] fn settle_manual_instruction_with_portfolio() { test_with_cdd_provider(|_eve| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let mut alice = UserWithBalance::new(alice, &[asset_id]); @@ -2616,8 +2617,8 @@ fn settle_manual_instruction_with_portfolio() { #[test] fn add_nft_instruction_with_duplicated_nfts() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let nfts = NFTs::new_unverified(asset_id, vec![NFTId(1), NFTId(1)]); @@ -2645,8 +2646,8 @@ fn add_nft_instruction_with_duplicated_nfts() { #[test] fn add_nft_instruction_exceeding_nfts() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let nfts = NFTs::new_unverified( @@ -2689,8 +2690,8 @@ fn add_nft_instruction_exceeding_nfts() { #[test] fn add_nft_instruction() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); let nfts = NFTs::new_unverified(asset_id, vec![NFTId(1)]); @@ -2716,8 +2717,8 @@ fn add_nft_instruction() { fn add_and_affirm_nft_instruction() { test_with_cdd_provider(|_eve| { // First we need to create a collection, mint one NFT, and create a venue - let alice: User = User::new(AccountKeyring::Alice); - let bob: User = User::new(AccountKeyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); let collection_keys: NFTCollectionKeys = vec![AssetMetadataKey::Local(AssetMetadataLocalKey(1))].into(); let asset_id = create_nft_collection( @@ -2826,8 +2827,8 @@ fn add_and_affirm_nft_instruction() { fn add_and_affirm_nft_not_owned() { test_with_cdd_provider(|_eve| { // First we need to create a collection, mint one NFT, and create a venue - let alice: User = User::new(AccountKeyring::Alice); - let bob: User = User::new(AccountKeyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); let collection_keys: NFTCollectionKeys = vec![AssetMetadataKey::Local(AssetMetadataLocalKey(1))].into(); let asset_id = create_nft_collection( @@ -2882,8 +2883,8 @@ fn add_and_affirm_nft_not_owned() { fn add_same_nft_different_legs() { test_with_cdd_provider(|_eve| { // First we need to create a collection, mint two NFTs, and create a venue - let alice: User = User::new(AccountKeyring::Alice); - let bob: User = User::new(AccountKeyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); let collection_keys: NFTCollectionKeys = vec![AssetMetadataKey::Local(AssetMetadataLocalKey(1))].into(); let asset_id = create_nft_collection( @@ -2952,8 +2953,8 @@ fn add_and_affirm_with_receipts_nfts() { // First we need to create a collection, mint one NFT, and create a venue let id = InstructionId(0); let ticker = Ticker::from_slice_truncated(b"TICKER".as_ref()); - let alice: User = User::new(AccountKeyring::Alice); - let bob: User = User::new(AccountKeyring::Bob); + let alice: User = User::new(Sr25519Keyring::Alice); + let bob: User = User::new(Sr25519Keyring::Bob); let collection_keys: NFTCollectionKeys = vec![AssetMetadataKey::Local(AssetMetadataLocalKey(1))].into(); let asset_id = create_nft_collection( @@ -3003,8 +3004,8 @@ fn add_and_affirm_with_receipts_nfts() { 0, id, LegId(0), - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Alice + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Alice .sign( &Receipt::new(0, id, LegId(0), alice.did, bob.did, ticker, 1).encode() ) @@ -3022,8 +3023,8 @@ fn add_and_affirm_with_receipts_nfts() { #[test] fn add_instruction_unexpected_offchain_asset() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let venue_counter = VenueCounter::::get(); Settlement::create_venue( alice.origin(), @@ -3076,10 +3077,10 @@ fn add_instruction_unexpected_offchain_asset() { #[test] fn add_and_execute_offchain_instruction() { ExtBuilder::default().build().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie); - let alice = User::new(AccountKeyring::Alice); - let dave = User::new(AccountKeyring::Dave); - let bob = User::new(AccountKeyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); + let alice = User::new(Sr25519Keyring::Alice); + let dave = User::new(Sr25519Keyring::Dave); + let bob = User::new(Sr25519Keyring::Bob); let ticker = Ticker::from_slice_truncated(b"TICKER".as_ref()); let (_, venue_id) = create_and_issue_sample_asset_with_venue(&alice); let amount = 1; @@ -3096,8 +3097,8 @@ fn add_and_execute_offchain_instruction() { 0, id, LegId(0), - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Alice.sign(&receipt.encode()).into(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Alice.sign(&receipt.encode()).into(), None, )]; @@ -3149,8 +3150,8 @@ fn add_and_execute_offchain_instruction() { #[test] fn affirm_offchain_asset_without_receipt() { ExtBuilder::default().build().execute_with(|| { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let venue = VenueCounter::::get(); Settlement::create_venue( alice.origin(), @@ -3190,9 +3191,9 @@ fn affirm_offchain_asset_without_receipt() { fn add_instruction_with_offchain_assets() { ExtBuilder::default().build().execute_with(|| { // Setup base parameters - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let (asset_id, venue) = create_and_issue_sample_asset_with_venue(&alice); let asset_id2 = AssetId::new([0; 16]); @@ -3257,9 +3258,9 @@ fn add_instruction_with_offchain_assets() { fn add_instruction_with_pre_affirmed_tickers() { ExtBuilder::default().build().execute_with(|| { // Setup base parameters - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let bob_user_porfolio = PortfolioId::user_portfolio(bob.did, PortfolioNumber(1)); let (asset_id, venue) = create_and_issue_sample_asset_with_venue(&alice); @@ -3316,9 +3317,9 @@ fn add_instruction_with_pre_affirmed_tickers() { fn add_instruction_with_pre_affirmed_tickers_with_assigned_custodian() { ExtBuilder::default().build().execute_with(|| { // Setup base parameters - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); - let charlie = User::new(AccountKeyring::Charlie); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let charlie = User::new(Sr25519Keyring::Charlie); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); let bob_user_porfolio = PortfolioId::user_portfolio(bob.did, PortfolioNumber(1)); @@ -3386,10 +3387,10 @@ fn add_instruction_with_pre_affirmed_tickers_with_assigned_custodian() { fn add_instruction_with_pre_affirmed_portfolio() { ExtBuilder::default().build().execute_with(|| { // Setup base parameters - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); let alice_user_porfolio = PortfolioId::user_portfolio(alice.did, PortfolioNumber(1)); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let bob_user_porfolio = PortfolioId::user_portfolio(bob.did, PortfolioNumber(1)); let (asset_id, venue) = create_and_issue_sample_asset_with_venue(&alice); @@ -3453,9 +3454,9 @@ fn add_instruction_with_pre_affirmed_portfolio() { fn add_instruction_with_single_pre_affirmed() { ExtBuilder::default().build().execute_with(|| { // Setup base parameters - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let (asset_id, venue) = create_and_issue_sample_asset_with_venue(&alice); let instruction_memo = Some(Memo::default()); @@ -3511,9 +3512,9 @@ fn add_instruction_with_single_pre_affirmed() { fn manually_execute_failed_instruction() { ExtBuilder::default().build().execute_with(|| { // Setup base parameters - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let (asset_id, venue) = create_and_issue_sample_asset_with_venue(&alice); let instruction_memo = Some(Memo::default()); @@ -3591,9 +3592,9 @@ fn manually_execute_failed_instruction() { #[test] fn affirm_with_receipts_cost() { ExtBuilder::default().build().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie); - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let ticker = Ticker::from_slice_truncated(b"TICKER2".as_ref()); let (_, venue_id) = create_and_issue_sample_asset_with_venue(&alice); let amount = 1; @@ -3610,8 +3611,8 @@ fn affirm_with_receipts_cost() { 0, id, LegId(0), - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Alice.sign(&receipt.encode()).into(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Alice.sign(&receipt.encode()).into(), None, )]; assert_ok!(Settlement::add_instruction( @@ -3643,10 +3644,10 @@ fn affirm_with_receipts_cost() { fn affirm_instruction_cost() { ExtBuilder::default().build().execute_with(|| { // Setup base parameters - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); let alice_user_porfolio = PortfolioId::user_portfolio(alice.did, PortfolioNumber(1)); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let bob_user_porfolio = PortfolioId::user_portfolio(bob.did, PortfolioNumber(1)); let (asset_id, venue) = create_and_issue_sample_asset_with_venue(&alice); @@ -3707,9 +3708,9 @@ fn affirm_instruction_cost() { fn withdraw_affirmation_cost() { ExtBuilder::default().build().execute_with(|| { // Setup base parameters - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let (asset_id, venue) = create_and_issue_sample_asset_with_venue(&alice); let instruction_memo = Some(Memo::default()); @@ -3756,9 +3757,9 @@ fn withdraw_affirmation_cost() { fn reject_instruction_cost() { ExtBuilder::default().build().execute_with(|| { // Setup base parameters - let alice = User::new(AccountKeyring::Alice); + let alice = User::new(Sr25519Keyring::Alice); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); - let bob = User::new(AccountKeyring::Bob); + let bob = User::new(Sr25519Keyring::Bob); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let (asset_id, venue) = create_and_issue_sample_asset_with_venue(&alice); let instruction_memo = Some(Memo::default()); @@ -3819,10 +3820,10 @@ fn reject_instruction_cost() { #[test] fn add_instruction_with_mediators() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); - let charlie = User::new(AccountKeyring::Charlie); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); + let charlie = User::new(Sr25519Keyring::Charlie); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); @@ -3873,10 +3874,10 @@ fn add_instruction_with_mediators() { #[test] fn affirm_as_mediator_invalid_mediator() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); - let charlie = User::new(AccountKeyring::Charlie); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); + let charlie = User::new(Sr25519Keyring::Charlie); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); @@ -3907,9 +3908,9 @@ fn affirm_as_mediator_invalid_mediator() { #[test] fn affirm_as_mediator() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); - let charlie = User::new(AccountKeyring::Charlie); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let charlie = User::new(Sr25519Keyring::Charlie); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); @@ -3957,10 +3958,10 @@ fn affirm_as_mediator() { #[test] fn withdraw_as_mediator_invalid_mediator() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); - let charlie = User::new(AccountKeyring::Charlie); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); + let charlie = User::new(Sr25519Keyring::Charlie); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); @@ -3991,9 +3992,9 @@ fn withdraw_as_mediator_invalid_mediator() { #[test] fn withdraw_as_mediator_invalid_status() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); - let charlie = User::new(AccountKeyring::Charlie); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let charlie = User::new(Sr25519Keyring::Charlie); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); @@ -4024,9 +4025,9 @@ fn withdraw_as_mediator_invalid_status() { #[test] fn withdraw_affirmation_as_mediator() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); - let charlie = User::new(AccountKeyring::Charlie); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let charlie = User::new(Sr25519Keyring::Charlie); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); @@ -4078,9 +4079,9 @@ fn withdraw_affirmation_as_mediator() { #[test] fn expired_affirmation_execution() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); - let charlie = User::new(AccountKeyring::Charlie); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let charlie = User::new(Sr25519Keyring::Charlie); let bob_default_portfolio = PortfolioId::default_portfolio(bob.did); let alice_default_portfolio = PortfolioId::default_portfolio(alice.did); @@ -4147,10 +4148,10 @@ fn expired_affirmation_execution() { #[test] fn reject_instruction_as_mediator() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let dave = User::new(AccountKeyring::Dave); - let alice = User::new(AccountKeyring::Alice); - let charlie = User::new(AccountKeyring::Charlie); + let bob = User::new(Sr25519Keyring::Bob); + let dave = User::new(Sr25519Keyring::Dave); + let alice = User::new(Sr25519Keyring::Alice); + let charlie = User::new(Sr25519Keyring::Charlie); let (asset_id, venue_counter) = create_and_issue_sample_asset_with_venue(&alice); @@ -4190,8 +4191,8 @@ fn reject_instruction_as_mediator() { #[test] fn missing_venue_for_offchain_asset() { ExtBuilder::default().build().execute_with(|| { - let bob = User::new(AccountKeyring::Bob); - let alice = User::new(AccountKeyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); let (asset_id, _) = create_and_issue_sample_asset_with_venue(&alice); diff --git a/pallets/runtime/tests/src/signed_extra.rs b/pallets/runtime/tests/src/signed_extra.rs index 999941861c..4557b48936 100644 --- a/pallets/runtime/tests/src/signed_extra.rs +++ b/pallets/runtime/tests/src/signed_extra.rs @@ -1,21 +1,21 @@ -use pallet_group as group; -use pallet_identity as identity; -use polymesh_primitives::{identity_id::GenesisIdentityRecord, AccountId, IdentityId, Index}; -use polymesh_runtime_develop::{ - runtime::{RuntimeCall, SignedExtra}, - Runtime, -}; - -use frame_support::dispatch::{DispatchClass, DispatchInfo, Weight}; -use frame_support::pallet_prelude::*; -use frame_system::{ - CheckEra, CheckGenesis, CheckNonce, CheckSpecVersion, CheckTxVersion, CheckWeight, -}; +use frame_support::dispatch::{DispatchClass, DispatchInfo}; +use frame_support::weights::Weight; +use frame_system::{CheckEra, CheckGenesis, CheckNonce}; +use frame_system::{CheckSpecVersion, CheckTxVersion, CheckWeight}; use sp_io::TestExternalities; -use sp_runtime::{generic, traits::SignedExtension}; +use sp_keyring::Sr25519Keyring; +use sp_runtime::traits::{TransactionExtension, TxBaseImplication}; +use sp_runtime::transaction_validity::TransactionSource; +use sp_runtime::{generic, BuildStorage}; use sp_std::convert::From; -use sp_keyring::AccountKeyring; +use pallet_group as group; +use pallet_identity as identity; +use polymesh_primitives::{identity_id::GenesisIdentityRecord, AccountId, IdentityId, Nonce}; +use polymesh_runtime_develop::runtime::{RuntimeCall, TxExtension}; +use polymesh_runtime_develop::Runtime; + +type RuntimeOrigin = ::RuntimeOrigin; pub fn make_call() -> (::RuntimeCall, usize) { ( @@ -24,21 +24,28 @@ pub fn make_call() -> (::RuntimeCall, usize) { ) } -/// Generate a `SignedExtra` value as it is defined in `Runtime`. +/// Generate a `TxExtension` value as it is defined in `Runtime`. /// It ensures that `Runtime` is using: /// - Transaction `priority` == `tip`. /// - Only `Operational` transactions could have `tip` != 0. /// - `Normal` transactions have `priority` == 0, as `tip` == 0. -fn make_signed_extra(current_block: u64, period: u64, nonce: Index, tip: u128) -> SignedExtra { +fn make_signed_extra(current_block: u64, period: u64, nonce: Nonce, tip: u128) -> TxExtension { ( - CheckSpecVersion::::new(), - CheckTxVersion::::new(), - CheckGenesis::::new(), + ( + frame_system::AuthorizeCall::new(), + frame_system::CheckNonZeroSender::new(), + CheckSpecVersion::::new(), + CheckTxVersion::::new(), + CheckGenesis::::new(), + ), CheckEra::::from(generic::Era::mortal(period, current_block)), CheckNonce::::from(nonce), CheckWeight::::new(), - pallet_transaction_payment::ChargeTransactionPayment::::from(tip), + polymesh_transaction_payment::ChargeTransactionPayment::::from(tip), pallet_permissions::StoreCallMetadata::::new(), + frame_metadata_hash_extension::CheckMetadataHash::new(false), + pallet_revive::evm::tx_extension::SetOrigin::default(), + frame_system::WeightReclaim::::new(), ) } @@ -50,9 +57,9 @@ fn make_signed_extra(current_block: u64, period: u64, nonce: Index, tip: u128) - /// - Those accounts are added as CDD providers, so auto-generated CDD claims are valid. fn make_min_storage() -> Result { let accounts = [ - AccountKeyring::Alice.to_account_id(), - AccountKeyring::Bob.to_account_id(), - AccountKeyring::Charlie.to_account_id(), + Sr25519Keyring::Alice.to_account_id(), + Sr25519Keyring::Bob.to_account_id(), + Sr25519Keyring::Charlie.to_account_id(), ]; let identities = accounts .iter() @@ -75,7 +82,7 @@ fn make_min_storage() -> Result { .map(|gen_id| gen_id.did) .collect::>(); - let mut storage = frame_system::GenesisConfig::default().build_storage::()?; + let mut storage = frame_system::GenesisConfig::::default().build_storage()?; // Balances pallet_balances::GenesisConfig:: { @@ -83,6 +90,7 @@ fn make_min_storage() -> Result { .iter() .map(|acc| (acc.clone(), 1_000_000)) .collect::>(), + dev_accounts: None, } .assimilate_storage(&mut storage)?; @@ -115,28 +123,45 @@ fn normal_tx_ext() -> Result<(), String> { make_min_storage()?.execute_with(normal_tx) } -/// This test ensures the following rules are true for current `runtime::SignedExtra`: +/// This test ensures the following rules are true for current `runtime::TxExtension`: /// - Normal transactions can not have a tip. /// - Priority of any transaction is its own tip. fn normal_tx() -> Result<(), String> { - let user = AccountKeyring::Alice.to_account_id(); + let user = Sr25519Keyring::Alice.to_account_id(); + let alice_origin = RuntimeOrigin::signed(user.clone()); let (call, len) = make_call(); let info = DispatchInfo { - weight: Weight::from_ref_time(100), + call_weight: Weight::from_parts(100, 0), ..Default::default() }; // Normat Tx with tip. Expected an error. let sign_extra = make_signed_extra(0, 10, 0, 42u128.into()); - let tx_validity = sign_extra.validate(&user, &call, &info, len); + let tx_validity = sign_extra.validate( + alice_origin.clone(), + &call, + &info, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ); assert!(tx_validity.is_err()); // Normal TX without any tip. let sign_extra = make_signed_extra(0, 10, 0, 0u128.into()); let tx_validity = sign_extra - .validate(&user, &call, &info, len) + .validate( + alice_origin, + &call, + &info, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) .expect("Tx should be valid"); - assert_eq!(tx_validity.priority, 0); + assert_eq!(tx_validity.0.priority, 786432); Ok(()) } @@ -149,10 +174,11 @@ fn operational_tx_ext() -> Result<(), String> { /// - Operational transactions can have tip != 0. /// - Priority of any transaction is its own tip. fn operational_tx() -> Result<(), String> { - let user: AccountId = AccountKeyring::Alice.public().into(); + let user: AccountId = Sr25519Keyring::Alice.public().into(); + let alice_origin = RuntimeOrigin::signed(user.clone()); let (call, len) = make_call(); let info = DispatchInfo { - weight: Weight::from_ref_time(100), + call_weight: Weight::from_parts(100, 0), class: DispatchClass::Operational, ..Default::default() }; @@ -161,15 +187,31 @@ fn operational_tx() -> Result<(), String> { let tip = 42u128; let sign_extra = make_signed_extra(0, 10, 0, tip.into()); let tx_validity = sign_extra - .validate(&user, &call, &info, len) + .validate( + alice_origin.clone(), + &call, + &info, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) .expect("Tx should be valid"); - assert_eq!(tx_validity.priority as u128, tip); + assert_eq!(tx_validity.0.priority as u128, 162789326848); // Operational TX without any tip. let sign_extra = make_signed_extra(0, 10, 0, 0u128.into()); let tx_validity = sign_extra - .validate(&user, &call, &info, len) + .validate( + alice_origin, + &call, + &info, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) .expect("Tx should be valid"); - assert_eq!(tx_validity.priority, 0); + assert_eq!(tx_validity.0.priority, 162525085696); Ok(()) } diff --git a/pallets/runtime/tests/src/stable_api_v8_precompile_test.rs b/pallets/runtime/tests/src/stable_api_v8_precompile_test.rs new file mode 100644 index 0000000000..526cb60854 --- /dev/null +++ b/pallets/runtime/tests/src/stable_api_v8_precompile_test.rs @@ -0,0 +1,90 @@ +// This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). +// Copyright (c) 2020 Polymesh Association + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3. + +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use frame_support::{assert_ok, weights::Weight}; +use polymesh_runtime_common::Currency; +use sp_core::H160; +use sp_keyring::Sr25519Keyring; + +use pallet_revive::precompiles::alloy::{hex, sol_types::SolCall}; +use pallet_revive::{precompiles::TransactionLimits, AddressMapper, ExecConfig}; + +use polymesh_stable_api_precompiles::v8::IPolymeshStableApiV8; + +use crate::ext_builder::ExtBuilder; +use crate::storage::{TestStorage, User}; + +type Revive = pallet_revive::Pallet; +type Balances = pallet_balances::Pallet; + +/// Precompile address for Stable API v8. +/// Fixed(8) → 0x0000000000000000000000000000000000080000 +fn precompile_v8_address() -> H160 { + H160::from(hex::const_decode_to_array(b"0000000000000000000000000000000000080000").unwrap()) +} + +/// Helper: call getKeyDid via bare_call and return the decoded bytes32 DID. +fn call_get_key_did(caller: &User, account: H160) -> [u8; 32] { + let data = IPolymeshStableApiV8::getKeyDidCall { + account: account.0.into(), + } + .abi_encode(); + + let data = Revive::bare_call( + caller.origin(), + precompile_v8_address(), + 0u32.into(), + TransactionLimits::WeightAndDeposit { + weight_limit: Weight::MAX, + deposit_limit: u128::MAX, + }, + data, + ExecConfig::new_substrate_tx(), + ) + .result + .unwrap() + .data; + + IPolymeshStableApiV8::getKeyDidCall::abi_decode_returns(&data) + .unwrap() + .0 +} + +#[test] +fn get_key_did_test() { + ExtBuilder::default().build().execute_with(|| { + // Create Alice with a DID and fund + map her account. + let alice = User::new(Sr25519Keyring::Alice); + Balances::make_free_balance_be( + &alice.acc(), + 1_000_000 * polymesh_primitives::constants::currency::POLY, + ); + assert_ok!(Revive::map_account(alice.origin())); + + // Known address with a DID returns the correct DID. + let alice_evm = + ::AddressMapper::to_address(&alice.acc()); + let ret = call_get_key_did(&alice, alice_evm); + assert_eq!( + ret, alice.did.0, + "alice's EVM address should resolve to her DID" + ); + + // Unknown address returns zero DID. + let unknown_addr = H160([0xAA; 20]); + let ret = call_get_key_did(&alice, unknown_addr); + assert_eq!(ret, [0u8; 32], "unknown address should return zero DID"); + }); +} diff --git a/pallets/runtime/tests/src/staking/mock.rs b/pallets/runtime/tests/src/staking/mock.rs deleted file mode 100644 index d930043d40..0000000000 --- a/pallets/runtime/tests/src/staking/mock.rs +++ /dev/null @@ -1,1502 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Test utilities - -use std::collections::BTreeMap; - -use frame_election_provider_support::{onchain, SequentialPhragmen}; -use frame_support::dispatch::{DispatchResult, Weight}; -use frame_support::traits::{ - ConstU32, Currency, EitherOfDiverse, FindAuthor, GenesisBuild, Get, Hooks, Imbalance, - KeyOwnerProofSystem, OnUnbalanced, OneSessionHandler, -}; -use frame_support::weights::constants::RocksDbWeight; -use frame_support::{assert_ok, ord_parameter_types, parameter_types}; -use frame_system::{EnsureRoot, EnsureSignedBy}; -use sp_core::H256; -use sp_runtime::curve::PiecewiseLinear; -use sp_runtime::testing::{Header, TestXt, UintAuthorityId}; -use sp_runtime::traits::{IdentityLookup, Zero}; -use sp_runtime::transaction_validity::InvalidTransaction; -use sp_runtime::{KeyTypeId, Perbill}; -use sp_staking::offence::{DisableStrategy, OffenceDetails, OnOffenceHandler}; -use sp_staking::{EraIndex, SessionIndex}; - -use pallet_balances::AccountData; -use pallet_balances::BlockRewardConfig; -use pallet_staking::types::SlashingSwitch; -use pallet_staking::{self as pallet_staking, *}; -use polymesh_primitives::asset::AssetId; -use polymesh_primitives::constants::currency::POLY; -use polymesh_primitives::identity_id::GenesisIdentityRecord; -use polymesh_primitives::{ - traits::{ - group::{GroupTrait, InactiveMember}, - CheckCdd, PortfolioSubTrait, SubsidiserTrait, - }, - Authorization, AuthorizationData, Claim, IdentityId, Moment, NFTId, Permissions, PortfolioId, - SecondaryKey, Signatory, -}; - -pub const INIT_TIMESTAMP: u64 = 30_000; -pub const BLOCK_TIME: u64 = 1_000; - -/// The AccountId alias in this test module. -pub(crate) type AccountId = u64; -pub(crate) type AccountIndex = u64; -pub(crate) type BlockNumber = u64; -pub(crate) type Balance = u128; - -/// Another session handler struct to test on_disabled. -pub struct OtherSessionHandler; -impl OneSessionHandler for OtherSessionHandler { - type Key = UintAuthorityId; - - fn on_genesis_session<'a, I: 'a>(_: I) - where - I: Iterator, - AccountId: 'a, - { - } - - fn on_new_session<'a, I: 'a>(_: bool, _: I, _: I) - where - I: Iterator, - AccountId: 'a, - { - } - - fn on_disabled(_validator_index: u32) {} -} - -impl sp_runtime::BoundToRuntimeAppPublic for OtherSessionHandler { - type Public = UintAuthorityId; -} - -pub fn is_disabled(controller: AccountId) -> bool { - let stash = Staking::ledger(&controller).unwrap().stash; - let validator_index = match Session::validators().iter().position(|v| *v == stash) { - Some(index) => index as u32, - None => return false, - }; - - Session::disabled_validators().contains(&validator_index) -} - -type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; -type Block = frame_system::mocking::MockBlock; -pub type Call = RuntimeCall; - -frame_support::construct_runtime!( - pub enum Test where - Block = Block, - NodeBlock = Block, - UncheckedExtrinsic = UncheckedExtrinsic, - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - Babe: pallet_babe::{Pallet, Call, Storage, Config, ValidateUnsigned}, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, - Authorship: pallet_authorship, - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, - Staking: pallet_staking::{Pallet, Call, Config, Storage, Event}, - Session: pallet_session::{Pallet, Call, Storage, Event, Config}, - Historical: pallet_session::historical::{Pallet}, - Identity: pallet_identity::{Pallet, Call, Storage, Event, Config}, - CddServiceProviders: pallet_group::::{Pallet, Call, Storage, Event, Config}, - ProtocolFee: pallet_protocol_fee::{Pallet, Call, Storage, Event, Config}, - Preimage: pallet_preimage::{Pallet, Call, Storage, Event}, - Scheduler: pallet_scheduler::{Pallet, Call, Storage, Event}, - Treasury: pallet_treasury::{Pallet, Call, Event}, - PolymeshCommittee: pallet_committee::::{Pallet, Call, Storage, Origin, Event, Config}, - Pips: pallet_pips::{Pallet, Call, Storage, Event, Config}, - Base: pallet_base::{Pallet, Call, Event}, - } -); - -/// Author of block is always 11 -pub struct Author11; -impl FindAuthor for Author11 { - fn find_author<'a, I>(_digests: I) -> Option - where - I: 'a + IntoIterator, - { - Some(11) - } -} - -parameter_types! { - pub static SessionsPerEra: sp_staking::SessionIndex = 3; - pub static ExistentialDeposit: Balance = 1; - pub static SlashDeferDuration: EraIndex = 0; - pub static Period: BlockNumber = 5; - pub static Offset: BlockNumber = 0; - - pub const MaxLen: u32 = 256; - pub const MaxLocks: u32 = 1024; - pub const BlockHashCount: u64 = 250; - pub const MaximumBlockWeight: Weight = Weight::from_ref_time(1024); - pub BlockWeights: frame_system::limits::BlockWeights = - frame_system::limits::BlockWeights::simple_max( - Weight::from_ref_time(frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND * 2) - ); -} - -impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = RocksDbWeight; - type RuntimeOrigin = RuntimeOrigin; - type Index = AccountIndex; - type BlockNumber = BlockNumber; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = ::sp_runtime::traits::BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; - type Header = Header; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_base::Config for Test { - type RuntimeEvent = RuntimeEvent; - type MaxLen = MaxLen; -} - -impl BlockRewardConfig for Test { - type BlockRewardsReserve = pallet_balances::Pallet; -} - -impl pallet_balances::Config for Test { - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - - type CddChecker = Test; - type MaxLocks = MaxLocks; - type WeightInfo = polymesh_weights::pallet_balances::SubstrateWeight; -} - -sp_runtime::impl_opaque_keys! { - pub struct SessionKeys { - pub other: OtherSessionHandler, - } -} - -impl pallet_session::Config for Test { - type SessionManager = pallet_session::historical::NoteHistoricalRoot; - type Keys = SessionKeys; - type ShouldEndSession = pallet_session::PeriodicSessions; - type SessionHandler = (OtherSessionHandler,); - type RuntimeEvent = RuntimeEvent; - type ValidatorId = AccountId; - type ValidatorIdOf = pallet_staking::StashOf; - type NextSessionRotation = pallet_session::PeriodicSessions; - type WeightInfo = (); -} - -impl pallet_committee::Config for Test { - type RuntimeOrigin = RuntimeOrigin; - type Proposal = RuntimeCall; - type CommitteeOrigin = frame_system::EnsureRoot; - type VoteThresholdOrigin = Self::CommitteeOrigin; - type RuntimeEvent = RuntimeEvent; - type WeightInfo = polymesh_weights::pallet_committee::SubstrateWeight; -} - -impl pallet_session::historical::Config for Test { - type FullIdentification = pallet_staking::Exposure; - type FullIdentificationOf = pallet_staking::ExposureOf; -} - -impl pallet_pips::Config for Test { - type Currency = pallet_balances::Pallet; - type VotingMajorityOrigin = frame_system::EnsureRoot; - type GovernanceCommittee = crate::storage::Committee; - type TechnicalCommitteeVMO = frame_system::EnsureRoot; - type UpgradeCommitteeVMO = frame_system::EnsureRoot; - type RuntimeEvent = RuntimeEvent; - type WeightInfo = polymesh_weights::pallet_pips::SubstrateWeight; - type Scheduler = Scheduler; - type SchedulerCall = RuntimeCall; - type MaxRefundsAndVotesPruned = MaxRefundsAndVotesPruned; -} - -impl pallet_treasury::Config for Test { - type RuntimeEvent = RuntimeEvent; - type Currency = pallet_balances::Pallet; - type WeightInfo = polymesh_weights::pallet_treasury::SubstrateWeight; -} - -impl pallet_authorship::Config for Test { - type FindAuthor = Author11; - type EventHandler = pallet_staking::Pallet; -} - -parameter_types! { - pub const MinimumPeriod: u64 = 5; - // PIPs - pub const MaxRefundsAndVotesPruned: u32 = 128; -} - -impl pallet_timestamp::Config for Test { - type Moment = u64; - type OnTimestampSet = (); - type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); -} - -impl pallet_group::Config for Test { - type RuntimeEvent = RuntimeEvent; - type LimitOrigin = frame_system::EnsureRoot; - type AddOrigin = frame_system::EnsureRoot; - type RemoveOrigin = frame_system::EnsureRoot; - type SwapOrigin = frame_system::EnsureRoot; - type ResetOrigin = frame_system::EnsureRoot; - type MembershipInitialized = (); - type MembershipChanged = (); - type WeightInfo = polymesh_weights::pallet_group::SubstrateWeight; -} - -impl pallet_protocol_fee::Config for Test { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type OnProtocolFeePayment = (); - type WeightInfo = polymesh_weights::pallet_protocol_fee::SubstrateWeight; - type Subsidiser = Test; -} - -impl pallet_identity::Config for Test { - type RuntimeEvent = RuntimeEvent; - type Proposal = RuntimeCall; - type CddServiceProviders = pallet_group::Pallet; - type Balances = Balances; - type CddHandler = Test; - type Public = UintAuthorityId; - type OffChainSignature = sp_runtime::testing::TestSignature; - type ProtocolFee = pallet_protocol_fee::Pallet; - type GCVotingMajorityOrigin = frame_system::EnsureRoot; - type WeightInfo = polymesh_weights::pallet_identity::SubstrateWeight; - type IdentityFn = pallet_identity::Pallet; - type SchedulerOrigin = OriginCaller; - type InitialPOLYX = InitialPOLYX; - type MaxGivenAuths = MaxGivenAuths; - type MaxAuthRetries = MaxAuthRetries; -} - -parameter_types! { - pub const InitialPOLYX: Balance = 0; - pub MaximumSchedulerWeight: Weight = Perbill::from_percent(80) * MaximumBlockWeight::get(); - pub const MaxScheduledPerBlock: u32 = 50; - pub const MaxGivenAuths: u32 = 1024; - pub const MaxAuthRetries: u8 = 10; -} - -impl pallet_scheduler::Config for Test { - type RuntimeEvent = RuntimeEvent; - type RuntimeOrigin = RuntimeOrigin; - type PalletsOrigin = OriginCaller; - type RuntimeCall = RuntimeCall; - type MaximumWeight = MaximumSchedulerWeight; - type ScheduleOrigin = EnsureRoot; - type MaxScheduledPerBlock = MaxScheduledPerBlock; - type WeightInfo = (); - type OriginPrivilegeCmp = frame_support::traits::EqualPrivilegeOnly; - type Preimages = Preimage; -} - -parameter_types! { - pub const PreimageMaxSize: u32 = 4096 * 1024; - pub const PreimageBaseDeposit: Balance = polymesh_runtime_common::deposit(2, 64); - pub const PreimageByteDeposit: Balance = polymesh_runtime_common::deposit(0, 1); -} - -impl pallet_preimage::Config for Test { - type WeightInfo = polymesh_weights::pallet_preimage::SubstrateWeight; - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type ManagerOrigin = EnsureRoot; - type BaseDeposit = PreimageBaseDeposit; - type ByteDeposit = PreimageByteDeposit; -} - -impl polymesh_primitives::traits::CddAndFeeDetails for Test { - fn get_valid_payer( - _: &Call, - _: AccountId, - ) -> Result, sp_runtime::transaction_validity::InvalidTransaction> { - Ok(None) - } - fn clear_context() {} - fn set_payer_context(_: Option) {} - fn get_payer_from_context() -> Option { - None - } - fn decrease_authorization_count(_caller: &AccountId, _auth_id: Option) {} - fn get_authorization_id(_call: &RuntimeCall) -> Option { - None - } -} - -impl SubsidiserTrait for Test { - fn check_subsidy( - _: &AccountId, - _: Balance, - _: Option<&RuntimeCall>, - ) -> Result, InvalidTransaction> { - Ok(None) - } - fn debit_subsidy(_: &AccountId, _: Balance) -> Result, InvalidTransaction> { - Ok(None) - } -} - -impl GroupTrait for Test { - fn get_members() -> Vec { - return Group::active_members(); - } - - fn get_inactive_members() -> Vec> { - vec![] - } - - fn disable_member( - _who: IdentityId, - _expiry: Option, - _at: Option, - ) -> DispatchResult { - unimplemented!(); - } - - fn add_member(_who: IdentityId) -> DispatchResult { - unimplemented!() - } - - fn get_active_members() -> Vec { - Self::get_members() - } - - /// Current set size - fn member_count() -> usize { - Self::get_members().len() - } - - fn is_member(member_id: &IdentityId) -> bool { - Self::get_members().contains(member_id) - } - - /// It returns the current "active members" and any "inactive member" which its - /// expiration time-stamp is greater than `moment`. - fn get_valid_members_at(moment: Moment) -> Vec { - Self::get_active_members() - .into_iter() - .chain( - Self::get_inactive_members() - .into_iter() - .filter(|m| !Self::is_member_expired(&m, moment)) - .map(|m| m.id), - ) - .collect::>() - } - - fn is_member_expired(_member: &InactiveMember, _now: Moment) -> bool { - false - } -} - -impl PortfolioSubTrait for Test { - fn ensure_portfolio_custody(_: &PortfolioId, _: IdentityId) -> DispatchResult { - unimplemented!() - } - - fn ensure_portfolio_validity(_: &PortfolioId) -> DispatchResult { - unimplemented!() - } - - fn lock_tokens(_: PortfolioId, _: AssetId, _: Balance) -> DispatchResult { - unimplemented!() - } - - fn unlock_tokens(_: PortfolioId, _: AssetId, _: Balance) -> DispatchResult { - unimplemented!() - } - - fn ensure_portfolio_custody_and_permission( - _: &PortfolioId, - _: IdentityId, - _: Option<&SecondaryKey>, - ) -> DispatchResult { - unimplemented!() - } - - fn lock_nft(_: PortfolioId, _: AssetId, _: NFTId) -> DispatchResult { - unimplemented!() - } - - fn unlock_nft(_: &PortfolioId, _: &AssetId, _: &NFTId) -> DispatchResult { - unimplemented!() - } - - fn skip_portfolio_affirmation(_: &PortfolioId, _: &AssetId) -> bool { - unimplemented!() - } -} - -impl CheckCdd for Test { - fn check_key_cdd(_key: &AccountId) -> bool { - true - } - fn get_key_cdd_did(_key: &AccountId) -> Option { - None - } -} - -impl pallet_permissions::Config for Test { - type Checker = Identity; -} - -parameter_types! { - pub const EpochDuration: u64 = 10; - pub const ExpectedBlockTime: u64 = 1; - pub const MaxAuthorities: u32 = 100; -} - -impl pallet_babe::Config for Test { - type WeightInfo = (); - type EpochDuration = EpochDuration; - type ExpectedBlockTime = ExpectedBlockTime; - type EpochChangeTrigger = pallet_babe::ExternalTrigger; - type DisabledValidators = Session; - - type KeyOwnerProofSystem = (); - type KeyOwnerProof = >::Proof; - type KeyOwnerIdentification = >::IdentificationTuple; - type HandleEquivocation = - pallet_babe::EquivocationHandler; - - type MaxAuthorities = MaxAuthorities; -} - -pallet_staking_reward_curve::build! { - const I_NPOS: PiecewiseLinear<'static> = curve!( - min_inflation: 0_025_000, - max_inflation: 0_100_000, - ideal_stake: 0_500_000, - falloff: 0_050_000, - max_piece_count: 40, - test_precision: 0_005_000, - ); -} -parameter_types! { - pub const BondingDuration: EraIndex = 3; - pub const RewardCurve: &'static PiecewiseLinear<'static> = &I_NPOS; - pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(75); - - pub const MaxNominatorRewardedPerValidator: u32 = 64; - pub const MaxVariableInflationTotalIssuance: Balance = 1_000_000_000 * POLY; - pub const FixedYearlyReward: Balance = 200_000_000 * POLY; -} - -parameter_types! { - pub static RewardRemainderUnbalanced: u128 = 0; -} - -pub struct RewardRemainderMock; - -impl OnUnbalanced> for RewardRemainderMock { - fn on_nonzero_unbalanced(amount: NegativeImbalanceOf) { - RewardRemainderUnbalanced::mutate(|v| { - *v += amount.peek(); - }); - drop(amount); - } -} - -const THRESHOLDS: [sp_npos_elections::VoteWeight; 9] = - [10, 20, 30, 40, 50, 60, 1_000, 2_000, 10_000]; - -parameter_types! { - pub static BagThresholds: &'static [sp_npos_elections::VoteWeight] = &THRESHOLDS; - pub static MaxNominations: u32 = 16; - pub static HistoryDepth: u32 = 80; - pub static MaxUnlockingChunks: u32 = 32; - pub static RewardOnUnbalanceWasCalled: bool = false; - pub static LedgerSlashPerEra: (BalanceOf, BTreeMap>) = (Zero::zero(), BTreeMap::new()); - pub static MaxWinners: u32 = 100; -} - -pub struct OnChainSeqPhragmen; -impl onchain::Config for OnChainSeqPhragmen { - type System = Test; - type Solver = SequentialPhragmen; - type DataProvider = Staking; - type WeightInfo = (); - type MaxWinners = MaxWinners; - type VotersBound = ConstU32<{ u32::MAX }>; - type TargetsBound = ConstU32<{ u32::MAX }>; -} - -pub struct MockReward {} - -impl OnUnbalanced> for MockReward { - fn on_unbalanced(_: PositiveImbalanceOf) { - RewardOnUnbalanceWasCalled::set(true); - } -} - -pub struct OnStakerSlashMock(core::marker::PhantomData); -impl sp_staking::OnStakerSlash for OnStakerSlashMock { - fn on_slash( - _pool_account: &AccountId, - slashed_bonded: Balance, - slashed_chunks: &BTreeMap, - ) { - LedgerSlashPerEra::set((slashed_bonded, slashed_chunks.clone())); - } -} - -impl pallet_staking::Config for Test { - type Currency = Balances; - type CurrencyBalance = Balance; - type UnixTime = Timestamp; - type CurrencyToVote = frame_support::traits::U128CurrencyToVote; - type ElectionProvider = onchain::OnChainExecution; - type GenesisElectionProvider = Self::ElectionProvider; - type MaxNominations = MaxNominations; - type HistoryDepth = HistoryDepth; - type RewardRemainder = RewardRemainderMock; - type RuntimeEvent = RuntimeEvent; - type Slash = (); - type Reward = MockReward; - type SessionsPerEra = SessionsPerEra; - type BondingDuration = BondingDuration; - type SlashDeferDuration = SlashDeferDuration; - type AdminOrigin = frame_system::EnsureRoot; - type SessionInterface = Self; - type EraPayout = ConvertCurve; - type NextNewSession = Session; - type MaxNominatorRewardedPerValidator = MaxNominatorRewardedPerValidator; - type OffendingValidatorsThreshold = OffendingValidatorsThreshold; - type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; - type TargetList = pallet_staking::UseValidatorsMap; - type MaxUnlockingChunks = MaxUnlockingChunks; - type OnStakerSlash = OnStakerSlashMock; - type BenchmarkingConfig = pallet_staking::SampleBenchmarkingConfig; - type WeightInfo = polymesh_weights::pallet_staking::SubstrateWeight; - type MaxValidatorPerIdentity = polymesh_runtime_common::MaxValidatorPerIdentity; - type MaxVariableInflationTotalIssuance = MaxVariableInflationTotalIssuance; - type FixedYearlyReward = FixedYearlyReward; - type Call = RuntimeCall; - type PalletsOrigin = OriginCaller; - type RewardScheduler = Scheduler; -} - -impl frame_system::offchain::SendTransactionTypes for Test -where - Call: From, -{ - type OverarchingCall = RuntimeCall; - type Extrinsic = Extrinsic; -} - -pub type Extrinsic = TestXt; - -pub(crate) type StakingCall = pallet_staking::Call; -pub(crate) type TestCall = ::RuntimeCall; - -pub struct ExtBuilder { - nominate: bool, - validator_count: u32, - minimum_validator_count: u32, - invulnerables: Vec, - has_stakers: bool, - initialize_first_session: bool, - pub min_nominator_bond: Balance, - min_validator_bond: Balance, - balance_factor: Balance, - status: BTreeMap>, - stakes: BTreeMap, - stakers: Vec<( - IdentityId, - AccountId, - AccountId, - Balance, - StakerStatus, - )>, - slashing_allowed_for: SlashingSwitch, -} - -impl Default for ExtBuilder { - fn default() -> Self { - Self { - nominate: true, - validator_count: 2, - minimum_validator_count: 0, - balance_factor: 1, - invulnerables: vec![], - has_stakers: true, - initialize_first_session: true, - min_nominator_bond: ExistentialDeposit::get(), - min_validator_bond: ExistentialDeposit::get(), - status: Default::default(), - stakes: Default::default(), - stakers: Default::default(), - slashing_allowed_for: SlashingSwitch::Validator, - } - } -} - -impl ExtBuilder { - pub fn existential_deposit(self, existential_deposit: Balance) -> Self { - EXISTENTIAL_DEPOSIT.with(|v| *v.borrow_mut() = existential_deposit); - self - } - pub fn nominate(mut self, nominate: bool) -> Self { - self.nominate = nominate; - self - } - pub fn validator_count(mut self, count: u32) -> Self { - self.validator_count = count; - self - } - pub fn minimum_validator_count(mut self, count: u32) -> Self { - self.minimum_validator_count = count; - self - } - pub fn slash_defer_duration(self, eras: EraIndex) -> Self { - SLASH_DEFER_DURATION.with(|v| *v.borrow_mut() = eras); - self - } - pub fn invulnerables(mut self, invulnerables: Vec) -> Self { - self.invulnerables = invulnerables; - self - } - pub fn session_per_era(self, length: SessionIndex) -> Self { - SESSIONS_PER_ERA.with(|v| *v.borrow_mut() = length); - self - } - pub fn period(self, length: BlockNumber) -> Self { - PERIOD.with(|v| *v.borrow_mut() = length); - self - } - pub fn has_stakers(mut self, has: bool) -> Self { - self.has_stakers = has; - self - } - pub fn initialize_first_session(mut self, init: bool) -> Self { - self.initialize_first_session = init; - self - } - pub fn offset(self, offset: BlockNumber) -> Self { - OFFSET.with(|v| *v.borrow_mut() = offset); - self - } - pub fn min_nominator_bond(mut self, amount: Balance) -> Self { - self.min_nominator_bond = amount; - self - } - pub fn min_validator_bond(mut self, amount: Balance) -> Self { - self.min_validator_bond = amount; - self - } - pub fn set_status(mut self, who: AccountId, status: StakerStatus) -> Self { - self.status.insert(who, status); - self - } - pub fn set_stake(mut self, who: AccountId, stake: Balance) -> Self { - self.stakes.insert(who, stake); - self - } - pub fn add_staker( - mut self, - identity: IdentityId, - stash: AccountId, - ctrl: AccountId, - stake: Balance, - status: StakerStatus, - ) -> Self { - self.stakers.push((identity, stash, ctrl, stake, status)); - self - } - pub fn balance_factor(mut self, factor: Balance) -> Self { - self.balance_factor = factor; - self - } - fn build(self) -> sp_io::TestExternalities { - sp_tracing::try_init_simple(); - let mut storage = frame_system::GenesisConfig::default() - .build_storage::() - .unwrap(); - - let _ = pallet_balances::GenesisConfig:: { - balances: vec![ - (1, 10 * self.balance_factor), - (2, 20 * self.balance_factor), - (3, 300 * self.balance_factor), - (4, 400 * self.balance_factor), - // controllers - (10, self.balance_factor), - (20, self.balance_factor), - (30, self.balance_factor), - (40, self.balance_factor), - (50, self.balance_factor), - // stashes - (11, self.balance_factor * 1000), - (21, self.balance_factor * 2000), - (31, self.balance_factor * 2000), - (41, self.balance_factor * 2000), - (51, self.balance_factor * 2000), - // optional nominator - (100, self.balance_factor * 2000), - (101, self.balance_factor * 2000), - // aux accounts - (60, self.balance_factor), - (61, self.balance_factor * 2000), - (70, self.balance_factor), - (71, self.balance_factor * 2000), - (80, self.balance_factor), - (81, self.balance_factor * 2000), - // This allows us to have a total_payout different from 0. - (999, 1_000_000_000_000), - ], - } - .assimilate_storage(&mut storage); - - pallet_group::GenesisConfig:: { - active_members_limit: u32::MAX, - active_members: vec![IdentityId::from(1), IdentityId::from(2)], - phantom: Default::default(), - } - .assimilate_storage(&mut storage) - .unwrap(); - - pallet_identity::GenesisConfig:: { - identities: vec![ - // (primary_account_id, service provider did, target did, expiry time of CustomerDueDiligence claim i.e 10 days is ms) - // Provide Identity - GenesisIdentityRecord { - primary_key: Some(1005), - issuers: vec![IdentityId::from(1)], - did: IdentityId::from(1), - secondary_keys: Default::default(), - cdd_claim_expiry: None, - }, - GenesisIdentityRecord { - primary_key: Some(11), - issuers: vec![IdentityId::from(1)], - did: IdentityId::from(11), - secondary_keys: Default::default(), - cdd_claim_expiry: None, - }, - GenesisIdentityRecord { - primary_key: Some(21), - issuers: vec![IdentityId::from(1)], - did: IdentityId::from(21), - secondary_keys: Default::default(), - cdd_claim_expiry: None, - }, - GenesisIdentityRecord { - primary_key: Some(31), - issuers: vec![IdentityId::from(1)], - did: IdentityId::from(31), - secondary_keys: Default::default(), - cdd_claim_expiry: None, - }, - GenesisIdentityRecord { - primary_key: Some(41), - issuers: vec![IdentityId::from(1)], - did: IdentityId::from(41), - secondary_keys: Default::default(), - cdd_claim_expiry: None, - }, - GenesisIdentityRecord { - primary_key: Some(101), - issuers: vec![IdentityId::from(1)], - did: IdentityId::from(101), - secondary_keys: Default::default(), - cdd_claim_expiry: None, - }, - GenesisIdentityRecord { - primary_key: Some(61), - issuers: vec![IdentityId::from(1)], - did: IdentityId::from(61), - secondary_keys: Default::default(), - cdd_claim_expiry: None, - }, - GenesisIdentityRecord { - primary_key: Some(71), - issuers: vec![IdentityId::from(1)], - did: IdentityId::from(71), - secondary_keys: Default::default(), - cdd_claim_expiry: None, - }, - GenesisIdentityRecord { - primary_key: Some(81), - issuers: vec![IdentityId::from(1)], - did: IdentityId::from(81), - secondary_keys: Default::default(), - cdd_claim_expiry: None, - }, - ], - ..Default::default() - } - .assimilate_storage(&mut storage) - .unwrap(); - - let mut stakers = vec![]; - if self.has_stakers { - stakers = vec![ - // (stash, ctrl, stake, status) - // these two will be elected in the default test where we elect 2. - ( - IdentityId::from(11), - 11, - 10, - self.balance_factor * 1000, - StakerStatus::::Validator, - ), - ( - IdentityId::from(21), - 21, - 20, - self.balance_factor * 1000, - StakerStatus::::Validator, - ), - // a loser validator - ( - IdentityId::from(31), - 31, - 30, - self.balance_factor * 500, - StakerStatus::::Validator, - ), - // an idle validator - ( - IdentityId::from(41), - 41, - 40, - self.balance_factor * 1000, - StakerStatus::::Idle, - ), - ]; - // optionally add a nominator - if self.nominate { - stakers.push(( - IdentityId::from(101), - 101, - 100, - self.balance_factor * 500, - StakerStatus::::Nominator(vec![11, 21]), - )) - } - - // replace any of the status if needed. - self.status.into_iter().for_each(|(stash, status)| { - let (_, _, _, _, ref mut prev_status) = stakers - .iter_mut() - .find(|s| s.1 == stash) - .expect("set_status staker should exist; qed"); - *prev_status = status; - }); - - // replaced any of the stakes if needed. - self.stakes.into_iter().for_each(|(stash, stake)| { - let (_, _, _, ref mut prev_stake, _) = stakers - .iter_mut() - .find(|s| s.1 == stash) - .expect("set_stake staker should exits; qed."); - *prev_stake = stake; - }); - // extend stakers if needed. - stakers.extend(self.stakers) - } - - let _ = pallet_staking::GenesisConfig:: { - stakers: stakers.clone(), - validator_count: self.validator_count, - minimum_validator_count: self.minimum_validator_count, - invulnerables: self.invulnerables, - slash_reward_fraction: Perbill::from_percent(10), - min_nominator_bond: self.min_nominator_bond, - min_validator_bond: self.min_validator_bond, - slashing_allowed_for: self.slashing_allowed_for, - ..Default::default() - } - .assimilate_storage(&mut storage); - - let _ = pallet_session::GenesisConfig:: { - keys: if self.has_stakers { - // set the keys for the first session. - stakers - .into_iter() - .map(|(_, id, ..)| (id, id, SessionKeys { other: id.into() })) - .collect() - } else { - // set some dummy validators in genesis. - (0..self.validator_count as u64) - .map(|id| (id, id, SessionKeys { other: id.into() })) - .collect() - }, - } - .assimilate_storage(&mut storage); - - let mut ext = sp_io::TestExternalities::from(storage); - - if self.initialize_first_session { - // We consider all test to start after timestamp is initialized This must be ensured by - // having `timestamp::on_initialize` called before `staking::on_initialize`. Also, if - // session length is 1, then it is already triggered. - ext.execute_with(|| { - System::set_block_number(1); - Session::on_initialize(1); - >::on_initialize(1); - Timestamp::set_timestamp(INIT_TIMESTAMP); - }); - } - - ext - } - pub fn build_and_execute(self, test: impl FnOnce() -> ()) { - sp_tracing::try_init_simple(); - let mut ext = self.build(); - ext.execute_with(test); - ext.execute_with(|| { - Staking::do_try_state(System::block_number()).unwrap(); - }); - } -} - -pub type Group = pallet_group::Pallet; - -pub fn provide_did_to_user(account: AccountId) -> bool { - if pallet_identity::KeyRecords::::contains_key(&account) { - return false; - } - - let cdd_account_id = 1005; - let cdd = RuntimeOrigin::signed(cdd_account_id); - assert!( - pallet_identity::KeyRecords::::contains_key(&cdd_account_id), - "CDD provider account not mapped to identity" - ); - - let cdd_did = pallet_identity::Pallet::::get_identity(&cdd_account_id) - .expect("CDD provider missing identity"); - assert!( - pallet_identity::DidRecords::::contains_key(&cdd_did), - "CDD provider identity has no DID record" - ); - - let cdd_did_record = pallet_identity::DidRecords::::get(&cdd_did).unwrap_or_default(); - assert!( - cdd_did_record.primary_key == Some(cdd_account_id), - "CDD identity primary key mismatch" - ); - assert!( - pallet_identity::Pallet::::cdd_register_did(cdd.clone(), account, vec![]).is_ok(), - "Error in registering the DID" - ); - - let did = pallet_identity::Pallet::::get_identity(&account) - .expect("DID not find in the storage"); - assert!( - pallet_identity::Pallet::::add_claim( - cdd.clone(), - did, - Claim::CustomerDueDiligence(Default::default()), - None - ) - .is_ok(), - "Error CDD Claim cannot be added to DID" - ); - true -} - -pub fn add_secondary_key(stash_key: AccountId, to_secondary_key: AccountId) { - if !get_identity(to_secondary_key) { - pallet_identity::Pallet::::get_identity(&stash_key).unwrap(); - assert!( - pallet_identity::Pallet::::add_authorization( - RuntimeOrigin::signed(stash_key), - Signatory::Account(to_secondary_key), - AuthorizationData::JoinIdentity(Permissions::default()), - None - ) - .is_ok(), - "Error in providing the authorization" - ); - - let auth_id = get_last_auth_id(&Signatory::Account(to_secondary_key)); - assert_ok!(pallet_identity::Pallet::::join_identity_as_key( - RuntimeOrigin::signed(to_secondary_key), - auth_id - )); - } -} - -pub(crate) fn active_era() -> EraIndex { - Staking::active_era().unwrap().index -} - -pub(crate) fn current_era() -> EraIndex { - Staking::current_era().unwrap() -} - -pub(crate) fn bond(stash: AccountId, ctrl: AccountId, val: Balance) { - let _ = Balances::make_free_balance_be(&stash, val); - let _ = Balances::make_free_balance_be(&ctrl, val); - - provide_did_to_user(stash); - add_secondary_key(stash, ctrl); - - if Staking::bonded(&stash).is_none() { - assert_ok!(Staking::bond( - RuntimeOrigin::signed(stash), - ctrl, - val, - RewardDestination::Controller, - )); - } -} - -pub(crate) fn bond_validator(stash: AccountId, ctrl: AccountId, val: Balance) { - bond_validator_with_intended_count(stash, ctrl, val, None) -} - -pub fn bond_validator_with_intended_count( - stash: AccountId, - ctrl: AccountId, - val: Balance, - i_count: Option, -) { - bond(stash, ctrl, val); - - let stash_id = Identity::get_identity(&stash).unwrap(); - if Staking::permissioned_identity(stash_id).is_none() { - assert_ok!(Staking::add_permissioned_validator( - frame_system::RawOrigin::Root.into(), - stash_id, - i_count - )); - } - - assert_ok!(Staking::validate( - RuntimeOrigin::signed(ctrl), - ValidatorPrefs::default() - )); - assert_ok!(Session::set_keys( - RuntimeOrigin::signed(ctrl), - SessionKeys { other: ctrl.into() }, - vec![] - )); -} - -pub(crate) fn bond_nominator( - stash: AccountId, - ctrl: AccountId, - val: Balance, - target: Vec, -) { - bond(stash, ctrl, val); - assert_ok!(Staking::nominate(RuntimeOrigin::signed(ctrl), target)); -} - -/// Progress to the given block, triggering session and era changes as we progress. -/// -/// This will finalize the previous block, initialize up to the given block, essentially simulating -/// a block import/propose process where we first initialize the block, then execute some stuff (not -/// in the function), and then finalize the block. -pub(crate) fn run_to_block(n: BlockNumber) { - Staking::on_finalize(System::block_number()); - for b in (System::block_number() + 1)..=n { - System::set_block_number(b); - Session::on_initialize(b); - >::on_initialize(b); - Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); - if b != n { - Staking::on_finalize(System::block_number()); - } - } -} - -/// Progresses from the current block number (whatever that may be) to the `P * session_index + 1`. -pub(crate) fn start_session(session_index: SessionIndex) { - let end: u64 = if Offset::get().is_zero() { - (session_index as u64) * Period::get() - } else { - Offset::get() + (session_index.saturating_sub(1) as u64) * Period::get() - }; - run_to_block(end); - // session must have progressed properly. - assert_eq!( - Session::current_index(), - session_index, - "current session index = {}, expected = {}", - Session::current_index(), - session_index, - ); -} - -/// Go one session forward. -pub(crate) fn advance_session() { - let current_index = Session::current_index(); - start_session(current_index + 1); -} - -/// Progress until the given era. -pub(crate) fn start_active_era(era_index: EraIndex) { - start_session((era_index * >::get()).into()); - assert_eq!(active_era(), era_index); - // One way or another, current_era must have changed before the active era, so they must match - // at this point. - assert_eq!(current_era(), active_era()); -} - -pub(crate) fn current_total_payout_for_duration(duration: u64) -> Balance { - let reward = inflation::compute_total_payout( - &I_NPOS, - Staking::eras_total_stake(active_era()), - Balances::total_issuance(), - duration, - ::MaxVariableInflationTotalIssuance::get(), - ::FixedYearlyReward::get(), - ) - .0; - assert!(reward > 0); - reward -} - -pub(crate) fn maximum_payout_for_duration(duration: u64) -> Balance { - inflation::compute_total_payout( - &I_NPOS, - 0, - Balances::total_issuance(), - duration, - ::MaxVariableInflationTotalIssuance::get(), - ::FixedYearlyReward::get(), - ) - .1 -} - -/// Time it takes to finish a session. -/// -/// Note, if you see `time_per_session() - BLOCK_TIME`, it is fine. This is because we set the -/// timestamp after on_initialize, so the timestamp is always one block old. -pub(crate) fn time_per_session() -> u64 { - Period::get() * BLOCK_TIME -} - -/// Time it takes to finish an era. -/// -/// Note, if you see `time_per_era() - BLOCK_TIME`, it is fine. This is because we set the -/// timestamp after on_initialize, so the timestamp is always one block old. -pub(crate) fn time_per_era() -> u64 { - time_per_session() * SessionsPerEra::get() as u64 -} - -/// Time that will be calculated for the reward per era. -pub(crate) fn reward_time_per_era() -> u64 { - time_per_era() - BLOCK_TIME -} - -pub(crate) fn reward_all_elected() { - let rewards = ::SessionInterface::validators() - .into_iter() - .map(|v| (v, 1)); - - >::reward_by_ids(rewards) -} - -pub(crate) fn validator_controllers() -> Vec { - Session::validators() - .into_iter() - .map(|s| Staking::bonded(&s).expect("no controller for validator")) - .collect() -} - -pub(crate) fn on_offence_in_era( - offenders: &[OffenceDetails< - AccountId, - pallet_session::historical::IdentificationTuple, - >], - slash_fraction: &[Perbill], - era: EraIndex, - disable_strategy: DisableStrategy, -) { - let bonded_eras = pallet_staking::BondedEras::::get(); - for &(bonded_era, start_session) in bonded_eras.iter() { - if bonded_era == era { - let _ = Staking::on_offence(offenders, slash_fraction, start_session, disable_strategy); - return; - } else if bonded_era > era { - break; - } - } - - if Staking::active_era().unwrap().index == era { - let _ = Staking::on_offence( - offenders, - slash_fraction, - Staking::eras_start_session_index(era).unwrap(), - disable_strategy, - ); - } else { - panic!("cannot slash in era {}", era); - } -} - -pub(crate) fn on_offence_now( - offenders: &[OffenceDetails< - AccountId, - pallet_session::historical::IdentificationTuple, - >], - slash_fraction: &[Perbill], -) { - let now = Staking::active_era().unwrap().index; - on_offence_in_era(offenders, slash_fraction, now, DisableStrategy::WhenSlashed) -} - -pub(crate) fn add_slash(who: &AccountId) { - on_offence_now( - &[OffenceDetails { - offender: (*who, Staking::eras_stakers(active_era(), *who)), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - ); -} - -/// Make all validator and nominator request their payment -pub(crate) fn make_all_reward_payment(era: EraIndex) { - let validators_with_reward = ErasRewardPoints::::get(era) - .individual - .keys() - .cloned() - .collect::>(); - - // reward validators - for validator_controller in validators_with_reward.iter().filter_map(Staking::bonded) { - let ledger = >::get(&validator_controller).unwrap(); - assert_ok!(Staking::payout_stakers( - RuntimeOrigin::signed(1337), - ledger.stash, - era - )); - } -} - -#[macro_export] -macro_rules! assert_session_era { - ($session:expr, $era:expr) => { - assert_eq!( - Session::current_index(), - $session, - "wrong session {} != {}", - Session::current_index(), - $session, - ); - assert_eq!( - Staking::current_era().unwrap(), - $era, - "wrong current era {} != {}", - Staking::current_era().unwrap(), - $era, - ); - }; -} - -pub(crate) fn staking_events() -> Vec> { - System::events() - .into_iter() - .map(|r| r.event) - .filter_map(|e| { - if let RuntimeEvent::Staking(inner) = e { - Some(inner) - } else { - None - } - }) - .collect() -} - -parameter_types! { - static StakingEventsIndex: usize = 0; -} -ord_parameter_types! { - pub const One: u64 = 1; -} - -type EnsureOneOrRoot = EitherOfDiverse, EnsureSignedBy>; - -pub(crate) fn staking_events_since_last_call() -> Vec> { - let all: Vec<_> = System::events() - .into_iter() - .filter_map(|r| { - if let RuntimeEvent::Staking(inner) = r.event { - Some(inner) - } else { - None - } - }) - .collect(); - let seen = StakingEventsIndex::get(); - StakingEventsIndex::set(all.len()); - all.into_iter().skip(seen).collect() -} - -pub(crate) fn balances(who: &AccountId) -> (Balance, Balance) { - (Balances::free_balance(who), Balances::reserved_balance(who)) -} - -pub fn get_identity(key: AccountId) -> bool { - pallet_identity::KeyRecords::::contains_key(&key) -} - -pub fn bond_nominator_cdd(stash: AccountId, ctrl: AccountId, val: Balance, target: Vec) { - provide_did_to_user(stash); - add_secondary_key(stash, ctrl); - bond_nominator(stash, ctrl, val, target); -} - -// `iter_prefix_values` has no guarantee that it will iterate in a sequential -// order. However, we need the latest `auth_id`. Which is why we search for the claim -// with the highest `auth_id`. -pub fn get_last_auth(signatory: &Signatory) -> Authorization { - pallet_identity::Authorizations::::iter_prefix_values(signatory) - .into_iter() - .max_by_key(|x| x.auth_id) - .expect("there are no authorizations") -} - -pub fn get_last_auth_id(signatory: &Signatory) -> u64 { - get_last_auth(signatory).auth_id -} - -// Polymesh change -// ----------------------------------------------------------------- - -pub type Origin = ::RuntimeOrigin; - -fn get_primary_key(target: IdentityId) -> AccountId { - Identity::get_primary_key(target).unwrap_or_default() -} - -pub fn make_account(account_id: AccountId) -> (Origin, IdentityId) { - make_account_with_balance(account_id, 1_000_000, None) -} - -/// It creates an Account and registers its DID. -pub fn make_account_with_balance( - account_id: AccountId, - balance: Balance, - expiry: Option, -) -> (Origin, IdentityId) { - Balances::make_free_balance_be(&account_id, balance); - - let signed_account = Origin::signed(account_id.clone()); - - let cdd_providers = Group::get_members(); - if let Some(cdd_provider_did) = cdd_providers.into_iter().nth(0) { - let cdd_provider_acc = get_primary_key(cdd_provider_did); - Identity::cdd_register_did(Origin::signed(cdd_provider_acc), account_id, vec![]).unwrap(); - let account_did = Identity::get_identity(&account_id).unwrap(); - Identity::add_claim( - Origin::signed(cdd_provider_acc), - account_did, - Claim::CustomerDueDiligence(Default::default()), - expiry, - ) - .unwrap(); - return (signed_account, account_did); - } - - Identity::testing_cdd_register_did(account_id.clone(), vec![]).unwrap(); - let account_did = Identity::get_identity(&account_id).unwrap(); - - (signed_account, account_did) -} - -pub fn add_trusted_cdd_provider(identity: IdentityId) { - assert_ok!(Group::add_member( - Origin::from(frame_system::RawOrigin::Root), - identity - )); -} - -pub fn run_to_block_scheduler(n: u64) { - while System::block_number() < n { - Staking::on_finalize(System::block_number()); - Scheduler::on_finalize(System::block_number()); - System::set_block_number(System::block_number() + 1); - Scheduler::on_initialize(System::block_number()); - Session::on_initialize(System::block_number()); - Staking::on_initialize(System::block_number()); - Staking::on_finalize(System::block_number()); - } -} - -pub fn bond_nominator_with_expiry(acc: u64, val: u128, claim_expiry: u64, target: Vec) { - // a = controller - // a + 1 = stash - let controller = acc; - let stash = acc + 1; - let _ = Balances::make_free_balance_be(&(stash), val); - assert_ok!(Staking::bond( - Origin::signed(stash), - controller, - val, - RewardDestination::Controller - )); - create_did_and_add_claim_with_expiry(stash, claim_expiry); - assert_ok!(Staking::nominate(Origin::signed(controller), target)); -} - -pub fn create_did_and_add_claim_with_expiry(stash: AccountId, expiry: u64) { - Balances::make_free_balance_be(&1005, 1_000_000); - assert_ok!(Identity::cdd_register_did( - Origin::signed(1005), - stash, - vec![] - )); - let did = Identity::get_identity(&stash).unwrap(); - assert_ok!(Identity::add_claim( - Origin::signed(1005), - did, - Claim::CustomerDueDiligence(Default::default()), - Some(expiry.into()) - )); -} - -// ----------------------------------------------------------------- diff --git a/pallets/runtime/tests/src/staking/mod.rs b/pallets/runtime/tests/src/staking/mod.rs deleted file mode 100644 index 9a85dfdeeb..0000000000 --- a/pallets/runtime/tests/src/staking/mod.rs +++ /dev/null @@ -1,7083 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Tests for the module. - -mod mock; - -use frame_election_provider_support::{ElectionProvider, SortedListProvider}; -use frame_support::{ - assert_noop, assert_ok, assert_storage_noop, bounded_vec, - dispatch::{extract_actual_weight, GetDispatchInfo, WithPostDispatchInfo}, - pallet_prelude::*, - traits::{Currency, Get, ReservableCurrency}, -}; -use mock::*; - -use pallet_balances::{Error as BalancesError, Locks}; -use pallet_pips::{ProposalVotes, Proposals}; -use polymesh_primitives::IdentityId; -use sp_runtime::{ - assert_eq_error_rate, - traits::{BadOrigin, Dispatchable}, - Perbill, Percent, Perquintill, Rounding, -}; -use sp_staking::{ - offence::{DisableStrategy, OffenceDetails, OnOffenceHandler}, - EraIndex, SessionIndex, -}; -use sp_std::prelude::*; -use substrate_test_utils::assert_eq_uvec; - -use std::collections::BTreeMap; - -use sp_runtime::traits::Zero; - -use pallet_staking::{ConfigOp, Event, *}; - -macro_rules! assert_add_permissioned_validator { - ($acc_id:expr) => { - assert_ok!(Staking::add_permissioned_validator( - RuntimeOrigin::root(), - pallet_identity::Pallet::::get_identity($acc_id).unwrap(), - None - )); - }; -} - -#[test] -fn set_staking_configs_works() { - ExtBuilder::default().build_and_execute(|| { - // setting works - assert_ok!(Staking::set_staking_configs( - RuntimeOrigin::root(), - ConfigOp::Set(1_500), - ConfigOp::Set(2_000), - ConfigOp::Set(10), - ConfigOp::Set(20), - ConfigOp::Set(Percent::from_percent(75)), - ConfigOp::Set(Zero::zero()) - )); - assert_eq!(MinNominatorBond::::get(), 1_500); - assert_eq!(MinValidatorBond::::get(), 2_000); - assert_eq!(MaxNominatorsCount::::get(), Some(10)); - assert_eq!(MaxValidatorsCount::::get(), Some(20)); - assert_eq!( - ChillThreshold::::get(), - Some(Percent::from_percent(75)) - ); - assert_eq!(MinCommission::::get(), Perbill::from_percent(0)); - - // noop does nothing - assert_storage_noop!(assert_ok!(Staking::set_staking_configs( - RuntimeOrigin::root(), - ConfigOp::Noop, - ConfigOp::Noop, - ConfigOp::Noop, - ConfigOp::Noop, - ConfigOp::Noop, - ConfigOp::Noop - ))); - - // removing works - assert_ok!(Staking::set_staking_configs( - RuntimeOrigin::root(), - ConfigOp::Remove, - ConfigOp::Remove, - ConfigOp::Remove, - ConfigOp::Remove, - ConfigOp::Remove, - ConfigOp::Remove - )); - assert_eq!(MinNominatorBond::::get(), 0); - assert_eq!(MinValidatorBond::::get(), 0); - assert_eq!(MaxNominatorsCount::::get(), None); - assert_eq!(MaxValidatorsCount::::get(), None); - assert_eq!(ChillThreshold::::get(), None); - assert_eq!(MinCommission::::get(), Perbill::from_percent(0)); - }); -} - -#[test] -fn force_unstake_works() { - ExtBuilder::default().build_and_execute(|| { - // Account 11 is stashed and locked, and account 10 is the controller - assert_eq!(Staking::bonded(&11), Some(10)); - // Adds 2 slashing spans - add_slash(&11); - // Cant transfer - assert_noop!( - Balances::transfer(RuntimeOrigin::signed(11), 1, 10), - BalancesError::::LiquidityRestrictions - ); - // Force unstake requires root. - assert_noop!( - Staking::force_unstake(RuntimeOrigin::signed(11), 11, 2), - BadOrigin - ); - // Force unstake needs correct number of slashing spans (for weight calculation) - assert_noop!( - Staking::force_unstake(RuntimeOrigin::root(), 11, 0), - Error::::IncorrectSlashingSpans - ); - // We now force them to unstake - assert_ok!(Staking::force_unstake(RuntimeOrigin::root(), 11, 2)); - // No longer bonded. - assert_eq!(Staking::bonded(&11), None); - // Transfer works. - assert_ok!(Balances::transfer(RuntimeOrigin::signed(11), 1, 10)); - }); -} - -#[test] -fn kill_stash_works() { - ExtBuilder::default().build_and_execute(|| { - // Account 11 is stashed and locked, and account 10 is the controller - assert_eq!(Staking::bonded(&11), Some(10)); - // Adds 2 slashing spans - add_slash(&11); - // Only can kill a stash account - assert_noop!(Staking::kill_stash(&12, 0), Error::::NotStash); - // Respects slashing span count - assert_noop!( - Staking::kill_stash(&11, 0), - Error::::IncorrectSlashingSpans - ); - // Correct inputs, everything works - assert_ok!(Staking::kill_stash(&11, 2)); - // No longer bonded. - assert_eq!(Staking::bonded(&11), None); - }); -} - -#[test] -fn basic_setup_works() { - // Verifies initial conditions of mock - ExtBuilder::default().build_and_execute(|| { - // Account 11 is stashed and locked, and account 10 is the controller - assert_eq!(Staking::bonded(&11), Some(10)); - // Account 21 is stashed and locked, and account 20 is the controller - assert_eq!(Staking::bonded(&21), Some(20)); - // Account 1 is not a stashed - assert_eq!(Staking::bonded(&1), None); - - // Account 10 controls the stash from account 11, which is 100 * balance_factor units - assert_eq!( - Staking::ledger(&10).unwrap(), - StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - } - ); - // Account 20 controls the stash from account 21, which is 200 * balance_factor units - assert_eq!( - Staking::ledger(&20), - Some(StakingLedger { - stash: 21, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - // Account 1 does not control any stash - assert_eq!(Staking::ledger(&1), None); - - // ValidatorPrefs are default - assert_eq_uvec!( - >::iter().collect::>(), - vec![ - (31, ValidatorPrefs::default()), - (21, ValidatorPrefs::default()), - (11, ValidatorPrefs::default()) - ] - ); - - assert_eq!( - Staking::ledger(100), - Some(StakingLedger { - stash: 101, - total: 500, - active: 500, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - - assert_eq!( - Staking::eras_stakers(active_era(), 11), - Exposure { - total: 1125, - own: 1000, - others: vec![IndividualExposure { - who: 101, - value: 125 - }] - }, - ); - assert_eq!( - Staking::eras_stakers(active_era(), 21), - Exposure { - total: 1375, - own: 1000, - others: vec![IndividualExposure { - who: 101, - value: 375 - }] - }, - ); - - // initial total stake = 1125 + 1375 - assert_eq!(Staking::eras_total_stake(active_era()), 2500); - - // The number of validators required. - assert_eq!(Staking::validator_count(), 2); - - // Initial Era and session - assert_eq!(active_era(), 0); - - // Account 10 has `balance_factor` free balance - assert_eq!(Balances::free_balance(10), 1); - assert_eq!(Balances::free_balance(10), 1); - - // New era is not being forced - assert_eq!(Staking::force_era(), Forcing::NotForcing); - }); -} - -#[test] -fn change_controller_works() { - ExtBuilder::default().build_and_execute(|| { - // 10 and 11 are bonded as stash controller. - assert_eq!(Staking::bonded(&11), Some(10)); - - // 10 can control 11 who is initially a validator. - assert_ok!(Staking::chill(RuntimeOrigin::signed(10))); - - // change controller - assert_ok!(Staking::set_controller(RuntimeOrigin::signed(11), 5)); - assert_eq!(Staking::bonded(&11), Some(5)); - mock::start_active_era(1); - - // 10 is no longer in control. - assert_noop!( - Staking::validate(RuntimeOrigin::signed(10), ValidatorPrefs::default()), - Error::::NotController, - ); - assert_ok!(Staking::validate( - RuntimeOrigin::signed(5), - ValidatorPrefs::default() - )); - }) -} - -#[test] -fn rewards_should_work() { - ExtBuilder::default() - .nominate(true) - .session_per_era(3) - .build_and_execute(|| { - let init_balance_10 = Balances::total_balance(&10); - let init_balance_11 = Balances::total_balance(&11); - let init_balance_20 = Balances::total_balance(&20); - let init_balance_21 = Balances::total_balance(&21); - let init_balance_100 = Balances::total_balance(&100); - let init_balance_101 = Balances::total_balance(&101); - - // Set payees - Payee::::insert(11, RewardDestination::Controller); - Payee::::insert(21, RewardDestination::Controller); - Payee::::insert(101, RewardDestination::Controller); - - Pallet::::reward_by_ids(vec![(11, 50)]); - Pallet::::reward_by_ids(vec![(11, 50)]); - // This is the second validator of the current elected set. - Pallet::::reward_by_ids(vec![(21, 50)]); - - // Compute total payout now for whole duration of the session. - let total_payout_0 = current_total_payout_for_duration(reward_time_per_era()); - let maximum_payout = maximum_payout_for_duration(reward_time_per_era()); - - start_session(1); - assert_eq_uvec!(Session::validators(), vec![11, 21]); - - assert_eq!(Balances::total_balance(&10), init_balance_10); - assert_eq!(Balances::total_balance(&11), init_balance_11); - assert_eq!(Balances::total_balance(&20), init_balance_20); - assert_eq!(Balances::total_balance(&21), init_balance_21); - assert_eq!(Balances::total_balance(&100), init_balance_100); - assert_eq!(Balances::total_balance(&101), init_balance_101); - assert_eq!( - Staking::eras_reward_points(active_era()), - EraRewardPoints { - total: 50 * 3, - individual: vec![(11, 100), (21, 50)].into_iter().collect(), - } - ); - let part_for_10 = Perbill::from_rational::(1000, 1125); - let part_for_20 = Perbill::from_rational::(1000, 1375); - let part_for_100_from_10 = Perbill::from_rational::(125, 1125); - let part_for_100_from_20 = Perbill::from_rational::(375, 1375); - - start_session(2); - start_session(3); - - assert_eq!(active_era(), 1); - assert_eq!( - mock::RewardRemainderUnbalanced::get(), - maximum_payout - total_payout_0, - ); - assert_eq!( - *mock::staking_events().last().unwrap(), - Event::EraPaid { - era_index: 0, - validator_payout: total_payout_0, - remainder: maximum_payout - total_payout_0 - } - ); - mock::make_all_reward_payment(0); - - assert_eq_error_rate!( - Balances::total_balance(&10), - init_balance_10 + part_for_10 * total_payout_0 * 2 / 3, - 2, - ); - assert_eq_error_rate!(Balances::total_balance(&11), init_balance_11, 2); - assert_eq_error_rate!( - Balances::total_balance(&20), - init_balance_20 + part_for_20 * total_payout_0 * 1 / 3, - 2, - ); - assert_eq_error_rate!(Balances::total_balance(&21), init_balance_21, 2); - assert_eq_error_rate!( - Balances::total_balance(&100), - init_balance_100 - + part_for_100_from_10 * total_payout_0 * 2 / 3 - + part_for_100_from_20 * total_payout_0 * 1 / 3, - 2 - ); - assert_eq_error_rate!(Balances::total_balance(&101), init_balance_101, 2); - - assert_eq_uvec!(Session::validators(), vec![11, 21]); - Pallet::::reward_by_ids(vec![(11, 1)]); - - // Compute total payout now for whole duration as other parameter won't change - let total_payout_1 = current_total_payout_for_duration(reward_time_per_era()); - - mock::start_active_era(2); - assert_eq!( - mock::RewardRemainderUnbalanced::get(), - maximum_payout * 2 - total_payout_0 - total_payout_1, - ); - assert_eq!( - *mock::staking_events().last().unwrap(), - Event::EraPaid { - era_index: 1, - validator_payout: total_payout_1, - remainder: maximum_payout - total_payout_1 - } - ); - mock::make_all_reward_payment(1); - - assert_eq_error_rate!( - Balances::total_balance(&10), - init_balance_10 + part_for_10 * (total_payout_0 * 2 / 3 + total_payout_1), - 2, - ); - assert_eq_error_rate!(Balances::total_balance(&11), init_balance_11, 2); - assert_eq_error_rate!( - Balances::total_balance(&20), - init_balance_20 + part_for_20 * total_payout_0 * 1 / 3, - 2, - ); - assert_eq_error_rate!(Balances::total_balance(&21), init_balance_21, 2); - assert_eq_error_rate!( - Balances::total_balance(&100), - init_balance_100 - + part_for_100_from_10 * (total_payout_0 * 2 / 3 + total_payout_1) - + part_for_100_from_20 * total_payout_0 * 1 / 3, - 2 - ); - assert_eq_error_rate!(Balances::total_balance(&101), init_balance_101, 2); - }); -} - -#[test] -fn staking_should_work() { - ExtBuilder::default().nominate(false).build_and_execute(|| { - // remember + compare this along with the test. - assert_eq_uvec!(validator_controllers(), vec![20, 10]); - - // put some money in account that we'll use. - for i in 1..5 { - let _ = Balances::make_free_balance_be(&i, 2000); - } - - // --- Block 2: - start_session(2); - provide_did_to_user(3); - add_secondary_key(3, 4); - // add a new candidate for being a validator. account 3 controlled by 4. - assert_ok!(Staking::bond( - RuntimeOrigin::signed(3), - 4, - 1500, - RewardDestination::Controller - )); - assert_add_permissioned_validator!(&3); - assert_ok!(Staking::validate( - RuntimeOrigin::signed(4), - ValidatorPrefs::default() - )); - assert_ok!(Session::set_keys( - RuntimeOrigin::signed(4), - SessionKeys { other: 4.into() }, - vec![] - )); - - // No effects will be seen so far. - assert_eq_uvec!(validator_controllers(), vec![20, 10]); - - // --- Block 3: - start_session(3); - - // No effects will be seen so far. Era has not been yet triggered. - assert_eq_uvec!(validator_controllers(), vec![20, 10]); - - // --- Block 4: the validators will now be queued. - start_session(4); - assert_eq!(active_era(), 1); - - // --- Block 5: the validators are still in queue. - start_session(5); - - // --- Block 6: the validators will now be changed. - start_session(6); - - assert_eq_uvec!(validator_controllers(), vec![20, 4]); - // --- Block 6: Unstake 4 as a validator, freeing up the balance stashed in 3 - // 4 will chill - Staking::chill(RuntimeOrigin::signed(4)).unwrap(); - - // --- Block 7: nothing. 4 is still there. - start_session(7); - assert_eq_uvec!(validator_controllers(), vec![20, 4]); - - // --- Block 8: - start_session(8); - - // --- Block 9: 4 will not be a validator. - start_session(9); - assert_eq_uvec!(validator_controllers(), vec![20, 10]); - - // Note: the stashed value of 4 is still lock - assert_eq!( - Staking::ledger(&4), - Some(StakingLedger { - stash: 3, - total: 1500, - active: 1500, - unlocking: Default::default(), - claimed_rewards: bounded_vec![0], - }) - ); - // e.g. it cannot reserve more than 500 that it has free from the total 2000 - assert_noop!( - Balances::reserve(&3, 501), - BalancesError::::LiquidityRestrictions - ); - assert_ok!(Balances::reserve(&3, 409)); - }); -} - -#[test] -fn blocking_and_kicking_works() { - ExtBuilder::default() - .minimum_validator_count(1) - .validator_count(4) - .nominate(true) - .build_and_execute(|| { - // block validator 10/11 - assert_ok!(Staking::validate( - RuntimeOrigin::signed(10), - ValidatorPrefs { - blocked: true, - ..Default::default() - } - )); - // attempt to nominate from 100/101... - assert_ok!(Staking::nominate(RuntimeOrigin::signed(100), vec![11])); - // should have worked since we're already nominated them - assert_eq!(Nominators::::get(&101).unwrap().targets, vec![11]); - // kick the nominator - assert_ok!(Staking::kick(RuntimeOrigin::signed(10), vec![101])); - // should have been kicked now - assert!(Nominators::::get(&101).unwrap().targets.is_empty()); - // attempt to nominate from 100/101... - assert_noop!( - Staking::nominate(RuntimeOrigin::signed(100), vec![11]), - Error::::BadTarget - ); - }); -} - -#[test] -fn less_than_needed_candidates_works() { - ExtBuilder::default() - .minimum_validator_count(1) - .validator_count(4) - .nominate(false) - .build_and_execute(|| { - assert_eq!(Staking::validator_count(), 4); - assert_eq!(Staking::minimum_validator_count(), 1); - assert_eq_uvec!(validator_controllers(), vec![30, 20, 10]); - - mock::start_active_era(1); - - // Previous set is selected. NO election algorithm is even executed. - assert_eq_uvec!(validator_controllers(), vec![30, 20, 10]); - - // But the exposure is updated in a simple way. No external votes exists. - // This is purely self-vote. - assert!(ErasStakers::::iter_prefix_values(active_era()) - .all(|exposure| exposure.others.is_empty())); - }); -} - -#[test] -fn no_candidate_emergency_condition() { - ExtBuilder::default() - .minimum_validator_count(1) - .validator_count(15) - .set_status(41, StakerStatus::Validator) - .nominate(false) - .build_and_execute(|| { - // initial validators - assert_eq_uvec!(validator_controllers(), vec![10, 20, 30, 40]); - let prefs = ValidatorPrefs { - commission: Perbill::one(), - ..Default::default() - }; - pallet_staking::Validators::::insert(11, prefs.clone()); - - // set the minimum validator count. - pallet_staking::MinimumValidatorCount::::put(10); - - // try to chill - let res = Staking::chill(RuntimeOrigin::signed(10)); - assert_ok!(res); - - let current_era = CurrentEra::::get(); - - // try trigger new era - mock::run_to_block(20); - assert_eq!( - *staking_events().last().unwrap(), - Event::StakingElectionFailed - ); - // No new era is created - assert_eq!(current_era, CurrentEra::::get()); - - // Go to far further session to see if validator have changed - mock::run_to_block(100); - - // Previous ones are elected. chill is not effective in active era (as era hasn't - // changed) - assert_eq_uvec!(validator_controllers(), vec![10, 20, 30, 40]); - // The chill is still pending. - assert!(!pallet_staking::Validators::::contains_key(11)); - // No new era is created. - assert_eq!(current_era, CurrentEra::::get()); - }); -} - -#[test] -fn nominating_and_rewards_should_work() { - ExtBuilder::default() - .nominate(false) - .set_status(41, StakerStatus::Validator) - .set_status(11, StakerStatus::Idle) - .set_status(31, StakerStatus::Idle) - .build_and_execute(|| { - // initial validators. - assert_eq_uvec!(validator_controllers(), vec![40, 20]); - - // re-validate with 11 and 31. - assert_add_permissioned_validator!(&11); - assert_ok!(Staking::validate( - RuntimeOrigin::signed(10), - Default::default() - )); - assert_add_permissioned_validator!(&31); - assert_ok!(Staking::validate( - RuntimeOrigin::signed(30), - Default::default() - )); - - // Set payee to controller. - assert_ok!(Staking::set_payee( - RuntimeOrigin::signed(10), - RewardDestination::Controller - )); - assert_ok!(Staking::set_payee( - RuntimeOrigin::signed(20), - RewardDestination::Controller - )); - assert_ok!(Staking::set_payee( - RuntimeOrigin::signed(30), - RewardDestination::Controller - )); - assert_ok!(Staking::set_payee( - RuntimeOrigin::signed(40), - RewardDestination::Controller - )); - - // give the man some money - let initial_balance = 1000; - for i in [1, 2, 3, 4, 5, 10, 11, 20, 21].iter() { - let _ = Balances::make_free_balance_be(i, initial_balance); - } - - // bond two account pairs and state interest in nomination. - provide_did_to_user(1); - add_secondary_key(1, 2); - assert_ok!(Staking::bond( - RuntimeOrigin::signed(1), - 2, - 1000, - RewardDestination::Controller - )); - assert_add_permissioned_validator!(&1); - assert_ok!(Staking::nominate( - RuntimeOrigin::signed(2), - vec![11, 21, 31] - )); - - provide_did_to_user(3); - add_secondary_key(3, 4); - assert_ok!(Staking::bond( - RuntimeOrigin::signed(3), - 4, - 1000, - RewardDestination::Controller - )); - assert_add_permissioned_validator!(&3); - assert_ok!(Staking::nominate( - RuntimeOrigin::signed(4), - vec![11, 21, 41] - )); - - // the total reward for era 0 - let total_payout_0 = current_total_payout_for_duration(reward_time_per_era()); - Pallet::::reward_by_ids(vec![(41, 1)]); - Pallet::::reward_by_ids(vec![(21, 1)]); - - mock::start_active_era(1); - - // 10 and 20 have more votes, they will be chosen. - assert_eq_uvec!(validator_controllers(), vec![20, 10]); - - // old validators must have already received some rewards. - let initial_balance_40 = Balances::total_balance(&40); - let mut initial_balance_20 = Balances::total_balance(&20); - mock::make_all_reward_payment(0); - assert_eq!( - Balances::total_balance(&40), - initial_balance_40 + total_payout_0 / 2 - ); - assert_eq!( - Balances::total_balance(&20), - initial_balance_20 + total_payout_0 / 2 - ); - initial_balance_20 = Balances::total_balance(&20); - - assert_eq!( - ErasStakers::::iter_prefix_values(active_era()).count(), - 2 - ); - assert_eq!( - Staking::eras_stakers(active_era(), 11), - Exposure { - total: 1000 + 800, - own: 1000, - others: vec![ - IndividualExposure { who: 3, value: 400 }, - IndividualExposure { who: 1, value: 400 }, - ] - }, - ); - assert_eq!( - Staking::eras_stakers(active_era(), 21), - Exposure { - total: 1000 + 1200, - own: 1000, - others: vec![ - IndividualExposure { who: 3, value: 600 }, - IndividualExposure { who: 1, value: 600 }, - ] - }, - ); - - // the total reward for era 1 - let total_payout_1 = current_total_payout_for_duration(reward_time_per_era()); - Pallet::::reward_by_ids(vec![(21, 2)]); - Pallet::::reward_by_ids(vec![(11, 1)]); - - mock::start_active_era(2); - - // nothing else will happen, era ends and rewards are paid again, it is expected that - // nominators will also be paid. See below - - mock::make_all_reward_payment(1); - let payout_for_10 = total_payout_1 / 3; - let payout_for_20 = 2 * total_payout_1 / 3; - // Nominator 2: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 20]'s reward. ==> - // 2/9 + 3/11 - assert_eq_error_rate!( - Balances::total_balance(&2), - initial_balance + (2 * payout_for_10 / 9 + 3 * payout_for_20 / 11), - 2, - ); - // Nominator 4: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 20]'s reward. ==> - // 2/9 + 3/11 - assert_eq_error_rate!( - Balances::total_balance(&4), - initial_balance + (2 * payout_for_10 / 9 + 3 * payout_for_20 / 11), - 2, - ); - - // Validator 10: got 800 / 1800 external stake => 8/18 =? 4/9 => Validator's share = 5/9 - assert_eq_error_rate!( - Balances::total_balance(&10), - initial_balance + 5 * payout_for_10 / 9, - 2, - ); - // Validator 20: got 1200 / 2200 external stake => 12/22 =? 6/11 => Validator's share = - // 5/11 - assert_eq_error_rate!( - Balances::total_balance(&20), - initial_balance_20 + 5 * payout_for_20 / 11, - 2, - ); - }); -} - -#[test] -fn nominators_also_get_slashed_pro_rata() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - let slash_percent = Perbill::from_percent(5); - let initial_exposure = Staking::eras_stakers(active_era(), 11); - // 101 is a nominator for 11 - assert_eq!(initial_exposure.others.first().unwrap().who, 101); - - // staked values; - let nominator_stake = Staking::ledger(100).unwrap().active; - let nominator_balance = balances(&101).0; - let validator_stake = Staking::ledger(10).unwrap().active; - let validator_balance = balances(&11).0; - let exposed_stake = initial_exposure.total; - let exposed_validator = initial_exposure.own; - let exposed_nominator = initial_exposure.others.first().unwrap().value; - - // 11 goes offline - on_offence_now( - &[OffenceDetails { - offender: (11, initial_exposure.clone()), - reporters: vec![], - }], - &[slash_percent], - ); - - // Polymesh change - // ----------------------------------------------------------------- - // Nominator slashing is switched of - // validator stake must have decreased - assert!(Staking::ledger(100).unwrap().active == nominator_stake); - assert!(Staking::ledger(10).unwrap().active < validator_stake); - // ----------------------------------------------------------------- - - let slash_amount = slash_percent * exposed_stake; - let validator_share = - Perbill::from_rational(exposed_validator, exposed_stake) * slash_amount; - let nominator_share = - Perbill::from_rational(exposed_nominator, exposed_stake) * slash_amount; - - // both slash amounts need to be positive for the test to make sense. - assert!(validator_share > 0); - assert!(nominator_share > 0); - - // both stakes must have been decreased pro-rata. - // assert_eq!( - // Staking::ledger(100).unwrap().active, - // nominator_stake - nominator_share - // ); - assert_eq!( - Staking::ledger(10).unwrap().active, - validator_stake - validator_share - ); - assert_eq!( - balances(&101).0, // free balance - nominator_balance, - ); - assert_eq!( - balances(&11).0, // free balance - validator_balance - validator_share, - ); - // Because slashing happened. - assert!(is_disabled(10)); - }); -} - -#[test] -fn double_staking_should_fail() { - // should test (in the same order): - // * an account already bonded as stash cannot be be stashed again. - // * an account already bonded as stash cannot nominate. - // * an account already bonded as controller can nominate. - ExtBuilder::default().build_and_execute(|| { - let arbitrary_value = 5; - // 2 = controller, 1 stashed => ok - assert_ok!(Staking::bond( - RuntimeOrigin::signed(1), - 2, - arbitrary_value, - RewardDestination::default() - )); - // 4 = not used so far, 1 stashed => not allowed. - assert_noop!( - Staking::bond( - RuntimeOrigin::signed(1), - 4, - arbitrary_value, - RewardDestination::default() - ), - Error::::AlreadyBonded, - ); - // 1 = stashed => attempting to nominate should fail. - assert_noop!( - Staking::nominate(RuntimeOrigin::signed(1), vec![1]), - Error::::NotController - ); - // 2 = controller => nominating should work. - assert_ok!(Staking::nominate(RuntimeOrigin::signed(2), vec![1]),); - }); -} - -#[test] -fn double_controlling_should_fail() { - // should test (in the same order): - // * an account already bonded as controller CANNOT be reused as the controller of another - // account. - ExtBuilder::default().build_and_execute(|| { - let arbitrary_value = 5; - // 2 = controller, 1 stashed => ok - assert_ok!(Staking::bond( - RuntimeOrigin::signed(1), - 2, - arbitrary_value, - RewardDestination::default(), - )); - // 2 = controller, 3 stashed (Note that 2 is reused.) => no-op - assert_noop!( - Staking::bond( - RuntimeOrigin::signed(3), - 2, - arbitrary_value, - RewardDestination::default() - ), - Error::::AlreadyPaired, - ); - }); -} - -#[test] -fn session_and_eras_work_simple() { - ExtBuilder::default().period(1).build_and_execute(|| { - assert_eq!(active_era(), 0); - assert_eq!(current_era(), 0); - assert_eq!(Session::current_index(), 1); - assert_eq!(System::block_number(), 1); - - // Session 1: this is basically a noop. This has already been started. - start_session(1); - assert_eq!(Session::current_index(), 1); - assert_eq!(active_era(), 0); - assert_eq!(System::block_number(), 1); - - // Session 2: No change. - start_session(2); - assert_eq!(Session::current_index(), 2); - assert_eq!(active_era(), 0); - assert_eq!(System::block_number(), 2); - - // Session 3: Era increment. - start_session(3); - assert_eq!(Session::current_index(), 3); - assert_eq!(active_era(), 1); - assert_eq!(System::block_number(), 3); - - // Session 4: No change. - start_session(4); - assert_eq!(Session::current_index(), 4); - assert_eq!(active_era(), 1); - assert_eq!(System::block_number(), 4); - - // Session 5: No change. - start_session(5); - assert_eq!(Session::current_index(), 5); - assert_eq!(active_era(), 1); - assert_eq!(System::block_number(), 5); - - // Session 6: Era increment. - start_session(6); - assert_eq!(Session::current_index(), 6); - assert_eq!(active_era(), 2); - assert_eq!(System::block_number(), 6); - }); -} - -#[test] -fn session_and_eras_work_complex() { - ExtBuilder::default().period(5).build_and_execute(|| { - assert_eq!(active_era(), 0); - assert_eq!(Session::current_index(), 0); - assert_eq!(System::block_number(), 1); - - start_session(1); - assert_eq!(Session::current_index(), 1); - assert_eq!(active_era(), 0); - assert_eq!(System::block_number(), 5); - - start_session(2); - assert_eq!(Session::current_index(), 2); - assert_eq!(active_era(), 0); - assert_eq!(System::block_number(), 10); - - start_session(3); - assert_eq!(Session::current_index(), 3); - assert_eq!(active_era(), 1); - assert_eq!(System::block_number(), 15); - - start_session(4); - assert_eq!(Session::current_index(), 4); - assert_eq!(active_era(), 1); - assert_eq!(System::block_number(), 20); - - start_session(5); - assert_eq!(Session::current_index(), 5); - assert_eq!(active_era(), 1); - assert_eq!(System::block_number(), 25); - - start_session(6); - assert_eq!(Session::current_index(), 6); - assert_eq!(active_era(), 2); - assert_eq!(System::block_number(), 30); - }); -} - -#[test] -fn forcing_new_era_works() { - ExtBuilder::default().build_and_execute(|| { - // normal flow of session. - start_session(1); - assert_eq!(active_era(), 0); - - start_session(2); - assert_eq!(active_era(), 0); - - start_session(3); - assert_eq!(active_era(), 1); - - // no era change. - Staking::set_force_era(Forcing::ForceNone); - - start_session(4); - assert_eq!(active_era(), 1); - - start_session(5); - assert_eq!(active_era(), 1); - - start_session(6); - assert_eq!(active_era(), 1); - - start_session(7); - assert_eq!(active_era(), 1); - - // back to normal. - // this immediately starts a new session. - Staking::set_force_era(Forcing::NotForcing); - - start_session(8); - assert_eq!(active_era(), 1); - - start_session(9); - assert_eq!(active_era(), 2); - // forceful change - Staking::set_force_era(Forcing::ForceAlways); - - start_session(10); - assert_eq!(active_era(), 2); - - start_session(11); - assert_eq!(active_era(), 3); - - start_session(12); - assert_eq!(active_era(), 4); - - // just one forceful change - Staking::set_force_era(Forcing::ForceNew); - start_session(13); - assert_eq!(active_era(), 5); - assert_eq!(ForceEra::::get(), Forcing::NotForcing); - - start_session(14); - assert_eq!(active_era(), 6); - - start_session(15); - assert_eq!(active_era(), 6); - }); -} - -#[test] -fn cannot_transfer_staked_balance() { - // Tests that a stash account cannot transfer funds - ExtBuilder::default().nominate(false).build_and_execute(|| { - // Confirm account 11 is stashed - assert_eq!(Staking::bonded(&11), Some(10)); - // Confirm account 11 has some free balance - assert_eq!(Balances::free_balance(11), 1000); - // Confirm account 11 (via controller 10) is totally staked - assert_eq!(Staking::eras_stakers(active_era(), 11).total, 1000); - // Confirm account 11 cannot transfer as a result - assert_noop!( - Balances::transfer(RuntimeOrigin::signed(11), 20, 1), - BalancesError::::LiquidityRestrictions - ); - - // Give account 11 extra free balance - let _ = Balances::make_free_balance_be(&11, 10000); - // Confirm that account 11 can now transfer some balance - assert_ok!(Balances::transfer(RuntimeOrigin::signed(11), 20, 1)); - }); -} - -#[test] -fn cannot_transfer_staked_balance_2() { - // Tests that a stash account cannot transfer funds - // Same test as above but with 20, and more accurate. - // 21 has 2000 free balance but 1000 at stake - ExtBuilder::default().nominate(false).build_and_execute(|| { - // Confirm account 21 is stashed - assert_eq!(Staking::bonded(&21), Some(20)); - // Confirm account 21 has some free balance - assert_eq!(Balances::free_balance(21), 2000); - // Confirm account 21 (via controller 20) is totally staked - assert_eq!(Staking::eras_stakers(active_era(), 21).total, 1000); - // Confirm account 21 can transfer at most 1000 - assert_noop!( - Balances::transfer(RuntimeOrigin::signed(21), 20, 1001), - BalancesError::::LiquidityRestrictions - ); - assert_ok!(Balances::transfer(RuntimeOrigin::signed(21), 20, 1000)); - }); -} - -#[test] -fn cannot_reserve_staked_balance() { - // Checks that a bonded account cannot reserve balance from free balance - ExtBuilder::default().build_and_execute(|| { - // Confirm account 11 is stashed - assert_eq!(Staking::bonded(&11), Some(10)); - // Confirm account 11 has some free balance - assert_eq!(Balances::free_balance(11), 1000); - // Confirm account 11 (via controller 10) is totally staked - assert_eq!(Staking::eras_stakers(active_era(), 11).own, 1000); - // Confirm account 11 cannot reserve as a result - assert_noop!( - Balances::reserve(&11, 1), - BalancesError::::LiquidityRestrictions - ); - - // Give account 11 extra free balance - let _ = Balances::make_free_balance_be(&11, 10000); - // Confirm account 11 can now reserve balance - assert_ok!(Balances::reserve(&11, 1)); - }); -} - -#[test] -fn reward_destination_works() { - // Rewards go to the correct destination as determined in Payee - ExtBuilder::default().nominate(false).build_and_execute(|| { - // Check that account 11 is a validator - assert!(Session::validators().contains(&11)); - // Check the balance of the validator account - assert_eq!(Balances::free_balance(10), 1); - // Check the balance of the stash account - assert_eq!(Balances::free_balance(11), 1000); - // Check how much is at stake - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - - // Compute total payout now for whole duration as other parameter won't change - let total_payout_0 = current_total_payout_for_duration(reward_time_per_era()); - Pallet::::reward_by_ids(vec![(11, 1)]); - - mock::start_active_era(1); - mock::make_all_reward_payment(0); - - // Check that RewardDestination is Staked (default) - assert_eq!(Staking::payee(&11), RewardDestination::Staked); - // Check that reward went to the stash account of validator - assert_eq!(Balances::free_balance(11), 1000 + total_payout_0); - // Check that amount at stake increased accordingly - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000 + total_payout_0, - active: 1000 + total_payout_0, - unlocking: Default::default(), - claimed_rewards: bounded_vec![0], - }) - ); - - // Change RewardDestination to Stash - >::insert(&11, RewardDestination::Stash); - - // Compute total payout now for whole duration as other parameter won't change - let total_payout_1 = current_total_payout_for_duration(reward_time_per_era()); - Pallet::::reward_by_ids(vec![(11, 1)]); - - mock::start_active_era(2); - mock::make_all_reward_payment(1); - - // Check that RewardDestination is Stash - assert_eq!(Staking::payee(&11), RewardDestination::Stash); - // Check that reward went to the stash account - assert_eq!( - Balances::free_balance(11), - 1000 + total_payout_0 + total_payout_1 - ); - // Record this value - let recorded_stash_balance = 1000 + total_payout_0 + total_payout_1; - // Check that amount at stake is NOT increased - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000 + total_payout_0, - active: 1000 + total_payout_0, - unlocking: Default::default(), - claimed_rewards: bounded_vec![0, 1], - }) - ); - - // Change RewardDestination to Controller - >::insert(&11, RewardDestination::Controller); - - // Check controller balance - assert_eq!(Balances::free_balance(10), 1); - - // Compute total payout now for whole duration as other parameter won't change - let total_payout_2 = current_total_payout_for_duration(reward_time_per_era()); - Pallet::::reward_by_ids(vec![(11, 1)]); - - mock::start_active_era(3); - mock::make_all_reward_payment(2); - - // Check that RewardDestination is Controller - assert_eq!(Staking::payee(&11), RewardDestination::Controller); - // Check that reward went to the controller account - assert_eq!(Balances::free_balance(10), 1 + total_payout_2); - // Check that amount at stake is NOT increased - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000 + total_payout_0, - active: 1000 + total_payout_0, - unlocking: Default::default(), - claimed_rewards: bounded_vec![0, 1, 2], - }) - ); - // Check that amount in staked account is NOT increased. - assert_eq!(Balances::free_balance(11), recorded_stash_balance); - }); -} - -#[test] -fn validator_payment_prefs_work() { - // Test that validator preferences are correctly honored - // Note: unstake threshold is being directly tested in slashing tests. - // This test will focus on validator payment. - ExtBuilder::default().build_and_execute(|| { - let commission = Perbill::from_percent(40); - >::insert( - &11, - ValidatorPrefs { - commission, - ..Default::default() - }, - ); - - // Reward controller so staked ratio doesn't change. - >::insert(&11, RewardDestination::Controller); - >::insert(&101, RewardDestination::Controller); - - mock::start_active_era(1); - mock::make_all_reward_payment(0); - - let balance_era_1_10 = Balances::total_balance(&10); - let balance_era_1_100 = Balances::total_balance(&100); - - // Compute total payout now for whole duration as other parameter won't change - let total_payout_1 = current_total_payout_for_duration(reward_time_per_era()); - let exposure_1 = Staking::eras_stakers(active_era(), 11); - Pallet::::reward_by_ids(vec![(11, 1)]); - - mock::start_active_era(2); - mock::make_all_reward_payment(1); - - let taken_cut = commission * total_payout_1; - let shared_cut = total_payout_1 - taken_cut; - let reward_of_10 = shared_cut * exposure_1.own / exposure_1.total + taken_cut; - let reward_of_100 = shared_cut * exposure_1.others[0].value / exposure_1.total; - assert_eq_error_rate!( - Balances::total_balance(&10), - balance_era_1_10 + reward_of_10, - 2 - ); - assert_eq_error_rate!( - Balances::total_balance(&100), - balance_era_1_100 + reward_of_100, - 2 - ); - }); -} - -#[test] -fn bond_extra_works() { - // Tests that extra `free_balance` in the stash can be added to stake - // NOTE: this tests only verifies `StakingLedger` for correct updates - // See `bond_extra_and_withdraw_unbonded_works` for more details and updates on `Exposure`. - ExtBuilder::default().build_and_execute(|| { - // Check that account 10 is a validator - assert!(>::contains_key(11)); - // Check that account 10 is bonded to account 11 - assert_eq!(Staking::bonded(&11), Some(10)); - // Check how much is at stake - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - - // Give account 11 some large free balance greater than total - let _ = Balances::make_free_balance_be(&11, 1000000); - - // Call the bond_extra function from controller, add only 100 - assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(11), 100)); - // There should be 100 more `total` and `active` in the ledger - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000 + 100, - active: 1000 + 100, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - - // Call the bond_extra function with a large number, should handle it - assert_ok!(Staking::bond_extra( - RuntimeOrigin::signed(11), - Balance::max_value() - )); - // The full amount of the funds should now be in the total and active - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000000, - active: 1000000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - }); -} - -#[test] -fn bond_extra_and_withdraw_unbonded_works() { - // - // * Should test - // * Given an account being bonded [and chosen as a validator](not mandatory) - // * It can add extra funds to the bonded account. - // * it can unbond a portion of its funds from the stash account. - // * Once the unbonding period is done, it can actually take the funds out of the stash. - ExtBuilder::default().nominate(false).build_and_execute(|| { - // Set payee to controller. avoids confusion - assert_ok!(Staking::set_payee( - RuntimeOrigin::signed(10), - RewardDestination::Controller - )); - - // Give account 11 some large free balance greater than total - let _ = Balances::make_free_balance_be(&11, 1000000); - - // Initial config should be correct - assert_eq!(active_era(), 0); - - // check the balance of a validator accounts. - assert_eq!(Balances::total_balance(&10), 1); - - // confirm that 10 is a normal validator and gets paid at the end of the era. - mock::start_active_era(1); - - // Initial state of 10 - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - assert_eq!( - Staking::eras_stakers(active_era(), 11), - Exposure { - total: 1000, - own: 1000, - others: vec![] - } - ); - - // deposit the extra 100 units - Staking::bond_extra(RuntimeOrigin::signed(11), 100).unwrap(); - - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000 + 100, - active: 1000 + 100, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - // Exposure is a snapshot! only updated after the next era update. - assert_ne!( - Staking::eras_stakers(active_era(), 11), - Exposure { - total: 1000 + 100, - own: 1000 + 100, - others: vec![] - } - ); - - // trigger next era. - mock::start_active_era(2); - assert_eq!(active_era(), 2); - - // ledger should be the same. - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000 + 100, - active: 1000 + 100, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - // Exposure is now updated. - assert_eq!( - Staking::eras_stakers(active_era(), 11), - Exposure { - total: 1000 + 100, - own: 1000 + 100, - others: vec![] - } - ); - - // Unbond almost all of the funds in stash. - Staking::unbond(RuntimeOrigin::signed(10), 1000).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000 + 100, - active: 100, - unlocking: bounded_vec![UnlockChunk { - value: 1000, - era: 2 + 3 - }], - claimed_rewards: bounded_vec![], - }), - ); - - // Attempting to free the balances now will fail. 2 eras need to pass. - assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(10), 0)); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000 + 100, - active: 100, - unlocking: bounded_vec![UnlockChunk { - value: 1000, - era: 2 + 3 - }], - claimed_rewards: bounded_vec![], - }), - ); - - // trigger next era. - mock::start_active_era(3); - - // nothing yet - assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(10), 0)); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000 + 100, - active: 100, - unlocking: bounded_vec![UnlockChunk { - value: 1000, - era: 2 + 3 - }], - claimed_rewards: bounded_vec![], - }), - ); - - // trigger next era. - mock::start_active_era(5); - - assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(10), 0)); - // Now the value is free and the staking ledger is updated. - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 100, - active: 100, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }), - ); - }) -} - -#[test] -fn many_unbond_calls_should_work() { - ExtBuilder::default().build_and_execute(|| { - let mut current_era = 0; - // locked at era MaxUnlockingChunks - 1 until 3 - - let max_unlocking_chunks = <::MaxUnlockingChunks as Get>::get(); - - for i in 0..max_unlocking_chunks - 1 { - // There is only 1 chunk per era, so we need to be in a new era to create a chunk. - current_era = i as u32; - mock::start_active_era(current_era); - assert_ok!(Staking::unbond(RuntimeOrigin::signed(10), 1)); - } - - current_era += 1; - mock::start_active_era(current_era); - - // This chunk is locked at `current_era` through `current_era + 2` (because - // `BondingDuration` == 3). - assert_ok!(Staking::unbond(RuntimeOrigin::signed(10), 1)); - assert_eq!( - Staking::ledger(&10).map(|l| l.unlocking.len()).unwrap(), - <::MaxUnlockingChunks as Get>::get() as usize - ); - - // even though the number of unlocked chunks is the same as `MaxUnlockingChunks`, - // unbonding works as expected. - for i in current_era..(current_era + max_unlocking_chunks) - 1 { - // There is only 1 chunk per era, so we need to be in a new era to create a chunk. - current_era = i as u32; - mock::start_active_era(current_era); - assert_ok!(Staking::unbond(RuntimeOrigin::signed(10), 1)); - } - - // only slots within last `BondingDuration` are filled. - assert_eq!( - Staking::ledger(&10).map(|l| l.unlocking.len()).unwrap(), - <::BondingDuration>::get() as usize - ); - }) -} - -#[test] -fn auto_withdraw_may_not_unlock_all_chunks() { - ExtBuilder::default().build_and_execute(|| { - // set `MaxUnlockingChunks` to a low number to test case when the unbonding period - // is larger than the number of unlocking chunks available, which may result on a - // `Error::NoMoreChunks`, even when the auto-withdraw tries to release locked chunks. - MaxUnlockingChunks::set(1); - - let mut current_era = 0; - - // fills the chunking slots for account - mock::start_active_era(current_era); - assert_ok!(Staking::unbond(RuntimeOrigin::signed(10), 1)); - - current_era += 1; - mock::start_active_era(current_era); - - // unbonding will fail because i) there are no remaining chunks and ii) no filled chunks - // can be released because current chunk hasn't stay in the queue for at least - // `BondingDuration` - assert_noop!( - Staking::unbond(RuntimeOrigin::signed(10), 1), - Error::::NoMoreChunks - ); - - // fast-forward a few eras for unbond to be successful with implicit withdraw - current_era += 10; - mock::start_active_era(current_era); - assert_ok!(Staking::unbond(RuntimeOrigin::signed(10), 1)); - }) -} - -#[test] -fn rebond_works() { - // - // * Should test - // * Given an account being bonded [and chosen as a validator](not mandatory) - // * it can unbond a portion of its funds from the stash account. - // * it can re-bond a portion of the funds scheduled to unlock. - ExtBuilder::default().nominate(false).build_and_execute(|| { - // Set payee to controller. avoids confusion - assert_ok!(Staking::set_payee( - RuntimeOrigin::signed(10), - RewardDestination::Controller - )); - - // Give account 11 some large free balance greater than total - let _ = Balances::make_free_balance_be(&11, 1000000); - - // confirm that 10 is a normal validator and gets paid at the end of the era. - mock::start_active_era(1); - - // Initial state of 10 - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - - mock::start_active_era(2); - assert_eq!(active_era(), 2); - - // Try to rebond some funds. We get an error since no fund is unbonded. - assert_noop!( - Staking::rebond(RuntimeOrigin::signed(10), 500), - Error::::NoUnlockChunk - ); - - // Unbond almost all of the funds in stash. - Staking::unbond(RuntimeOrigin::signed(10), 900).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 100, - unlocking: bounded_vec![UnlockChunk { - value: 900, - era: 2 + 3 - }], - claimed_rewards: bounded_vec![], - }) - ); - - // Re-bond all the funds unbonded. - Staking::rebond(RuntimeOrigin::signed(10), 900).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - - // Unbond almost all of the funds in stash. - Staking::unbond(RuntimeOrigin::signed(10), 900).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 100, - unlocking: bounded_vec![UnlockChunk { value: 900, era: 5 }], - claimed_rewards: bounded_vec![], - }) - ); - - // Re-bond part of the funds unbonded. - Staking::rebond(RuntimeOrigin::signed(10), 500).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 600, - unlocking: bounded_vec![UnlockChunk { value: 400, era: 5 }], - claimed_rewards: bounded_vec![], - }) - ); - - // Re-bond the remainder of the funds unbonded. - Staking::rebond(RuntimeOrigin::signed(10), 500).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - - // Unbond parts of the funds in stash. - Staking::unbond(RuntimeOrigin::signed(10), 300).unwrap(); - Staking::unbond(RuntimeOrigin::signed(10), 300).unwrap(); - Staking::unbond(RuntimeOrigin::signed(10), 300).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 100, - unlocking: bounded_vec![UnlockChunk { value: 900, era: 5 }], - claimed_rewards: bounded_vec![], - }) - ); - - // Re-bond part of the funds unbonded. - Staking::rebond(RuntimeOrigin::signed(10), 500).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 600, - unlocking: bounded_vec![UnlockChunk { value: 400, era: 5 }], - claimed_rewards: bounded_vec![], - }) - ); - }) -} - -#[test] -fn rebond_is_fifo() { - // Rebond should proceed by reversing the most recent bond operations. - ExtBuilder::default().nominate(false).build_and_execute(|| { - // Set payee to controller. avoids confusion - assert_ok!(Staking::set_payee( - RuntimeOrigin::signed(10), - RewardDestination::Controller - )); - - // Give account 11 some large free balance greater than total - let _ = Balances::make_free_balance_be(&11, 1000000); - - // confirm that 10 is a normal validator and gets paid at the end of the era. - mock::start_active_era(1); - - // Initial state of 10 - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - - mock::start_active_era(2); - - // Unbond some of the funds in stash. - Staking::unbond(RuntimeOrigin::signed(10), 400).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 600, - unlocking: bounded_vec![UnlockChunk { - value: 400, - era: 2 + 3 - }], - claimed_rewards: bounded_vec![], - }) - ); - - mock::start_active_era(3); - - // Unbond more of the funds in stash. - Staking::unbond(RuntimeOrigin::signed(10), 300).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 300, - unlocking: bounded_vec![ - UnlockChunk { - value: 400, - era: 2 + 3 - }, - UnlockChunk { - value: 300, - era: 3 + 3 - }, - ], - claimed_rewards: bounded_vec![], - }) - ); - - mock::start_active_era(4); - - // Unbond yet more of the funds in stash. - Staking::unbond(RuntimeOrigin::signed(10), 200).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 100, - unlocking: bounded_vec![ - UnlockChunk { - value: 400, - era: 2 + 3 - }, - UnlockChunk { - value: 300, - era: 3 + 3 - }, - UnlockChunk { - value: 200, - era: 4 + 3 - }, - ], - claimed_rewards: bounded_vec![], - }) - ); - - // Re-bond half of the unbonding funds. - Staking::rebond(RuntimeOrigin::signed(10), 400).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 500, - unlocking: bounded_vec![ - UnlockChunk { - value: 400, - era: 2 + 3 - }, - UnlockChunk { - value: 100, - era: 3 + 3 - }, - ], - claimed_rewards: bounded_vec![], - }) - ); - }) -} - -#[test] -fn rebond_emits_right_value_in_event() { - // When a user calls rebond with more than can be rebonded, things succeed, - // and the rebond event emits the actual value rebonded. - ExtBuilder::default().nominate(false).build_and_execute(|| { - // Set payee to controller. avoids confusion - assert_ok!(Staking::set_payee( - RuntimeOrigin::signed(10), - RewardDestination::Controller - )); - - // Give account 11 some large free balance greater than total - let _ = Balances::make_free_balance_be(&11, 1000000); - - // confirm that 10 is a normal validator and gets paid at the end of the era. - mock::start_active_era(1); - - // Unbond almost all of the funds in stash. - Staking::unbond(RuntimeOrigin::signed(10), 900).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 100, - unlocking: bounded_vec![UnlockChunk { - value: 900, - era: 1 + 3 - }], - claimed_rewards: bounded_vec![], - }) - ); - - // Re-bond less than the total - Staking::rebond(RuntimeOrigin::signed(10), 100).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 200, - unlocking: bounded_vec![UnlockChunk { - value: 800, - era: 1 + 3 - }], - claimed_rewards: bounded_vec![], - }) - ); - // Event emitted should be correct - assert_eq!( - *staking_events().last().unwrap(), - Event::Bonded { - identity: IdentityId::default(), - stash: 11, - amount: 100 - } - ); - - // Re-bond way more than available - Staking::rebond(RuntimeOrigin::signed(10), 100_000).unwrap(); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - // Event emitted should be correct, only 800 - assert_eq!( - *staking_events().last().unwrap(), - Event::Bonded { - identity: IdentityId::default(), - stash: 11, - amount: 800 - } - ); - }); -} - -#[test] -fn reward_to_stake_works() { - ExtBuilder::default() - .nominate(false) - .set_status(31, StakerStatus::Idle) - .set_status(41, StakerStatus::Idle) - .set_stake(21, 2000) - .build_and_execute(|| { - assert_eq!(Staking::validator_count(), 2); - // Confirm account 10 and 20 are validators - assert!(>::contains_key(&11) && >::contains_key(&21)); - - assert_eq!(Staking::eras_stakers(active_era(), 11).total, 1000); - assert_eq!(Staking::eras_stakers(active_era(), 21).total, 2000); - - // Give the man some money. - let _ = Balances::make_free_balance_be(&10, 1000); - let _ = Balances::make_free_balance_be(&20, 1000); - - // Bypass logic and change current exposure - ErasStakers::::insert( - 0, - 21, - Exposure { - total: 69, - own: 69, - others: vec![], - }, - ); - >::insert( - &20, - StakingLedger { - stash: 21, - total: 69, - active: 69, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }, - ); - - // Compute total payout now for whole duration as other parameter won't change - let total_payout_0 = current_total_payout_for_duration(reward_time_per_era()); - Pallet::::reward_by_ids(vec![(11, 1)]); - Pallet::::reward_by_ids(vec![(21, 1)]); - - // New era --> rewards are paid --> stakes are changed - mock::start_active_era(1); - mock::make_all_reward_payment(0); - - assert_eq!(Staking::eras_stakers(active_era(), 11).total, 1000); - assert_eq!(Staking::eras_stakers(active_era(), 21).total, 69); - - let _11_balance = Balances::free_balance(&11); - assert_eq!(_11_balance, 1000 + total_payout_0 / 2); - - // Trigger another new era as the info are frozen before the era start. - mock::start_active_era(2); - - // -- new infos - assert_eq!( - Staking::eras_stakers(active_era(), 11).total, - 1000 + total_payout_0 / 2 - ); - assert_eq!( - Staking::eras_stakers(active_era(), 21).total, - 69 + total_payout_0 / 2 - ); - }); -} - -#[test] -fn reap_stash_works() { - ExtBuilder::default() - .existential_deposit(10) - .balance_factor(10) - .build_and_execute(|| { - // given - assert_eq!(Balances::free_balance(10), 10); - assert_eq!(Balances::free_balance(11), 10 * 1000); - assert_eq!(Staking::bonded(&11), Some(10)); - - assert!(>::contains_key(&10)); - assert!(>::contains_key(&11)); - assert!(>::contains_key(&11)); - assert!(>::contains_key(&11)); - - // stash is not reapable - assert_noop!( - Staking::reap_stash(RuntimeOrigin::signed(20), 11, 0), - Error::::FundedTarget - ); - // Polymesh change - // ----------------------------------------------------------------- - // controller or any other account is not reapable - // assert_noop!( - // Staking::reap_stash(RuntimeOrigin::signed(20), 10, 0), - // Error::::NotStash - // ); - // ----------------------------------------------------------------- - - // no easy way to cause an account to go below ED, we tweak their staking ledger - // instead. - - //Ledger::::insert( - // 10, - // StakingLedger { - // stash: 11, - // total: 5, - // active: 5, - // unlocking: Default::default(), - // claimed_rewards: bounded_vec![], - // }, - //); - - let _ = Balances::slash(&11, Balance::max_value()); - // reap-able - assert_ok!(Staking::reap_stash(RuntimeOrigin::signed(20), 11, 0)); - - // then - assert!(!>::contains_key(&10)); - assert!(!>::contains_key(&11)); - assert!(!>::contains_key(&11)); - assert!(!>::contains_key(&11)); - }); -} - -#[test] -fn switching_roles() { - // Test that it should be possible to switch between roles (nominator, validator, idle) with - // minimal overhead. - ExtBuilder::default().nominate(false).build_and_execute(|| { - // Reset reward destination - for i in &[10, 20] { - assert_ok!(Staking::set_payee( - RuntimeOrigin::signed(*i), - RewardDestination::Controller - )); - } - - assert_eq_uvec!(validator_controllers(), vec![20, 10]); - - // put some money in account that we'll use. - for i in 1..7 { - let _ = Balances::deposit_creating(&i, 5000); - } - - provide_did_to_user(1); - add_secondary_key(1, 2); - // add 2 nominators - assert_ok!(Staking::bond( - RuntimeOrigin::signed(1), - 2, - 2000, - RewardDestination::Controller - )); - assert_ok!(Staking::nominate(RuntimeOrigin::signed(2), vec![11, 5])); - - provide_did_to_user(3); - add_secondary_key(3, 4); - assert_ok!(Staking::bond( - RuntimeOrigin::signed(3), - 4, - 500, - RewardDestination::Controller - )); - assert_ok!(Staking::nominate(RuntimeOrigin::signed(4), vec![21, 1])); - - provide_did_to_user(5); - add_secondary_key(5, 6); - // add a new validator candidate - assert_ok!(Staking::bond( - RuntimeOrigin::signed(5), - 6, - 1000, - RewardDestination::Controller - )); - assert_add_permissioned_validator!(&5); - assert_ok!(Staking::validate( - RuntimeOrigin::signed(6), - ValidatorPrefs::default() - )); - assert_ok!(Session::set_keys( - RuntimeOrigin::signed(6), - SessionKeys { other: 6.into() }, - vec![] - )); - - mock::start_active_era(1); - - // with current nominators 10 and 5 have the most stake - assert_eq_uvec!(validator_controllers(), vec![6, 10]); - - assert_add_permissioned_validator!(&1); - // 2 decides to be a validator. Consequences: - assert_ok!(Staking::validate( - RuntimeOrigin::signed(2), - ValidatorPrefs::default() - )); - assert_ok!(Session::set_keys( - RuntimeOrigin::signed(2), - SessionKeys { other: 2.into() }, - vec![] - )); - // new stakes: - // 10: 1000 self vote - // 20: 1000 self vote + 250 vote - // 6 : 1000 self vote - // 2 : 2000 self vote + 250 vote. - // Winners: 20 and 2 - - mock::start_active_era(2); - - assert_eq_uvec!(validator_controllers(), vec![2, 20]); - }); -} - -#[test] -fn wrong_vote_is_moot() { - ExtBuilder::default() - .add_staker( - IdentityId::from(61), - 61, - 60, - 500, - StakerStatus::Nominator(vec![ - 11, 21, // good votes - 1, 2, 15, 1000, 25, // crap votes. No effect. - ]), - ) - .build_and_execute(|| { - // the genesis validators already reflect the above vote, nonetheless start a new era. - mock::start_active_era(1); - - // new validators - assert_eq_uvec!(validator_controllers(), vec![20, 10]); - - // our new voter is taken into account - assert!(Staking::eras_stakers(active_era(), 11) - .others - .iter() - .any(|i| i.who == 61)); - assert!(Staking::eras_stakers(active_era(), 21) - .others - .iter() - .any(|i| i.who == 61)); - }); -} - -#[test] -fn bond_with_no_staked_value() { - // Behavior when someone bonds with no staked value. - // Particularly when they votes and the candidate is elected. - ExtBuilder::default() - .validator_count(3) - .existential_deposit(5) - .balance_factor(5) - .nominate(false) - .minimum_validator_count(1) - .build_and_execute(|| { - provide_did_to_user(1); - add_secondary_key(1, 2); - // Polymesh change - // ----------------------------------------------------------------- - // The assertion below would fail as we have exestential deposit = 0 (Hard coded) - // Can't bond with 1 - //assert_noop!( - // Staking::bond( - // RuntimeOrigin::signed(1), - // 2, - // 1, - // RewardDestination::Controller - // ), - // Error::::InsufficientBond, - //); - // ----------------------------------------------------------------- - // bonded with absolute minimum value possible. - assert_ok!(Staking::bond( - RuntimeOrigin::signed(1), - 2, - 5, - RewardDestination::Controller - )); - assert_eq!(Locks::::get(&1)[0].amount, 5); - - // unbonding even 1 will cause all to be unbonded. - assert_ok!(Staking::unbond(RuntimeOrigin::signed(2), 1)); - // Polymesh change - // ----------------------------------------------------------------- - // The assertion below would fail as we have exestential deposit = 0 (Hard coded) - assert_eq!( - Staking::ledger(2), - Some(StakingLedger { - stash: 1, - active: 4, - total: 5, - unlocking: bounded_vec![UnlockChunk { value: 1, era: 3 }], - claimed_rewards: bounded_vec![], - }) - ); - // ----------------------------------------------------------------- - - mock::start_active_era(1); - mock::start_active_era(2); - - // not yet removed. - assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(2), 0)); - assert!(Staking::ledger(2).is_some()); - assert_eq!(Locks::::get(&1)[0].amount, 5); - - mock::start_active_era(3); - - // poof. Account 1 is removed from the staking system. - assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(2), 0)); - assert!(Staking::ledger(2).is_some()); - assert_eq!(Locks::::get(&1).len(), 1); - }); -} - -#[test] -fn bond_with_little_staked_value_bounded() { - ExtBuilder::default() - .validator_count(3) - .nominate(false) - .minimum_validator_count(1) - .build_and_execute(|| { - // setup - assert_ok!(Staking::chill(RuntimeOrigin::signed(30))); - assert_ok!(Staking::set_payee( - RuntimeOrigin::signed(10), - RewardDestination::Controller - )); - let init_balance_2 = Balances::free_balance(&2); - let init_balance_10 = Balances::free_balance(&10); - - provide_did_to_user(1); - // Stingy validator. - assert_ok!(Staking::bond( - RuntimeOrigin::signed(1), - 2, - 1, - RewardDestination::Controller - )); - add_secondary_key(1, 2); - assert_add_permissioned_validator!(&1); - assert_ok!(Staking::validate( - RuntimeOrigin::signed(2), - ValidatorPrefs::default() - )); - assert_ok!(Session::set_keys( - RuntimeOrigin::signed(2), - SessionKeys { other: 2.into() }, - vec![] - )); - - // 1 era worth of reward. BUT, we set the timestamp after on_initialize, so outdated by - // one block. - let total_payout_0 = current_total_payout_for_duration(reward_time_per_era()); - - reward_all_elected(); - mock::start_active_era(1); - mock::make_all_reward_payment(0); - - // 2 is elected. - assert_eq_uvec!(validator_controllers(), vec![20, 10, 2]); - assert_eq!(Staking::eras_stakers(active_era(), 2).total, 0); - - // Old ones are rewarded. - assert_eq_error_rate!( - Balances::free_balance(10), - init_balance_10 + total_payout_0 / 3, - 1 - ); - // no rewards paid to 2. This was initial election. - assert_eq!(Balances::free_balance(2), init_balance_2); - - // reward era 2 - let total_payout_1 = current_total_payout_for_duration(reward_time_per_era()); - reward_all_elected(); - mock::start_active_era(2); - mock::make_all_reward_payment(1); - - assert_eq_uvec!(validator_controllers(), vec![20, 10, 2]); - assert_eq!(Staking::eras_stakers(active_era(), 2).total, 0); - - // 2 is now rewarded. - assert_eq_error_rate!( - Balances::free_balance(2), - init_balance_2 + total_payout_1 / 3, - 1 - ); - assert_eq_error_rate!( - Balances::free_balance(&10), - init_balance_10 + total_payout_0 / 3 + total_payout_1 / 3, - 2, - ); - }); -} - -#[test] -fn bond_with_duplicate_vote_should_be_ignored_by_election_provider() { - ExtBuilder::default() - .validator_count(2) - .nominate(false) - .minimum_validator_count(1) - .set_stake(31, 1000) - .build_and_execute(|| { - // ensure all have equal stake. - assert_eq!( - >::iter() - .map(|(v, _)| (v, Staking::ledger(v - 1).unwrap().total)) - .collect::>(), - vec![(31, 1000), (21, 1000), (11, 1000)], - ); - // no nominators shall exist. - assert!(>::iter() - .map(|(n, _)| n) - .collect::>() - .is_empty()); - - // give the man some money. - let initial_balance = 1000; - for i in [1, 2, 3, 4].iter() { - let _ = Balances::make_free_balance_be(i, initial_balance); - } - - provide_did_to_user(1); - add_secondary_key(1, 2); - assert_ok!(Staking::bond( - RuntimeOrigin::signed(1), - 2, - 1000, - RewardDestination::Controller - )); - assert_ok!(Staking::nominate( - RuntimeOrigin::signed(2), - vec![11, 11, 11, 21, 31] - )); - - provide_did_to_user(3); - add_secondary_key(3, 4); - assert_ok!(Staking::bond( - RuntimeOrigin::signed(3), - 4, - 1000, - RewardDestination::Controller - )); - assert_ok!(Staking::nominate(RuntimeOrigin::signed(4), vec![21, 31])); - - // winners should be 21 and 31. Otherwise this election is taking duplicates into - // account. - let supports = ::ElectionProvider::elect().unwrap(); - assert_eq!(supports.len(), 2); - assert_eq!(supports[0].0, 21); - assert_eq!(supports[1].0, 31); - - //assert_eq!( - // supports, - // vec![ - // ( - // 21, - // Support { - // total: 1800, - // voters: vec![(21, 1000), (1, 400), (3, 400)] - // } - // ), - // ( - // 31, - // Support { - // total: 2200, - // voters: vec![(31, 1000), (1, 600), (3, 600)] - // } - // ) - // ], - //); - }); -} - -#[test] -fn bond_with_duplicate_vote_should_be_ignored_by_election_provider_elected() { - // same as above but ensures that even when the dupe is being elected, everything is sane. - ExtBuilder::default() - .validator_count(2) - .nominate(false) - .set_stake(31, 1000) - .minimum_validator_count(1) - .build_and_execute(|| { - // ensure all have equal stake. - assert_eq!( - >::iter() - .map(|(v, _)| (v, Staking::ledger(v - 1).unwrap().total)) - .collect::>(), - vec![(31, 1000), (21, 1000), (11, 1000)], - ); - - // no nominators shall exist. - assert!(>::iter().collect::>().is_empty()); - - // give the man some money. - let initial_balance = 1000; - for i in [1, 2, 3, 4].iter() { - let _ = Balances::make_free_balance_be(i, initial_balance); - } - - provide_did_to_user(1); - add_secondary_key(1, 2); - assert_ok!(Staking::bond( - RuntimeOrigin::signed(1), - 2, - 1000, - RewardDestination::Controller - )); - assert_ok!(Staking::nominate( - RuntimeOrigin::signed(2), - vec![11, 11, 11, 21] - )); - - provide_did_to_user(3); - add_secondary_key(3, 4); - assert_ok!(Staking::bond( - RuntimeOrigin::signed(3), - 4, - 1000, - RewardDestination::Controller - )); - assert_ok!(Staking::nominate(RuntimeOrigin::signed(4), vec![21])); - - // winners should be 21 and 11. - let supports = ::ElectionProvider::elect().unwrap(); - assert_eq!(supports.len(), 2); - assert_eq!(supports[0].0, 11); - assert_eq!(supports[1].0, 21); - // assert_eq!( - // supports, - // vec![ - // ( - // 11, - // Support { - // total: 1500, - // voters: vec![(11, 1000), (1, 500)] - // } - // ), - // ( - // 21, - // Support { - // total: 2500, - // voters: vec![(21, 1000), (1, 500), (3, 1000)] - // } - // ) - // ], - // ); - }); -} - -#[test] -fn new_era_elects_correct_number_of_validators() { - ExtBuilder::default() - .nominate(true) - .validator_count(1) - .build_and_execute(|| { - assert_eq!(Staking::validator_count(), 1); - assert_eq!(validator_controllers().len(), 1); - - Session::on_initialize(System::block_number()); - - assert_eq!(validator_controllers().len(), 1); - }) -} - -#[test] -fn phragmen_should_not_overflow() { - ExtBuilder::default().nominate(false).build_and_execute(|| { - // This is the maximum value that we can have as the outcome of CurrencyToVote. - type Votes = u64; - - let _ = Staking::chill(RuntimeOrigin::signed(10)); - let _ = Staking::chill(RuntimeOrigin::signed(20)); - - bond_validator(3, 2, Votes::max_value() as Balance); - bond_validator(5, 4, Votes::max_value() as Balance); - - bond_nominator(7, 6, Votes::max_value() as Balance, vec![3, 5]); - bond_nominator(9, 8, Votes::max_value() as Balance, vec![3, 5]); - - mock::start_active_era(1); - - assert_eq_uvec!(validator_controllers(), vec![4, 2]); - - // We can safely convert back to values within [u64, u128]. - assert!(Staking::eras_stakers(active_era(), 3).total > Votes::max_value() as Balance); - assert!(Staking::eras_stakers(active_era(), 5).total > Votes::max_value() as Balance); - }) -} - -#[test] -fn reward_validator_slashing_validator_does_not_overflow() { - ExtBuilder::default().build_and_execute(|| { - let stake = u64::MAX as Balance * 2; - let reward_slash = u64::MAX as Balance * 2; - - // Assert multiplication overflows in balance arithmetic. - assert!(stake.checked_mul(reward_slash).is_none()); - - // Set staker - let _ = Balances::make_free_balance_be(&11, stake); - - let exposure = Exposure:: { - total: stake, - own: stake, - others: vec![], - }; - let reward = EraRewardPoints:: { - total: 1, - individual: vec![(11, 1)].into_iter().collect(), - }; - - // Check reward - ErasRewardPoints::::insert(0, reward); - ErasStakers::::insert(0, 11, &exposure); - ErasStakersClipped::::insert(0, 11, exposure); - ErasValidatorReward::::insert(0, stake); - assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 0)); - assert_eq!(Balances::total_balance(&11), stake * 2); - - // Set staker - let _ = Balances::make_free_balance_be(&11, stake); - let _ = Balances::make_free_balance_be(&2, stake); - - // only slashes out of bonded stake are applied. without this line, it is 0. - Staking::bond( - RuntimeOrigin::signed(2), - 20000, - stake - 1, - RewardDestination::default(), - ) - .unwrap(); - // Override exposure of 11 - ErasStakers::::insert( - 0, - 11, - Exposure { - total: stake, - own: 1, - others: vec![IndividualExposure { - who: 2, - value: stake - 1, - }], - }, - ); - - // Check slashing - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(100)], - ); - - assert_eq!(Balances::total_balance(&11), stake - 1); - // Polymesh change - // ---------------------------------------------------------------- - // Nominators slashing is switched off - // assert_eq!(Balances::total_balance(&2), 1); - // ---------------------------------------------------------------- - }) -} - -#[test] -fn reward_from_authorship_event_handler_works() { - ExtBuilder::default().build_and_execute(|| { - use pallet_authorship::EventHandler; - - assert_eq!(>::author(), Some(11)); - - Pallet::::note_author(11); - Pallet::::note_author(11); - - // Not mandatory but must be coherent with rewards - assert_eq_uvec!(Session::validators(), vec![11, 21]); - - // 21 is rewarded as an uncle producer - // 11 is rewarded as a block producer and uncle referencer and uncle producer - assert_eq!( - ErasRewardPoints::::get(active_era()), - EraRewardPoints { - individual: vec![(11, 20 * 2)].into_iter().collect(), - total: 40 - }, - ); - }) -} - -#[test] -fn add_reward_points_fns_works() { - ExtBuilder::default().build_and_execute(|| { - // Not mandatory but must be coherent with rewards - assert_eq_uvec!(Session::validators(), vec![21, 11]); - - Pallet::::reward_by_ids(vec![(21, 1), (11, 1), (11, 1)]); - - Pallet::::reward_by_ids(vec![(21, 1), (11, 1), (11, 1)]); - - assert_eq!( - ErasRewardPoints::::get(active_era()), - EraRewardPoints { - individual: vec![(11, 4), (21, 2)].into_iter().collect(), - total: 6 - }, - ); - }) -} - -#[test] -fn unbonded_balance_is_not_slashable() { - ExtBuilder::default().build_and_execute(|| { - // total amount staked is slashable. - assert_eq!(Staking::slashable_balance_of(&11), 1000); - - assert_ok!(Staking::unbond(RuntimeOrigin::signed(10), 800)); - - // only the active portion. - assert_eq!(Staking::slashable_balance_of(&11), 200); - }) -} - -#[test] -fn era_is_always_same_length() { - // This ensures that the sessions is always of the same length if there is no forcing no - // session changes. - ExtBuilder::default().build_and_execute(|| { - let session_per_era = >::get(); - - mock::start_active_era(1); - assert_eq!( - Staking::eras_start_session_index(current_era()).unwrap(), - session_per_era - ); - - mock::start_active_era(2); - assert_eq!( - Staking::eras_start_session_index(current_era()).unwrap(), - session_per_era * 2u32 - ); - - let session = Session::current_index(); - Staking::set_force_era(Forcing::ForceNew); - advance_session(); - advance_session(); - assert_eq!(current_era(), 3); - assert_eq!( - Staking::eras_start_session_index(current_era()).unwrap(), - session + 2 - ); - - mock::start_active_era(4); - assert_eq!( - Staking::eras_start_session_index(current_era()).unwrap(), - session + 2u32 + session_per_era - ); - }); -} - -#[test] -fn offence_forces_new_era() { - ExtBuilder::default().build_and_execute(|| { - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(5)], - ); - - assert_eq!(Staking::force_era(), Forcing::ForceNew); - }); -} - -#[test] -fn offence_ensures_new_era_without_clobbering() { - ExtBuilder::default().build_and_execute(|| { - assert_ok!(Staking::force_new_era_always(RuntimeOrigin::root())); - assert_eq!(Staking::force_era(), Forcing::ForceAlways); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(5)], - ); - - assert_eq!(Staking::force_era(), Forcing::ForceAlways); - }); -} - -#[test] -fn offence_deselects_validator_even_when_slash_is_zero() { - ExtBuilder::default().build_and_execute(|| { - assert!(Session::validators().contains(&11)); - assert!(>::contains_key(11)); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(0)], - ); - - assert_eq!(Staking::force_era(), Forcing::ForceNew); - assert!(!>::contains_key(11)); - - mock::start_active_era(1); - - assert!(!Session::validators().contains(&11)); - assert!(!>::contains_key(11)); - }); -} - -#[test] -fn slashing_performed_according_exposure() { - // This test checks that slashing is performed according the exposure (or more precisely, - // historical exposure), not the current balance. - ExtBuilder::default().build_and_execute(|| { - assert_eq!(Staking::eras_stakers(active_era(), 11).own, 1000); - - // Handle an offence with a historical exposure. - on_offence_now( - &[OffenceDetails { - offender: ( - 11, - Exposure { - total: 500, - own: 500, - others: vec![], - }, - ), - reporters: vec![], - }], - &[Perbill::from_percent(50)], - ); - - // The stash account should be slashed for 250 (50% of 500). - assert_eq!(Balances::free_balance(11), 1000 - 250); - }); -} - -#[test] -fn slash_in_old_span_does_not_deselect() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - - assert!(>::contains_key(11)); - assert!(Session::validators().contains(&11)); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(0)], - ); - - assert_eq!(Staking::force_era(), Forcing::ForceNew); - assert!(!>::contains_key(11)); - - mock::start_active_era(2); - - Staking::validate(RuntimeOrigin::signed(10), Default::default()).unwrap(); - assert_eq!(Staking::force_era(), Forcing::NotForcing); - assert!(>::contains_key(11)); - assert!(!Session::validators().contains(&11)); - - mock::start_active_era(3); - - // this staker is in a new slashing span now, having re-registered after - // their prior slash. - - on_offence_in_era( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(0)], - 1, - DisableStrategy::WhenSlashed, - ); - - // the validator doesn't get chilled again - assert!(pallet_staking::Validators::::iter().any(|(stash, _)| stash == 11)); - - // but we are still forcing a new era - assert_eq!(Staking::force_era(), Forcing::ForceNew); - - on_offence_in_era( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - // NOTE: A 100% slash here would clean up the account, causing de-registration. - &[Perbill::from_percent(95)], - 1, - DisableStrategy::WhenSlashed, - ); - - // the validator doesn't get chilled again - assert!(pallet_staking::Validators::::iter().any(|(stash, _)| stash == 11)); - - // but it's disabled - assert!(is_disabled(10)); - // and we are still forcing a new era - assert_eq!(Staking::force_era(), Forcing::ForceNew); - }); -} - -#[test] -fn reporters_receive_their_slice() { - // This test verifies that the reporters of the offence receive their slice from the slashed - // amount. - ExtBuilder::default().build_and_execute(|| { - // The reporters' reward is calculated from the total exposure. - let initial_balance = 1_000; - - assert_eq!(Staking::eras_stakers(active_era(), 11).own, initial_balance); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![1, 2], - }], - &[Perbill::from_percent(50)], - ); - - // F1 * (reward_proportion * slash - 0) - // 50% * (10% * initial_balance / 2) - let reward = (initial_balance / 20) / 2; - let reward_each = reward / 2; // split into two pieces. - assert_eq!(Balances::free_balance(1), 10 + reward_each); - assert_eq!(Balances::free_balance(2), 20 + reward_each); - }); -} - -#[test] -fn subsequent_reports_in_same_span_pay_out_less() { - // This test verifies that the reporters of the offence receive their slice from the slashed - // amount, but less and less if they submit multiple reports in one span. - ExtBuilder::default().build_and_execute(|| { - // The reporters' reward is calculated from the total exposure. - let initial_balance = 1_000; - - assert_eq!(Staking::eras_stakers(active_era(), 11).own, initial_balance); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![1], - }], - &[Perbill::from_percent(20)], - ); - - // F1 * (reward_proportion * slash - 0) - // 50% * (10% * initial_balance * 20%) - let reward = (initial_balance / 5) / 20; - assert_eq!(Balances::free_balance(1), 10 + reward); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![1], - }], - &[Perbill::from_percent(50)], - ); - - let prior_payout = reward; - - // F1 * (reward_proportion * slash - prior_payout) - // 50% * (10% * (initial_balance / 2) - prior_payout) - let reward = ((initial_balance / 20) - prior_payout) / 2; - assert_eq!(Balances::free_balance(1), 10 + prior_payout + reward); - }); -} - -#[test] -fn invulnerables_are_not_slashed() { - // For invulnerable validators no slashing is performed. - ExtBuilder::default() - .invulnerables(vec![11]) - .build_and_execute(|| { - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(21), 2000); - - let exposure = Staking::eras_stakers(active_era(), 21); - let initial_balance = Staking::slashable_balance_of(&21); - - let _nominator_balances: Vec<_> = exposure - .others - .iter() - .map(|o| Balances::free_balance(&o.who)) - .collect(); - - on_offence_now( - &[ - OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }, - OffenceDetails { - offender: (21, Staking::eras_stakers(active_era(), 21)), - reporters: vec![], - }, - ], - &[Perbill::from_percent(50), Perbill::from_percent(20)], - ); - - // The validator 11 hasn't been slashed, but 21 has been. - assert_eq!(Balances::free_balance(11), 1000); - // 2000 - (0.2 * initial_balance) - assert_eq!( - Balances::free_balance(21), - 2000 - (2 * initial_balance / 10) - ); - - // Polymesh change - // ----------------------------------------------------------------- - // Nominators slashing is switched off - // // ensure that nominators were slashed as well. - // for (initial_balance, other) in nominator_balances.into_iter().zip(exposure.others) { - // assert_eq!( - // Balances::free_balance(&other.who), - // initial_balance - (2 * other.value / 10), - // ); - // } - // ----------------------------------------------------------------- - }); -} - -#[test] -fn dont_slash_if_fraction_is_zero() { - // Don't slash if the fraction is zero. - ExtBuilder::default().build_and_execute(|| { - assert_eq!(Balances::free_balance(11), 1000); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(0)], - ); - - // The validator hasn't been slashed. The new era is not forced. - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Staking::force_era(), Forcing::ForceNew); - }); -} - -#[test] -fn only_slash_for_max_in_era() { - // multiple slashes within one era are only applied if it is more than any previous slash in the - // same era. - ExtBuilder::default().build_and_execute(|| { - assert_eq!(Balances::free_balance(11), 1000); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(50)], - ); - - // The validator has been slashed and has been force-chilled. - assert_eq!(Balances::free_balance(11), 500); - assert_eq!(Staking::force_era(), Forcing::ForceNew); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(25)], - ); - - // The validator has not been slashed additionally. - assert_eq!(Balances::free_balance(11), 500); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(60)], - ); - - // The validator got slashed 10% more. - assert_eq!(Balances::free_balance(11), 400); - }) -} - -#[test] -fn garbage_collection_after_slashing() { - // ensures that `SlashingSpans` and `SpanSlash` of an account is removed after reaping. - ExtBuilder::default() - .existential_deposit(2) - .balance_factor(2) - .build_and_execute(|| { - assert_eq!(Balances::free_balance(11), 2000); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - ); - - assert_eq!(Balances::free_balance(11), 2000 - 200); - assert!(pallet_staking::SlashingSpans::::get(&11).is_some()); - assert_eq!( - pallet_staking::SpanSlash::::get(&(11, 0)).amount(), - &200 - ); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(100)], - ); - - // validator and nominator slash in era are garbage-collected by era change, - // so we don't test those here. - - assert_eq!(Balances::free_balance(11), 0); - assert_eq!(Balances::total_balance(&11), 0); - - let slashing_spans = pallet_staking::SlashingSpans::::get(&11).unwrap(); - assert_eq!(slashing_spans.iter().count(), 2); - - // reap_stash respects num_slashing_spans so that weight is accurate - assert_noop!( - Staking::reap_stash(RuntimeOrigin::signed(20), 11, 0), - Error::::IncorrectSlashingSpans - ); - assert_ok!(Staking::reap_stash(RuntimeOrigin::signed(20), 11, 2)); - - assert!(pallet_staking::SlashingSpans::::get(&11).is_none()); - assert_eq!( - pallet_staking::SpanSlash::::get(&(11, 0)).amount(), - &0 - ); - }) -} - -#[test] -fn garbage_collection_on_window_pruning() { - // ensures that `ValidatorSlashInEra` and `NominatorSlashInEra` are cleared after - // `BondingDuration`. - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - - assert_eq!(Balances::free_balance(11), 1000); - let now = active_era(); - - let exposure = Staking::eras_stakers(now, 11); - assert_eq!(Balances::free_balance(101), 2000); - let _nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().value; - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(now, 11)), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - ); - - assert_eq!(Balances::free_balance(11), 900); - // Polymesh change - // ----------------------------------------------------------------- - // Nominators slashing is switched off - // assert_eq!(Balances::free_balance(101), 2000 - (nominated_value / 10)); - // ----------------------------------------------------------------- - - assert!(pallet_staking::ValidatorSlashInEra::::get(&now, &11).is_some()); - assert!(pallet_staking::NominatorSlashInEra::::get(&now, &101).is_none()); - - // + 1 because we have to exit the bonding window. - for era in (0..(BondingDuration::get() + 1)).map(|offset| offset + now + 1) { - assert!(pallet_staking::ValidatorSlashInEra::::get(&now, &11).is_some()); - assert!(pallet_staking::NominatorSlashInEra::::get(&now, &101).is_none()); - - mock::start_active_era(era); - } - - assert!(pallet_staking::ValidatorSlashInEra::::get(&now, &11).is_none()); - assert!(pallet_staking::NominatorSlashInEra::::get(&now, &101).is_none()); - }) -} - -#[test] -fn slashing_nominators_by_span_max() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - mock::start_active_era(2); - mock::start_active_era(3); - - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(21), 2000); - assert_eq!(Balances::free_balance(101), 2000); - assert_eq!(Staking::slashable_balance_of(&21), 1000); - - let exposure_11 = Staking::eras_stakers(active_era(), 11); - let exposure_21 = Staking::eras_stakers(active_era(), 21); - let nominated_value_11 = exposure_11 - .others - .iter() - .find(|o| o.who == 101) - .unwrap() - .value; - let nominated_value_21 = exposure_21 - .others - .iter() - .find(|o| o.who == 101) - .unwrap() - .value; - - on_offence_in_era( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - 2, - DisableStrategy::WhenSlashed, - ); - - assert_eq!(Balances::free_balance(11), 900); - - // Polymesh change - // ----------------------------------------------------------------- - // Nominators slashing is switched off - let slash_1_amount = Perbill::from_percent(10) * nominated_value_11; - assert_eq!(Balances::free_balance(101), 2000); - // ----------------------------------------------------------------- - - let expected_spans = vec![ - slashing::SlashingSpan { - index: 1, - start: 4, - length: None, - }, - slashing::SlashingSpan { - index: 0, - start: 0, - length: Some(4), - }, - ]; - - let get_span = |account| pallet_staking::SlashingSpans::::get(&account).unwrap(); - - assert_eq!(get_span(11).iter().collect::>(), expected_spans); - - //assert_eq!(get_span(101).iter().collect::>(), expected_spans); - - // second slash: higher era, higher value, same span. - on_offence_in_era( - &[OffenceDetails { - offender: (21, Staking::eras_stakers(active_era(), 21)), - reporters: vec![], - }], - &[Perbill::from_percent(30)], - 3, - DisableStrategy::WhenSlashed, - ); - - // 11 was not further slashed, but 21 and 101 were. - assert_eq!(Balances::free_balance(11), 900); - assert_eq!(Balances::free_balance(21), 1700); - - let slash_2_amount = Perbill::from_percent(30) * nominated_value_21; - assert!(slash_2_amount > slash_1_amount); - - // only the maximum slash in a single span is taken. - assert_eq!(Balances::free_balance(101), 2000); - - // third slash: in same era and on same validator as first, higher - // in-era value, but lower slash value than slash 2. - on_offence_in_era( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(20)], - 2, - DisableStrategy::WhenSlashed, - ); - - // 11 was further slashed, but 21 and 101 were not. - assert_eq!(Balances::free_balance(11), 800); - assert_eq!(Balances::free_balance(21), 1700); - - let slash_3_amount = Perbill::from_percent(20) * nominated_value_21; - assert!(slash_3_amount < slash_2_amount); - assert!(slash_3_amount > slash_1_amount); - - // only the maximum slash in a single span is taken. - assert_eq!(Balances::free_balance(101), 2000); - }); -} - -#[test] -fn slashes_are_summed_across_spans() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - mock::start_active_era(2); - mock::start_active_era(3); - - assert_eq!(Balances::free_balance(21), 2000); - assert_eq!(Staking::slashable_balance_of(&21), 1000); - - let get_span = |account| pallet_staking::SlashingSpans::::get(&account).unwrap(); - - on_offence_now( - &[OffenceDetails { - offender: (21, Staking::eras_stakers(active_era(), 21)), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - ); - - let expected_spans = vec![ - slashing::SlashingSpan { - index: 1, - start: 4, - length: None, - }, - slashing::SlashingSpan { - index: 0, - start: 0, - length: Some(4), - }, - ]; - - assert_eq!(get_span(21).iter().collect::>(), expected_spans); - assert_eq!(Balances::free_balance(21), 1900); - - // 21 has been force-chilled. re-signal intent to validate. - Staking::validate(RuntimeOrigin::signed(20), Default::default()).unwrap(); - - mock::start_active_era(4); - - assert_eq!(Staking::slashable_balance_of(&21), 900); - - on_offence_now( - &[OffenceDetails { - offender: (21, Staking::eras_stakers(active_era(), 21)), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - ); - - let expected_spans = vec![ - slashing::SlashingSpan { - index: 2, - start: 5, - length: None, - }, - slashing::SlashingSpan { - index: 1, - start: 4, - length: Some(1), - }, - slashing::SlashingSpan { - index: 0, - start: 0, - length: Some(4), - }, - ]; - - assert_eq!(get_span(21).iter().collect::>(), expected_spans); - assert_eq!(Balances::free_balance(21), 1810); - }); -} - -#[test] -fn deferred_slashes_are_deferred() { - ExtBuilder::default() - .slash_defer_duration(2) - .build_and_execute(|| { - mock::start_active_era(1); - - assert_eq!(Balances::free_balance(11), 1000); - - let exposure = Staking::eras_stakers(active_era(), 11); - assert_eq!(Balances::free_balance(101), 2000); - let _nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().value; - - System::reset_events(); - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - ); - - // nominations are not removed regardless of the deferring. - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); - - mock::start_active_era(2); - - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); - - mock::start_active_era(3); - - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); - - // at the start of era 4, slashes from era 1 are processed, - // after being deferred for at least 2 full eras. - mock::start_active_era(4); - - assert_eq!(Balances::free_balance(11), 900); - // Polymesh change - // ----------------------------------------------------------------- - // Nominators slashing is switched off - // assert_eq!(Balances::free_balance(101), 2000 - (nominated_value / 10)); - // ----------------------------------------------------------------- - assert!(matches!( - staking_events_since_last_call().as_slice(), - &[ - Event::Chilled { stash: 11 }, - Event::ForceEra { - mode: Forcing::ForceNew - }, - Event::SlashReported { - validator: 11, - slash_era: 1, - .. - }, - Event::StakersElected, - Event::ForceEra { - mode: Forcing::NotForcing - }, - .., - Event::Slashed { - staker: 11, - amount: 100 - }, - ] - )); - }) -} - -#[test] -fn retroactive_deferred_slashes_two_eras_before() { - ExtBuilder::default() - .slash_defer_duration(2) - .build_and_execute(|| { - assert_eq!(BondingDuration::get(), 3); - - mock::start_active_era(1); - let exposure_11_at_era1 = Staking::eras_stakers(active_era(), 11); - - mock::start_active_era(3); - - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - - System::reset_events(); - on_offence_in_era( - &[OffenceDetails { - offender: (11, exposure_11_at_era1), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - 1, // should be deferred for two full eras, and applied at the beginning of era 4. - DisableStrategy::Never, - ); - - mock::start_active_era(4); - - assert!(matches!( - staking_events_since_last_call().as_slice(), - &[ - Event::Chilled { stash: 11 }, - Event::ForceEra { - mode: Forcing::ForceNew - }, - Event::SlashReported { - validator: 11, - slash_era: 1, - .. - }, - .., - Event::Slashed { - staker: 11, - amount: 100 - }, - ] - )); - }) -} - -#[test] -fn retroactive_deferred_slashes_one_before() { - ExtBuilder::default() - .slash_defer_duration(2) - .build_and_execute(|| { - assert_eq!(BondingDuration::get(), 3); - - mock::start_active_era(1); - let exposure_11_at_era1 = Staking::eras_stakers(active_era(), 11); - - // unbond at slash era. - mock::start_active_era(2); - assert_ok!(Staking::chill(RuntimeOrigin::signed(10))); - assert_ok!(Staking::unbond(RuntimeOrigin::signed(10), 100)); - - mock::start_active_era(3); - System::reset_events(); - on_offence_in_era( - &[OffenceDetails { - offender: (11, exposure_11_at_era1), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - 2, // should be deferred for two full eras, and applied at the beginning of era 5. - DisableStrategy::Never, - ); - - mock::start_active_era(4); - - assert_eq!(Staking::ledger(10).unwrap().total, 1000); - // slash happens after the next line. - - mock::start_active_era(5); - assert!(matches!( - staking_events_since_last_call().as_slice(), - &[ - Event::SlashReported { - validator: 11, - slash_era: 2, - .. - }, - .., - Event::Slashed { - staker: 11, - amount: 100 - }, - ] - )); - - // their ledger has already been slashed. - assert_eq!(Staking::ledger(10).unwrap().total, 900); - assert_ok!(Staking::unbond(RuntimeOrigin::signed(10), 1000)); - assert_eq!(Staking::ledger(10).unwrap().total, 900); - }) -} - -#[test] -fn staker_cannot_bail_deferred_slash() { - // as long as SlashDeferDuration is less than BondingDuration, this should not be possible. - ExtBuilder::default() - .slash_defer_duration(2) - .build_and_execute(|| { - mock::start_active_era(1); - - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); - - let exposure = Staking::eras_stakers(active_era(), 11); - let _nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().value; - - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - ); - - // now we chill - assert_ok!(Staking::chill(RuntimeOrigin::signed(100))); - assert_ok!(Staking::unbond(RuntimeOrigin::signed(100), 500)); - - assert_eq!(Staking::current_era().unwrap(), 1); - assert_eq!(active_era(), 1); - - assert_eq!( - Ledger::::get(100).unwrap(), - StakingLedger { - active: 0, - total: 500, - stash: 101, - claimed_rewards: bounded_vec![], - unlocking: bounded_vec![UnlockChunk { - era: 4u32, - value: 500 - }], - } - ); - - // no slash yet. - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); - - // no slash yet. - mock::start_active_era(2); - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); - assert_eq!(Staking::current_era().unwrap(), 2); - assert_eq!(active_era(), 2); - - // no slash yet. - mock::start_active_era(3); - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); - assert_eq!(Staking::current_era().unwrap(), 3); - assert_eq!(active_era(), 3); - - // and cannot yet unbond: - assert_storage_noop!(assert!(Staking::withdraw_unbonded( - RuntimeOrigin::signed(100), - 0 - ) - .is_ok())); - assert_eq!( - Ledger::::get(100).unwrap().unlocking.into_inner(), - vec![UnlockChunk { - era: 4u32, - value: 500 as Balance - }], - ); - - // at the start of era 4, slashes from era 1 are processed, - // after being deferred for at least 2 full eras. - mock::start_active_era(4); - - assert_eq!(Balances::free_balance(11), 900); - // Polymesh change - // ----------------------------------------------------------------- - // Nominators slashing is switched off - assert_eq!(Balances::free_balance(101), 2000); - // ----------------------------------------------------------------- - - // and the leftover of the funds can now be unbonded. - }) -} - -#[test] -fn remove_deferred() { - ExtBuilder::default() - .slash_defer_duration(2) - .build_and_execute(|| { - mock::start_active_era(1); - - assert_eq!(Balances::free_balance(11), 1000); - - let exposure = Staking::eras_stakers(active_era(), 11); - assert_eq!(Balances::free_balance(101), 2000); - let nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().value; - - // deferred to start of era 4. - on_offence_now( - &[OffenceDetails { - offender: (11, exposure.clone()), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - ); - - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); - - mock::start_active_era(2); - - // reported later, but deferred to start of era 4 as well. - System::reset_events(); - on_offence_in_era( - &[OffenceDetails { - offender: (11, exposure.clone()), - reporters: vec![], - }], - &[Perbill::from_percent(15)], - 1, - DisableStrategy::WhenSlashed, - ); - - // fails if empty - assert_noop!( - Staking::cancel_deferred_slash(RuntimeOrigin::root(), 1, vec![]), - Error::::EmptyTargets - ); - - // cancel one of them. - assert_ok!(Staking::cancel_deferred_slash( - RuntimeOrigin::root(), - 4, - vec![0] - )); - - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); - - mock::start_active_era(3); - - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); - - // at the start of era 4, slashes from era 1 are processed, - // after being deferred for at least 2 full eras. - mock::start_active_era(4); - - // the first slash for 10% was cancelled, but the 15% one not. - assert!(matches!( - staking_events_since_last_call().as_slice(), - &[ - Event::SlashReported { - validator: 11, - slash_era: 1, - .. - }, - .., - Event::Slashed { - staker: 11, - amount: 50 - }, - ] - )); - - let slash_10 = Perbill::from_percent(10); - let slash_15 = Perbill::from_percent(15); - let initial_slash = slash_10 * nominated_value; - - let total_slash = slash_15 * nominated_value; - let _actual_slash = total_slash - initial_slash; - - // Polymesh change - // ----------------------------------------------------------------- - // Nominator slashing is switched off - // 5% slash (15 - 10) processed now. - assert_eq!(Balances::free_balance(11), 950); - assert_eq!(Balances::free_balance(101), 2000); - // ----------------------------------------------------------------- - }) -} - -#[test] -fn remove_multi_deferred() { - ExtBuilder::default() - .slash_defer_duration(2) - .build_and_execute(|| { - mock::start_active_era(1); - - assert_eq!(Balances::free_balance(11), 1000); - - let exposure = Staking::eras_stakers(active_era(), 11); - assert_eq!(Balances::free_balance(101), 2000); - - on_offence_now( - &[OffenceDetails { - offender: (11, exposure.clone()), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - ); - - on_offence_now( - &[OffenceDetails { - offender: (21, Staking::eras_stakers(active_era(), 21)), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - ); - - on_offence_now( - &[OffenceDetails { - offender: (11, exposure.clone()), - reporters: vec![], - }], - &[Perbill::from_percent(25)], - ); - - on_offence_now( - &[OffenceDetails { - offender: (42, exposure.clone()), - reporters: vec![], - }], - &[Perbill::from_percent(25)], - ); - - on_offence_now( - &[OffenceDetails { - offender: (69, exposure.clone()), - reporters: vec![], - }], - &[Perbill::from_percent(25)], - ); - - assert_eq!(pallet_staking::UnappliedSlashes::::get(&4).len(), 5); - - // fails if list is not sorted - assert_noop!( - Staking::cancel_deferred_slash(RuntimeOrigin::root(), 1, vec![2, 0, 4]), - Error::::NotSortedAndUnique - ); - // fails if list is not unique - assert_noop!( - Staking::cancel_deferred_slash(RuntimeOrigin::root(), 1, vec![0, 2, 2]), - Error::::NotSortedAndUnique - ); - // fails if bad index - assert_noop!( - Staking::cancel_deferred_slash(RuntimeOrigin::root(), 1, vec![1, 2, 3, 4, 5]), - Error::::InvalidSlashIndex - ); - - assert_ok!(Staking::cancel_deferred_slash( - RuntimeOrigin::root(), - 4, - vec![0, 2, 4] - )); - - let slashes = pallet_staking::UnappliedSlashes::::get(&4); - assert_eq!(slashes.len(), 2); - assert_eq!(slashes[0].validator, 21); - assert_eq!(slashes[1].validator, 42); - }) -} - -#[test] -fn slash_kicks_validators_not_nominators_and_disables_nominator_for_kicked_validator() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - assert_eq_uvec!(Session::validators(), vec![11, 21]); - - // pre-slash balance - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); - - // 100 has approval for 11 as of now - assert!(Staking::nominators(101).unwrap().targets.contains(&11)); - - // 11 and 21 both have the support of 100 - let exposure_11 = Staking::eras_stakers(active_era(), &11); - let exposure_21 = Staking::eras_stakers(active_era(), &21); - - assert_eq!(exposure_11.total, 1000 + 125); - assert_eq!(exposure_21.total, 1000 + 375); - - on_offence_now( - &[OffenceDetails { - offender: (11, exposure_11.clone()), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - ); - - assert_eq!( - staking_events_since_last_call(), - vec![ - Event::StakersElected, - Event::EraPaid { - era_index: 0, - validator_payout: 11075, - remainder: 33225 - }, - Event::Chilled { stash: 11 }, - Event::ForceEra { - mode: Forcing::ForceNew - }, - Event::SlashReported { - validator: 11, - fraction: Perbill::from_percent(10), - slash_era: 1 - }, - Event::Slashed { - staker: 11, - amount: 100 - }, - ] - ); - - // post-slash balance - let nominator_slash_amount_11 = 125 / 10; - assert_eq!(Balances::free_balance(11), 900); - // Polymesh change - // ----------------------------------------------------------------- - // Nominators slashing is switched off - assert_eq!(Balances::free_balance(101), 2000); - // ----------------------------------------------------------------- - - // check that validator was chilled. - assert!(pallet_staking::Validators::::iter().all(|(stash, _)| stash != 11)); - - // actually re-bond the slashed validator - assert_ok!(Staking::validate( - RuntimeOrigin::signed(10), - Default::default() - )); - - mock::start_active_era(2); - let exposure_11 = Staking::eras_stakers(active_era(), &11); - let exposure_21 = Staking::eras_stakers(active_era(), &21); - - // 11's own expo is reduced. sum of support from 11 is less (448), which is 500 - // 900 + 146 - assert!(matches!( - exposure_11, - Exposure { - own: 900, - total: 1051, - .. - } - )); - // 1000 + 342 - assert!(matches!( - exposure_21, - Exposure { - own: 1000, - total: 1349, - .. - } - )); - assert_eq!(500 - 146 - 342, nominator_slash_amount_11); - }); -} - -#[test] -fn non_slashable_offence_doesnt_disable_validator() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - assert_eq_uvec!(Session::validators(), vec![11, 21]); - - let exposure_11 = Staking::eras_stakers(Staking::active_era().unwrap().index, &11); - let exposure_21 = Staking::eras_stakers(Staking::active_era().unwrap().index, &21); - - // offence with no slash associated - on_offence_now( - &[OffenceDetails { - offender: (11, exposure_11.clone()), - reporters: vec![], - }], - &[Perbill::zero()], - ); - - // it does NOT affect the nominator. - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - - // offence that slashes 25% of the bond - on_offence_now( - &[OffenceDetails { - offender: (21, exposure_21.clone()), - reporters: vec![], - }], - &[Perbill::from_percent(25)], - ); - - // it DOES NOT affect the nominator. - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - - assert_eq!( - staking_events_since_last_call(), - vec![ - Event::StakersElected, - Event::EraPaid { - era_index: 0, - validator_payout: 11075, - remainder: 33225 - }, - Event::Chilled { stash: 11 }, - Event::ForceEra { - mode: Forcing::ForceNew - }, - Event::SlashReported { - validator: 11, - fraction: Perbill::from_percent(0), - slash_era: 1 - }, - Event::Chilled { stash: 21 }, - Event::SlashReported { - validator: 21, - fraction: Perbill::from_percent(25), - slash_era: 1 - }, - Event::Slashed { - staker: 21, - amount: 250 - }, - ] - ); - - // the offence for validator 10 wasn't slashable so it wasn't disabled - assert!(!is_disabled(10)); - // whereas validator 20 gets disabled - assert!(is_disabled(20)); - }); -} - -#[test] -fn slashing_independent_of_disabling_validator() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - assert_eq_uvec!(Session::validators(), vec![11, 21]); - - let exposure_11 = Staking::eras_stakers(Staking::active_era().unwrap().index, &11); - let exposure_21 = Staking::eras_stakers(Staking::active_era().unwrap().index, &21); - - let now = Staking::active_era().unwrap().index; - - // offence with no slash associated, BUT disabling - on_offence_in_era( - &[OffenceDetails { - offender: (11, exposure_11.clone()), - reporters: vec![], - }], - &[Perbill::zero()], - now, - DisableStrategy::Always, - ); - - // nomination remains untouched. - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - - // offence that slashes 25% of the bond, BUT not disabling - on_offence_in_era( - &[OffenceDetails { - offender: (21, exposure_21.clone()), - reporters: vec![], - }], - &[Perbill::from_percent(25)], - now, - DisableStrategy::Never, - ); - - // nomination remains untouched. - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - - assert_eq!( - staking_events_since_last_call(), - vec![ - Event::StakersElected, - Event::EraPaid { - era_index: 0, - validator_payout: 11075, - remainder: 33225 - }, - Event::Chilled { stash: 11 }, - Event::ForceEra { - mode: Forcing::ForceNew - }, - Event::SlashReported { - validator: 11, - fraction: Perbill::from_percent(0), - slash_era: 1 - }, - Event::Chilled { stash: 21 }, - Event::SlashReported { - validator: 21, - fraction: Perbill::from_percent(25), - slash_era: 1 - }, - Event::Slashed { - staker: 21, - amount: 250 - }, - ] - ); - - // the offence for validator 10 was explicitly disabled - assert!(is_disabled(10)); - // whereas validator 20 is explicitly not disabled - assert!(!is_disabled(20)); - }); -} - -#[test] -fn offence_threshold_triggers_new_era() { - ExtBuilder::default() - .validator_count(4) - .set_status(41, StakerStatus::Validator) - .build_and_execute(|| { - mock::start_active_era(1); - assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41]); - - assert_eq!( - ::OffendingValidatorsThreshold::get(), - Perbill::from_percent(75), - ); - - // we have 4 validators and an offending validator threshold of 75%, - // once the third validator commits an offence a new era should be forced - - let exposure_11 = Staking::eras_stakers(Staking::active_era().unwrap().index, &11); - let exposure_21 = Staking::eras_stakers(Staking::active_era().unwrap().index, &21); - let exposure_31 = Staking::eras_stakers(Staking::active_era().unwrap().index, &31); - - on_offence_now( - &[OffenceDetails { - offender: (11, exposure_11.clone()), - reporters: vec![], - }], - &[Perbill::zero()], - ); - - assert_eq!(ForceEra::::get(), Forcing::NotForcing); - - on_offence_now( - &[OffenceDetails { - offender: (21, exposure_21.clone()), - reporters: vec![], - }], - &[Perbill::zero()], - ); - - assert_eq!(ForceEra::::get(), Forcing::NotForcing); - - on_offence_now( - &[OffenceDetails { - offender: (31, exposure_31.clone()), - reporters: vec![], - }], - &[Perbill::zero()], - ); - - assert_eq!(ForceEra::::get(), Forcing::ForceNew); - }); -} - -#[test] -fn disabled_validators_are_kept_disabled_for_whole_era() { - ExtBuilder::default() - .validator_count(4) - .set_status(41, StakerStatus::Validator) - .build_and_execute(|| { - mock::start_active_era(1); - assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41]); - assert_eq!(::SessionsPerEra::get(), 3); - - let exposure_11 = Staking::eras_stakers(Staking::active_era().unwrap().index, &11); - let exposure_21 = Staking::eras_stakers(Staking::active_era().unwrap().index, &21); - - on_offence_now( - &[OffenceDetails { - offender: (11, exposure_11.clone()), - reporters: vec![], - }], - &[Perbill::zero()], - ); - - on_offence_now( - &[OffenceDetails { - offender: (21, exposure_21.clone()), - reporters: vec![], - }], - &[Perbill::from_percent(25)], - ); - - // nominations are not updated. - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - - // validator 10 should not be disabled since the offence wasn't slashable - assert!(!is_disabled(10)); - // validator 20 gets disabled since it got slashed - assert!(is_disabled(20)); - - advance_session(); - - // disabled validators should carry-on through all sessions in the era - assert!(!is_disabled(10)); - assert!(is_disabled(20)); - - // validator 10 should now get disabled - on_offence_now( - &[OffenceDetails { - offender: (11, exposure_11.clone()), - reporters: vec![], - }], - &[Perbill::from_percent(25)], - ); - - // nominations are not updated. - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - - advance_session(); - - // and both are disabled in the last session of the era - assert!(is_disabled(10)); - assert!(is_disabled(20)); - - mock::start_active_era(2); - - // when a new era starts disabled validators get cleared - assert!(!is_disabled(10)); - assert!(!is_disabled(20)); - }); -} - -#[test] -fn claim_reward_at_the_last_era_and_no_double_claim_and_invalid_claim() { - // should check that: - // * rewards get paid until history_depth for both validators and nominators - // * an invalid era to claim doesn't update last_reward - // * double claim of one era fails - ExtBuilder::default().nominate(true).build_and_execute(|| { - // Consumed weight for all payout_stakers dispatches that fail - let err_weight = ::WeightInfo::payout_stakers_alive_staked(0); - - let init_balance_10 = Balances::total_balance(&10); - let init_balance_100 = Balances::total_balance(&100); - - let part_for_10 = Perbill::from_rational::(1000, 1125); - let part_for_100 = Perbill::from_rational::(125, 1125); - - // Check state - Payee::::insert(11, RewardDestination::Controller); - Payee::::insert(101, RewardDestination::Controller); - - Pallet::::reward_by_ids(vec![(11, 1)]); - // Compute total payout now for whole duration as other parameter won't change - let total_payout_0 = current_total_payout_for_duration(reward_time_per_era()); - - mock::start_active_era(1); - - Pallet::::reward_by_ids(vec![(11, 1)]); - // Change total issuance in order to modify total payout - let _ = Balances::deposit_creating(&999, 1_000_000_000); - // Compute total payout now for whole duration as other parameter won't change - let total_payout_1 = current_total_payout_for_duration(reward_time_per_era()); - assert!(total_payout_1 != total_payout_0); - - mock::start_active_era(2); - - Pallet::::reward_by_ids(vec![(11, 1)]); - // Change total issuance in order to modify total payout - let _ = Balances::deposit_creating(&999, 1_000_000_000); - // Compute total payout now for whole duration as other parameter won't change - let total_payout_2 = current_total_payout_for_duration(reward_time_per_era()); - assert!(total_payout_2 != total_payout_0); - assert!(total_payout_2 != total_payout_1); - - mock::start_active_era(HistoryDepth::get() + 1); - - let active_era = active_era(); - - // This is the latest planned era in staking, not the active era - let current_era = Staking::current_era().unwrap(); - - // Last kept is 1: - assert!(current_era - HistoryDepth::get() == 1); - assert_noop!( - Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 0), - // Fail: Era out of history - Error::::InvalidEraToReward.with_weight(err_weight) - ); - assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 1)); - assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 2)); - assert_noop!( - Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 2), - // Fail: Double claim - Error::::AlreadyClaimed.with_weight(err_weight) - ); - assert_noop!( - Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, active_era), - // Fail: Era not finished yet - Error::::InvalidEraToReward.with_weight(err_weight) - ); - - // Era 0 can't be rewarded anymore and current era can't be rewarded yet - // only era 1 and 2 can be rewarded. - - assert_eq!( - Balances::total_balance(&10), - init_balance_10 + part_for_10 * (total_payout_1 + total_payout_2), - ); - assert_eq!( - Balances::total_balance(&100), - init_balance_100 + part_for_100 * (total_payout_1 + total_payout_2), - ); - }); -} - -#[test] -fn zero_slash_keeps_nominators() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - - assert_eq!(Balances::free_balance(11), 1000); - - let exposure = Staking::eras_stakers(active_era(), 11); - assert_eq!(Balances::free_balance(101), 2000); - - on_offence_now( - &[OffenceDetails { - offender: (11, exposure.clone()), - reporters: vec![], - }], - &[Perbill::from_percent(0)], - ); - - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(101), 2000); - - // 11 is still removed.. - assert!(pallet_staking::Validators::::iter().all(|(stash, _)| stash != 11)); - // but their nominations are kept. - assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); - }); -} - -#[test] -fn six_session_delay() { - ExtBuilder::default() - .initialize_first_session(false) - .build_and_execute(|| { - use pallet_session::SessionManager; - - let val_set = Session::validators(); - let init_session = Session::current_index(); - let init_active_era = active_era(); - - // pallet-session is delaying session by one, thus the next session to plan is +2. - assert_eq!( - >::new_session(init_session + 2), - None - ); - assert_eq!( - >::new_session(init_session + 3), - Some(val_set.clone()) - ); - assert_eq!( - >::new_session(init_session + 4), - None - ); - assert_eq!( - >::new_session(init_session + 5), - None - ); - assert_eq!( - >::new_session(init_session + 6), - Some(val_set.clone()) - ); - - >::end_session(init_session); - >::start_session(init_session + 1); - assert_eq!(active_era(), init_active_era); - - >::end_session(init_session + 1); - >::start_session(init_session + 2); - assert_eq!(active_era(), init_active_era); - - // Reward current era - Staking::reward_by_ids(vec![(11, 1)]); - - // New active era is triggered here. - >::end_session(init_session + 2); - >::start_session(init_session + 3); - assert_eq!(active_era(), init_active_era + 1); - - >::end_session(init_session + 3); - >::start_session(init_session + 4); - assert_eq!(active_era(), init_active_era + 1); - - >::end_session(init_session + 4); - >::start_session(init_session + 5); - assert_eq!(active_era(), init_active_era + 1); - - // Reward current era - Staking::reward_by_ids(vec![(21, 2)]); - - // New active era is triggered here. - >::end_session(init_session + 5); - >::start_session(init_session + 6); - assert_eq!(active_era(), init_active_era + 2); - - // That reward are correct - assert_eq!(Staking::eras_reward_points(init_active_era).total, 1); - assert_eq!(Staking::eras_reward_points(init_active_era + 1).total, 2); - }); -} - -#[test] -fn test_max_nominator_rewarded_per_validator_and_cant_steal_someone_else_reward() { - ExtBuilder::default().build_and_execute(|| { - for i in 0..=<::MaxNominatorRewardedPerValidator as Get>::get() as i32 - { - let stash = 10_000 + i as AccountId; - let controller = 20_000 + i as AccountId; - let balance = 10_000 + i as Balance; - Balances::make_free_balance_be(&stash, balance); - provide_did_to_user(stash); - add_secondary_key(stash, controller); - assert_ok!(Staking::bond( - RuntimeOrigin::signed(stash), - controller, - balance, - RewardDestination::Stash - )); - assert_ok!(Staking::nominate( - RuntimeOrigin::signed(controller), - vec![11] - )); - } - mock::start_active_era(1); - - Pallet::::reward_by_ids(vec![(11, 1)]); - // compute and ensure the reward amount is greater than zero. - let _ = current_total_payout_for_duration(reward_time_per_era()); - - mock::start_active_era(2); - mock::make_all_reward_payment(1); - - // Assert only nominators from 1 to Max are rewarded - for i in 0..=<::MaxNominatorRewardedPerValidator as Get>::get() as i32 - { - let stash = 10_000 + i as AccountId; - let balance = 10_000 + i as Balance; - if stash == 10_000 { - assert!(Balances::free_balance(&stash) == balance); - } else { - assert!(Balances::free_balance(&stash) > balance); - } - } - }); -} - -#[test] -fn test_payout_stakers() { - // Test that payout_stakers work in general, including that only the top - // `T::MaxNominatorRewardedPerValidator` nominators are rewarded. - ExtBuilder::default() - .has_stakers(false) - .build_and_execute(|| { - let balance = 1000; - // Track the exposure of the validator and all nominators. - let mut total_exposure = balance; - // Track the exposure of the validator and the nominators that will get paid out. - let mut payout_exposure = balance; - // Create a validator: - bond_validator(11, 10, balance); // Default(64) - assert_eq!(Validators::::count(), 1); - - // Create nominators, targeting stash of validators - for i in 0..100 { - let bond_amount = balance + i as Balance; - bond_nominator_cdd(1000 + i, 100 + i, bond_amount, vec![11]); - total_exposure += bond_amount; - if i >= 36 { - payout_exposure += bond_amount; - }; - } - let payout_exposure_part = Perbill::from_rational(payout_exposure, total_exposure); - - mock::start_active_era(1); - Staking::reward_by_ids(vec![(11, 1)]); - - // compute and ensure the reward amount is greater than zero. - let payout = current_total_payout_for_duration(reward_time_per_era()); - let actual_paid_out = payout_exposure_part * payout; - - mock::start_active_era(2); - - let pre_payout_total_issuance = Balances::total_issuance(); - RewardOnUnbalanceWasCalled::set(false); - assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 1)); - assert_eq_error_rate!( - Balances::total_issuance(), - pre_payout_total_issuance + actual_paid_out, - 1 - ); - assert!(RewardOnUnbalanceWasCalled::get()); - - // Top 64 nominators of validator 11 automatically paid out, including the validator - // Validator payout goes to controller. - assert!(Balances::free_balance(&10) > balance); - for i in 36..100 { - assert!(Balances::free_balance(&(100 + i)) > balance + i as Balance); - } - // The bottom 36 do not - for i in 0..36 { - assert_eq!(Balances::free_balance(&(100 + i)), balance + i as Balance); - } - - // We track rewards in `claimed_rewards` vec - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![1] - }) - ); - - for i in 3..16 { - Staking::reward_by_ids(vec![(11, 1)]); - - // compute and ensure the reward amount is greater than zero. - let payout = current_total_payout_for_duration(reward_time_per_era()); - let actual_paid_out = payout_exposure_part * payout; - let pre_payout_total_issuance = Balances::total_issuance(); - - mock::start_active_era(i); - RewardOnUnbalanceWasCalled::set(false); - assert_ok!(Staking::payout_stakers( - RuntimeOrigin::signed(1337), - 11, - i - 1 - )); - assert_eq_error_rate!( - Balances::total_issuance(), - pre_payout_total_issuance + actual_paid_out, - 1 - ); - assert!(RewardOnUnbalanceWasCalled::get()); - } - - // We track rewards in `claimed_rewards` vec - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: (1..=14).collect::>().try_into().unwrap() - }) - ); - - let last_era = 99; - let history_depth = HistoryDepth::get(); - let expected_last_reward_era = last_era - 1; - let expected_start_reward_era = last_era - history_depth; - for i in 16..=last_era { - Staking::reward_by_ids(vec![(11, 1)]); - // compute and ensure the reward amount is greater than zero. - let _ = current_total_payout_for_duration(reward_time_per_era()); - mock::start_active_era(i); - } - - // We clean it up as history passes - assert_ok!(Staking::payout_stakers( - RuntimeOrigin::signed(1337), - 11, - expected_start_reward_era - )); - assert_ok!(Staking::payout_stakers( - RuntimeOrigin::signed(1337), - 11, - expected_last_reward_era - )); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![ - expected_start_reward_era, - expected_last_reward_era - ] - }) - ); - - // Out of order claims works. - assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 69)); - assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 23)); - assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 42)); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![ - expected_start_reward_era, - 23, - 42, - 69, - expected_last_reward_era - ] - }) - ); - }); -} - -#[test] -fn payout_stakers_handles_basic_errors() { - // Here we will test payouts handle all errors. - ExtBuilder::default() - .has_stakers(false) - .build_and_execute(|| { - // Consumed weight for all payout_stakers dispatches that fail - let err_weight = ::WeightInfo::payout_stakers_alive_staked(0); - - // Same setup as the test above - let balance = 1000; - bond_validator(11, 10, balance); // Default(64) - - // Create nominators, targeting stash - for i in 0..100 { - bond_nominator(1000 + i, 100 + i, balance + i as Balance, vec![11]); - } - - mock::start_active_era(1); - Staking::reward_by_ids(vec![(11, 1)]); - - // compute and ensure the reward amount is greater than zero. - let _ = current_total_payout_for_duration(reward_time_per_era()); - - mock::start_active_era(2); - - // Wrong Era, too big - assert_noop!( - Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 2), - Error::::InvalidEraToReward.with_weight(err_weight) - ); - // Wrong Staker - assert_noop!( - Staking::payout_stakers(RuntimeOrigin::signed(1337), 10, 1), - Error::::NotStash.with_weight(err_weight) - ); - - let last_era = 99; - for i in 3..=last_era { - Staking::reward_by_ids(vec![(11, 1)]); - // compute and ensure the reward amount is greater than zero. - let _ = current_total_payout_for_duration(reward_time_per_era()); - mock::start_active_era(i); - } - - let history_depth = HistoryDepth::get(); - let expected_last_reward_era = last_era - 1; - let expected_start_reward_era = last_era - history_depth; - - // We are at era last_era=99. Given history_depth=80, we should be able - // to payout era starting from expected_start_reward_era=19 through - // expected_last_reward_era=98 (80 total eras), but not 18 or 99. - assert_noop!( - Staking::payout_stakers( - RuntimeOrigin::signed(1337), - 11, - expected_start_reward_era - 1 - ), - Error::::InvalidEraToReward.with_weight(err_weight) - ); - assert_noop!( - Staking::payout_stakers( - RuntimeOrigin::signed(1337), - 11, - expected_last_reward_era + 1 - ), - Error::::InvalidEraToReward.with_weight(err_weight) - ); - assert_ok!(Staking::payout_stakers( - RuntimeOrigin::signed(1337), - 11, - expected_start_reward_era - )); - assert_ok!(Staking::payout_stakers( - RuntimeOrigin::signed(1337), - 11, - expected_last_reward_era - )); - - // Can't claim again - assert_noop!( - Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, expected_start_reward_era), - Error::::AlreadyClaimed.with_weight(err_weight) - ); - assert_noop!( - Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, expected_last_reward_era), - Error::::AlreadyClaimed.with_weight(err_weight) - ); - }); -} - -#[test] -fn payout_stakers_handles_weight_refund() { - // Note: this test relies on the assumption that `payout_stakers_alive_staked` is solely used by - // `payout_stakers` to calculate the weight of each payout op. - ExtBuilder::default() - .has_stakers(false) - .build_and_execute(|| { - let max_nom_rewarded = - <::MaxNominatorRewardedPerValidator as Get<_>>::get(); - // Make sure the configured value is meaningful for our use. - assert!(max_nom_rewarded >= 4); - let half_max_nom_rewarded = max_nom_rewarded / 2; - // Sanity check our max and half max nominator quantities. - assert!(half_max_nom_rewarded > 0); - assert!(max_nom_rewarded > half_max_nom_rewarded); - - let max_nom_rewarded_weight = - ::WeightInfo::payout_stakers_alive_staked(max_nom_rewarded); - let half_max_nom_rewarded_weight = - ::WeightInfo::payout_stakers_alive_staked(half_max_nom_rewarded); - let zero_nom_payouts_weight = - ::WeightInfo::payout_stakers_alive_staked(0); - assert!(zero_nom_payouts_weight.any_gt(Weight::zero())); - assert!(half_max_nom_rewarded_weight.any_gt(zero_nom_payouts_weight)); - assert!(max_nom_rewarded_weight.any_gt(half_max_nom_rewarded_weight)); - - let balance = 1000; - bond_validator(11, 10, balance); - - // Era 1 - start_active_era(1); - - // Reward just the validator. - Staking::reward_by_ids(vec![(11, 1)]); - - // Add some `half_max_nom_rewarded` nominators who will start backing the validator in the - // next era. - for i in 0..half_max_nom_rewarded { - bond_nominator( - (1000 + i).into(), - (100 + i).into(), - balance + i as Balance, - vec![11], - ); - } - - // Era 2 - start_active_era(2); - - // Collect payouts when there are no nominators - let call = TestCall::Staking(StakingCall::payout_stakers { - validator_stash: 11, - era: 1, - }); - let info = call.get_dispatch_info(); - let result = call.dispatch(RuntimeOrigin::signed(20)); - assert_ok!(result); - assert_eq!( - extract_actual_weight(&result, &info), - zero_nom_payouts_weight - ); - - // The validator is not rewarded in this era; so there will be zero payouts to claim for - // this era. - - // Era 3 - start_active_era(3); - - // Collect payouts for an era where the validator did not receive any points. - let call = TestCall::Staking(StakingCall::payout_stakers { - validator_stash: 11, - era: 2, - }); - let info = call.get_dispatch_info(); - let result = call.dispatch(RuntimeOrigin::signed(20)); - assert_ok!(result); - assert_eq!( - extract_actual_weight(&result, &info), - zero_nom_payouts_weight - ); - - // Reward the validator and its nominators. - Staking::reward_by_ids(vec![(11, 1)]); - - // Era 4 - start_active_era(4); - - // Collect payouts when the validator has `half_max_nom_rewarded` nominators. - let call = TestCall::Staking(StakingCall::payout_stakers { - validator_stash: 11, - era: 3, - }); - let info = call.get_dispatch_info(); - let result = call.dispatch(RuntimeOrigin::signed(20)); - assert_ok!(result); - assert_eq!( - extract_actual_weight(&result, &info), - half_max_nom_rewarded_weight - ); - - // Add enough nominators so that we are at the limit. They will be active nominators - // in the next era. - for i in half_max_nom_rewarded..max_nom_rewarded { - bond_nominator( - (1000 + i).into(), - (100 + i).into(), - balance + i as Balance, - vec![11], - ); - } - - // Era 5 - start_active_era(5); - // We now have `max_nom_rewarded` nominators actively nominating our validator. - - // Reward the validator so we can collect for everyone in the next era. - Staking::reward_by_ids(vec![(11, 1)]); - - // Era 6 - start_active_era(6); - - // Collect payouts when the validator had `half_max_nom_rewarded` nominators. - let call = TestCall::Staking(StakingCall::payout_stakers { - validator_stash: 11, - era: 5, - }); - let info = call.get_dispatch_info(); - let result = call.dispatch(RuntimeOrigin::signed(20)); - assert_ok!(result); - assert_eq!( - extract_actual_weight(&result, &info), - max_nom_rewarded_weight - ); - - // Try and collect payouts for an era that has already been collected. - let call = TestCall::Staking(StakingCall::payout_stakers { - validator_stash: 11, - era: 5, - }); - let info = call.get_dispatch_info(); - let result = call.dispatch(RuntimeOrigin::signed(20)); - assert!(result.is_err()); - // When there is an error the consumed weight == weight when there are 0 nominator payouts. - assert_eq!( - extract_actual_weight(&result, &info), - zero_nom_payouts_weight - ); - }); -} - -#[test] -fn bond_during_era_correctly_populates_claimed_rewards() { - ExtBuilder::default() - .has_stakers(false) - .build_and_execute(|| { - // Era = None - bond_validator(9, 8, 1000); - assert_eq!( - Staking::ledger(&8), - Some(StakingLedger { - stash: 9, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - }) - ); - mock::start_active_era(5); - bond_validator(11, 10, 1000); - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: (0..5).collect::>().try_into().unwrap(), - }) - ); - - // make sure only era upto history depth is stored - let current_era = 99; - let last_reward_era = 99 - HistoryDepth::get(); - mock::start_active_era(current_era); - bond_validator(13, 12, 1000); - assert_eq!( - Staking::ledger(&12), - Some(StakingLedger { - stash: 13, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: (last_reward_era..current_era) - .collect::>() - .try_into() - .unwrap(), - }) - ); - }); -} - -#[test] -fn offences_weight_calculated_correctly() { - ExtBuilder::default().nominate(true).build_and_execute(|| { - // On offence with zero offenders: 4 Reads, 1 Write - let zero_offence_weight = - ::DbWeight::get().reads_writes(4, 1); - assert_eq!( - Staking::on_offence(&[], &[Perbill::from_percent(50)], 0, DisableStrategy::WhenSlashed), - zero_offence_weight - ); - - // On Offence with N offenders, Unapplied: 4 Reads, 1 Write + 4 Reads, 5 Writes - let n_offence_unapplied_weight = ::DbWeight::get() - .reads_writes(4, 1) + - ::DbWeight::get().reads_writes(4, 5); - - let offenders: Vec< - OffenceDetails< - ::AccountId, - pallet_session::historical::IdentificationTuple, - >, - > = (1..10) - .map(|i| OffenceDetails { - offender: (i, Staking::eras_stakers(active_era(), i)), - reporters: vec![], - }) - .collect(); - assert_eq!( - Staking::on_offence( - &offenders, - &[Perbill::from_percent(50)], - 0, - DisableStrategy::WhenSlashed - ), - n_offence_unapplied_weight - ); - - // On Offence with one offenders, Applied - let one_offender = [OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![1], - }]; - - let _n = 1; // Number of offenders - let rw = 3; // rw reads and writes - let one_offence_unapplied_weight = - ::DbWeight::get().reads_writes(4, 1) - + - ::DbWeight::get().reads_writes(rw, rw) - // One `slash_cost` - + ::DbWeight::get().reads_writes(6, 5) - // `slash_cost` * nominators (1) - // + ::DbWeight::get().reads_writes(6, 5) - // `reward_cost` * reporters (1) - + ::DbWeight::get().reads_writes(2, 2) - ; - - assert_eq!( - Staking::on_offence( - &one_offender, - &[Perbill::from_percent(50)], - 0, - DisableStrategy::WhenSlashed{} - ), - one_offence_unapplied_weight - ); - }); -} - -#[test] -fn payout_creates_controller() { - ExtBuilder::default() - .has_stakers(false) - .build_and_execute(|| { - let balance = 1000; - // Create a validator: - bond_validator(11, 10, balance); - - // Create a stash/controller pair - bond_nominator(1234, 1337, 100, vec![11]); - - // kill controller - assert_ok!(Balances::transfer(RuntimeOrigin::signed(1337), 1234, 100)); - assert_eq!(Balances::free_balance(1337), 0); - - mock::start_active_era(1); - Staking::reward_by_ids(vec![(11, 1)]); - // compute and ensure the reward amount is greater than zero. - let _ = current_total_payout_for_duration(reward_time_per_era()); - mock::start_active_era(2); - assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 1)); - - // Controller is created - assert!(Balances::free_balance(1337) > 0); - }) -} - -#[test] -fn payout_to_any_account_works() { - ExtBuilder::default() - .has_stakers(false) - .build_and_execute(|| { - let balance = 1000; - // Create a validator: - bond_validator(11, 10, balance); // Default(64) - - // Create a stash/controller pair - bond_nominator(1234, 1337, 100, vec![11]); - - // Update payout location - assert_ok!(Staking::set_payee( - RuntimeOrigin::signed(1337), - RewardDestination::Account(42) - )); - - // Reward Destination account doesn't exist - assert_eq!(Balances::free_balance(42), 0); - - mock::start_active_era(1); - Staking::reward_by_ids(vec![(11, 1)]); - // compute and ensure the reward amount is greater than zero. - let _ = current_total_payout_for_duration(reward_time_per_era()); - mock::start_active_era(2); - assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 1)); - - // Payment is successful - assert!(Balances::free_balance(42) > 0); - }) -} - -#[test] -fn session_buffering_with_offset() { - // similar to live-chains, have some offset for the first session - ExtBuilder::default() - .offset(2) - .period(5) - .session_per_era(5) - .build_and_execute(|| { - assert_eq!(current_era(), 0); - assert_eq!(active_era(), 0); - assert_eq!(Session::current_index(), 0); - - start_session(1); - assert_eq!(current_era(), 0); - assert_eq!(active_era(), 0); - assert_eq!(Session::current_index(), 1); - assert_eq!(System::block_number(), 2); - - start_session(2); - assert_eq!(current_era(), 0); - assert_eq!(active_era(), 0); - assert_eq!(Session::current_index(), 2); - assert_eq!(System::block_number(), 7); - - start_session(3); - assert_eq!(current_era(), 0); - assert_eq!(active_era(), 0); - assert_eq!(Session::current_index(), 3); - assert_eq!(System::block_number(), 12); - - // active era is lagging behind by one session, because of how session module works. - start_session(4); - assert_eq!(current_era(), 1); - assert_eq!(active_era(), 0); - assert_eq!(Session::current_index(), 4); - assert_eq!(System::block_number(), 17); - - start_session(5); - assert_eq!(current_era(), 1); - assert_eq!(active_era(), 1); - assert_eq!(Session::current_index(), 5); - assert_eq!(System::block_number(), 22); - - // go all the way to active 2. - start_active_era(2); - assert_eq!(current_era(), 2); - assert_eq!(active_era(), 2); - assert_eq!(Session::current_index(), 10); - }); -} - -#[test] -fn session_buffering_no_offset() { - // no offset, first session starts immediately - ExtBuilder::default() - .offset(0) - .period(5) - .session_per_era(5) - .build_and_execute(|| { - assert_eq!(current_era(), 0); - assert_eq!(active_era(), 0); - assert_eq!(Session::current_index(), 0); - - start_session(1); - assert_eq!(current_era(), 0); - assert_eq!(active_era(), 0); - assert_eq!(Session::current_index(), 1); - assert_eq!(System::block_number(), 5); - - start_session(2); - assert_eq!(current_era(), 0); - assert_eq!(active_era(), 0); - assert_eq!(Session::current_index(), 2); - assert_eq!(System::block_number(), 10); - - start_session(3); - assert_eq!(current_era(), 0); - assert_eq!(active_era(), 0); - assert_eq!(Session::current_index(), 3); - assert_eq!(System::block_number(), 15); - - // active era is lagging behind by one session, because of how session module works. - start_session(4); - assert_eq!(current_era(), 1); - assert_eq!(active_era(), 0); - assert_eq!(Session::current_index(), 4); - assert_eq!(System::block_number(), 20); - - start_session(5); - assert_eq!(current_era(), 1); - assert_eq!(active_era(), 1); - assert_eq!(Session::current_index(), 5); - assert_eq!(System::block_number(), 25); - - // go all the way to active 2. - start_active_era(2); - assert_eq!(current_era(), 2); - assert_eq!(active_era(), 2); - assert_eq!(Session::current_index(), 10); - }); -} - -#[test] -fn cannot_rebond_to_lower_than_ed() { - ExtBuilder::default() - .existential_deposit(10) - .balance_factor(10) - .build_and_execute(|| { - // initial stuff. - assert_eq!( - Staking::ledger(&20).unwrap(), - StakingLedger { - stash: 21, - total: 10 * 1000, - active: 10 * 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - } - ); - - // unbond all of it. must be chilled first. - assert_ok!(Staking::chill(RuntimeOrigin::signed(20))); - assert_ok!(Staking::unbond(RuntimeOrigin::signed(20), 10 * 1000)); - assert_eq!( - Staking::ledger(&20).unwrap(), - StakingLedger { - stash: 21, - total: 10 * 1000, - active: 0, - unlocking: bounded_vec![UnlockChunk { - value: 10 * 1000, - era: 3 - }], - claimed_rewards: bounded_vec![], - } - ); - - // now bond a wee bit more - // Polymesh change - // ----------------------------------------------------------------- - assert_ok!(Staking::rebond(RuntimeOrigin::signed(20), 5),); - // ----------------------------------------------------------------- - }) -} - -#[test] -fn cannot_bond_extra_to_lower_than_ed() { - ExtBuilder::default() - .existential_deposit(10) - .balance_factor(10) - .build_and_execute(|| { - // initial stuff. - assert_eq!( - Staking::ledger(&20).unwrap(), - StakingLedger { - stash: 21, - total: 10 * 1000, - active: 10 * 1000, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - } - ); - - // unbond all of it. must be chilled first. - assert_ok!(Staking::chill(RuntimeOrigin::signed(20))); - assert_ok!(Staking::unbond(RuntimeOrigin::signed(20), 10 * 1000)); - assert_eq!( - Staking::ledger(&20).unwrap(), - StakingLedger { - stash: 21, - total: 10 * 1000, - active: 0, - unlocking: bounded_vec![UnlockChunk { - value: 10 * 1000, - era: 3 - }], - claimed_rewards: bounded_vec![], - } - ); - - // now bond a wee bit more - // Polymesh change - // ----------------------------------------------------------------- - assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(21), 5),); - // ----------------------------------------------------------------- - }) -} - -#[test] -fn do_not_die_when_active_is_ed() { - let ed = 10; - ExtBuilder::default() - .existential_deposit(ed) - .balance_factor(ed) - .build_and_execute(|| { - // given - assert_eq!( - Staking::ledger(&20).unwrap(), - StakingLedger { - stash: 21, - total: 1000 * ed, - active: 1000 * ed, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - } - ); - - // when unbond all of it except ed. - assert_ok!(Staking::unbond(RuntimeOrigin::signed(20), 999 * ed)); - start_active_era(3); - assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(20), 100)); - - // then - assert_eq!( - Staking::ledger(&20).unwrap(), - StakingLedger { - stash: 21, - total: ed, - active: ed, - unlocking: Default::default(), - claimed_rewards: bounded_vec![], - } - ); - }) -} - -#[test] -fn on_finalize_weight_is_nonzero() { - ExtBuilder::default().build_and_execute(|| { - let on_finalize_weight = ::DbWeight::get().reads(1); - assert!(>::on_initialize(1).all_gte(on_finalize_weight)); - }) -} - -mod election_data_provider { - use super::*; - use frame_election_provider_support::ElectionDataProvider; - - #[test] - fn targets_2sec_block() { - let mut validators = 1000; - while ::WeightInfo::get_npos_targets(validators).all_lt(Weight::from_parts( - 2u64 * frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND, - u64::MAX, - )) { - validators += 1; - } - - println!( - "Can create a snapshot of {} validators in 2sec block", - validators - ); - } - - #[test] - fn voters_2sec_block() { - // we assume a network only wants up to 1000 validators in most cases, thus having 2000 - // candidates is as high as it gets. - let validators = 2000; - let mut nominators = 1000; - - while ::WeightInfo::get_npos_voters(validators, nominators).all_lt( - Weight::from_parts( - 2u64 * frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND, - u64::MAX, - ), - ) { - nominators += 1; - } - - println!( - "Can create a snapshot of {} nominators [{} validators, each 1 slashing] in 2sec block", - nominators, validators - ); - } - - #[test] - fn set_minimum_active_stake_is_correct() { - ExtBuilder::default() - .nominate(false) - .add_staker( - IdentityId::from(61), - 61, - 60, - 2_000, - StakerStatus::::Nominator(vec![21]), - ) - .add_staker( - IdentityId::from(71), - 71, - 70, - 10, - StakerStatus::::Nominator(vec![21]), - ) - .add_staker( - IdentityId::from(81), - 81, - 80, - 50, - StakerStatus::::Nominator(vec![21]), - ) - .build_and_execute(|| { - assert_ok!(::electing_voters(None)); - assert_eq!(MinimumActiveStake::::get(), 10); - - // remove staker with lower bond by limiting the number of voters and check - // `MinimumActiveStake` again after electing voters. - assert_ok!(::electing_voters(Some(4))); - assert_eq!(MinimumActiveStake::::get(), 50); - }); - } - - #[test] - fn set_minimum_active_stake_zero_correct() { - ExtBuilder::default() - .has_stakers(false) - .build_and_execute(|| { - assert_ok!(::electing_voters(None)); - assert_eq!(MinimumActiveStake::::get(), 0); - }); - } - - #[test] - fn voters_include_self_vote() { - ExtBuilder::default().nominate(false).build_and_execute(|| { - assert!(>::iter() - .map(|(x, _)| x) - .all(|v| Staking::electing_voters(None) - .unwrap() - .into_iter() - .any(|(w, _, t)| { v == w && t[0] == w }))) - }) - } - - #[test] - fn respects_snapshot_len_limits() { - ExtBuilder::default() - .set_status(41, StakerStatus::Validator) - .build_and_execute(|| { - // sum of all nominators who'd be voters (1), plus the self-votes (4). - assert_eq!(::VoterList::count(), 5); - - // if limits is less.. - assert_eq!(Staking::electing_voters(Some(1)).unwrap().len(), 1); - - // if limit is equal.. - assert_eq!(Staking::electing_voters(Some(5)).unwrap().len(), 5); - - // if limit is more. - assert_eq!(Staking::electing_voters(Some(55)).unwrap().len(), 5); - - // if target limit is more.. - assert_eq!(Staking::electable_targets(Some(6)).unwrap().len(), 4); - assert_eq!(Staking::electable_targets(Some(4)).unwrap().len(), 4); - - // if target limit is less, then we return an error. - assert_eq!( - Staking::electable_targets(Some(1)).unwrap_err(), - "Target snapshot too big" - ); - }); - } - - // Tests the criteria that in `ElectionDataProvider::voters` function, we try to get at most - // `maybe_max_len` voters, and if some of them end up being skipped, we iterate at most `2 * - // maybe_max_len`. - #[ignore] - #[test] - fn only_iterates_max_2_times_max_allowed_len() { - ExtBuilder::default() - .nominate(false) - // the best way to invalidate a bunch of nominators is to have them nominate a lot of - // ppl, but then lower the MaxNomination limit. - .add_staker( - IdentityId::from(61), - 61, - 60, - 2_000, - StakerStatus::::Nominator(vec![21, 22, 23, 24, 25]), - ) - .add_staker( - IdentityId::from(71), - 71, - 70, - 2_000, - StakerStatus::::Nominator(vec![21, 22, 23, 24, 25]), - ) - .add_staker( - IdentityId::from(81), - 81, - 80, - 2_000, - StakerStatus::::Nominator(vec![21, 22, 23, 24, 25]), - ) - .build_and_execute(|| { - // all voters ordered by stake, - assert_eq!( - ::VoterList::iter().collect::>(), - vec![61, 71, 81, 11, 21, 31] - ); - - MaxNominations::set(2); - - // we want 2 voters now, and in maximum we allow 4 iterations. This is what happens: - // 61 is pruned; - // 71 is pruned; - // 81 is pruned; - // 11 is taken; - // we finish since the 2x limit is reached. - assert_eq!( - Staking::electing_voters(Some(2)) - .unwrap() - .iter() - .map(|(stash, _, _)| stash) - .copied() - .collect::>(), - vec![11], - ); - }); - } - - #[test] - fn estimate_next_election_works() { - ExtBuilder::default() - .session_per_era(5) - .period(5) - .build_and_execute(|| { - // first session is always length 0. - for b in 1..20 { - run_to_block(b); - assert_eq!( - Staking::next_election_prediction(System::block_number()), - 20 - ); - } - - // election - run_to_block(20); - assert_eq!( - Staking::next_election_prediction(System::block_number()), - 45 - ); - assert_eq!(staking_events().len(), 1); - assert_eq!(*staking_events().last().unwrap(), Event::StakersElected); - - for b in 21..45 { - run_to_block(b); - assert_eq!( - Staking::next_election_prediction(System::block_number()), - 45 - ); - } - - // election - run_to_block(45); - assert_eq!( - Staking::next_election_prediction(System::block_number()), - 70 - ); - assert_eq!(staking_events().len(), 3); - assert_eq!(*staking_events().last().unwrap(), Event::StakersElected); - - Staking::force_no_eras(RuntimeOrigin::root()).unwrap(); - assert_eq!( - Staking::next_election_prediction(System::block_number()), - u64::MAX - ); - - Staking::force_new_era_always(RuntimeOrigin::root()).unwrap(); - assert_eq!( - Staking::next_election_prediction(System::block_number()), - 45 + 5 - ); - - Staking::force_new_era(RuntimeOrigin::root()).unwrap(); - assert_eq!( - Staking::next_election_prediction(System::block_number()), - 45 + 5 - ); - - // Do a fail election - MinimumValidatorCount::::put(1000); - run_to_block(50); - // Election: failed, next session is a new election - assert_eq!( - Staking::next_election_prediction(System::block_number()), - 50 + 5 - ); - // The new era is still forced until a new era is planned. - assert_eq!(ForceEra::::get(), Forcing::ForceNew); - - MinimumValidatorCount::::put(2); - run_to_block(55); - assert_eq!( - Staking::next_election_prediction(System::block_number()), - 55 + 25 - ); - assert_eq!(staking_events().len(), 10); - assert_eq!( - *staking_events().last().unwrap(), - Event::ForceEra { - mode: Forcing::NotForcing - } - ); - assert_eq!( - *staking_events().get(staking_events().len() - 2).unwrap(), - Event::StakersElected - ); - // The new era has been planned, forcing is changed from `ForceNew` to `NotForcing`. - assert_eq!(ForceEra::::get(), Forcing::NotForcing); - }) - } -} - -#[ignore] -#[test] -#[should_panic] -fn count_check_works() { - ExtBuilder::default().build_and_execute(|| { - // We should never insert into the validators or nominators map directly as this will - // not keep track of the count. This test should panic as we verify the count is accurate - // after every test using the `post_checks` in `mock`. - Validators::::insert(987654321, ValidatorPrefs::default()); - Nominators::::insert( - 987654321, - Nominations { - targets: Default::default(), - submitted_in: Default::default(), - suppressed: false, - }, - ); - }) -} - -#[test] -fn min_bond_checks_work() { - ExtBuilder::default() - .existential_deposit(100) - .balance_factor(100) - .min_nominator_bond(1_000) - .min_validator_bond(1_500) - .build_and_execute(|| { - // 500 is not enough for any role - assert_ok!(Staking::bond( - RuntimeOrigin::signed(3), - 4, - 500, - RewardDestination::Controller - )); - assert_noop!( - Staking::nominate(RuntimeOrigin::signed(4), vec![1]), - Error::::InsufficientBond - ); - assert_noop!( - Staking::validate(RuntimeOrigin::signed(4), ValidatorPrefs::default()), - Error::::InsufficientBond, - ); - - // 1000 is enough for nominator - provide_did_to_user(3); - add_secondary_key(3, 4); - assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(3), 500)); - assert_ok!(Staking::nominate(RuntimeOrigin::signed(4), vec![1])); - assert_noop!( - Staking::validate(RuntimeOrigin::signed(4), ValidatorPrefs::default()), - Error::::InsufficientBond, - ); - - // 1500 is enough for validator - assert_add_permissioned_validator!(&3); - assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(3), 500)); - assert_ok!(Staking::nominate(RuntimeOrigin::signed(4), vec![1])); - assert_ok!(Staking::validate( - RuntimeOrigin::signed(4), - ValidatorPrefs::default() - )); - - // Can't unbond anything as validator - assert_noop!( - Staking::unbond(RuntimeOrigin::signed(4), 500), - Error::::InsufficientBond - ); - - // Once they are a nominator, they can unbond 500 - assert_ok!(Staking::nominate(RuntimeOrigin::signed(4), vec![1])); - assert_ok!(Staking::unbond(RuntimeOrigin::signed(4), 500)); - assert_noop!( - Staking::unbond(RuntimeOrigin::signed(4), 500), - Error::::InsufficientBond - ); - - // Once they are chilled they can unbond everything - assert_ok!(Staking::chill(RuntimeOrigin::signed(4))); - assert_ok!(Staking::unbond(RuntimeOrigin::signed(4), 1000)); - }) -} - -#[ignore] -#[test] -fn chill_other_works() {} - -#[ignore] -#[test] -fn capped_stakers_works() {} - -#[test] -fn min_commission_works() { - ExtBuilder::default().build_and_execute(|| { - assert_ok!(Staking::set_commission_cap( - RuntimeOrigin::root(), - Perbill::from_percent(60) - )); - // account 10 controls the stash from account 11 - assert_ok!(Staking::validate( - RuntimeOrigin::signed(10), - ValidatorPrefs { - commission: Perbill::from_percent(5), - blocked: false - } - )); - - // event emitted should be correct - assert_eq!( - *staking_events().last().unwrap(), - Event::ValidatorPrefsSet { - stash: 11, - prefs: ValidatorPrefs { - commission: Perbill::from_percent(5), - blocked: false - } - } - ); - - assert_ok!(Staking::set_staking_configs( - RuntimeOrigin::root(), - ConfigOp::Remove, - ConfigOp::Remove, - ConfigOp::Remove, - ConfigOp::Remove, - ConfigOp::Remove, - ConfigOp::Set(Perbill::from_percent(10)), - )); - - // can't make it less than 10 now - assert_noop!( - Staking::validate( - RuntimeOrigin::signed(10), - ValidatorPrefs { - commission: Perbill::from_percent(5), - blocked: false - } - ), - Error::::CommissionTooLow - ); - - // can only change to higher. - assert_ok!(Staking::validate( - RuntimeOrigin::signed(10), - ValidatorPrefs { - commission: Perbill::from_percent(10), - blocked: false - } - )); - - assert_ok!(Staking::validate( - RuntimeOrigin::signed(10), - ValidatorPrefs { - commission: Perbill::from_percent(15), - blocked: false - } - )); - }) -} - -#[test] -fn change_of_max_nominations() { - use frame_election_provider_support::ElectionDataProvider; - ExtBuilder::default() - .add_staker( - IdentityId::from(61), - 61, - 60, - 10, - StakerStatus::Nominator(vec![1]), - ) - .add_staker( - IdentityId::from(71), - 71, - 70, - 10, - StakerStatus::Nominator(vec![1, 2, 3]), - ) - .balance_factor(10) - .build_and_execute(|| { - // pre-condition - assert_eq!(MaxNominations::get(), 16); - - assert_eq!( - Nominators::::iter() - .map(|(k, n)| (k, n.targets.len())) - .collect::>(), - vec![(101, 2), (71, 3), (61, 1)] - ); - // 3 validators and 3 nominators - assert_eq!(Staking::electing_voters(None).unwrap().len(), 3 + 3); - - // abrupt change from 16 to 4, everyone should be fine. - MaxNominations::set(4); - - assert_eq!( - Nominators::::iter() - .map(|(k, n)| (k, n.targets.len())) - .collect::>(), - vec![(101, 2), (71, 3), (61, 1)] - ); - assert_eq!(Staking::electing_voters(None).unwrap().len(), 3 + 3); - - // abrupt change from 4 to 3, everyone should be fine. - MaxNominations::set(3); - - assert_eq!( - Nominators::::iter() - .map(|(k, n)| (k, n.targets.len())) - .collect::>(), - vec![(101, 2), (71, 3), (61, 1)] - ); - assert_eq!(Staking::electing_voters(None).unwrap().len(), 3 + 3); - - // abrupt change from 3 to 2, this should cause some nominators to be non-decodable, and - // thus non-existent unless if they update. - MaxNominations::set(2); - - assert_eq!( - Nominators::::iter() - .map(|(k, n)| (k, n.targets.len())) - .collect::>(), - vec![(101, 2), (61, 1)] - ); - // 70 is still in storage.. - assert!(Nominators::::contains_key(71)); - // but its value cannot be decoded and default is returned. - assert!(Nominators::::get(71).is_none()); - - assert_eq!(Staking::electing_voters(None).unwrap().len(), 3 + 2); - assert!(Nominators::::contains_key(101)); - - // abrupt change from 2 to 1, this should cause some nominators to be non-decodable, and - // thus non-existent unless if they update. - MaxNominations::set(1); - - assert_eq!( - Nominators::::iter() - .map(|(k, n)| (k, n.targets.len())) - .collect::>(), - vec![(61, 1)] - ); - assert!(Nominators::::contains_key(71)); - assert!(Nominators::::contains_key(61)); - assert!(Nominators::::get(71).is_none()); - assert!(Nominators::::get(61).is_some()); - assert_eq!(Staking::electing_voters(None).unwrap().len(), 3 + 1); - - // now one of them can revive themselves by re-nominating to a proper value. - assert_ok!(Staking::nominate(RuntimeOrigin::signed(70), vec![1])); - assert_eq!( - Nominators::::iter() - .map(|(k, n)| (k, n.targets.len())) - .collect::>(), - vec![(71, 1), (61, 1)] - ); - - // or they can be chilled by any account. - assert!(Nominators::::contains_key(101)); - assert!(Nominators::::get(101).is_none()); - assert_ok!(Staking::chill_other(RuntimeOrigin::signed(71), 100)); - assert!(!Nominators::::contains_key(101)); - assert!(Nominators::::get(101).is_none()); - }) -} - -mod sorted_list_provider { - use super::*; - use frame_election_provider_support::SortedListProvider; - - #[test] - fn re_nominate_does_not_change_counters_or_list() { - ExtBuilder::default().nominate(true).build_and_execute(|| { - // given - let pre_insert_voter_count = - (Nominators::::count() + Validators::::count()) as u32; - assert_eq!(::VoterList::count(), pre_insert_voter_count); - - // Polymesh change - // ----------------------------------------------------------------- - // UseNominatorsAndValidatorsMap does not provide nominators is sorted order - // assert_eq!( - // ::VoterList::iter().collect::>(), - // vec![11, 21, 31, 101] - // ); - // ----------------------------------------------------------------- - - // when account 101 renominates - assert_ok!(Staking::nominate(RuntimeOrigin::signed(100), vec![41])); - - // then counts don't change - assert_eq!(::VoterList::count(), pre_insert_voter_count); - // Polymesh change - // ----------------------------------------------------------------- - // UseNominatorsAndValidatorsMap does not provide nominators is sorted order - // assert_eq!( - // ::VoterList::iter().collect::>(), - // vec![11, 21, 31, 101] - // ); - // ----------------------------------------------------------------- - }); - } - - #[test] - fn re_validate_does_not_change_counters_or_list() { - ExtBuilder::default().nominate(false).build_and_execute(|| { - // given - let pre_insert_voter_count = - (Nominators::::count() + Validators::::count()) as u32; - assert_eq!(::VoterList::count(), pre_insert_voter_count); - - // Polymesh change - // ----------------------------------------------------------------- - // UseNominatorsAndValidatorsMap does not provide nominators is sorted order - // assert_eq!( - // ::VoterList::iter().collect::>(), - // vec![11, 21, 31] - // ); - // ----------------------------------------------------------------- - - // when account 11 re-validates - assert_ok!(Staking::validate( - RuntimeOrigin::signed(10), - Default::default() - )); - - // then counts don't change - assert_eq!(::VoterList::count(), pre_insert_voter_count); - // Polymesh change - // ----------------------------------------------------------------- - // UseNominatorsAndValidatorsMap does not provide nominators is sorted order - // assert_eq!( - // ::VoterList::iter().collect::>(), - // vec![11, 21, 31] - // ); - // ----------------------------------------------------------------- - }); - } -} - -#[test] -fn force_apply_min_commission_works() { - let prefs = |c| ValidatorPrefs { - commission: Perbill::from_percent(c), - blocked: false, - }; - let validators = || Validators::::iter().collect::>(); - ExtBuilder::default().build_and_execute(|| { - assert_ok!(Staking::set_commission_cap( - RuntimeOrigin::root(), - Perbill::from_percent(60) - )); - assert_ok!(Staking::validate(RuntimeOrigin::signed(30), prefs(10))); - assert_ok!(Staking::validate(RuntimeOrigin::signed(20), prefs(5))); - - // Given - assert_eq!( - validators(), - vec![(31, prefs(10)), (21, prefs(5)), (11, prefs(0))] - ); - MinCommission::::set(Perbill::from_percent(5)); - - // When applying to a commission greater than min - assert_ok!(Staking::force_apply_min_commission( - RuntimeOrigin::signed(1), - 31 - )); - // Then the commission is not changed - assert_eq!( - validators(), - vec![(31, prefs(10)), (21, prefs(5)), (11, prefs(0))] - ); - - // When applying to a commission that is equal to min - assert_ok!(Staking::force_apply_min_commission( - RuntimeOrigin::signed(1), - 21 - )); - // Then the commission is not changed - assert_eq!( - validators(), - vec![(31, prefs(10)), (21, prefs(5)), (11, prefs(0))] - ); - - // When applying to a commission that is less than the min - assert_ok!(Staking::force_apply_min_commission( - RuntimeOrigin::signed(1), - 11 - )); - // Then the commission is bumped to the min - assert_eq!( - validators(), - vec![(31, prefs(10)), (21, prefs(5)), (11, prefs(5))] - ); - - // When applying commission to a validator that doesn't exist then storage is not altered - assert_noop!( - Staking::force_apply_min_commission(RuntimeOrigin::signed(1), 420), - Error::::NotStash - ); - }); -} - -#[test] -fn proportional_slash_stop_slashing_if_remaining_zero() { - let c = |era, value| UnlockChunk:: { era, value }; - // Given - let mut ledger = StakingLedger:: { - stash: 123, - total: 40, - active: 20, - // we have some chunks, but they are not affected. - unlocking: bounded_vec![c(1, 10), c(2, 10)], - claimed_rewards: bounded_vec![], - }; - - assert_eq!(BondingDuration::get(), 3); - - // should not slash more than the amount requested, by accidentally slashing the first chunk. - assert_eq!(ledger.slash(18, 1, 0), 18); -} - -#[test] -fn proportional_ledger_slash_works() { - let c = |era, value| UnlockChunk:: { era, value }; - // Given - let mut ledger = StakingLedger:: { - stash: 123, - total: 10, - active: 10, - unlocking: bounded_vec![], - claimed_rewards: bounded_vec![], - }; - assert_eq!(BondingDuration::get(), 3); - - // When we slash a ledger with no unlocking chunks - assert_eq!(ledger.slash(5, 1, 0), 5); - // Then - assert_eq!(ledger.total, 5); - assert_eq!(ledger.active, 5); - assert_eq!(LedgerSlashPerEra::get().0, 5); - assert_eq!(LedgerSlashPerEra::get().1, Default::default()); - - // When we slash a ledger with no unlocking chunks and the slash amount is greater then the - // total - assert_eq!(ledger.slash(11, 1, 0), 5); - // Then - assert_eq!(ledger.total, 0); - assert_eq!(ledger.active, 0); - assert_eq!(LedgerSlashPerEra::get().0, 0); - assert_eq!(LedgerSlashPerEra::get().1, Default::default()); - - // Given - ledger.unlocking = bounded_vec![c(4, 10), c(5, 10)]; - ledger.total = 2 * 10; - ledger.active = 0; - // When all the chunks overlap with the slash eras - assert_eq!(ledger.slash(20, 0, 0), 20); - // Then - assert_eq!(ledger.unlocking, vec![]); - assert_eq!(ledger.total, 0); - assert_eq!(LedgerSlashPerEra::get().0, 0); - assert_eq!(LedgerSlashPerEra::get().1, BTreeMap::from([(4, 0), (5, 0)])); - - // Given - ledger.unlocking = bounded_vec![c(4, 100), c(5, 100), c(6, 100), c(7, 100)]; - ledger.total = 4 * 100; - ledger.active = 0; - // When the first 2 chunks don't overlap with the affected range of unlock eras. - assert_eq!(ledger.slash(140, 0, 3), 140); - // Then - assert_eq!( - ledger.unlocking, - vec![c(4, 100), c(5, 100), c(6, 30), c(7, 30)] - ); - assert_eq!(ledger.total, 4 * 100 - 140); - assert_eq!(LedgerSlashPerEra::get().0, 0); - assert_eq!( - LedgerSlashPerEra::get().1, - BTreeMap::from([(6, 30), (7, 30)]) - ); - - // Given - ledger.unlocking = bounded_vec![c(4, 100), c(5, 100), c(6, 100), c(7, 100)]; - ledger.total = 4 * 100; - ledger.active = 0; - // When the first 2 chunks don't overlap with the affected range of unlock eras. - assert_eq!(ledger.slash(15, 0, 3), 15); - // Then - assert_eq!( - ledger.unlocking, - vec![c(4, 100), c(5, 100), c(6, 100 - 8), c(7, 100 - 7)] - ); - assert_eq!(ledger.total, 4 * 100 - 15); - assert_eq!(LedgerSlashPerEra::get().0, 0); - assert_eq!( - LedgerSlashPerEra::get().1, - BTreeMap::from([(6, 92), (7, 93)]) - ); - - // Given - ledger.unlocking = bounded_vec![c(4, 40), c(5, 100), c(6, 10), c(7, 250)]; - ledger.active = 500; - // 900 - ledger.total = 40 + 10 + 100 + 250 + 500; - // When we have a partial slash that touches all chunks - assert_eq!(ledger.slash(900 / 2, 0, 0), 450); - // Then - assert_eq!(ledger.active, 500 / 2); - assert_eq!( - ledger.unlocking, - vec![c(4, 40 / 2), c(5, 100 / 2), c(6, 10 / 2), c(7, 250 / 2)] - ); - assert_eq!(ledger.total, 900 / 2); - assert_eq!(LedgerSlashPerEra::get().0, 500 / 2); - assert_eq!( - LedgerSlashPerEra::get().1, - BTreeMap::from([(4, 40 / 2), (5, 100 / 2), (6, 10 / 2), (7, 250 / 2)]) - ); - - // slash 1/4th with not chunk. - ledger.unlocking = bounded_vec![]; - ledger.active = 500; - ledger.total = 500; - // When we have a partial slash that touches all chunks - assert_eq!(ledger.slash(500 / 4, 0, 0), 500 / 4); - // Then - assert_eq!(ledger.active, 3 * 500 / 4); - assert_eq!(ledger.unlocking, vec![]); - assert_eq!(ledger.total, ledger.active); - assert_eq!(LedgerSlashPerEra::get().0, 3 * 500 / 4); - assert_eq!(LedgerSlashPerEra::get().1, Default::default()); - - // Given we have the same as above, - ledger.unlocking = bounded_vec![c(4, 40), c(5, 100), c(6, 10), c(7, 250)]; - ledger.active = 500; - ledger.total = 40 + 10 + 100 + 250 + 500; // 900 - assert_eq!(ledger.total, 900); - // When we have a higher min balance - assert_eq!( - ledger.slash( - 900 / 2, - 25, /* min balance - chunks with era 0 & 2 will be slashed to <=25, causing it to - * get swept */ - 0 - ), - 450 - ); - assert_eq!(ledger.active, 500 / 2); - // the last chunk was not slashed 50% like all the rest, because some other earlier chunks got - // dusted. - assert_eq!(ledger.unlocking, vec![c(5, 100 / 2), c(7, 150)]); - assert_eq!(ledger.total, 900 / 2); - assert_eq!(LedgerSlashPerEra::get().0, 500 / 2); - assert_eq!( - LedgerSlashPerEra::get().1, - BTreeMap::from([(4, 0), (5, 100 / 2), (6, 0), (7, 150)]) - ); - - // Given - // slash order --------------------NA--------2----------0----------1---- - ledger.unlocking = bounded_vec![c(4, 40), c(5, 100), c(6, 10), c(7, 250)]; - ledger.active = 500; - ledger.total = 40 + 10 + 100 + 250 + 500; // 900 - assert_eq!( - ledger.slash( - 500 + 10 + 250 + 100 / 2, // active + era 6 + era 7 + era 5 / 2 - 0, - 3 /* slash era 6 first, so the affected parts are era 6, era 7 and - * ledge.active. This will cause the affected to go to zero, and then we will - * start slashing older chunks */ - ), - 500 + 250 + 10 + 100 / 2 - ); - // Then - assert_eq!(ledger.active, 0); - assert_eq!(ledger.unlocking, vec![c(4, 40), c(5, 100 / 2)]); - assert_eq!(ledger.total, 90); - assert_eq!(LedgerSlashPerEra::get().0, 0); - assert_eq!( - LedgerSlashPerEra::get().1, - BTreeMap::from([(5, 100 / 2), (6, 0), (7, 0)]) - ); - - // Given - // iteration order------------------NA---------2----------0----------1---- - ledger.unlocking = bounded_vec![c(4, 100), c(5, 100), c(6, 100), c(7, 100)]; - ledger.active = 100; - ledger.total = 5 * 100; - // When - assert_eq!( - ledger.slash( - 351, // active + era 6 + era 7 + era 5 / 2 + 1 - 50, // min balance - everything slashed below 50 will get dusted - 3 /* slash era 3+3 first, so the affected parts are era 6, era 7 and - * ledge.active. This will cause the affected to go to zero, and then we will - * start slashing older chunks */ - ), - 400 - ); - // Then - assert_eq!(ledger.active, 0); - assert_eq!(ledger.unlocking, vec![c(4, 100)]); - assert_eq!(ledger.total, 100); - assert_eq!(LedgerSlashPerEra::get().0, 0); - assert_eq!( - LedgerSlashPerEra::get().1, - BTreeMap::from([(5, 0), (6, 0), (7, 0)]) - ); - - // Tests for saturating arithmetic - - // Given - let slash = u64::MAX as Balance * 2; - // The value of the other parts of ledger that will get slashed - let value = slash - (10 * 4); - - ledger.active = 10; - ledger.unlocking = bounded_vec![c(4, 10), c(5, 10), c(6, 10), c(7, value)]; - ledger.total = value + 40; - // When - let slash_amount = ledger.slash(slash, 0, 0); - assert_eq_error_rate!(slash_amount, slash, 5); - // Then - assert_eq!(ledger.active, 0); // slash of 9 - assert_eq!(ledger.unlocking, vec![]); - assert_eq!(ledger.total, 0); - assert_eq!(LedgerSlashPerEra::get().0, 0); - assert_eq!( - LedgerSlashPerEra::get().1, - BTreeMap::from([(4, 0), (5, 0), (6, 0), (7, 0)]) - ); - - // Given - use sp_runtime::PerThing as _; - let slash = u64::MAX as Balance * 2; - let value = u64::MAX as Balance * 2; - let unit = 100; - // slash * value that will saturate - assert!(slash.checked_mul(value).is_none()); - // but slash * unit won't. - assert!(slash.checked_mul(unit).is_some()); - ledger.unlocking = bounded_vec![c(4, unit), c(5, value), c(6, unit), c(7, unit)]; - //--------------------------------------note value^^^ - ledger.active = unit; - ledger.total = unit * 4 + value; - // When - assert_eq!(ledger.slash(slash, 0, 0), slash - 5); - // Then - // The amount slashed out of `unit` - let affected_balance = value + unit * 4; - let ratio = - Perquintill::from_rational_with_rounding(slash, affected_balance, Rounding::Up).unwrap(); - // `unit` after the slash is applied - let unit_slashed = { - let unit_slash = ratio.mul_ceil(unit); - unit - unit_slash - }; - let value_slashed = { - let value_slash = ratio.mul_ceil(value); - value - value_slash - }; - assert_eq!(ledger.active, unit_slashed); - assert_eq!(ledger.unlocking, vec![c(5, value_slashed)]); - assert_eq!(ledger.total, value_slashed); - assert_eq!(LedgerSlashPerEra::get().0, 0); - assert_eq!( - LedgerSlashPerEra::get().1, - BTreeMap::from([(4, 0), (5, value_slashed), (6, 0), (7, 0)]) - ); -} - -#[test] -fn pre_bonding_era_cannot_be_claimed() { - // Verifies initial conditions of mock - ExtBuilder::default().nominate(false).build_and_execute(|| { - let history_depth = HistoryDepth::get(); - // jump to some era above history_depth - let mut current_era = history_depth + 10; - let last_reward_era = current_era - 1; - let start_reward_era = current_era - history_depth; - - // put some money in stash=3 and controller=4. - for i in 3..5 { - let _ = Balances::make_free_balance_be(&i, 2000); - } - - mock::start_active_era(current_era); - - // add a new candidate for being a validator. account 3 controlled by 4. - assert_ok!(Staking::bond( - RuntimeOrigin::signed(3), - 4, - 1500, - RewardDestination::Controller - )); - - let claimed_rewards: BoundedVec<_, _> = (start_reward_era..=last_reward_era) - .collect::>() - .try_into() - .unwrap(); - assert_eq!( - Staking::ledger(&4).unwrap(), - StakingLedger { - stash: 3, - total: 1500, - active: 1500, - unlocking: Default::default(), - claimed_rewards, - } - ); - - // start next era - current_era = current_era + 1; - mock::start_active_era(current_era); - - // claiming reward for last era in which validator was active works - assert_ok!(Staking::payout_stakers( - RuntimeOrigin::signed(4), - 3, - current_era - 1 - )); - - // consumed weight for all payout_stakers dispatches that fail - let err_weight = ::WeightInfo::payout_stakers_alive_staked(0); - // cannot claim rewards for an era before bonding occured as it is - // already marked as claimed. - assert_noop!( - Staking::payout_stakers(RuntimeOrigin::signed(4), 3, current_era - 2), - Error::::AlreadyClaimed.with_weight(err_weight) - ); - - // decoding will fail now since Staking Ledger is in corrupt state - HistoryDepth::set(history_depth - 1); - assert_eq!(Staking::ledger(&4), None); - - // make sure stakers still cannot claim rewards that they are not meant to - assert_noop!( - Staking::payout_stakers(RuntimeOrigin::signed(4), 3, current_era - 2), - Error::::NotController - ); - - // fix the corrupted state for post conditions check - HistoryDepth::set(history_depth); - }); -} - -#[test] -fn reducing_history_depth_abrupt() { - // Verifies initial conditions of mock - ExtBuilder::default().nominate(false).build_and_execute(|| { - let original_history_depth = HistoryDepth::get(); - let mut current_era = original_history_depth + 10; - let last_reward_era = current_era - 1; - let start_reward_era = current_era - original_history_depth; - - // put some money in (stash, controller)=(3,4),(5,6). - for i in 3..7 { - let _ = Balances::make_free_balance_be(&i, 2000); - } - - // start current era - mock::start_active_era(current_era); - - // add a new candidate for being a staker. account 3 controlled by 4. - assert_ok!(Staking::bond( - RuntimeOrigin::signed(3), - 4, - 1500, - RewardDestination::Controller - )); - - // all previous era before the bonding action should be marked as - // claimed. - let claimed_rewards: BoundedVec<_, _> = (start_reward_era..=last_reward_era) - .collect::>() - .try_into() - .unwrap(); - assert_eq!( - Staking::ledger(&4).unwrap(), - StakingLedger { - stash: 3, - total: 1500, - active: 1500, - unlocking: Default::default(), - claimed_rewards, - } - ); - - // next era - current_era = current_era + 1; - mock::start_active_era(current_era); - - // claiming reward for last era in which validator was active works - assert_ok!(Staking::payout_stakers( - RuntimeOrigin::signed(4), - 3, - current_era - 1 - )); - - // next era - current_era = current_era + 1; - mock::start_active_era(current_era); - - // history_depth reduced without migration - let history_depth = original_history_depth - 1; - HistoryDepth::set(history_depth); - // claiming reward does not work anymore - assert_noop!( - Staking::payout_stakers(RuntimeOrigin::signed(4), 3, current_era - 1), - Error::::NotController - ); - - // new stakers can still bond - assert_ok!(Staking::bond( - RuntimeOrigin::signed(5), - 6, - 1200, - RewardDestination::Controller - )); - - // new staking ledgers created will be bounded by the current history depth - let last_reward_era = current_era - 1; - let start_reward_era = current_era - history_depth; - let claimed_rewards: BoundedVec<_, _> = (start_reward_era..=last_reward_era) - .collect::>() - .try_into() - .unwrap(); - assert_eq!( - Staking::ledger(&6).unwrap(), - StakingLedger { - stash: 5, - total: 1200, - active: 1200, - unlocking: Default::default(), - claimed_rewards, - } - ); - - // fix the corrupted state for post conditions check - HistoryDepth::set(original_history_depth); - }); -} - -#[test] -fn reducing_max_unlocking_chunks_abrupt() { - // Concern is on validators only - // By Default 11, 10 are stash and ctrl and 21,20 - ExtBuilder::default().build_and_execute(|| { - // given a staker at era=10 and MaxUnlockChunks set to 2 - MaxUnlockingChunks::set(2); - start_active_era(10); - assert_ok!(Staking::bond( - RuntimeOrigin::signed(3), - 4, - 300, - RewardDestination::Staked - )); - assert!(matches!(Staking::ledger(4), Some(_))); - - // when staker unbonds - assert_ok!(Staking::unbond(RuntimeOrigin::signed(4), 20)); - - // then an unlocking chunk is added at `current_era + bonding_duration` - // => 10 + 3 = 13 - let expected_unlocking: BoundedVec, MaxUnlockingChunks> = - bounded_vec![UnlockChunk { - value: 20 as Balance, - era: 13 as EraIndex - }]; - assert!(matches!(Staking::ledger(4), - Some(StakingLedger { - unlocking, - .. - }) if unlocking==expected_unlocking)); - - // when staker unbonds at next era - start_active_era(11); - assert_ok!(Staking::unbond(RuntimeOrigin::signed(4), 50)); - // then another unlock chunk is added - let expected_unlocking: BoundedVec, MaxUnlockingChunks> = bounded_vec![ - UnlockChunk { value: 20, era: 13 }, - UnlockChunk { value: 50, era: 14 } - ]; - assert!(matches!(Staking::ledger(4), - Some(StakingLedger { - unlocking, - .. - }) if unlocking==expected_unlocking)); - - // when staker unbonds further - start_active_era(12); - // then further unbonding not possible - assert_noop!( - Staking::unbond(RuntimeOrigin::signed(4), 20), - Error::::NoMoreChunks - ); - - // when max unlocking chunks is reduced abruptly to a low value - MaxUnlockingChunks::set(1); - // then unbond, rebond ops are blocked with ledger in corrupt state - assert_noop!( - Staking::unbond(RuntimeOrigin::signed(4), 20), - Error::::NotController - ); - assert_noop!( - Staking::rebond(RuntimeOrigin::signed(4), 100), - Error::::NotController - ); - - // reset the ledger corruption - MaxUnlockingChunks::set(2); - }) -} - -#[test] -fn cannot_set_unsupported_validator_count() { - ExtBuilder::default().build_and_execute(|| { - MaxWinners::set(50); - // set validator count works - assert_ok!(Staking::set_validator_count(RuntimeOrigin::root(), 30)); - assert_ok!(Staking::set_validator_count(RuntimeOrigin::root(), 50)); - // setting validator count above 100 does not work - assert_noop!( - Staking::set_validator_count(RuntimeOrigin::root(), 51), - Error::::TooManyValidators, - ); - }) -} - -#[test] -fn increase_validator_count_errors() { - ExtBuilder::default().build_and_execute(|| { - MaxWinners::set(50); - assert_ok!(Staking::set_validator_count(RuntimeOrigin::root(), 40)); - - // increase works - assert_ok!(Staking::increase_validator_count(RuntimeOrigin::root(), 6)); - assert_eq!(ValidatorCount::::get(), 46); - - // errors - assert_noop!( - Staking::increase_validator_count(RuntimeOrigin::root(), 5), - Error::::TooManyValidators, - ); - }) -} - -#[test] -fn scale_validator_count_errors() { - ExtBuilder::default().build_and_execute(|| { - MaxWinners::set(50); - assert_ok!(Staking::set_validator_count(RuntimeOrigin::root(), 20)); - - // scale value works - assert_ok!(Staking::scale_validator_count( - RuntimeOrigin::root(), - Percent::from_percent(200) - )); - assert_eq!(ValidatorCount::::get(), 40); - - // errors - assert_noop!( - Staking::scale_validator_count(RuntimeOrigin::root(), Percent::from_percent(126)), - Error::::TooManyValidators, - ); - }) -} - -#[test] -fn set_min_commission_works_with_admin_origin() { - ExtBuilder::default().build_and_execute(|| { - // no minimum commission set initially - assert_eq!(MinCommission::::get(), Zero::zero()); - - // root can set min commission - assert_ok!(Staking::set_min_commission( - RuntimeOrigin::root(), - Perbill::from_percent(10) - )); - - assert_eq!(MinCommission::::get(), Perbill::from_percent(10)); - - // Non privileged origin can not set min_commission - assert_noop!( - Staking::set_min_commission(RuntimeOrigin::signed(2), Perbill::from_percent(15)), - BadOrigin - ); - - // Admin Origin can set min commission - assert_ok!(Staking::set_min_commission( - RuntimeOrigin::root(), - Perbill::from_percent(15), - )); - - // setting commission below min_commission fails - assert_noop!( - Staking::validate( - RuntimeOrigin::signed(10), - ValidatorPrefs { - commission: Perbill::from_percent(14), - blocked: false - } - ), - Error::::CommissionTooLow - ); - - // setting commission >= min_commission works - assert_ok!(Staking::set_commission_cap( - RuntimeOrigin::root(), - Perbill::from_percent(60) - )); - assert_ok!(Staking::validate( - RuntimeOrigin::signed(10), - ValidatorPrefs { - commission: Perbill::from_percent(15), - blocked: false - } - )); - }) -} - -mod staking_interface { - use frame_support::storage::with_storage_layer; - use sp_staking::StakingInterface; - - use super::*; - - #[test] - fn force_unstake_with_slash_works() { - ExtBuilder::default().build_and_execute(|| { - // without slash - let _ = with_storage_layer::<(), _, _>(|| { - // bond an account, can unstake - assert_eq!(Staking::bonded(&11), Some(10)); - assert_ok!(::force_unstake(11)); - Err(DispatchError::from("revert")) - }); - - // bond again and add a slash, still can unstake. - assert_eq!(Staking::bonded(&11), Some(10)); - add_slash(&11); - assert_ok!(::force_unstake(11)); - }); - } - - #[test] - fn do_withdraw_unbonded_with_wrong_slash_spans_works_as_expected() { - ExtBuilder::default().build_and_execute(|| { - on_offence_now( - &[OffenceDetails { - offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], - }], - &[Perbill::from_percent(100)], - ); - - assert_eq!(Staking::bonded(&11), Some(10)); - - assert_noop!( - Staking::withdraw_unbonded(RuntimeOrigin::signed(10), 0), - Error::::IncorrectSlashingSpans - ); - - let num_slashing_spans = Staking::slashing_spans(&11).map_or(0, |s| s.iter().count()); - assert_ok!(Staking::withdraw_unbonded( - RuntimeOrigin::signed(10), - num_slashing_spans as u32 - )); - }); - } -} - -// Polymesh change -// ----------------------------------------------------------------- - -use chrono::Utc; - -use crate::asset_test::set_timestamp; -use pallet_staking::types::{PermissionedIdentityPrefs, SlashingSwitch}; - -type PError = pallet_pips::Error; - -macro_rules! assert_absent_identity { - ($acc_id:expr) => { - assert!( - Staking::permissioned_identity(mock::Identity::get_identity($acc_id).unwrap()) - .is_none() - ); - }; -} - -macro_rules! assert_present_identity { - ($acc_id:expr) => { - assert!( - Staking::permissioned_identity(mock::Identity::get_identity($acc_id).unwrap()) - .is_some() - ); - }; -} - -macro_rules! assert_permissioned_identity_prefs { - ($id:expr, $i_count:expr, $r_count:expr) => { - assert_eq!( - Staking::permissioned_identity($id).unwrap(), - PermissionedIdentityPrefs { - intended_count: $i_count, - running_count: $r_count - } - ); - }; -} - -fn create_on_offence_now(offender: u64) { - on_offence_now( - &[OffenceDetails { - offender: ( - offender, - Staking::eras_stakers(Staking::active_era().unwrap().index, offender), - ), - reporters: vec![], - }], - &[Perbill::from_percent(10)], - ); -} - -#[test] -fn add_nominator_without_cdd() { - ExtBuilder::default().nominate(true).build_and_execute(|| { - let alice_acc = 500; - let alice_controller_acc = 501; - let alice_controller_signed = RuntimeOrigin::signed(alice_controller_acc); - let (_, _) = - make_account_with_balance(alice_acc, 1_000_000, Some(Utc::now().timestamp() as u64)); - - let bob_acc = 600; - let (_, bob_did) = make_account(bob_acc); - add_trusted_cdd_provider(bob_did); - - assert_ok!(Staking::bond( - RuntimeOrigin::signed(alice_acc.clone()), - alice_controller_acc, - 1000, - RewardDestination::Stash - )); - - set_timestamp(Utc::now().timestamp() as u64); - assert_ok!(Staking::nominate(alice_controller_signed, vec![10, 20, 30]),); - assert!(Staking::nominators(&alice_acc).is_some()); - }); -} - -#[test] -fn add_valid_nominator_with_multiple_claims() { - ExtBuilder::default().nominate(true).build_and_execute(|| { - let alice_acc = 500; - let alice_controller_acc = 501; - let alice_controller_signed = RuntimeOrigin::signed(alice_controller_acc); - let (_, _) = make_account_with_balance(alice_acc, 1_000_000, None); - - assert_ok!(Staking::bond( - Origin::signed(alice_acc.clone()), - alice_controller_acc, - 1000, - RewardDestination::Stash - )); - - set_timestamp(Utc::now().timestamp() as u64); - assert_ok!(Staking::nominate(alice_controller_signed, vec![10, 20, 30]),); - assert!(!Staking::nominators(&alice_acc).is_none()); - }); -} - -#[test] -fn validate_nominators_with_valid_cdd() { - ExtBuilder::default() - .nominate(true) - .min_nominator_bond(0) - .build_and_execute(|| { - let alice_acc = 500; - let alice_controller_acc = 501; - let alice_controller_signed = RuntimeOrigin::signed(alice_controller_acc); - let (_, _) = make_account_with_balance( - alice_acc, - 1_000_000, - Some(Utc::now().timestamp() as u64 + 500u64), - ); - - let (_, claim_issuer_1_did) = make_account(600); - add_trusted_cdd_provider(claim_issuer_1_did); - - let eve_acc = 700; - let eve_controller_acc = 701; - let eve_controller_signed = Origin::signed(eve_controller_acc); - let (_, _) = make_account_with_balance( - eve_acc, - 1_000_000, - Some(Utc::now().timestamp() as u64 + 7000u64), - ); - - assert_ok!(Staking::bond( - RuntimeOrigin::signed(alice_acc.clone()), - alice_controller_acc, - 1000, - RewardDestination::Stash - )); - assert_ok!(Staking::bond( - Origin::signed(eve_acc), - eve_controller_acc, - 1000, - RewardDestination::Stash - )); - - set_timestamp(Utc::now().timestamp() as u64); - assert_ok!(Staking::nominate(alice_controller_signed, vec![10, 20, 30])); - assert!(!Staking::nominators(&alice_acc).is_none()); - - assert_ok!(Staking::nominate(eve_controller_signed, vec![11, 21, 31])); - assert!(!Staking::nominators(&eve_acc).is_none()); - }); -} - -#[test] -fn should_initialize_stakers_and_validators() { - // Verifies initial conditions of mock - ExtBuilder::default().build_and_execute(|| { - assert_eq!(Staking::bonded(&11), Some(10)); // Account 11 is stashed and locked, and account 10 is the controller - assert_eq!(Staking::bonded(&21), Some(20)); // Account 21 is stashed and locked, and account 20 is the controller - assert_eq!(Staking::bonded(&500), None); // Account 1 is not a stashed - - // Account 10 controls the stash from account 11, which is 100 * balance_factor units - assert_eq!( - Staking::ledger(&10), - Some(StakingLedger { - stash: 11, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: Default::default(), - }) - ); - // Account 20 controls the stash from account 21, which is 200 * balance_factor units - assert_eq!( - Staking::ledger(&20), - Some(StakingLedger { - stash: 21, - total: 1000, - active: 1000, - unlocking: Default::default(), - claimed_rewards: Default::default(), - }) - ); - // Account 1 does not control any stash - assert_eq!(Staking::ledger(&500), None); - }); -} - -#[test] -fn should_add_permissioned_validators() { - ExtBuilder::default().build_and_execute(|| { - let acc_10 = 10; - let acc_20 = 20; - - provide_did_to_user(10); - provide_did_to_user(20); - - assert_add_permissioned_validator!(&acc_10); - assert_add_permissioned_validator!(&acc_20); - assert_present_identity!(&acc_10); - assert_present_identity!(&acc_20); - }); -} - -#[test] -fn should_remove_permissioned_validators() { - ExtBuilder::default().build_and_execute(|| { - let acc_10 = 10; - let acc_20 = 20; - let acc_30 = 30; - - provide_did_to_user(10); - provide_did_to_user(20); - provide_did_to_user(30); - - assert_add_permissioned_validator!(&acc_10); - assert_add_permissioned_validator!(&acc_20); - - assert_ok!(Staking::remove_permissioned_validator( - RuntimeOrigin::root(), - mock::Identity::get_identity(&acc_20).unwrap() - )); - - assert_present_identity!(&acc_10); - assert_absent_identity!(&acc_20); - assert_absent_identity!(&acc_30); - }); -} - -#[test] -fn voting_for_pip_overlays_with_staking() { - use crate::staking::mock::RuntimeCall; - - ExtBuilder::default().build_and_execute(|| { - System::set_block_number(1); - - assert_ok!(Pips::set_min_proposal_deposit(RuntimeOrigin::root(), 0)); - - // Initialize with 100 POLYX. - let alice_acc = 500; - let (alice_signer, _) = make_account_with_balance(alice_acc, 100, None); - - let alice_proposal = |deposit: u128| { - let signer = Origin::signed(alice_acc); - let proposal = Box::new(RuntimeCall::Pips( - pallet_pips::Call::set_min_proposal_deposit { deposit: 0 }, - )); - Pips::propose(signer, proposal, deposit, None, None) - }; - - // Bond all but 10. - assert_ok!(Staking::bond( - alice_signer, - alice_acc, - 90, - RewardDestination::Stash - )); - // OK, because we're overlaying with 90 tokens already locked. - assert_ok!(alice_proposal(50)); - // OK, because we're still overlaying, but also increasing it by 10. - assert_ok!(alice_proposal(50)); - // Error, because we don't have 101 tokens to bond. - assert_noop!(alice_proposal(1), PError::InsufficientDeposit); - }); -} - -#[test] -fn slashing_leaves_pips_untouched() { - use crate::staking::mock::RuntimeCall; - use pallet_pips::PipId; - - ExtBuilder::default().build_and_execute(|| { - let acc = 11; - let propose = |deposit| { - let signer = Origin::signed(acc); - let proposal = Box::new(RuntimeCall::Pips(pallet_pips::Call::set_active_pip_limit { - limit: 0, - })); - Pips::propose(signer, proposal, deposit, None, None) - }; - let slash = |amount| { - let exposure = Exposure { - total: amount, - own: amount, - others: vec![], - }; - let details = OffenceDetails { - offender: (acc, exposure), - reporters: vec![], - }; - on_offence_now(&[details], &[Perbill::from_percent(100)]); - }; - let balance_is = |bal| { - assert_eq!(Balances::free_balance(acc), bal); - }; - let id = PipId(0); - let vote_is = |bal| { - Proposals::::get(id).unwrap(); - assert_eq!(ProposalVotes::::get(id, acc).unwrap().1, bal); - }; - let vote = |bal| Pips::vote(Origin::signed(acc), id, true, bal); - - // Ensure we start with 1000 balance. - balance_is(1000); - - // Raise min deposit to 1000. - assert_ok!(Pips::set_prune_historical_pips( - RuntimeOrigin::root(), - false - )); - assert_ok!(Pips::set_min_proposal_deposit(RuntimeOrigin::root(), 1000)); - - assert_ok!(propose(1000)); - - // Fall below minimum deposit; still have 1000 as vote, and proposal exists. - slash(700); - balance_is(300); - vote_is(1000); - assert_ok!(vote(1000)); - - // Lower account balance to 1; ditto. - start_active_era(12); - slash(299); - balance_is(1); - vote_is(1000); - - // Cannot propose anything; still locked 1000 into PIPs. - assert_ok!(Pips::set_min_proposal_deposit(RuntimeOrigin::root(), 0)); - assert_noop!(propose(2), PError::InsufficientDeposit); - - // Lower vote to 1; locked decreases to 1. - assert_ok!(vote(1)); - vote_is(1); - - // Slash again, we'll have 0 in balance now, but 1 still locked. - slash(1); - vote_is(1); - assert_ok!(vote(1)); - }); -} - -#[test] -fn check_slashing_switch_for_validators_and_nominators() { - ExtBuilder::default() - .validator_count(4) - .build_and_execute(|| { - // Check the initial state of the Slashing Switch. - assert_eq!(Staking::slashing_allowed_for(), SlashingSwitch::Validator); - - let change_slashing_allowed_for = |switch: SlashingSwitch| { - assert_ok!(Staking::change_slashing_allowed_for( - RuntimeOrigin::root(), - switch - )); - assert_eq!(Staking::slashing_allowed_for(), switch); - }; - - change_slashing_allowed_for(SlashingSwitch::None); - change_slashing_allowed_for(SlashingSwitch::ValidatorAndNominator); - }); -} - -#[test] -fn offence_is_blocked_when_slashing_status_is_off() { - ExtBuilder::default() - .validator_count(4) - .has_stakers(false) - .build_and_execute(|| { - assert_ok!(Staking::change_slashing_allowed_for( - RuntimeOrigin::root(), - SlashingSwitch::None - )); - assert_eq!(Staking::slashing_allowed_for(), SlashingSwitch::None); - let initial_balance = Balances::free_balance(10); - create_on_offence_now(10); - // No slashing happened. - assert_eq!(Balances::free_balance(10), initial_balance); - }); -} - -#[test] -fn check_slashing_for_different_switches() { - ExtBuilder::default().build_and_execute(|| { - mock::start_active_era(1); - - assert_eq!(Balances::free_balance(11), 1000); - assert_eq!(Balances::free_balance(21), 2000); - - // Switch to ValidatorAndNominator. - assert_ok!(Staking::change_slashing_allowed_for( - RuntimeOrigin::root(), - SlashingSwitch::ValidatorAndNominator - )); - assert_eq!( - Staking::slashing_allowed_for(), - SlashingSwitch::ValidatorAndNominator - ); - - // Add nominator. - // add a new candidate for being a nominator. account 3 controlled by 4. - bond_nominator_with_expiry(3, 2000, 99999999, vec![11, 21]); - add_secondary_key(4, 3); - - mock::start_active_era(2); - - assert_eq!(Balances::free_balance(101), 2000); - - create_on_offence_now(11); - - create_on_offence_now(21); - - // Balance of account 11 [validator] get slashed by 10% i.e 10 % of 1000 (total staked). - assert_eq!(Balances::free_balance(11), 900); - // Balance of account 4 [nominator] get slashed by 10% i.e 10 % of 2000 (total staked). - assert_eq!(Balances::free_balance(4), 1800); - // Balance of account 21 [validator] get slashed by 10% i.e 10 % of 1000 (total staked). - assert_eq!(Balances::free_balance(21), 1900); - }) -} - -#[test] -fn chill_from_governance() { - ExtBuilder::default() - .validator_count(8) - .minimum_validator_count(1) - .build_and_execute(|| { - // 50 stash and 51 controller (corrected) - bond(50, 51, 500000); - let entity_id = mock::Identity::get_identity(&50).unwrap(); - - // Add a new validator successfully. - bond_validator_with_intended_count(50, 51, 500000, Some(2)); - assert_permissioned_identity_prefs!(entity_id, 2, 1); - - // Add other stash and controller to the same did. - add_secondary_key(50, 60); - add_secondary_key(50, 61); - - // Validate one more validator from the same entity. - // 60 stash and 61 controller. - bond_validator(60, 61, 500000); - assert_permissioned_identity_prefs!(entity_id, 2, 2); - - // Removes 50 and 60 from being validators - assert_ok!(Staking::chill_from_governance( - RuntimeOrigin::root(), - entity_id, - vec![50, 60] - )); - - // No longer permissioned identity - assert_noop!( - Staking::chill_from_governance(RuntimeOrigin::root(), entity_id, vec![50, 60]), - Error::::ValidatorNotFound - ); - - // 70 stash and 71 controller - bond(70, 71, 500000); - let entity_id_2 = mock::Identity::get_identity(&70).unwrap(); - - // Add a new validator successfully. - bond_validator_with_intended_count(70, 71, 500000, Some(2)); - - // Add other stash and controller to the same did. - add_secondary_key(70, 80); - add_secondary_key(70, 81); - - // Check keys that aren't joined with identity gives error - assert_noop!( - Staking::chill_from_governance(RuntimeOrigin::root(), entity_id_2, vec![90, 95]), - Error::::NotStash - ); - - // Check key that is not GC gives error - assert_noop!( - Staking::chill_from_governance(Origin::signed(20), entity_id_2, vec![90, 95]), - BadOrigin - ); - }); -} - -#[test] -fn test_running_count() { - ExtBuilder::default() - .validator_count(8) - .minimum_validator_count(1) - .build_and_execute(|| { - // 50 stash and 51 controller - bond(50, 51, 500000); - let entity_id = mock::Identity::get_identity(&50).unwrap(); - - // Add a new validator successfully. - bond_validator_with_intended_count(50, 51, 500000, Some(2)); - assert_permissioned_identity_prefs!(entity_id, 2, 1); - - // Add other stash and controller to the same did. - add_secondary_key(50, 60); - add_secondary_key(50, 61); - - // Validate one more validator from the same entity. - // 60 stash and 61 controller. - bond_validator(60, 61, 500000); - assert_permissioned_identity_prefs!(entity_id, 2, 2); - - // Ensure that the validator's stash key can't be removed from it's identity. - assert_noop!( - mock::Identity::remove_secondary_keys(Origin::signed(50), vec![60]), - pallet_identity::Error::::AccountKeyIsBeingUsed - ); - - // chill to remove the validator - assert_ok!(Staking::chill(Origin::signed(61))); - - // remove validator's stash key from it's identity - assert_ok!(mock::Identity::remove_secondary_keys( - Origin::signed(50), - vec![60] - )); - }); -} - -#[test] -fn validator_unbonding() { - ExtBuilder::default() - .validator_count(8) - .minimum_validator_count(1) - .build_and_execute(|| { - MinValidatorBond::::put(50_000); - - // Add a new validator successfully. - bond_validator_with_intended_count(50, 51, 500_000, Some(2)); - let entity_id = mock::Identity::get_identity(&50).unwrap(); - assert_permissioned_identity_prefs!(entity_id, 2, 1); - - // Check that an error is given when unbonding beyond the minimum bond threshold as a validator - assert_noop!( - Staking::unbond(Origin::signed(51), 480_000), - Error::::InsufficientBond - ); - // Check that validator can unbond once it doesn't go below the minimum bond threshold - assert_ok!(Staking::unbond(Origin::signed(51), 80_000)); - assert_ok!(Staking::unbond(Origin::signed(51), 80_000)); - assert_ok!(Staking::unbond(Origin::signed(51), 80_000)); - assert_ok!(Staking::unbond(Origin::signed(51), 80_000)); - - // Check the remaining bond amount can't all be unbond - assert_noop!( - Staking::unbond(Origin::signed(51), 180_000), - Error::::InsufficientBond - ); - // Chill validator - assert_ok!(Staking::chill(Origin::signed(51))); - // After chilling validator checks that entity can unbond successfully - assert_ok!(Staking::unbond(Origin::signed(51), 180_000)); - }); -} - -// ----------------------------------------------------------------- diff --git a/pallets/runtime/tests/src/staking_extra_tests.rs b/pallets/runtime/tests/src/staking_extra_tests.rs index 4fad1dde4e..c998285c57 100644 --- a/pallets/runtime/tests/src/staking_extra_tests.rs +++ b/pallets/runtime/tests/src/staking_extra_tests.rs @@ -1,5 +1,5 @@ use frame_support::assert_ok; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use polymesh_primitives::{AuthorizationData, Permissions}; @@ -10,13 +10,13 @@ type Origin = ::RuntimeOrigin; #[test] fn updating_controller() { - let charlie = vec![AccountKeyring::Charlie.to_account_id()]; + let charlie = vec![Sr25519Keyring::Charlie.to_account_id()]; ExtBuilder::default() .cdd_providers(charlie) .build() .execute_with(|| { - let alice: User = User::new(AccountKeyring::Alice); - let eve: User = User::new_with(alice.did, AccountKeyring::Eve); + let alice: User = User::new(Sr25519Keyring::Alice); + let eve: User = User::new_with(alice.did, Sr25519Keyring::Eve); add_secondary_key(alice.did, eve.acc()); @@ -29,7 +29,7 @@ fn updating_controller() { .unwrap(); assert_ok!( - pallet_staking::Pallet::::add_permissioned_validator( + pallet_validators::Pallet::::add_permissioned_validator( Origin::root(), alice.did, None @@ -38,9 +38,8 @@ fn updating_controller() { assert_ok!(pallet_staking::Pallet::::bond( alice.origin(), - sp_runtime::MultiAddress::Id(alice.acc()), 10_000_000, - pallet_staking::RewardDestination::Controller + pallet_staking::RewardDestination::Account(alice.acc()) )); assert_ok!(pallet_staking::Pallet::::validate( @@ -49,13 +48,13 @@ fn updating_controller() { )); assert_ok!(pallet_identity::Pallet::::revoke_claim( - Origin::signed(AccountKeyring::Charlie.to_account_id()), + Origin::signed(Sr25519Keyring::Charlie.to_account_id()), alice.did, polymesh_primitives::Claim::CustomerDueDiligence(Default::default()) )); assert_ok!( - pallet_staking::Pallet::::remove_permissioned_validator( + pallet_validators::Pallet::::remove_permissioned_validator( Origin::root(), alice.did, ) @@ -80,10 +79,5 @@ fn updating_controller() { None ) ); - - assert_ok!(pallet_staking::Pallet::::set_controller( - alice.origin(), - sp_runtime::MultiAddress::Id(eve.acc()), - )); }); } diff --git a/pallets/runtime/tests/src/sto_test.rs b/pallets/runtime/tests/src/sto_test.rs index fa86a84f2a..61ba88ed29 100644 --- a/pallets/runtime/tests/src/sto_test.rs +++ b/pallets/runtime/tests/src/sto_test.rs @@ -1,5 +1,5 @@ use frame_support::{assert_noop, assert_ok}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use sp_runtime::DispatchError; use pallet_asset::BalanceOf; @@ -34,7 +34,7 @@ type System = frame_system::Pallet; #[track_caller] fn test(logic: impl FnOnce()) { ExtBuilder::default() - .cdd_providers(vec![AccountKeyring::Eve.to_account_id()]) + .cdd_providers(vec![Sr25519Keyring::Eve.to_account_id()]) .build() .execute_with(logic); } @@ -83,8 +83,8 @@ struct RaiseContext { } fn init_raise_context() -> RaiseContext { - let (alice, alice_portfolio) = make_account_with_portfolio(AccountKeyring::Alice); - let (bob, bob_portfolio) = make_account_with_portfolio(AccountKeyring::Bob); + let (alice, alice_portfolio) = make_account_with_portfolio(Sr25519Keyring::Alice); + let (bob, bob_portfolio) = make_account_with_portfolio(Sr25519Keyring::Bob); // Register tokens let offering_asset = create_and_issue_sample_asset(&alice); @@ -131,7 +131,7 @@ fn raise_happy_path() { exec_ok!(Settlement::create_venue( alice.origin(), VenueDetails::default(), - vec![AccountKeyring::Alice.to_account_id()], + vec![Sr25519Keyring::Alice.to_account_id()], VenueType::Sto )); @@ -269,8 +269,8 @@ fn raise_happy_path() { } fn raise_unhappy_path() { - let (alice, alice_portfolio) = make_account_with_portfolio(AccountKeyring::Alice); - let (bob, bob_portfolio) = make_account_with_portfolio(AccountKeyring::Bob); + let (alice, alice_portfolio) = make_account_with_portfolio(Sr25519Keyring::Alice); + let (bob, bob_portfolio) = make_account_with_portfolio(Sr25519Keyring::Bob); // Offering asset not created assert_noop!( @@ -424,7 +424,7 @@ fn invalid_fundraiser() { assert_ok!(Settlement::create_venue( alice.origin(), VenueDetails::default(), - vec![AccountKeyring::Alice.to_account_id()], + vec![Sr25519Keyring::Alice.to_account_id()], VenueType::Sto )); @@ -487,7 +487,7 @@ fn basic_fundraiser() -> (FundraiserId, RaiseContext) { assert_ok!(Settlement::create_venue( context.alice.origin(), VenueDetails::default(), - vec![AccountKeyring::Alice.to_account_id()], + vec![Sr25519Keyring::Alice.to_account_id()], VenueType::Sto )); let fundraiser_id = FundraiserCount::::get(context.offering_asset); diff --git a/pallets/runtime/tests/src/storage.rs b/pallets/runtime/tests/src/storage.rs index 615b99e83b..d10eac9efe 100644 --- a/pallets/runtime/tests/src/storage.rs +++ b/pallets/runtime/tests/src/storage.rs @@ -5,62 +5,58 @@ use std::cell::RefCell; use std::convert::From; use codec::Encode; -use frame_support::dispatch::{DispatchResult, Weight}; -use frame_support::traits::{ - Currency, Imbalance, KeyOwnerProofSystem, OnInitialize, OnUnbalanced, TryCollect, -}; -use frame_support::weights::{ - RuntimeDbWeight, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial, -}; +use frame_support::traits::tokens::{fungible::Credit, imbalance::OnUnbalanced}; +use frame_support::traits::{ConstBool, Currency, Imbalance, KeyOwnerProofSystem}; +use frame_support::traits::{OnInitialize, TryCollect}; +use frame_support::weights::RuntimeDbWeight; +use frame_support::weights::Weight; use frame_support::{assert_ok, parameter_types, BoundedBTreeSet}; -use smallvec::smallvec; use sp_core::crypto::{key_types, Pair as PairTrait}; use sp_core::sr25519::Pair; use sp_core::Get; use sp_core::H256; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use sp_runtime::curve::PiecewiseLinear; use sp_runtime::generic::Era; use sp_runtime::testing::UintAuthorityId; -use sp_runtime::traits::{ - BlakeTwo256, Block as BlockT, Extrinsic, IdentityLookup, NumberFor, OpaqueKeys, StaticLookup, - Verify, -}; +use sp_runtime::traits::{BlakeTwo256, Block as BlockT, IdentityLookup}; +use sp_runtime::traits::{NumberFor, OpaqueKeys, StaticLookup, Verify}; use sp_runtime::transaction_validity::{InvalidTransaction, TransactionPriority}; -use sp_runtime::{create_runtime_str, AnySignature, KeyTypeId, Perbill, Permill}; +use sp_runtime::{AnySignature, Cow, KeyTypeId, Perbill, Permill}; use sp_staking::{EraIndex, SessionIndex}; use sp_version::RuntimeVersion; use frame_system::{EnsureRoot, RawOrigin}; use lazy_static::lazy_static; -use pallet_asset::checkpoint as pallet_checkpoint; -use pallet_balances as balances; -use pallet_committee as committee; -use pallet_corporate_actions as corporate_actions; -use pallet_corporate_actions::ballot as pallet_corporate_ballot; -use pallet_corporate_actions::distribution as pallet_capital_distribution; -use pallet_group as group; -use pallet_identity::{self as identity, Context}; -use pallet_pips as pips; -use pallet_protocol_fee as protocol_fee; -use pallet_session::historical as pallet_session_historical; +use pallet_identity::Context; use pallet_transaction_payment::RuntimeDispatchInfo; use pallet_utility; use polymesh_common_utilities::protocol_fee::ProtocolOp; use polymesh_primitives::constants::currency::{DOLLARS, POLY}; use polymesh_primitives::settlement::Leg; -use polymesh_primitives::{ - traits::{group::GroupTrait, CddAndFeeDetails}, - AccountId, Authorization, AuthorizationData, BlockNumber, Claim, Moment, - Permissions as AuthPermissions, PortfolioNumber, Scope, SecondaryKey, TrustedFor, - TrustedIssuer, -}; +use polymesh_primitives::traits::{group::GroupTrait, CddAndFeeDetails}; +use polymesh_primitives::{AccountId, Authorization, AuthorizationData, BlockNumber}; +use polymesh_primitives::{Claim, Moment, Permissions as AuthPermissions}; +use polymesh_primitives::{PortfolioNumber, Scope, SecondaryKey, TrustedFor, TrustedIssuer}; use polymesh_runtime_common::merge_active_and_inactive; use polymesh_runtime_common::runtime::{BENCHMARK_MAX_INCREASE, VMO}; use polymesh_runtime_common::{AvailableBlockRatio, MaximumBlockWeight}; use polymesh_runtime_develop::constants::time::{EPOCH_DURATION_IN_BLOCKS, MILLISECS_PER_BLOCK}; -use super::ext_builder::{EXTRINSIC_BASE_WEIGHT, TRANSACTION_BYTE_FEE, WEIGHT_TO_FEE}; +use pallet_asset::checkpoint as pallet_checkpoint; +use pallet_balances as balances; +use pallet_committee as committee; +use pallet_corporate_actions as corporate_actions; +use pallet_corporate_actions::ballot as pallet_corporate_ballot; +use pallet_corporate_actions::distribution as pallet_capital_distribution; +use pallet_group as group; +use pallet_identity as identity; +use pallet_protocol_fee as protocol_fee; +use pallet_session::historical as pallet_session_historical; + +use super::ext_builder::{EXTRINSIC_BASE_WEIGHT, TRANSACTION_BYTE_FEE}; + +type Runtime = TestStorage; lazy_static! { pub static ref INTEGRATION_TEST: bool = std::env::var("INTEGRATION_TEST") @@ -98,8 +94,8 @@ macro_rules! exec_noop { pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4); const GENESIS_HASH: [u8; 32] = [69u8; 32]; pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("test-storage"), - impl_name: create_runtime_str!("test-storage"), + spec_name: Cow::Borrowed("test-storage"), + impl_name: Cow::Borrowed("test-storage"), authoring_version: 1, // Per convention: if the runtime behavior changes, increment spec_version // and set impl_version to 0. If only runtime @@ -108,8 +104,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_version: 1, impl_version: 1, apis: RUNTIME_API_VERSIONS, - transaction_version: 7, - state_version: 1, + transaction_version: 8, + system_version: 1, }; impl_opaque_keys! { @@ -124,10 +120,8 @@ impl From for MockSessionKeys { } } -type Runtime = TestStorage; - // example module to test behaviors. -#[frame_support::pallet] +#[frame_support::pallet(dev_mode)] pub mod example { use frame_support::{dispatch::WithPostDispatchInfo, pallet_prelude::*}; use frame_system::pallet_prelude::*; @@ -141,8 +135,9 @@ pub mod example { #[pallet::call] impl Pallet { #[pallet::call_index(0)] - #[pallet::weight(*_weight)] - pub fn noop(_origin: OriginFor, _weight: Weight) -> DispatchResult { + #[pallet::weight(*weight)] + pub fn noop(_origin: OriginFor, weight: Weight) -> DispatchResult { + let _ = weight; Ok(()) } @@ -224,7 +219,6 @@ parameter_types! { pub const MaxAuthorities: u32 = 100_000; pub const MaxKeys: u32 = 10_000; pub const MaxPeerInHeartbeats: u32 = 10_000; - pub const MaxPeerDataEncodingSize: u32 = 1_000; pub const ReportLongevity: u64 = BondingDuration::get() as u64 * SessionsPerEra::get() as u64 * EpochDuration::get(); pub const MaxNumberOfCollectionKeys: u8 = u8::MAX; @@ -245,101 +239,186 @@ parameter_types! { pub const MaxRefundsAndVotesPruned: u32 = 2; } -frame_support::construct_runtime!( - pub enum TestStorage where - Block = Block, - NodeBlock = polymesh_primitives::Block, - UncheckedExtrinsic = UncheckedExtrinsic, -{ - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - Babe: pallet_babe::{Pallet, Call, Storage, Config, ValidateUnsigned} = 1, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2, - Indices: pallet_indices::{Pallet, Call, Storage, Config, Event} = 3, - // Authorship: pallet_authorship = 4, - - // Balance: Genesis config dependencies: System. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 5, - - // TransactionPayment: Genesis config dependencies: Balance. - TransactionPayment: pallet_transaction_payment::{Pallet, Event, Storage} = 6, - - // Identity: Genesis config deps: Timestamp. - Identity: pallet_identity::{Pallet, Call, Storage, Event, Config} = 7, - - // Polymesh Committees - - // CddServiceProviders: Genesis config deps: Identity - CddServiceProviders: pallet_group::::{Pallet, Call, Storage, Event, Config} = 8, - - // Governance Council (committee) - PolymeshCommittee: pallet_committee::::{Pallet, Call, Storage, Origin, Event, Config} = 9, - // CommitteeMembership: Genesis config deps: PolymeshCommittee, Identity. - CommitteeMembership: pallet_group::::{Pallet, Call, Storage, Event, Config} = 10, - - // Technical Committee - TechnicalCommittee: pallet_committee::::{Pallet, Call, Storage, Origin, Event, Config} = 11, - // TechnicalCommitteeMembership: Genesis config deps: TechnicalCommittee, Identity - TechnicalCommitteeMembership: pallet_group::::{Pallet, Call, Storage, Event, Config} = 12, - - // Upgrade Committee - UpgradeCommittee: pallet_committee::::{Pallet, Call, Storage, Origin, Event, Config} = 13, - // UpgradeCommitteeMembership: Genesis config deps: UpgradeCommittee - UpgradeCommitteeMembership: pallet_group::::{Pallet, Call, Storage, Event, Config} = 14, - - MultiSig: pallet_multisig::{Pallet, Call, Config, Storage, Event} = 15, - - // Staking: Genesis config deps: Balances, Indices, Identity, Babe, Timestamp, CddServiceProviders. - Staking: pallet_staking::{Pallet, Call, Config, Storage, Event} = 17, - Offences: pallet_offences::{Pallet, Storage, Event} = 18, - - // Session: Genesis config deps: System. - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 19, - AuthorityDiscovery: pallet_authority_discovery::{Pallet, Config} = 20, - Grandpa: pallet_grandpa::{Pallet, Call, Storage, Config, Event} = 21, - Historical: pallet_session_historical::{Pallet} = 22, - ImOnline: pallet_im_online::{Pallet, Call, Storage, Event, ValidateUnsigned, Config} = 23, - RandomnessCollectiveFlip: pallet_insecure_randomness_collective_flip::{Pallet, Storage} = 24, - - // Sudo. Usable initially. - Sudo: pallet_sudo::{Pallet, Call, Config, Storage, Event} = 25, - - // Asset: Genesis config deps: Timestamp, - Asset: pallet_asset::{Pallet, Call, Storage, Config, Event} = 26, - CapitalDistribution: pallet_capital_distribution::{Pallet, Call, Storage, Event, Config} = 27, - Checkpoint: pallet_checkpoint::{Pallet, Call, Storage, Event, Config} = 28, - ComplianceManager: pallet_compliance_manager::{Pallet, Call, Storage, Event} = 29, - CorporateAction: pallet_corporate_actions::{Pallet, Call, Storage, Event, Config} = 30, - CorporateBallot: pallet_corporate_ballot::{Pallet, Call, Storage, Event, Config} = 31, - Permissions: pallet_permissions::{Pallet, Storage} = 32, - Pips: pallet_pips::{Pallet, Call, Storage, Event, Config} = 33, - Portfolio: pallet_portfolio::{Pallet, Call, Storage, Event, Config} = 34, - ProtocolFee: pallet_protocol_fee::{Pallet, Call, Storage, Event, Config} = 35, - Scheduler: pallet_scheduler::{Pallet, Call, Storage, Event} = 36, - Settlement: pallet_settlement::{Pallet, Call, Storage, Event, Config} = 37, - Statistics: pallet_statistics::{Pallet, Call, Storage, Event, Config} = 38, - Sto: pallet_sto::{Pallet, Call, Storage, Event} = 39, - Treasury: pallet_treasury::{Pallet, Call, Event} = 40, - Utility: pallet_utility::{Pallet, Call, Storage, Event} = 41, - Base: pallet_base::{Pallet, Call, Event} = 42, - ExternalAgents: pallet_external_agents::{Pallet, Call, Storage, Event} = 43, - Relayer: pallet_relayer::{Pallet, Call, Storage, Event} = 44, - // Removed pallet_rewards = 45, - - // Contracts - Contracts: pallet_contracts::{Pallet, Call, Storage, Event} = 46, - PolymeshContracts: polymesh_contracts::{Pallet, Call, Storage, Event, Config} = 47, - - // Preimage register. Used by `pallet_scheduler`. - Preimage: pallet_preimage::{Pallet, Call, Storage, Event} = 48, - - Nft: pallet_nft::{Pallet, Call, Storage, Event} = 49, - - // Testing only. - Example: example::{Pallet, Call} = 201, - - ElectionProviderMultiPhase: pallet_election_provider_multi_phase::{Pallet, Call, Storage, Event, ValidateUnsigned}, - } -); +#[frame_support::runtime] +mod runtime { + use super::*; + + #[runtime::runtime] + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason + )] + pub struct TestStorage; + + #[runtime::pallet_index(0)] + pub type System = frame_system::Pallet; + + #[runtime::pallet_index(1)] + pub type Babe = pallet_babe::Pallet; + + #[runtime::pallet_index(2)] + pub type Timestamp = pallet_timestamp::Pallet; + + #[runtime::pallet_index(3)] + pub type Indices = pallet_indices::Pallet; + + #[runtime::pallet_index(5)] + pub type Balances = pallet_balances::Pallet; + + #[runtime::pallet_index(6)] + pub type TransactionPayment = pallet_transaction_payment::Pallet; + + #[runtime::pallet_index(51)] + pub type PolymeshTransactionPayment = polymesh_transaction_payment::Pallet; + + #[runtime::pallet_index(7)] + pub type Identity = pallet_identity::Pallet; + + #[runtime::pallet_index(8)] + pub type CddServiceProviders = pallet_group::Pallet; + + #[runtime::pallet_index(9)] + pub type PolymeshCommittee = pallet_committee::Pallet; + + #[runtime::pallet_index(10)] + pub type CommitteeMembership = pallet_group::Pallet; + + #[runtime::pallet_index(11)] + pub type TechnicalCommittee = pallet_committee::Pallet; + + #[runtime::pallet_index(12)] + pub type TechnicalCommitteeMembership = pallet_group::Pallet; + + #[runtime::pallet_index(13)] + pub type UpgradeCommittee = pallet_committee::Pallet; + + #[runtime::pallet_index(14)] + pub type UpgradeCommitteeMembership = pallet_group::Pallet; + + #[runtime::pallet_index(15)] + pub type MultiSig = pallet_multisig::Pallet; + + #[runtime::pallet_index(16)] + pub type Validators = pallet_validators::Pallet; + + #[runtime::pallet_index(17)] + pub type Staking = pallet_staking::Pallet; + + #[runtime::pallet_index(18)] + pub type Offences = pallet_offences::Pallet; + + #[runtime::pallet_index(19)] + pub type Session = pallet_session::Pallet; + + #[runtime::pallet_index(20)] + pub type AuthorityDiscovery = pallet_authority_discovery::Pallet; + + #[runtime::pallet_index(21)] + pub type Grandpa = pallet_grandpa::Pallet; + + #[runtime::pallet_index(22)] + pub type Historical = pallet_session_historical::Pallet; + + #[runtime::pallet_index(23)] + pub type ImOnline = pallet_im_online::Pallet; + + #[runtime::pallet_index(25)] + pub type Sudo = pallet_sudo::Pallet; + + #[runtime::pallet_index(26)] + pub type Asset = pallet_asset::Pallet; + + #[runtime::pallet_index(27)] + pub type CapitalDistribution = pallet_capital_distribution::Pallet; + + #[runtime::pallet_index(28)] + pub type Checkpoint = pallet_checkpoint::Pallet; + + #[runtime::pallet_index(29)] + pub type ComplianceManager = pallet_compliance_manager::Pallet; + + #[runtime::pallet_index(30)] + pub type CorporateAction = pallet_corporate_actions::Pallet; + + #[runtime::pallet_index(31)] + pub type CorporateBallot = pallet_corporate_ballot::Pallet; + + #[runtime::pallet_index(32)] + pub type Permissions = pallet_permissions::Pallet; + + #[runtime::pallet_index(33)] + pub type Pips = pallet_pips::Pallet; + + #[runtime::pallet_index(34)] + pub type Portfolio = pallet_portfolio::Pallet; + + #[runtime::pallet_index(35)] + pub type ProtocolFee = pallet_protocol_fee::Pallet; + + #[runtime::pallet_index(36)] + pub type Scheduler = pallet_scheduler::Pallet; + + #[runtime::pallet_index(37)] + pub type Settlement = pallet_settlement::Pallet; + + #[runtime::pallet_index(38)] + pub type Statistics = pallet_statistics::Pallet; + + #[runtime::pallet_index(39)] + pub type Sto = pallet_sto::Pallet; + + #[runtime::pallet_index(40)] + pub type Treasury = pallet_treasury::Pallet; + + #[runtime::pallet_index(41)] + pub type Utility = pallet_utility::Pallet; + + #[runtime::pallet_index(42)] + pub type Base = pallet_base::Pallet; + + #[runtime::pallet_index(43)] + pub type ExternalAgents = pallet_external_agents::Pallet; + + #[runtime::pallet_index(44)] + pub type Relayer = pallet_relayer::Pallet; + + #[runtime::pallet_index(46)] + pub type Contracts = pallet_contracts::Pallet; + + #[runtime::pallet_index(47)] + pub type PolymeshContracts = polymesh_contracts::Pallet; + + #[runtime::pallet_index(48)] + pub type Preimage = pallet_preimage::Pallet; + + #[runtime::pallet_index(49)] + pub type Nft = pallet_nft::Pallet; + + #[runtime::pallet_index(50)] + pub type ElectionProviderMultiPhase = pallet_election_provider_multi_phase::Pallet; + + #[runtime::pallet_index(52)] + pub type Beefy = pallet_beefy::Pallet; + + // MMR leaf construction must be after session in order to have a leaf's next_auth_set + // refer to block. See issue polkadot-fellows/runtimes#160 for details. + #[runtime::pallet_index(53)] + pub type Mmr = pallet_mmr::Pallet; + + #[runtime::pallet_index(54)] + pub type MmrLeaf = pallet_beefy_mmr::Pallet; + + #[runtime::pallet_index(80)] + pub type Revive = pallet_revive::Pallet; + + #[runtime::pallet_index(200)] + pub type Example = example::Pallet; +} polymesh_runtime_common::runtime_apis! {} @@ -347,7 +426,7 @@ polymesh_runtime_common::runtime_apis! {} pub struct User { /// The `ring` of the `User` used to derive account related data, /// e.g., origins, keys, and balances. - pub ring: AccountKeyring, + pub ring: Sr25519Keyring, /// The DID of the `User`. /// The `ring` need not be the primary key of this DID. pub did: IdentityId, @@ -358,17 +437,17 @@ impl User { /// /// The function is useful when `ring` refers to a secondary key. /// At the time of calling, nothing is asserted about `did`'s registration. - pub const fn new_with(did: IdentityId, ring: AccountKeyring) -> Self { + pub const fn new_with(did: IdentityId, ring: Sr25519Keyring) -> Self { User { ring, did } } /// Creates and registers a `User` for the given `ring` which will act as the primary key. - pub fn new(ring: AccountKeyring) -> Self { + pub fn new(ring: Sr25519Keyring) -> Self { Self::new_with(register_keyring_account(ring).unwrap(), ring) } /// Creates a `User` for an already registered DID with `ring` as its primary key. - pub fn existing(ring: AccountKeyring) -> Self { + pub fn existing(ring: Sr25519Keyring) -> Self { Self::new_with(get_identity_id(ring).unwrap(), ring) } @@ -423,14 +502,14 @@ pub type EventTest = RuntimeEvent; type Hash = H256; type Hashing = BlakeTwo256; type Lookup = IdentityLookup; -type OffChainSignature = AnySignature; +pub(crate) type OffChainSignature = AnySignature; type AuthorityId = ::Signer; pub(crate) type Balance = u128; parameter_types! { pub MaximumExtrinsicWeight: Weight = AvailableBlockRatio::get() .saturating_sub(Perbill::from_percent(10)) * MaximumBlockWeight::get(); - pub const BlockExecutionWeight: Weight = Weight::from_ref_time(10); + pub const BlockExecutionWeight: Weight = Weight::from_parts(10, 0); pub TransactionByteFee: Balance = TRANSACTION_BYTE_FEE.with(|v| *v.borrow()); pub ExtrinsicBaseWeight: Weight = EXTRINSIC_BASE_WEIGHT.with(|v| *v.borrow()); pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { @@ -442,18 +521,22 @@ parameter_types! { pub struct DealWithFees; -impl OnUnbalanced> for DealWithFees { - fn on_nonzero_unbalanced(amount: NegativeImbalance) { +impl OnUnbalanced> for DealWithFees { + fn on_nonzero_unbalanced(credit: Credit) { + // Use a fixed account to receive transactino and protocol fees in tests. let target = account_from(5000); - let positive_imbalance = Balances::deposit_creating(&target, amount.peek()); - let _ = amount.offset(positive_imbalance).same().map_err(|_| 4); // random value mapped for error + let _ = Balances::deposit_creating(&target, credit.peek()); } } parameter_types! { pub const SS58Prefix: u8 = 12; pub const ExistentialDeposit: u64 = 0; + pub const BenchmarkEd: Balance = 1; pub const MaxLocks: u32 = 50; + pub const MaxHolds: u32 = 32; + pub const MaxFreezes: u32 = 32; + pub const MaxReserves: u32 = 50; pub const MaxLen: u32 = 256; pub const AssetNameMaxLength: u32 = 128; pub const FundingRoundNameMaxLength: u32 = 128; @@ -485,8 +568,6 @@ parameter_types! { pub const MaxValueSize: u32 = 16_384; pub Schedule: pallet_contracts::Schedule = Default::default(); - pub DeletionWeightLimit: Weight = Weight::from_ref_time(500_000_000_000); - pub DeletionQueueDepth: u32 = 1024; pub MaxInLen: u32 = 8 * 1024; pub MaxOutLen: u32 = 8 * 1024; } @@ -522,23 +603,8 @@ impl CddAndFeeDetails for TestStorage { } } -pub struct WeightToFee; -impl WeightToFeePolynomial for WeightToFee { - type Balance = Balance; - - fn polynomial() -> WeightToFeeCoefficients { - smallvec![WeightToFeeCoefficient { - degree: 1, - coeff_frac: Perbill::zero(), - coeff_integer: WEIGHT_TO_FEE.with(|v| *v.borrow()), - negative: false, - }] - } -} - /// PolymeshCommittee as an instance of group impl group::Config for TestStorage { - type RuntimeEvent = RuntimeEvent; type LimitOrigin = EnsureRoot; type AddOrigin = EnsureRoot; type RemoveOrigin = EnsureRoot; @@ -550,7 +616,6 @@ impl group::Config for TestStorage { } impl group::Config for TestStorage { - type RuntimeEvent = RuntimeEvent; type LimitOrigin = EnsureRoot; type AddOrigin = EnsureRoot; type RemoveOrigin = EnsureRoot; @@ -562,7 +627,6 @@ impl group::Config for TestStorage { } impl group::Config for TestStorage { - type RuntimeEvent = RuntimeEvent; type LimitOrigin = EnsureRoot; type AddOrigin = EnsureRoot; type RemoveOrigin = EnsureRoot; @@ -574,7 +638,6 @@ impl group::Config for TestStorage { } impl group::Config for TestStorage { - type RuntimeEvent = RuntimeEvent; type LimitOrigin = EnsureRoot; type AddOrigin = EnsureRoot; type RemoveOrigin = EnsureRoot; @@ -592,7 +655,6 @@ impl committee::Config for TestStorage { type Proposal = RuntimeCall; type CommitteeOrigin = VMO; type VoteThresholdOrigin = Self::CommitteeOrigin; - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_committee::SubstrateWeight; } @@ -601,7 +663,6 @@ impl committee::Config for TestStorage { type Proposal = RuntimeCall; type CommitteeOrigin = EnsureRoot; type VoteThresholdOrigin = Self::CommitteeOrigin; - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_committee::SubstrateWeight; } @@ -610,12 +671,10 @@ impl committee::Config for TestStorage { type Proposal = RuntimeCall; type CommitteeOrigin = EnsureRoot; type VoteThresholdOrigin = Self::CommitteeOrigin; - type RuntimeEvent = RuntimeEvent; type WeightInfo = polymesh_weights::pallet_committee::SubstrateWeight; } impl pallet_identity::Config for TestStorage { - type RuntimeEvent = RuntimeEvent; type Proposal = RuntimeCall; type CddServiceProviders = CddServiceProvider; type Balances = balances::Pallet; @@ -630,11 +689,13 @@ impl pallet_identity::Config for TestStorage { type InitialPOLYX = InitialPOLYX; type MaxGivenAuths = MaxGivenAuths; type MaxAuthRetries = MaxAuthRetries; + type Randomness = pallet_babe::RandomnessFromOneEpochAgo; } impl example::Config for TestStorage {} pub struct TestBaseCallFilter; + impl frame_support::traits::Contains for TestBaseCallFilter { fn contains(c: &RuntimeCall) -> bool { match *c { @@ -645,6 +706,7 @@ impl frame_support::traits::Contains for TestBaseCallFilter { } } } + type RuntimeBaseCallFilter = TestBaseCallFilter; pub struct TestSessionHandler; @@ -686,22 +748,23 @@ impl pallet_session::SessionManager for TestSessionManager { } } -impl pips::Config for TestStorage { - type Currency = balances::Pallet; - type VotingMajorityOrigin = VMO; +impl pallet_pips::Config for Runtime { + type Currency = Balances; + type VotingMajorityOrigin = VMO; type GovernanceCommittee = Committee; - type TechnicalCommitteeVMO = VMO; - type UpgradeCommitteeVMO = VMO; - type RuntimeEvent = RuntimeEvent; + type TechnicalCommitteeVMO = VMO; + type UpgradeCommitteeVMO = VMO; type WeightInfo = polymesh_weights::pallet_pips::SubstrateWeight; type Scheduler = Scheduler; type SchedulerCall = RuntimeCall; type MaxRefundsAndVotesPruned = MaxRefundsAndVotesPruned; + type SchedulerPreimage = Preimage; } impl pallet_sudo::Config for Runtime { type RuntimeEvent = RuntimeEvent; type RuntimeCall = RuntimeCall; + type WeightInfo = pallet_sudo::weights::SubstrateWeight; } polymesh_runtime_common::misc_pallet_impls!(); @@ -724,7 +787,7 @@ pub fn make_account( make_account_with_balance(id, 1_000_000) } -pub fn make_account_with_portfolio(ring: AccountKeyring) -> (User, PortfolioId) { +pub fn make_account_with_portfolio(ring: Sr25519Keyring) -> (User, PortfolioId) { let user = User::new(ring); let portfolio = PortfolioId::default_portfolio(user.did); (user, portfolio) @@ -788,12 +851,12 @@ pub fn make_account_without_cdd( Ok((signed_id, did)) } -pub fn register_keyring_account(acc: AccountKeyring) -> Result { +pub fn register_keyring_account(acc: Sr25519Keyring) -> Result { register_keyring_account_with_balance(acc, 10_000_000) } pub fn register_keyring_account_with_balance( - acc: AccountKeyring, + acc: Sr25519Keyring, balance: Balance, ) -> Result { let acc_id = acc.to_account_id(); @@ -838,7 +901,7 @@ pub fn account_from(id: u64) -> AccountId { pk.into() } -pub fn get_identity_id(acc: AccountKeyring) -> Option { +pub fn get_identity_id(acc: Sr25519Keyring) -> Option { Identity::get_identity(&acc.to_account_id()) } @@ -986,69 +1049,87 @@ macro_rules! assert_event_doesnt_exist { pub fn exec>(origin: RuntimeOrigin, call: C) -> DispatchResult { let origin: Result, RuntimeOrigin> = origin.into(); - let signed = match origin.unwrap() { - RawOrigin::Signed(acc) => { - let info = frame_system::Account::::get(&acc); - Some((acc, signed_extra(info.nonce))) + + let format = { + match origin.unwrap() { + RawOrigin::Signed(acc) => { + let info = frame_system::Account::::get(&acc); + generic::ExtrinsicFormat::Signed(acc, signed_extra(info.nonce)) + } + _ => generic::ExtrinsicFormat::Bare, } - _ => None, }; + Executive::apply_extrinsic(sign(CheckedExtrinsic { - signed, + format, function: call.into(), })) .unwrap() } -/// Sign given `CheckedExtrinsic` returning an `UncheckedExtrinsic` -/// usable for execution. -fn sign(xt: CheckedExtrinsic) -> UncheckedExtrinsic { - let CheckedExtrinsic { - signed, function, .. - } = xt; - UncheckedExtrinsic { - signature: signed.map(|(signed, extra)| { - let payload = ( - &function, - extra.clone(), - VERSION.spec_version, - VERSION.transaction_version, - GENESIS_HASH, - GENESIS_HASH, - ); - let key = AccountKeyring::from_account_id(&signed).unwrap(); - let signature = payload - .using_encoded(|b| { - if b.len() > 256 { - key.sign(&sp_io::hashing::blake2_256(b)) - } else { - key.sign(b) - } - }) - .into(); - (Address::Id(signed), signature, extra) - }), +/// Sign given `CheckedExtrinsic` returning an `UncheckedExtrinsic` usable for execution. +fn sign(checked_extrinsic: CheckedExtrinsic) -> UncheckedExtrinsic { + let preamble = { + match checked_extrinsic.format { + generic::ExtrinsicFormat::Signed(acc, ext) => { + let payload = ( + &checked_extrinsic.function, + ext.clone(), + VERSION.spec_version, + VERSION.transaction_version, + GENESIS_HASH, + GENESIS_HASH, + ); + let key = Sr25519Keyring::from_account_id(&acc).unwrap(); + let signature = payload + .using_encoded(|b| { + if b.len() > 256 { + key.sign(&sp_io::hashing::blake2_256(b)) + } else { + key.sign(b) + } + }) + .into(); + generic::Preamble::Signed(Address::Id(acc), signature, ext) + } + _ => generic::Preamble::Bare(0), + } + }; + + let function = checked_extrinsic.function; + generic::UncheckedExtrinsic { + preamble, function, + encoded_call: None, } + .into() } /// Returns transaction extra. -fn signed_extra(nonce: Index) -> SignedExtra { +fn signed_extra(nonce: Nonce) -> TxExtension { ( - frame_system::CheckSpecVersion::new(), - frame_system::CheckTxVersion::new(), - frame_system::CheckGenesis::new(), + ( + frame_system::AuthorizeCall::new(), + frame_system::CheckNonZeroSender::new(), + frame_system::CheckSpecVersion::new(), + frame_system::CheckTxVersion::new(), + frame_system::CheckGenesis::new(), + ), frame_system::CheckEra::from(Era::mortal(256, 0)), frame_system::CheckNonce::from(nonce), frame_system::CheckWeight::new(), - pallet_transaction_payment::ChargeTransactionPayment::from(0), + polymesh_transaction_payment::ChargeTransactionPayment::from(0), pallet_permissions::StoreCallMetadata::new(), + frame_metadata_hash_extension::CheckMetadataHash::new(false), + pallet_revive::evm::tx_extension::SetOrigin::default(), + frame_system::WeightReclaim::new(), ) } pub struct OnChainSeqPhragmen; impl frame_election_provider_support::onchain::Config for OnChainSeqPhragmen { + type Sort = ConstBool; type System = Runtime; type Solver = frame_election_provider_support::SequentialPhragmen< polymesh_primitives::AccountId, @@ -1056,7 +1137,7 @@ impl frame_election_provider_support::onchain::Config for OnChainSeqPhragmen { >; type DataProvider = ::DataProvider; type WeightInfo = frame_election_provider_support::weights::SubstrateWeight; - type MaxWinners = ::MaxWinners; - type VotersBound = polymesh_runtime_common::MaxOnChainElectingVoters; - type TargetsBound = polymesh_runtime_common::MaxOnChainElectableTargets; + type Bounds = polymesh_runtime_common::ElectionBoundsOnChain; + type MaxBackersPerWinner = polymesh_runtime_common::MaxElectingVotersSolution; + type MaxWinnersPerPage = polymesh_runtime_common::MaxActiveValidators; } diff --git a/pallets/runtime/tests/src/transaction_payment_test.rs b/pallets/runtime/tests/src/transaction_payment_test.rs index 0f01e1ecb7..d8d86e410b 100644 --- a/pallets/runtime/tests/src/transaction_payment_test.rs +++ b/pallets/runtime/tests/src/transaction_payment_test.rs @@ -1,29 +1,30 @@ -use super::ext_builder::ExtBuilder; -use super::storage::{RuntimeCall, TestStorage}; use codec::Encode; -use frame_support::{ - dispatch::{DispatchClass, DispatchInfo, GetDispatchInfo, Pays, PostDispatchInfo, Weight}, - traits::Currency, - weights::WeightToFee, -}; +use frame_support::dispatch::{DispatchClass, DispatchInfo}; +use frame_support::dispatch::{GetDispatchInfo, Pays, PostDispatchInfo}; +use frame_support::traits::Currency; +use frame_support::weights::{Weight, WeightToFee}; +use sp_arithmetic::traits::One; +use sp_keyring::Sr25519Keyring; +use sp_runtime::generic::UncheckedExtrinsic; +use sp_runtime::traits::{TransactionExtension, TxBaseImplication}; +use sp_runtime::transaction_validity::TransactionSource; +use sp_runtime::transaction_validity::{InvalidTransaction, TransactionValidityError}; +use sp_runtime::{FixedPointNumber, MultiAddress}; + use pallet_balances::Call as BalancesCall; -use pallet_transaction_payment::{ - ChargeTransactionPayment, Multiplier, NextFeeMultiplier, RuntimeDispatchInfo, -}; +use pallet_transaction_payment::{Multiplier, NextFeeMultiplier, RuntimeDispatchInfo}; use polymesh_primitives::AccountId; use polymesh_primitives::TransactionError; -use sp_arithmetic::traits::One; -use sp_keyring::AccountKeyring; -use sp_runtime::{ - testing::TestXt, - traits::SignedExtension, - transaction_validity::{InvalidTransaction, TransactionValidityError}, - FixedPointNumber, MultiAddress, -}; +use polymesh_transaction_payment::{ChargeTransactionPayment, Val}; + +use super::ext_builder::ExtBuilder; +use super::storage::{Address, RuntimeCall, TestStorage}; + +type RuntimeOrigin = ::RuntimeOrigin; fn call() -> ::RuntimeCall { - RuntimeCall::Balances(BalancesCall::transfer { - dest: MultiAddress::Id(AccountKeyring::Alice.to_account_id()), + RuntimeCall::Balances(BalancesCall::transfer_allow_death { + dest: MultiAddress::Id(Sr25519Keyring::Alice.to_account_id()), value: 69, }) } @@ -36,7 +37,7 @@ type TransactionPayment = pallet_transaction_payment::Pallet; pub fn info_from_weight(w: u64) -> DispatchInfo { // pays_fee: Pays::Yes -- class: DispatchClass::Normal DispatchInfo { - weight: Weight::from_ref_time(w), + call_weight: Weight::from_parts(w, 0), ..Default::default() } } @@ -47,7 +48,7 @@ fn weight_to_fee(weight: Weight) -> u128 { fn operational_info_from_weight(w: u64) -> DispatchInfo { DispatchInfo { - weight: Weight::from_ref_time(w), + call_weight: Weight::from_parts(w, 0), class: DispatchClass::Operational, ..Default::default() } @@ -55,7 +56,7 @@ fn operational_info_from_weight(w: u64) -> DispatchInfo { fn post_info_from_weight(w: u64) -> PostDispatchInfo { PostDispatchInfo { - actual_weight: Some(Weight::from_ref_time(w)), + actual_weight: Some(Weight::from_parts(w, 0)), pays_fee: Pays::Yes, } } @@ -74,34 +75,62 @@ fn signed_extension_transaction_payment_work() { .transaction_fees(5, 1, 1) .build() .execute_with(|| { - let bob = AccountKeyring::Bob.to_account_id(); - let alice = AccountKeyring::Alice.to_account_id(); + let bob = Sr25519Keyring::Bob.to_account_id(); + let alice = Sr25519Keyring::Alice.to_account_id(); let len = 10; + let bob_origin = RuntimeOrigin::signed(bob.clone()); + + let val = ChargeTransactionPayment::::from(0) + .validate( + bob_origin.clone(), + &call(), + &info_from_weight(5), + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) + .unwrap(); + let pre = ChargeTransactionPayment::::from(0) - .pre_dispatch(&bob, &call(), &info_from_weight(5), len) + .prepare(val.1, &bob_origin, &call(), &info_from_weight(5), len) .unwrap(); assert_eq!(Balances::free_balance(&bob), 1999969001); assert!(ChargeTransactionPayment::::post_dispatch( - Some(pre), + pre, &info_from_weight(5), - &default_post_info(), + &mut default_post_info(), len, &Ok(()) ) .is_ok()); assert_eq!(Balances::free_balance(&bob), 1999969001); + let alice_origin = RuntimeOrigin::signed(alice.clone()); + + let val = ChargeTransactionPayment::::from(0) + .validate( + alice_origin.clone(), + &call(), + &info_from_weight(100), + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) + .unwrap(); + let pre = ChargeTransactionPayment::::from(0 /* tipped */) - .pre_dispatch(&alice, &call(), &info_from_weight(100), len) + .prepare(val.1, &alice_origin, &call(), &info_from_weight(100), len) .unwrap(); assert_eq!(Balances::free_balance(&alice), 999969001); assert!(ChargeTransactionPayment::::post_dispatch( - Some(pre), + pre, &info_from_weight(100), - &post_info_from_weight(50), + &mut post_info_from_weight(50), len, &Ok(()) ) @@ -117,20 +146,34 @@ fn signed_extension_transaction_payment_multiplied_refund_works() { .transaction_fees(5, 1, 1) .build() .execute_with(|| { - let user = AccountKeyring::Alice.to_account_id(); + let user = Sr25519Keyring::Alice.to_account_id(); let len = 10; - TransactionPayment::put_next_fee_multiplier(Multiplier::saturating_from_rational(3, 2)); + NextFeeMultiplier::::put(Multiplier::saturating_from_rational(3, 2)); + + let alice_origin = RuntimeOrigin::signed(user.clone()); + + let val = ChargeTransactionPayment::::from(0) + .validate( + alice_origin.clone(), + &call(), + &info_from_weight(100), + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) + .unwrap(); let pre = ChargeTransactionPayment::::from(0 /* tipped */) - .pre_dispatch(&user, &call(), &info_from_weight(100), len) + .prepare(val.1, &alice_origin, &call(), &info_from_weight(100), len) .unwrap(); // 5 base fee, 10 byte fee, 3/2 * 100 weight fee, 5 tip assert_eq!(Balances::free_balance(&user), 999969001); assert!(ChargeTransactionPayment::::post_dispatch( - Some(pre), + pre, &info_from_weight(100), - &post_info_from_weight(50), + &mut post_info_from_weight(50), len, &Ok(()) ) @@ -148,23 +191,36 @@ fn signed_extension_transaction_payment_is_bounded() { .transaction_fees(0, 0, 1) .build() .execute_with(|| { - let user = AccountKeyring::Bob.to_account_id(); + let user = Sr25519Keyring::Bob.to_account_id(); let free_user = Balances::free_balance(&user); // Get the current weight settings. let weights = ::BlockWeights::get(); - let per_byte = - ::TransactionByteFee::get(); // Calculate maximum transaction fee. - let base_fee = weight_to_fee(weights.get(DispatchClass::Normal).base_extrinsic); - let len_fee = per_byte.saturating_mul(10); + let weight = weights.get(DispatchClass::Normal).base_extrinsic; + let base_fee = weight_to_fee(weight); + let len_fee = pallet_transaction_payment::Pallet::::length_to_fee(10); let max_block_fee = weight_to_fee(weights.max_block); let max_fee = base_fee + len_fee + max_block_fee; // maximum weight possible + let bob_origin = RuntimeOrigin::signed(user.clone()); + + let val = ChargeTransactionPayment::::from(0) + .validate( + bob_origin.clone(), + &call(), + &info_from_weight(u64::MAX), + 10, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) + .unwrap(); + ChargeTransactionPayment::::from(0) - .pre_dispatch(&user, &call(), &info_from_weight(u64::MAX), 10) + .prepare(val.1, &bob_origin, &call(), &info_from_weight(u64::MAX), 10) .unwrap(); // fee will be proportional to what is the actual maximum weight in the runtime. assert_eq!(Balances::free_balance(&user), (free_user - max_fee)); @@ -178,7 +234,8 @@ fn signed_extension_allows_free_transactions() { .balance_factor(0) .build() .execute_with(|| { - let user = AccountKeyring::Bob.to_account_id(); + let user = Sr25519Keyring::Bob.to_account_id(); + let bob_origin = RuntimeOrigin::signed(user.clone()); // I ain't have a penny. assert_eq!(Balances::free_balance(&user), 0); @@ -186,22 +243,40 @@ fn signed_extension_allows_free_transactions() { // This is a completely free (and thus wholly insecure/DoS-ridden) transaction. let operational_transaction = DispatchInfo { - weight: Weight::from_ref_time(0), + call_weight: Weight::from_parts(0, 0), + extension_weight: Default::default(), class: DispatchClass::Operational, pays_fee: Pays::No, }; assert!(ChargeTransactionPayment::::from(0) - .validate(&user, &call(), &operational_transaction, len) + .validate( + bob_origin.clone(), + &call(), + &operational_transaction, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) .is_ok()); // like a InsecureFreeNormal let free_transaction = DispatchInfo { - weight: Weight::from_ref_time(0), + call_weight: Weight::from_parts(0, 0), + extension_weight: Default::default(), class: DispatchClass::Normal, pays_fee: Pays::Yes, }; assert!(ChargeTransactionPayment::::from(0) - .validate(&user, &call(), &free_transaction, len) + .validate( + bob_origin, + &call(), + &free_transaction, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock + ) .is_err()); }); } @@ -215,11 +290,31 @@ fn signed_ext_length_fee_is_also_updated_per_congestion() { .build() .execute_with(|| { // all fees should be x1.5 - TransactionPayment::put_next_fee_multiplier(Multiplier::saturating_from_rational(3, 2)); + NextFeeMultiplier::::put(Multiplier::saturating_from_rational(3, 2)); let len = 10; - let user = AccountKeyring::Bob.to_account_id(); + let user = Sr25519Keyring::Bob.to_account_id(); + let bob_origin = RuntimeOrigin::signed(user.clone()); + + let val = ChargeTransactionPayment::::from(0) + .validate( + bob_origin.clone(), + &call(), + &info_from_weight(3), + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) + .unwrap(); + assert!(ChargeTransactionPayment::::from(0) // tipped - .pre_dispatch(&user, &call(), &info_from_weight(3), len) + .prepare( + val.1, + &bob_origin, + &call(), + &info_from_weight(3), + len + ) .is_ok()); assert_eq!(Balances::free_balance(&user), 19999969001); }) @@ -227,26 +322,30 @@ fn signed_ext_length_fee_is_also_updated_per_congestion() { #[test] fn query_info_works() { - let origin = 111111; - let extra = (); - let xt = TestXt::new(call(), Some((origin, extra))); - let info = xt.get_dispatch_info(); - let ext = xt.encode(); - let len = ext.len() as u32; ExtBuilder::default() .monied(true) .transaction_fees(5, 1, 2) .build() .execute_with(|| { + let acc = Sr25519Keyring::Bob.to_account_id(); + let key = Sr25519Keyring::from_account_id(&acc).unwrap(); + let signature = ().using_encoded(|b| key.sign(b)); + let unchecked_extrinsic = + UncheckedExtrinsic::new_signed(call(), Address::Id(acc), signature, ()); + let info = unchecked_extrinsic.get_dispatch_info(); + // all fees should be x1.5 - TransactionPayment::put_next_fee_multiplier(Multiplier::saturating_from_rational(3, 2)); + NextFeeMultiplier::::put(Multiplier::saturating_from_rational(3, 2)); assert_eq!( - TransactionPayment::query_info(xt, len, None), + TransactionPayment::query_info( + unchecked_extrinsic.clone(), + unchecked_extrinsic.encode().len() as u32 + ), RuntimeDispatchInfo { - weight: info.weight, + weight: info.call_weight, class: info.class, - partial_fee: 34599 + partial_fee: 65098 }, ); }); @@ -264,35 +363,44 @@ fn compute_fee_works_without_multiplier() { // Tip only, no fees works let dispatch_info = DispatchInfo { - weight: Weight::from_ref_time(0), + call_weight: Weight::from_parts(0, 0), + extension_weight: Default::default(), class: DispatchClass::Operational, pays_fee: Pays::No, }; assert_eq!(TransactionPayment::compute_fee(0, &dispatch_info, 10), 10); // No tip, only base fee works let dispatch_info = DispatchInfo { - weight: Weight::from_ref_time(0), + call_weight: Weight::from_parts(0, 0), + extension_weight: Default::default(), class: DispatchClass::Operational, pays_fee: Pays::Yes, }; - assert_eq!(TransactionPayment::compute_fee(0, &dispatch_info, 0), 29999); + assert_eq!( + TransactionPayment::compute_fee(0, &dispatch_info, 0), + 29_999 + ); // Tip + base fee works assert_eq!( TransactionPayment::compute_fee(0, &dispatch_info, 69), - 30068 + 30_068 ); // Len (byte fee) + base fee works assert_eq!( TransactionPayment::compute_fee(42, &dispatch_info, 0), - 34199 + 34_199 ); // Weight fee + base fee works let dispatch_info = DispatchInfo { - weight: Weight::from_ref_time(1000), + call_weight: Weight::from_parts(1000, 0), + extension_weight: Default::default(), class: DispatchClass::Operational, pays_fee: Pays::Yes, }; - assert_eq!(TransactionPayment::compute_fee(0, &dispatch_info, 0), 29999); + assert_eq!( + TransactionPayment::compute_fee(0, &dispatch_info, 0), + 29_999 + ); }); } @@ -304,25 +412,30 @@ fn compute_fee_works_with_multiplier() { .build() .execute_with(|| { // Add a next fee multiplier. Fees will be x3/2. - TransactionPayment::put_next_fee_multiplier(Multiplier::saturating_from_rational(3, 2)); + NextFeeMultiplier::::put(Multiplier::saturating_from_rational(3, 2)); // Base fee is unaffected by multiplier let dispatch_info = DispatchInfo { - weight: Weight::from_ref_time(0), + call_weight: Weight::from_parts(0, 0), + extension_weight: Default::default(), class: DispatchClass::Operational, pays_fee: Pays::Yes, }; - assert_eq!(TransactionPayment::compute_fee(0, &dispatch_info, 0), 29999); + assert_eq!( + TransactionPayment::compute_fee(0, &dispatch_info, 0), + 29_999 + ); // Everything works together :) let dispatch_info = DispatchInfo { - weight: Weight::from_ref_time(123), + call_weight: Weight::from_parts(123, 0), + extension_weight: Default::default(), class: DispatchClass::Operational, pays_fee: Pays::Yes, }; // 123 weight, 456 length, 100 base assert_eq!( TransactionPayment::compute_fee(456, &dispatch_info, 789), - 76388, + 76_388, ); }); } @@ -335,26 +448,31 @@ fn compute_fee_works_with_negative_multiplier() { .build() .execute_with(|| { // Add a next fee multiplier. All fees will be x1/2. - TransactionPayment::put_next_fee_multiplier(Multiplier::saturating_from_rational(1, 2)); + NextFeeMultiplier::::put(Multiplier::saturating_from_rational(1, 2)); // Base fee is unaffected by multiplier. let dispatch_info = DispatchInfo { - weight: Weight::from_ref_time(0), + call_weight: Weight::from_parts(0, 0), + extension_weight: Default::default(), class: DispatchClass::Operational, pays_fee: Pays::Yes, }; - assert_eq!(TransactionPayment::compute_fee(0, &dispatch_info, 0), 29999); + assert_eq!( + TransactionPayment::compute_fee(0, &dispatch_info, 0), + 29_999 + ); // Everything works together. let dispatch_info = DispatchInfo { - weight: Weight::from_ref_time(123), + call_weight: Weight::from_parts(123, 0), + extension_weight: Default::default(), class: DispatchClass::Operational, pays_fee: Pays::Yes, }; // 123 weight, 456 length, 100 base assert_eq!( TransactionPayment::compute_fee(456, &dispatch_info, 789), - 76388, + 76_388, ); }); } @@ -368,7 +486,8 @@ fn compute_fee_does_not_overflow() { .execute_with(|| { // Overflow is handled let dispatch_info = DispatchInfo { - weight: Weight::MAX, + call_weight: Weight::MAX, + extension_weight: Default::default(), class: DispatchClass::Operational, pays_fee: Pays::Yes, }; @@ -391,16 +510,30 @@ fn actual_weight_higher_than_max_refunds_nothing() { .build() .execute_with(|| { let len = 10; - let user = AccountKeyring::Alice.to_account_id(); + let user = Sr25519Keyring::Alice.to_account_id(); + let alice_origin = RuntimeOrigin::signed(user.clone()); + + let val = ChargeTransactionPayment::::from(0) + .validate( + alice_origin.clone(), + &call(), + &info_from_weight(5), + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) + .unwrap(); + let pre = ChargeTransactionPayment::::from(0 /* tipped */) - .pre_dispatch(&user, &call(), &info_from_weight(100), len) + .prepare(val.1, &alice_origin, &call(), &info_from_weight(100), len) .unwrap(); assert_eq!(Balances::free_balance(&user), 999969001); ChargeTransactionPayment::::post_dispatch( - Some(pre), + pre, &info_from_weight(100), - &post_info_from_weight(101), + &mut post_info_from_weight(101), len, &Ok(()), ) @@ -420,20 +553,36 @@ fn zero_transfer_on_free_transaction() { System::set_block_number(10); let len = 10; let dispatch_info = DispatchInfo { - weight: Weight::from_ref_time(100), + call_weight: Weight::from_parts(100, 0), + extension_weight: Default::default(), pays_fee: Pays::No, class: DispatchClass::Normal, }; - let user = AccountKeyring::Alice.to_account_id(); + let user = Sr25519Keyring::Alice.to_account_id(); let bal_init = Balances::total_balance(&user); + let alice_origin = RuntimeOrigin::signed(user.clone()); + + let val = ChargeTransactionPayment::::from(0) + .validate( + alice_origin.clone(), + &call(), + &dispatch_info, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) + .unwrap(); + let pre = ChargeTransactionPayment::::from(0) - .pre_dispatch(&user, &call(), &dispatch_info, len) + .prepare(val.1, &alice_origin, &call(), &dispatch_info, len) .unwrap(); + assert_eq!(Balances::total_balance(&user), bal_init); assert!(ChargeTransactionPayment::::post_dispatch( - Some(pre), + pre, &dispatch_info, - &default_post_info(), + &mut default_post_info(), len, &Ok(()) ) @@ -452,22 +601,36 @@ fn refund_consistent_with_actual_weight() { .build() .execute_with(|| { let info = info_from_weight(100); - let post_info = post_info_from_weight(33); - let alice = AccountKeyring::Alice.to_account_id(); + let mut post_info = post_info_from_weight(33); + let alice = Sr25519Keyring::Alice.to_account_id(); let prev_balance = Balances::free_balance(&alice); let len = 10; let tip = 0; - TransactionPayment::put_next_fee_multiplier(Multiplier::saturating_from_rational(5, 4)); + NextFeeMultiplier::::put(Multiplier::saturating_from_rational(5, 4)); + + let alice_origin = RuntimeOrigin::signed(alice.clone()); + + let val = ChargeTransactionPayment::::from(0) + .validate( + alice_origin.clone(), + &call(), + &info_from_weight(100), + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) + .unwrap(); let pre = ChargeTransactionPayment::::from(tip) - .pre_dispatch(&alice, &call(), &info, len) + .prepare(val.1, &alice_origin, &call(), &info, len) .unwrap(); ChargeTransactionPayment::::post_dispatch( - Some(pre), + pre, &info, - &post_info, + &mut post_info, len, &Ok(()), ) @@ -478,7 +641,7 @@ fn refund_consistent_with_actual_weight() { TransactionPayment::compute_actual_fee(len as u32, &info, &post_info, tip); // 33 weight, 10 length, 7 base, 5 tip - assert_eq!(actual_fee, 30999); + assert_eq!(actual_fee, 30_999); assert_eq!(refund_based_fee, actual_fee); }); } @@ -494,7 +657,8 @@ fn normal_tx_with_tip() { fn normal_tx_with_tip_ext() { let len = 10; let tip = 42; - let user = AccountKeyring::Alice.to_account_id(); + let user = Sr25519Keyring::Alice.to_account_id(); + let alice_origin = RuntimeOrigin::signed(user.clone()); let call = call(); let normal_info = info_from_weight(100); @@ -503,21 +667,28 @@ fn normal_tx_with_tip_ext() { TransactionError::ZeroTip as u8, )); let pre_err = ChargeTransactionPayment::::from(tip) - .pre_dispatch(&user, &call, &normal_info, len) - .map(|_| ()) + .validate( + alice_origin.clone(), + &call, + &normal_info, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) .unwrap_err(); assert!(pre_err == expected_err); // Valid normal tx. assert!(ChargeTransactionPayment::::from(0) - .pre_dispatch(&user, &call, &normal_info, len) + .prepare(Val::NoCharge, &alice_origin, &call, &normal_info, len) .is_ok()); } #[test] fn operational_tx_with_tip() { - let cdd_provider = AccountKeyring::Bob.to_account_id(); - let gc_member = AccountKeyring::Charlie.to_account_id(); + let cdd_provider = Sr25519Keyring::Bob.to_account_id(); + let gc_member = Sr25519Keyring::Charlie.to_account_id(); ExtBuilder::default() .monied(true) @@ -530,27 +701,64 @@ fn operational_tx_with_tip() { fn operational_tx_with_tip_ext(cdd: AccountId, gc: AccountId) { let len = 10; let tip = 42; - let user = AccountKeyring::Alice.to_account_id(); + let user = Sr25519Keyring::Alice.to_account_id(); + let alice_origin = RuntimeOrigin::signed(user.clone()); let call = call(); let operational_info = operational_info_from_weight(100); // Valid operational tx with `tip == 0`. assert!(ChargeTransactionPayment::::from(0) - .pre_dispatch(&user, &call, &operational_info, len) + .prepare(Val::NoCharge, &alice_origin, &call, &operational_info, len) .is_ok()); // Valid operational tx with tip. Only CDD and Governance members can tip. assert!(ChargeTransactionPayment::::from(tip) - .pre_dispatch(&user, &call, &operational_info, len) + .validate( + alice_origin.clone(), + &call, + &operational_info, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) .is_err()); // Governance can tip. + let gc_origin = RuntimeOrigin::signed(gc.clone()); + + let val = ChargeTransactionPayment::::from(tip) + .validate( + gc_origin.clone(), + &call, + &operational_info, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) + .unwrap(); + assert!(ChargeTransactionPayment::::from(tip) - .pre_dispatch(&gc, &call, &operational_info, len) + .prepare(val.1, &gc_origin, &call, &operational_info, len) .is_ok()); // CDD can also tip. + let cdd_origin = RuntimeOrigin::signed(cdd.clone()); + + let val = ChargeTransactionPayment::::from(tip) + .validate( + cdd_origin.clone(), + &call, + &operational_info, + len, + Default::default(), + &TxBaseImplication(()), + TransactionSource::InBlock, + ) + .unwrap(); + assert!(ChargeTransactionPayment::::from(tip) - .pre_dispatch(&cdd, &call, &operational_info, len) + .prepare(val.1, &cdd_origin, &call, &operational_info, len) .is_ok()); } diff --git a/pallets/runtime/tests/src/transfer_compliance_test.rs b/pallets/runtime/tests/src/transfer_compliance_test.rs index 9ec6f30871..1a1c9e909c 100644 --- a/pallets/runtime/tests/src/transfer_compliance_test.rs +++ b/pallets/runtime/tests/src/transfer_compliance_test.rs @@ -1,21 +1,22 @@ -use super::{ - storage::{account_from, make_account, TestStorage, User}, - ExtBuilder, -}; -use frame_support::{ - assert_noop, assert_ok, - dispatch::{DispatchError, DispatchResult}, -}; +use std::collections::{HashMap, HashSet}; + +use frame_support::dispatch::DispatchResult; +use frame_support::pallet_prelude::DispatchError; +use frame_support::{assert_noop, assert_ok}; +use sp_arithmetic::Permill; +use sp_keyring::Sr25519Keyring; + use pallet_external_agents::Event; use pallet_statistics::AssetStats; -use polymesh_primitives::asset::AssetId; -use polymesh_primitives::{ - asset::AssetType, jurisdiction::CountryCode, statistics::*, transfer_compliance::*, AccountId, - Balance, Claim, ClaimType, IdentityId, PortfolioId, PortfolioKind, Scope, WeightMeter, -}; -use sp_arithmetic::Permill; -use sp_keyring::AccountKeyring; -use std::collections::{HashMap, HashSet}; +use polymesh_primitives::asset::{AssetId, AssetType}; +use polymesh_primitives::jurisdiction::CountryCode; +use polymesh_primitives::statistics::*; +use polymesh_primitives::transfer_compliance::*; +use polymesh_primitives::{AccountId, PortfolioKind, Scope, WeightMeter}; +use polymesh_primitives::{Balance, Claim, ClaimType, IdentityId, PortfolioId}; + +use super::storage::{account_from, make_account, TestStorage, User}; +use super::ExtBuilder; type Origin = ::RuntimeOrigin; type Identity = pallet_identity::Pallet; @@ -26,7 +27,7 @@ type Error = pallet_statistics::Error; type AssetError = pallet_asset::Error; type System = frame_system::Pallet; -const CDD_PROVIDER: AccountKeyring = AccountKeyring::Eve; +const CDD_PROVIDER: Sr25519Keyring = Sr25519Keyring::Eve; #[derive(Clone)] struct InvestorState { @@ -664,7 +665,7 @@ fn multiple_stats_with_ext() { claim_issuer: None, }, ]; - let issuers = vec![User::new(AccountKeyring::Dave)]; + let issuers = vec![User::new(Sr25519Keyring::Dave)]; let claim_types = vec![ ClaimType::Accredited, ClaimType::Affiliate, @@ -824,7 +825,7 @@ fn claim_count_rule_with_ext() { // Create an asset. let mut tracker = AssetTracker::new(); - let issuer = User::new(AccountKeyring::Dave); + let issuer = User::new(Sr25519Keyring::Dave); let claim_types = vec![ClaimType::Accredited]; // Add issuer. tracker.add_issuer(&issuer, &claim_types[..]); @@ -912,7 +913,7 @@ fn jurisdiction_count_rule_with_ext() { // Create an asset. let mut tracker = AssetTracker::new(); - let issuer = User::new(AccountKeyring::Dave); + let issuer = User::new(Sr25519Keyring::Dave); let claim_type = ClaimType::Jurisdiction; // Add issuer. tracker.add_issuer(&issuer, &[claim_type]); @@ -998,7 +999,7 @@ fn jurisdiction_ownership_rule_with_ext() { // Create an asset. let mut tracker = AssetTracker::new(); - let issuer = User::new(AccountKeyring::Dave); + let issuer = User::new(Sr25519Keyring::Dave); let claim_type = ClaimType::Jurisdiction; // Add issuer. tracker.add_issuer(&issuer, &[claim_type]); diff --git a/pallets/runtime/tests/src/treasury_test.rs b/pallets/runtime/tests/src/treasury_test.rs index d37a3a6eea..73976d6a1d 100644 --- a/pallets/runtime/tests/src/treasury_test.rs +++ b/pallets/runtime/tests/src/treasury_test.rs @@ -5,7 +5,7 @@ use super::{ }; use polymesh_primitives::{Beneficiary, IdentityId}; -use sp_keyring::AccountKeyring; +use sp_keyring::Sr25519Keyring; use sp_runtime::DispatchError; use pallet_balances::TotalIssuance; @@ -29,9 +29,9 @@ fn reimbursement_and_disbursement() { } fn reimbursement_and_disbursement_we() { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); - let charlie_acc = AccountKeyring::Charlie.to_account_id(); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); + let charlie_acc = Sr25519Keyring::Charlie.to_account_id(); let (_, charlie_did) = make_account_without_cdd(charlie_acc.clone()).unwrap(); let total_issuance = TotalIssuance::::get(); @@ -100,8 +100,8 @@ fn bad_disbursement_did() { } fn bad_disbursement_did_we() { - let alice = User::new(AccountKeyring::Alice); - let bob = User::new(AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice); + let bob = User::new(Sr25519Keyring::Bob); let default_key = pallet_identity::types::zero_account_id(); let total_issuance = TotalIssuance::::get(); diff --git a/pallets/runtime/tests/src/utility_test.rs b/pallets/runtime/tests/src/utility_test.rs index 9216d7a0a4..1987506434 100644 --- a/pallets/runtime/tests/src/utility_test.rs +++ b/pallets/runtime/tests/src/utility_test.rs @@ -1,43 +1,38 @@ use codec::Encode; -use frame_support::dispatch::{ - extract_actual_weight, DispatchError, DispatchErrorWithPostInfo, Dispatchable, GetDispatchInfo, - Pays, PostDispatchInfo, Weight, -}; +use frame_support::dispatch::{extract_actual_weight, DispatchErrorWithPostInfo}; +use frame_support::dispatch::{GetDispatchInfo, Pays, PostDispatchInfo}; use frame_support::error::BadOrigin; +use frame_support::pallet_prelude::DispatchError; use frame_support::traits::Contains; -use frame_support::{ - assert_err_ignore_postinfo, assert_noop, assert_ok, assert_storage_noop, storage, -}; +use frame_support::weights::Weight; +use frame_support::{assert_err_ignore_postinfo, assert_noop, assert_ok}; +use frame_support::{assert_storage_noop, storage}; use frame_system::{Call as SystemCall, EventRecord}; -use pallet_timestamp::Call as TimestampCall; +use sp_keyring::Sr25519Keyring; +use sp_runtime::traits::Dispatchable; +use sp_runtime::MultiSignature; use pallet_asset::UniqueTickerRegistration; use pallet_balances::Call as BalancesCall; use pallet_pips::{PipIdSequence, ProposalState, SnapshotResult}; use pallet_portfolio::{Call as PortfolioCall, Portfolios}; -use pallet_utility::{ - self as utility, Call as UtilityCall, Config as UtilityConfig, Event, Nonces, UniqueCall, - WeightInfo, -}; -use polymesh_primitives::{ - traits::CddAndFeeDetails, AccountId, Balance, ExtrinsicPermissions, PalletPermissions, - Permissions, PortfolioName, PortfolioNumber, SubsetRestriction, Ticker, -}; -use sp_core::sr25519::Signature; -use sp_keyring::AccountKeyring; +use pallet_timestamp::Call as TimestampCall; +use pallet_utility::{self as utility, Call as UtilityCall, Config as UtilityConfig}; +use pallet_utility::{Event, Nonces, UniqueCall, WeightInfo}; +use polymesh_primitives::traits::CddAndFeeDetails; +use polymesh_primitives::{AccountId, Balance, ExtrinsicPermissions}; +use polymesh_primitives::{PalletPermissions, Permissions, PortfolioName}; +use polymesh_primitives::{PortfolioNumber, SubsetRestriction, Ticker}; use super::committee_test::set_members; use super::pips_test::{assert_balance, assert_state, committee_proposal, community_proposal}; use super::storage::example::Call as ExampleCall; -use super::storage::{ - add_secondary_key, get_secondary_keys, next_block, register_keyring_account_with_balance, - EventTest, Identity, Portfolio, RuntimeCall, RuntimeOrigin, System, TestBaseCallFilter, - TestStorage, User, Utility, -}; +use super::storage::{add_secondary_key, get_secondary_keys, next_block, TestStorage, Utility}; +use super::storage::{register_keyring_account_with_balance, EventTest, Identity, User}; +use super::storage::{Portfolio, RuntimeCall, RuntimeOrigin, System, TestBaseCallFilter}; use super::{assert_event_doesnt_exist, assert_event_exists, assert_last_event, ExtBuilder}; type Error = utility::Error; - type Balances = pallet_balances::Pallet; type Pips = pallet_pips::Pallet; type Committee = pallet_committee::Pallet; @@ -54,18 +49,12 @@ fn consensus_call(call: RuntimeCall, signers: &[User]) { } fn transfer(to: AccountId, amount: Balance) -> RuntimeCall { - RuntimeCall::Balances(BalancesCall::transfer { + RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: to.into(), value: amount, }) } -const ERROR: DispatchError = DispatchError::Module(sp_runtime::ModuleError { - index: 5, - error: [2, 0, 0, 0], - message: None, -}); - #[track_caller] fn assert_event(event: Event) { assert_eq!( @@ -78,13 +67,13 @@ fn batch_test(test: impl FnOnce(AccountId, AccountId)) { ExtBuilder::default().build().execute_with(|| { System::set_block_number(1); - let alice = AccountKeyring::Alice.to_account_id(); + let alice = Sr25519Keyring::Alice.to_account_id(); TestStorage::set_payer_context(Some(alice.clone())); - let _ = register_keyring_account_with_balance(AccountKeyring::Alice, 1_000).unwrap(); + let _ = register_keyring_account_with_balance(Sr25519Keyring::Alice, 1_000).unwrap(); - let bob = AccountKeyring::Bob.to_account_id(); + let bob = Sr25519Keyring::Bob.to_account_id(); TestStorage::set_payer_context(Some(bob.clone())); - let _ = register_keyring_account_with_balance(AccountKeyring::Bob, 1_000).unwrap(); + let _ = register_keyring_account_with_balance(Sr25519Keyring::Bob, 1_000).unwrap(); assert_balance(alice.clone(), 1000, 0); assert_balance(bob.clone(), 1000, 0); @@ -117,7 +106,7 @@ fn batch_early_exit_works() { assert_balance(bob, 1000 + 400, 0); assert_event(Event::BatchInterrupted { index: 1, - error: ERROR, + error: sp_runtime::TokenError::FundsUnavailable.into(), }); }) } @@ -156,7 +145,9 @@ fn batch_optimistic_failures_listed() { ); assert_eq!( events.pop().unwrap().event, - EventTest::Utility(Event::ItemFailed { error: ERROR }) + EventTest::Utility(Event::ItemFailed { + error: sp_runtime::TokenError::FundsUnavailable.into() + }) ); assert_eq!( events.pop().unwrap().event, @@ -164,15 +155,18 @@ fn batch_optimistic_failures_listed() { ); // skip Balances::Transfer event. events.pop().unwrap(); - events.pop().unwrap(); assert_eq!( events.pop().unwrap().event, - EventTest::Utility(Event::ItemFailed { error: ERROR }) + EventTest::Utility(Event::ItemFailed { + error: sp_runtime::TokenError::FundsUnavailable.into() + }) ); assert_eq!( events.pop().unwrap().event, - EventTest::Utility(Event::ItemFailed { error: ERROR }) + EventTest::Utility(Event::ItemFailed { + error: sp_runtime::TokenError::FundsUnavailable.into() + }) ); assert_eq!( events.pop().unwrap().event, @@ -204,7 +198,7 @@ fn batch_atomic_early_exit_works() { let calls = vec![trans(400), trans(900), trans(400)]; assert_storage_noop!(assert_err_ignore_postinfo!( Utility::batch_all(RuntimeOrigin::signed(alice.clone()), calls), - pallet_balances::Error::::InsufficientBalance + sp_runtime::TokenError::FundsUnavailable )); assert_balance(alice, 1000, 0); assert_balance(bob, 1000, 0); @@ -219,14 +213,14 @@ fn relay_happy_case() { } fn _relay_happy_case() { - let alice = AccountKeyring::Alice.to_account_id(); - let _ = register_keyring_account_with_balance(AccountKeyring::Alice, 1_000).unwrap(); + let alice = Sr25519Keyring::Alice.to_account_id(); + let _ = register_keyring_account_with_balance(Sr25519Keyring::Alice, 1_000).unwrap(); - let bob = AccountKeyring::Bob.to_account_id(); - let _ = register_keyring_account_with_balance(AccountKeyring::Bob, 1_000).unwrap(); + let bob = Sr25519Keyring::Bob.to_account_id(); + let _ = register_keyring_account_with_balance(Sr25519Keyring::Bob, 1_000).unwrap(); - let charlie = AccountKeyring::Charlie.to_account_id(); - let _ = register_keyring_account_with_balance(AccountKeyring::Charlie, 1_000).unwrap(); + let charlie = Sr25519Keyring::Charlie.to_account_id(); + let _ = register_keyring_account_with_balance(Sr25519Keyring::Charlie, 1_000).unwrap(); // 41 Extra for registering a DID assert_balance(bob.clone(), 1041, 0); @@ -235,7 +229,7 @@ fn _relay_happy_case() { let origin = RuntimeOrigin::signed(alice); let transaction = UniqueCall::new( Nonces::::get(bob.clone()), - RuntimeCall::Balances(BalancesCall::transfer { + RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: charlie.clone().into(), value: 50, }), @@ -244,7 +238,7 @@ fn _relay_happy_case() { assert_ok!(Utility::relay_tx( origin, bob.clone(), - AccountKeyring::Bob.sign(&transaction.encode()).into(), + Sr25519Keyring::Bob.sign(&transaction.encode()).into(), transaction )); @@ -260,44 +254,45 @@ fn relay_unhappy_cases() { } fn _relay_unhappy_cases() { - let alice = AccountKeyring::Alice.to_account_id(); - let _ = register_keyring_account_with_balance(AccountKeyring::Alice, 1_000).unwrap(); + let alice = Sr25519Keyring::Alice.to_account_id(); + let _ = register_keyring_account_with_balance(Sr25519Keyring::Alice, 1_000).unwrap(); - let bob = AccountKeyring::Bob.to_account_id(); + let bob = Sr25519Keyring::Bob.to_account_id(); - let charlie = AccountKeyring::Charlie.to_account_id(); + let charlie = Sr25519Keyring::Charlie.to_account_id(); let origin = RuntimeOrigin::signed(alice); let transaction = UniqueCall::new( Nonces::::get(bob.clone()), - RuntimeCall::Balances(BalancesCall::transfer { + RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: charlie.clone().into(), value: 59, }), ); + let signature = MultiSignature::Sr25519(Default::default()); assert_noop!( Utility::relay_tx( origin.clone(), bob.clone(), - Signature([0; 64]).into(), + signature.clone(), transaction.clone() ), Error::InvalidSignature ); - let _ = register_keyring_account_with_balance(AccountKeyring::Bob, 1_000).unwrap(); + let _ = register_keyring_account_with_balance(Sr25519Keyring::Bob, 1_000).unwrap(); let transaction = UniqueCall::new( Nonces::::get(bob.clone()) + 1, - RuntimeCall::Balances(BalancesCall::transfer { + RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: charlie.into(), value: 59, }), ); assert_noop!( - Utility::relay_tx(origin.clone(), bob, Signature([0; 64]).into(), transaction), + Utility::relay_tx(origin.clone(), bob, signature, transaction), Error::InvalidNonce ); } @@ -311,8 +306,8 @@ fn batch_secondary_with_permissions_works() { fn batch_secondary_with_permissions() { System::set_block_number(1); - let alice = User::new(AccountKeyring::Alice).balance(1_000); - let bob = User::new_with(alice.did, AccountKeyring::Bob); + let alice = User::new(Sr25519Keyring::Alice).balance(1_000); + let bob = User::new_with(alice.did, Sr25519Keyring::Bob); let check_name = |name| { assert_eq!( Portfolios::::get(&alice.did, &PortfolioNumber(1)), @@ -419,8 +414,8 @@ fn call_foobar(err: bool, start_weight: Weight, end_weight: Option) -> R #[test] fn sub_batch_with_root_works() { new_test_ext().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie).balance(10); - let ferdie = User::new(AccountKeyring::Ferdie).balance(10); + let charlie = User::new(Sr25519Keyring::Charlie).balance(10); + let ferdie = User::new(Sr25519Keyring::Ferdie).balance(10); let k = b"a".to_vec(); let call = RuntimeCall::System(frame_system::Call::set_storage { items: vec![(k.clone(), k.clone())], @@ -453,8 +448,8 @@ fn sub_batch_with_root_works() { #[test] fn sub_batch_with_signed_works() { new_test_ext().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie).balance(10); - let ferdie = User::new(AccountKeyring::Ferdie).balance(10); + let charlie = User::new(Sr25519Keyring::Charlie).balance(10); + let ferdie = User::new(Sr25519Keyring::Ferdie).balance(10); assert_eq!(Balances::free_balance(charlie.acc()), 10); assert_eq!(Balances::free_balance(ferdie.acc()), 10); assert_ok!(Utility::batch( @@ -469,7 +464,7 @@ fn sub_batch_with_signed_works() { #[test] fn sub_batch_with_signed_filters() { new_test_ext().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie); + let charlie = User::new(Sr25519Keyring::Charlie); assert_ok!(Utility::batch( charlie.origin(), vec![RuntimeCall::Example(ExampleCall::noop2 {})] @@ -487,9 +482,9 @@ fn sub_batch_with_signed_filters() { #[test] fn sub_batch_handles_weight_refund() { new_test_ext().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie); - let start_weight = Weight::from_ref_time(100); - let end_weight = Weight::from_ref_time(75); + let charlie = User::new(Sr25519Keyring::Charlie); + let start_weight = Weight::from_parts(100, 0); + let end_weight = Weight::from_parts(75, 0); let diff = start_weight - end_weight; let batch_len = 4; @@ -500,7 +495,7 @@ fn sub_batch_handles_weight_refund() { let info = call.get_dispatch_info(); let result = call.dispatch(charlie.origin()); assert_ok!(result); - assert_eq!(extract_actual_weight(&result, &info), info.weight); + assert_eq!(extract_actual_weight(&result, &info), info.call_weight); // Refund weight when ok let inner_call = call_foobar(false, start_weight, Some(end_weight)); @@ -512,7 +507,7 @@ fn sub_batch_handles_weight_refund() { // Diff is refunded assert_eq!( extract_actual_weight(&result, &info), - info.weight - diff * batch_len + info.call_weight - diff * batch_len ); // Full weight when err @@ -531,7 +526,7 @@ fn sub_batch_handles_weight_refund() { .into(), ); // No weight is refunded - assert_eq!(extract_actual_weight(&result, &info), info.weight); + assert_eq!(extract_actual_weight(&result, &info), info.call_weight); // Refund weight when err let good_call = call_foobar(false, start_weight, Some(end_weight)); @@ -551,7 +546,7 @@ fn sub_batch_handles_weight_refund() { ); assert_eq!( extract_actual_weight(&result, &info), - info.weight - diff * batch_len + info.call_weight - diff * batch_len ); // Partial batch completion @@ -580,8 +575,8 @@ fn sub_batch_handles_weight_refund() { #[test] fn sub_batch_all_works() { new_test_ext().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie).balance(10); - let ferdie = User::new(AccountKeyring::Ferdie).balance(10); + let charlie = User::new(Sr25519Keyring::Charlie).balance(10); + let ferdie = User::new(Sr25519Keyring::Ferdie).balance(10); assert_eq!(Balances::free_balance(charlie.acc()), 10); assert_eq!(Balances::free_balance(ferdie.acc()), 10); assert_ok!(Utility::batch_all( @@ -596,8 +591,8 @@ fn sub_batch_all_works() { #[test] fn sub_batch_all_revert() { new_test_ext().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie).balance(10); - let ferdie = User::new(AccountKeyring::Ferdie).balance(10); + let charlie = User::new(Sr25519Keyring::Charlie).balance(10); + let ferdie = User::new(Sr25519Keyring::Ferdie).balance(10); let call = transfer(ferdie.acc(), 5); let info = call.get_dispatch_info(); @@ -615,11 +610,12 @@ fn sub_batch_all_revert() { DispatchErrorWithPostInfo { post_info: PostDispatchInfo { actual_weight: Some( - ::WeightInfo::batch_all(2) + info.weight * 2 + ::WeightInfo::batch_all(2) + + info.call_weight * 2 ), pays_fee: Pays::Yes }, - error: pallet_balances::Error::::InsufficientBalance.into() + error: sp_runtime::TokenError::FundsUnavailable.into(), } ); assert_eq!(Balances::free_balance(charlie.acc()), 10); @@ -630,9 +626,9 @@ fn sub_batch_all_revert() { #[test] fn sub_batch_all_handles_weight_refund() { new_test_ext().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie).balance(10); - let start_weight = Weight::from_ref_time(100); - let end_weight = Weight::from_ref_time(75); + let charlie = User::new(Sr25519Keyring::Charlie).balance(10); + let start_weight = Weight::from_parts(100, 0); + let end_weight = Weight::from_parts(75, 0); let diff = start_weight - end_weight; let batch_len = 4; @@ -643,7 +639,7 @@ fn sub_batch_all_handles_weight_refund() { let info = call.get_dispatch_info(); let result = call.dispatch(charlie.origin()); assert_ok!(result); - assert_eq!(extract_actual_weight(&result, &info), info.weight); + assert_eq!(extract_actual_weight(&result, &info), info.call_weight); // Refund weight when ok let inner_call = call_foobar(false, start_weight, Some(end_weight)); @@ -655,7 +651,7 @@ fn sub_batch_all_handles_weight_refund() { // Diff is refunded assert_eq!( extract_actual_weight(&result, &info), - info.weight - diff * batch_len + info.call_weight - diff * batch_len ); // Full weight when err @@ -667,7 +663,7 @@ fn sub_batch_all_handles_weight_refund() { let result = call.dispatch(charlie.origin()); assert_err_ignore_postinfo!(result, "The cake is a lie."); // No weight is refunded - assert_eq!(extract_actual_weight(&result, &info), info.weight); + assert_eq!(extract_actual_weight(&result, &info), info.call_weight); // Refund weight when err let good_call = call_foobar(false, start_weight, Some(end_weight)); @@ -680,7 +676,7 @@ fn sub_batch_all_handles_weight_refund() { assert_err_ignore_postinfo!(result, "The cake is a lie."); assert_eq!( extract_actual_weight(&result, &info), - info.weight - diff * batch_len + info.call_weight - diff * batch_len ); // Partial batch completion @@ -702,8 +698,8 @@ fn sub_batch_all_handles_weight_refund() { #[test] fn sub_batch_all_does_not_nest() { new_test_ext().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie).balance(10); - let ferdie = User::new(AccountKeyring::Ferdie).balance(10); + let charlie = User::new(Sr25519Keyring::Charlie).balance(10); + let ferdie = User::new(Sr25519Keyring::Ferdie).balance(10); let batch_all = RuntimeCall::Utility(UtilityCall::batch_all { calls: vec![ transfer(ferdie.acc(), 1), @@ -722,7 +718,7 @@ fn sub_batch_all_does_not_nest() { DispatchErrorWithPostInfo { post_info: PostDispatchInfo { actual_weight: Some( - ::WeightInfo::batch_all(1) + info.weight + ::WeightInfo::batch_all(1) + info.call_weight ), pays_fee: Pays::Yes }, @@ -754,7 +750,7 @@ fn sub_batch_all_does_not_nest() { #[test] fn sub_batch_limit() { new_test_ext().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie).balance(10); + let charlie = User::new(Sr25519Keyring::Charlie).balance(10); let calls = vec![RuntimeCall::System(SystemCall::remark { remark: vec![] }); 40_000]; assert_noop!( Utility::batch(charlie.origin(), calls.clone()), @@ -770,15 +766,15 @@ fn sub_batch_limit() { #[test] fn sub_force_batch_works() { new_test_ext().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie).balance(10); - let ferdie = User::new(AccountKeyring::Ferdie).balance(10); + let charlie = User::new(Sr25519Keyring::Charlie).balance(10); + let ferdie = User::new(Sr25519Keyring::Ferdie).balance(10); assert_eq!(Balances::free_balance(charlie.acc()), 10); assert_eq!(Balances::free_balance(ferdie.acc()), 10); assert_ok!(Utility::force_batch( charlie.origin(), vec![ transfer(ferdie.acc(), 5), - call_foobar(true, Weight::from_ref_time(75), None), + call_foobar(true, Weight::from_parts(75, 0), None), transfer(ferdie.acc(), 10), transfer(ferdie.acc(), 5), ] @@ -822,7 +818,7 @@ fn sub_none_origin_does_not_work() { #[test] fn sub_batch_doesnt_work_with_inherents() { new_test_ext().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie).balance(10); + let charlie = User::new(Sr25519Keyring::Charlie).balance(10); // fails because inherents expect the origin to be none. assert_ok!(Utility::batch( charlie.origin(), @@ -853,7 +849,7 @@ fn sub_force_batch_doesnt_work_with_inherents() { #[test] fn sub_batch_all_doesnt_work_with_inherents() { new_test_ext().execute_with(|| { - let charlie = User::new(AccountKeyring::Charlie).balance(10); + let charlie = User::new(Sr25519Keyring::Charlie).balance(10); let batch_all = RuntimeCall::Utility(UtilityCall::batch_all { calls: vec![RuntimeCall::Timestamp(TimestampCall::set { now: 42 })], }); @@ -864,7 +860,7 @@ fn sub_batch_all_doesnt_work_with_inherents() { batch_all.dispatch(charlie.origin()), DispatchErrorWithPostInfo { post_info: PostDispatchInfo { - actual_weight: Some(info.weight), + actual_weight: Some(info.call_weight), pays_fee: Pays::Yes }, error: BadOrigin.into(), @@ -876,10 +872,10 @@ fn sub_batch_all_doesnt_work_with_inherents() { #[test] fn batch_works_with_committee_origin() { new_test_ext().execute_with(|| { - let proposer = User::new(AccountKeyring::Dave); + let proposer = User::new(Sr25519Keyring::Dave); - let bob = User::new(AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); + let bob = User::new(Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); set_members(vec![bob.did, charlie.did]); assert_ok!(Pips::set_min_proposal_deposit(RuntimeOrigin::root(), 10)); @@ -910,10 +906,10 @@ fn batch_works_with_committee_origin() { #[test] fn force_batch_works_with_committee_origin() { new_test_ext().execute_with(|| { - let proposer = User::new(AccountKeyring::Dave); + let proposer = User::new(Sr25519Keyring::Dave); - let bob = User::new(AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); + let bob = User::new(Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); set_members(vec![bob.did, charlie.did]); assert_ok!(Pips::set_min_proposal_deposit(RuntimeOrigin::root(), 10)); @@ -944,10 +940,10 @@ fn force_batch_works_with_committee_origin() { #[test] fn batch_all_works_with_committee_origin() { new_test_ext().execute_with(|| { - let proposer = User::new(AccountKeyring::Dave); + let proposer = User::new(Sr25519Keyring::Dave); - let bob = User::new(AccountKeyring::Bob); - let charlie = User::new(AccountKeyring::Charlie); + let bob = User::new(Sr25519Keyring::Bob); + let charlie = User::new(Sr25519Keyring::Charlie); set_members(vec![bob.did, charlie.did]); assert_ok!(Pips::set_min_proposal_deposit(RuntimeOrigin::root(), 10)); @@ -978,15 +974,9 @@ fn batch_all_works_with_committee_origin() { #[test] fn sub_with_weight_works() { new_test_ext().execute_with(|| { - let weights = ::BlockWeights::get(); let upgrade_code_call = Box::new(RuntimeCall::System( frame_system::Call::set_code_without_checks { code: vec![] }, )); - // Weight before is max. - assert_eq!( - upgrade_code_call.get_dispatch_info().weight, - weights.max_block - ); assert_eq!( upgrade_code_call.get_dispatch_info().class, frame_support::dispatch::DispatchClass::Operational @@ -998,7 +988,7 @@ fn sub_with_weight_works() { }; // Weight after is set by Root. assert_eq!( - with_weight_call.get_dispatch_info().weight, + with_weight_call.get_dispatch_info().call_weight, Weight::from_parts(123, 456) ); assert_eq!( @@ -1012,7 +1002,7 @@ fn sub_with_weight_works() { fn as_derivative() { new_test_ext().execute_with(|| { let ticker: Ticker = Ticker::from_slice_truncated(b"TICKER".as_ref()); - let alice = User::new(AccountKeyring::Alice).balance(1_000_000); + let alice = User::new(Sr25519Keyring::Alice).balance(1_000_000); let derivative_alice_account = Utility::derivative_account_id(alice.acc(), 1).unwrap(); Identity::unsafe_join_identity( alice.did, @@ -1020,7 +1010,8 @@ fn as_derivative() { derivative_alice_account.clone(), ); let derivative_alice_id = Identity::get_identity(&derivative_alice_account).unwrap(); - Balances::transfer(alice.origin(), derivative_alice_account.into(), 1_000_000).unwrap(); + Balances::transfer_allow_death(alice.origin(), derivative_alice_account.into(), 1_000_000) + .unwrap(); let call = RuntimeCall::Asset(pallet_asset::Call::register_unique_ticker { ticker }); assert_ok!(Utility::as_derivative(alice.origin(), 1, Box::new(call))); diff --git a/pallets/settlement/Cargo.toml b/pallets/settlement/Cargo.toml index 8a7dda8987..5e7b1c9f70 100644 --- a/pallets/settlement/Cargo.toml +++ b/pallets/settlement/Cargo.toml @@ -22,20 +22,20 @@ hex-literal = "0.2.1" hex = { version = "0.4.2", optional = true } log = "0.4.8" -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } -pallet-scheduler = { version = "4.0.0-dev", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +pallet-timestamp = { workspace = true, default-features = false } +pallet-scheduler = { workspace = true, default-features = false } # Only in STD -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [features] equalize = [] @@ -53,6 +53,7 @@ std = [ "pallet-timestamp/std", "pallet-permissions/std", "pallet-compliance-manager/std", + "pallet-nft/std", "polymesh-primitives/std", "serde/std", "serde_derive", @@ -65,5 +66,13 @@ std = [ ] runtime-benchmarks = [ "frame-benchmarking", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-asset/runtime-benchmarks", + "pallet-compliance-manager/runtime-benchmarks", + "pallet-external-agents/runtime-benchmarks", + "pallet-nft/runtime-benchmarks", + "pallet-permissions/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks" ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/settlement/src/benchmarking.rs b/pallets/settlement/src/benchmarking.rs index 83c2a910bd..7176d35706 100644 --- a/pallets/settlement/src/benchmarking.rs +++ b/pallets/settlement/src/benchmarking.rs @@ -201,7 +201,7 @@ where fn setup_execute_instruction( sender: &User, receiver: &User, - settlement_type: SettlementType, + settlement_type: SettlementType>, venue_id: VenueId, f: u32, n: u32, diff --git a/pallets/settlement/src/lib.rs b/pallets/settlement/src/lib.rs index 2d061b39a2..2bc4132453 100644 --- a/pallets/settlement/src/lib.rs +++ b/pallets/settlement/src/lib.rs @@ -51,14 +51,14 @@ pub mod benchmarking; use codec::{Decode, Encode}; use frame_support::dispatch::{ - DispatchError, DispatchErrorWithPostInfo, DispatchResult, DispatchResultWithPostInfo, - PostDispatchInfo, + DispatchErrorWithPostInfo, DispatchResult, DispatchResultWithPostInfo, PostDispatchInfo, }; use frame_support::pallet_prelude::*; use frame_support::storage::with_transaction as frame_support_with_transaction; use frame_support::storage::TransactionOutcome; -use frame_support::traits::schedule::{DispatchTime, Named}; -use frame_support::traits::Get; +use frame_support::traits::schedule::v3::Named as ScheduleNamed; +use frame_support::traits::schedule::DispatchTime; +use frame_support::traits::{Get, QueryPreimage, StorePreimage}; use frame_support::weights::Weight; use frame_support::{ensure, BoundedBTreeSet}; use frame_system::pallet_prelude::*; @@ -159,7 +159,7 @@ pub mod pallet { IdentityId, Option, InstructionId, - SettlementType, + SettlementType>, Option, Option, Vec, @@ -418,14 +418,18 @@ pub mod pallet { + pallet_nft::Config + pallet_timestamp::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// A call type used by the scheduler. - type Proposal: From> + Into<::Proposal>; + type SchedulerCall: From> + + Into<::Proposal> + + Encode; /// Scheduler of settlement instructions. - type Scheduler: Named::Proposal, Self::SchedulerOrigin>; + type Scheduler: ScheduleNamed< + BlockNumberFor, + Self::SchedulerCall, + Self::SchedulerOrigin, + Hasher = Self::Hashing, + >; /// Portfolio module. type Portfolio: PortfolioSubTrait; @@ -464,6 +468,9 @@ pub mod pallet { /// The maximum time period that an instruction can be held in the `LockedForExecution` status. #[pallet::constant] type MaximumLockPeriod: Get; + + /// Preimage provider for the scheduler. + type SchedulerPreimage: QueryPreimage + StorePreimage; } #[pallet::error] @@ -572,6 +579,8 @@ pub mod pallet { ReceiverIdentityNotFound, /// Invalid account id. InvalidAccountId, + /// TaskName cannot exceed 32 bytes. + InvalidTaskName, } storage_migration_ver!(3); @@ -616,7 +625,7 @@ pub mod pallet { _, Twox64Concat, InstructionId, - Instruction, + Instruction>, ValueQuery, >; @@ -693,8 +702,13 @@ pub mod pallet { /// Instruction statuses. instruction_id -> InstructionStatus #[pallet::storage] - pub type InstructionStatuses = - StorageMap<_, Twox64Concat, InstructionId, InstructionStatus, ValueQuery>; + pub type InstructionStatuses = StorageMap< + _, + Twox64Concat, + InstructionId, + InstructionStatus>, + ValueQuery, + >; /// Legs under an instruction. (instruction_id, leg_id) -> Leg #[pallet::storage] @@ -741,11 +755,14 @@ pub mod pallet { pub(super) type StorageVersion = StorageValue<_, Version, ValueQuery>; #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig; + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { VenueCounter::::put(VenueId(1)); InstructionCounter::::put(InstructionId(1)); @@ -1018,7 +1035,7 @@ pub mod pallet { pub fn add_instruction( origin: OriginFor, venue_id: Option, - settlement_type: SettlementType, + settlement_type: SettlementType>, trade_date: Option, value_date: Option, legs: Vec, @@ -1056,7 +1073,7 @@ pub mod pallet { pub fn add_and_affirm_instruction( origin: OriginFor, venue_id: Option, - settlement_type: SettlementType, + settlement_type: SettlementType>, trade_date: Option, value_date: Option, legs: Vec, @@ -1306,7 +1323,7 @@ pub mod pallet { pub fn add_instruction_with_mediators( origin: OriginFor, venue_id: Option, - settlement_type: SettlementType, + settlement_type: SettlementType>, trade_date: Option, value_date: Option, legs: Vec, @@ -1346,7 +1363,7 @@ pub mod pallet { pub fn add_and_affirm_with_mediators( origin: OriginFor, venue_id: Option, - settlement_type: SettlementType, + settlement_type: SettlementType>, trade_date: Option, value_date: Option, legs: Vec, @@ -1512,7 +1529,7 @@ impl Pallet { origin: OriginFor, id: InstructionId, is_execute: bool, - ) -> EnsureValidInstructionResult { + ) -> EnsureValidInstructionResult> { let origin_data = pallet_identity::Pallet::::ensure_origin_call_permissions(origin)?; Ok(( origin_data.primary_did, @@ -1531,7 +1548,7 @@ impl Pallet { pub fn base_add_instruction( did: IdentityId, venue_id: Option, - settlement_type: SettlementType, + settlement_type: SettlementType>, trade_date: Option, value_date: Option, legs: Vec, @@ -1657,7 +1674,7 @@ impl Pallet { instruction_info.nfts_transferred(), instruction_info.off_chain(), ); - Self::schedule_instruction(instruction_id, block_number, weight_limit); + Self::schedule_instruction(instruction_id, block_number, weight_limit)?; } Ok(instruction_id) @@ -1783,7 +1800,7 @@ impl Pallet { fn ensure_instruction_validity( id: InstructionId, is_execute: bool, - ) -> Result, DispatchError> { + ) -> Result>, DispatchError> { let details = InstructionDetails::::get(id); ensure!( InstructionStatuses::::get(id) != InstructionStatus::Unknown, @@ -2179,15 +2196,20 @@ impl Pallet { /// Schedule a given instruction to be executed on the next block only if the /// settlement type is `SettleOnAffirmation` and no. of affirms pending is 0. - fn maybe_schedule_instruction(affirms_pending: u64, id: InstructionId, weight_limit: Weight) { + fn maybe_schedule_instruction( + affirms_pending: u64, + id: InstructionId, + weight_limit: Weight, + ) -> DispatchResult { if affirms_pending == 0 && InstructionDetails::::get(id).settlement_type == SettlementType::SettleOnAffirmation { // Schedule instruction to be executed in the next block. let execution_at = System::::block_number() + One::one(); - Self::schedule_instruction(id, execution_at, weight_limit); + Self::schedule_instruction(id, execution_at, weight_limit)?; } + Ok(()) } /// Schedule execution of given instruction at given block number. @@ -2197,23 +2219,36 @@ impl Pallet { /// for the given block so there are chances where the instruction execution block no. may drift. pub(crate) fn schedule_instruction( id: InstructionId, - execution_at: T::BlockNumber, + execution_at: BlockNumberFor, weight_limit: Weight, - ) { - let call = Call::::execute_scheduled_instruction { id, weight_limit }.into(); + ) -> DispatchResult { + let scheduler_call = + ::SchedulerCall::from(Call::::execute_scheduled_instruction { + id, + weight_limit, + }); + + let execute_inst_call = ::SchedulerPreimage::bound(scheduler_call)?; + + let task_name = id + .execution_name() + .map_err(|_| Error::::InvalidTaskName)?; + if let Err(_) = T::Scheduler::schedule_named( - id.execution_name(), + task_name, DispatchTime::At(execution_at), None, SETTLEMENT_INSTRUCTION_EXECUTION_PRIORITY, RawOrigin::Root.into(), - call, + execute_inst_call, ) { Self::deposit_event(Event::SchedulingFailed( id, Error::::FailedToSchedule.into(), )); } + + Ok(()) } /// Affirms all legs from the instruction of the given `instruction_id`, where `portfolios` are a counter party. @@ -2337,7 +2372,11 @@ impl Pallet { instruction_asset_count.off_chain(), ); // Schedule instruction to be executed in the next block (expected) if conditions are met. - Self::maybe_schedule_instruction(InstructionAffirmsPending::::get(id), id, weight_limit); + Self::maybe_schedule_instruction( + InstructionAffirmsPending::::get(id), + id, + weight_limit, + )?; Ok(PostDispatchInfo::from(Some( Self::affirm_with_receipts_actual_weight( filtered_legs.sender_asset_count().clone(), @@ -2366,7 +2405,11 @@ impl Pallet { instruction_asset_count.off_chain(), ); // Schedule the instruction if conditions are met - Self::maybe_schedule_instruction(InstructionAffirmsPending::::get(id), id, weight_limit); + Self::maybe_schedule_instruction( + InstructionAffirmsPending::::get(id), + id, + weight_limit, + )?; Ok(PostDispatchInfo::from(Some( Self::affirm_instruction_actual_weight( filtered_legs.sender_asset_count().clone(), @@ -2403,7 +2446,7 @@ impl Pallet { fn execute_settle_on_affirmation_instruction( id: InstructionId, affirms_pending: u64, - settlement_type: SettlementType, + settlement_type: SettlementType>, caller_did: IdentityId, ) -> DispatchResult { // We assume `settlement_type == SettleOnAffirmation`, @@ -2590,7 +2633,10 @@ impl Pallet { Self::release_locks(&inst_id, &inst_legs)?; // Note: ignoring the error here is fine, since the instruction might not be scheduled yet - let _ = T::Scheduler::cancel_named(inst_id.execution_name()); + let task_name = inst_id + .execution_name() + .map_err(|_| Error::::InvalidTaskName)?; + let _ = T::Scheduler::cancel_named(task_name); Self::prune_instruction(&inst_id, &inst_legs)?; InstructionStatuses::::insert( @@ -2883,7 +2929,7 @@ impl Pallet { /// Returns `Ok` if [`SettlementType::SettleManual`] and the `block_number` is reached. fn ensure_manual_settlement_type( - settlement_type: SettlementType, + settlement_type: SettlementType>, ) -> DispatchResult { if let SettlementType::SettleManual(block_number) = settlement_type { ensure!( @@ -3007,7 +3053,7 @@ impl Pallet { weight_limit: Weight, ) -> Result { // Check that the provided weight limit is greater than the minimum required weight - WeightMeter::from_limit(minimum_weight, weight_limit).ok_or_else(|| { + WeightMeter::with_limit(minimum_weight, weight_limit).ok_or_else(|| { DispatchErrorWithPostInfo { post_info: Some(minimum_weight).into(), error: Error::::InputWeightIsLessThanMinimum.into(), @@ -3017,22 +3063,25 @@ impl Pallet { fn base_withdraw_affirmation( origin: OriginFor, - id: InstructionId, + inst_id: InstructionId, portfolios: BTreeSet, affirmation_count: Option, ) -> DispatchResultWithPostInfo { let (did, secondary_key, details) = - Self::ensure_origin_perm_and_instruction_validity(origin, id, false)?; + Self::ensure_origin_perm_and_instruction_validity(origin, inst_id, false)?; let filtered_legs = Self::unsafe_withdraw_instruction_affirmation( did, - id, + inst_id, portfolios, secondary_key.as_ref(), affirmation_count, )?; if details.settlement_type == SettlementType::SettleOnAffirmation { // Cancel the scheduled task for the execution of a given instruction. - let _fix_this = T::Scheduler::cancel_named(id.execution_name()); + let task_name = inst_id + .execution_name() + .map_err(|_| Error::::InvalidTaskName)?; + let _ = T::Scheduler::cancel_named(task_name); } Ok(PostDispatchInfo::from(Some( Self::withdraw_affirmation_actual_weight( @@ -3111,7 +3160,7 @@ impl Pallet { instruction_asset_count.non_fungible(), instruction_asset_count.off_chain(), ); - Self::maybe_schedule_instruction(n_pending_affirmations, instruction_id, weight_limit); + Self::maybe_schedule_instruction(n_pending_affirmations, instruction_id, weight_limit)?; } Self::deposit_event(Event::MediatorAffirmationReceived( @@ -3159,7 +3208,10 @@ impl Pallet { && instruction.settlement_type == SettlementType::SettleOnAffirmation { // Cancel the scheduled task - let _ = T::Scheduler::cancel_named(instruction_id.execution_name()); + let task_name = instruction_id + .execution_name() + .map_err(|_| Error::::InvalidTaskName)?; + let _ = T::Scheduler::cancel_named(task_name); } Self::deposit_event(Event::MediatorAffirmationWithdrawn( caller_did, diff --git a/pallets/stable-api-precompiles/Cargo.toml b/pallets/stable-api-precompiles/Cargo.toml new file mode 100644 index 0000000000..7f5787baca --- /dev/null +++ b/pallets/stable-api-precompiles/Cargo.toml @@ -0,0 +1,52 @@ +[package] +name = "polymesh-stable-api-precompiles" +version = "0.1.0" +authors = ["PolymeshAssociation"] +edition = "2021" + +[dependencies] +log = "0.4" + +sp-core = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } + +# Substrate pallets +pallet-revive = { workspace = true, default-features = false } + +# Polymesh pallets +pallet-asset = { workspace = true, default-features = false } +pallet-corporate-actions = { workspace = true, default-features = false } +pallet-identity = { workspace = true, default-features = false } +pallet-nft = { workspace = true, default-features = false } +pallet-portfolio = { workspace = true, default-features = false } +pallet-settlement = { workspace = true, default-features = false } + +# Polymesh primitives +polymesh-primitives = { workspace = true, default-features = false } + +[features] +default = ["std"] +no_std = [] +std = [ + "sp-core/std", + "sp-runtime/std", + "pallet-revive/std", + "pallet-asset/std", + "pallet-corporate-actions/std", + "pallet-identity/std", + "pallet-nft/std", + "pallet-portfolio/std", + "pallet-settlement/std", + "polymesh-primitives/std", +] +runtime-benchmarks = [ + "pallet-revive/runtime-benchmarks", + "pallet-asset/runtime-benchmarks", + "pallet-corporate-actions/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-nft/runtime-benchmarks", + "pallet-portfolio/runtime-benchmarks", + "pallet-settlement/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", +] +try-runtime = ["pallet-revive/try-runtime"] diff --git a/pallets/stable-api-precompiles/src/lib.rs b/pallets/stable-api-precompiles/src/lib.rs new file mode 100644 index 0000000000..137379e21b --- /dev/null +++ b/pallets/stable-api-precompiles/src/lib.rs @@ -0,0 +1,26 @@ +// This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). +// Copyright (c) 2020 Polymesh Association + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3. + +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Polymesh Stable API Precompiles for pallet-revive. +//! +//! Each version of the Stable API lives in its own submodule (e.g. `v8`). + +#![cfg_attr(not(feature = "std"), no_std)] + +extern crate alloc; + +pub mod v8; + +pub use v8::PolymeshStableApiV8; diff --git a/pallets/stable-api-precompiles/src/v8/IPolymeshStableApiV8.sol b/pallets/stable-api-precompiles/src/v8/IPolymeshStableApiV8.sol new file mode 100644 index 0000000000..bda1721b81 --- /dev/null +++ b/pallets/stable-api-precompiles/src/v8/IPolymeshStableApiV8.sol @@ -0,0 +1,325 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +/// @title Polymesh Stable API v8 +/// @notice EVM precompile interface for core Polymesh chain operations. + +/// @dev The on-chain address of the Polymesh Stable API v8 precompile. +address constant POLYMESH_STABLE_API_V8_ADDRESS = address(0x0000000000000000000000000000000000080000); + +/// @notice Portfolio kind: Default or User-defined. +/// @dev Maps to Rust `PortfolioKind`. +enum PolymeshPortfolioKind { + Default, + User +} + +/// @notice Settlement leg type. +/// @dev Maps to Rust `Leg` variants. +enum PolymeshLegType { + Fungible, + NonFungible, + OffChain +} + +/// @notice Venue type for settlement. +/// @dev Maps to Rust `VenueType`. +enum PolymeshVenueType { + Other, + Distribution, + Sto, + Exchange +} + +/// @notice Asset type classification. +/// @dev Maps to Rust `AssetType`. +enum PolymeshAssetType { + EquityCommon, + EquityPreferred, + Commodity, + FixedIncome, + REIT, + Fund, + RevenueShareAgreement, + StructuredProduct, + Derivative, + Custom, + StableCoin, + NonFungible +} + +/// @notice Identifies a portfolio by its owner DID and kind. +/// @dev Maps to Rust `PortfolioId { did, kind }`. +struct PolymeshPortfolioId { + /// @dev Owner identity (32-byte DID). + bytes32 did; + /// @dev Portfolio kind. + PolymeshPortfolioKind kind; + /// @dev User portfolio number (ignored when kind == Default). + uint64 number; +} + +/// @notice A single leg in a settlement instruction. +/// @dev Flattened from/to portfolios avoid nested struct encoding. +struct PolymeshLeg { + bytes32 from_did; + PolymeshPortfolioKind from_portfolio_kind; + uint64 from_portfolio_number; + bytes32 to_did; + PolymeshPortfolioKind to_portfolio_kind; + uint64 to_portfolio_number; + /// @dev 16-byte asset UUID. + bytes16 asset_id; + uint128 amount; + PolymeshLegType leg_type; +} + +/// @notice Corporate action identifier (asset + local sequence number). +struct PolymeshCAId { + bytes16 asset_id; + uint32 local_id; +} + +/// @notice Summary of a capital distribution attached to a corporate action. +struct PolymeshDistributionSummary { + /// @dev Portfolio from which the distribution pays out. + PolymeshPortfolioId from; + /// @dev Currency asset used for payment. + bytes16 currency; + uint128 per_share; + uint128 amount; + /// @dev UNIX timestamp for payment start. + uint64 payment_at; + /// @dev UNIX timestamp for expiry (0 = no expiry). + uint64 expires_at; +} + +/// @notice Parameters for creating a simple dividend distribution. +struct PolymeshSimpleDividend { + bytes16 asset_id; + /// @dev Declaration date (UNIX timestamp). + uint64 decl_date; + /// @dev Record date (UNIX timestamp). + uint64 record_date; + /// @dev Portfolio funding the dividend. + PolymeshPortfolioId portfolio; + /// @dev Currency asset used for payment. + bytes16 currency; + uint128 per_share; + uint128 amount; + /// @dev UNIX timestamp for payment start. + uint64 payment_at; + /// @dev UNIX timestamp for expiry (0 = no expiry). + uint64 expires_at; +} + +/// @notice Describes an asset transfer within a portfolio move. +struct PolymeshFund { + bytes16 asset_id; + /// @dev Fungible amount (0 for NFT-only moves). + uint128 amount; + /// @dev NFT token IDs (empty for fungible-only moves). + uint64[] nft_ids; + /// @dev Optional memo (empty bytes = no memo). + bytes memo; +} + +interface IPolymeshStableApiV8 { + // ── Portfolio (pallet_portfolio) ── + + /// @notice Create a named portfolio under the caller's identity. + /// @param name Portfolio name (UTF-8 encoded). + /// @return The newly created portfolio identifier. + function createPortfolio(bytes calldata name) external returns (PolymeshPortfolioId memory); + + /// @notice Accept custody of a portfolio using a pending authorization. + /// @param authId Authorization ID from the portfolio owner. + function acceptPortfolioCustody(uint64 authId) external; + + /// @notice Relinquish custody of a portfolio back to its owner. + /// @param portfolio The portfolio to release. + function quitPortfolioCustody(PolymeshPortfolioId calldata portfolio) external; + + /// @notice Move assets between two portfolios under the caller's custody. + /// @param from Source portfolio. + /// @param to Destination portfolio. + /// @param funds Array of asset transfers to execute. + function movePortfolioFunds( + PolymeshPortfolioId calldata from, + PolymeshPortfolioId calldata to, + PolymeshFund[] calldata funds + ) external; + + /// @notice Query the balance of an asset in a portfolio. + /// @param portfolio Portfolio to query. + /// @param assetId Asset identifier (16-byte UUID). + /// @return The fungible balance held. + function portfolioAssetBalances(PolymeshPortfolioId calldata portfolio, bytes16 assetId) + external + view + returns (uint128); + + /// @notice Check whether all given portfolios are in custody of a specific identity. + /// @param portfolios Array of portfolios to check. + /// @param custodianDid DID of the expected custodian. + /// @return True if every portfolio is under the custodian's custody. + function checkPortfoliosInCustody(PolymeshPortfolioId[] calldata portfolios, bytes32 custodianDid) + external + view + returns (bool); + + /// @notice Create a named portfolio under another identity and take custody. + /// @param ownerDid DID of the portfolio owner. + /// @param name Portfolio name (UTF-8 encoded). + /// @return The newly created portfolio identifier. + function createCustodyPortfolio(bytes32 ownerDid, bytes calldata name) + external + returns (PolymeshPortfolioId memory); + + // ── Settlement (pallet_settlement) ── + + /// @notice Create a new settlement venue. + /// @param details Venue description (UTF-8 encoded). + /// @param venueType Type of venue. + /// @return venueId The newly created venue identifier. + function createVenue(bytes calldata details, PolymeshVenueType venueType) external returns (uint64 venueId); + + /// @notice Execute a pre-existing settlement instruction. + /// @dev Caller supplies leg counts for proportional gas charging. + /// @param instructionId Instruction to execute. + /// @param fungibleCount Number of fungible legs. + /// @param nftCount Number of NFT legs. + /// @param offchainCount Number of off-chain legs. + function settlementExecute(uint64 instructionId, uint32 fungibleCount, uint32 nftCount, uint32 offchainCount) + external; + + /// @notice Create a settlement instruction and immediately affirm on behalf of the caller. + /// @param venueId Venue in which to create the instruction. + /// @param legs Array of settlement legs. + /// @param portfolios Caller's portfolios to affirm for. + /// @return instructionId The newly created instruction identifier. + function addAndAffirmInstruction( + uint64 venueId, + PolymeshLeg[] calldata legs, + PolymeshPortfolioId[] calldata portfolios + ) external returns (uint64 instructionId); + + // ── Asset (pallet_asset) ── + + /// @notice Create a new asset and issue an initial supply. + /// @param name Asset name (UTF-8 encoded). + /// @param assetType Asset type classification. + /// @param divisible Whether the asset is divisible. + /// @param amountToIssue Initial supply to mint. + /// @param portfolioKind Destination portfolio kind. + /// @param portfolioNumber Destination portfolio number (when kind == User). + /// @return assetId The newly created asset identifier. + function assetCreateAndIssue( + bytes calldata name, + PolymeshAssetType assetType, + bool divisible, + uint128 amountToIssue, + PolymeshPortfolioKind portfolioKind, + uint64 portfolioNumber + ) external returns (bytes16 assetId); + + /// @notice Issue (mint) additional supply of an existing asset. + /// @param assetId Asset to issue. + /// @param amount Amount to mint. + /// @param portfolioKind Destination portfolio kind. + /// @param portfolioNumber Destination portfolio number. + function assetIssue(bytes16 assetId, uint128 amount, PolymeshPortfolioKind portfolioKind, uint64 portfolioNumber) external; + + /// @notice Redeem (burn) tokens from the caller's portfolio. + /// @param assetId Asset to redeem. + /// @param amount Amount to burn. + /// @param portfolioKind Source portfolio kind. + /// @param portfolioNumber Source portfolio number. + function assetRedeem(bytes16 assetId, uint128 amount, PolymeshPortfolioKind portfolioKind, uint64 portfolioNumber) external; + + /// @notice Query an identity's total balance for an asset. + /// @param assetId Asset to query. + /// @param did Identity to query. + /// @return The total fungible balance. + function assetBalanceOf(bytes16 assetId, bytes32 did) external view returns (uint128); + + /// @notice Query the total supply of an asset. + /// @param assetId Asset to query. + /// @return The total supply. + function assetTotalSupply(bytes16 assetId) external view returns (uint128); + + /// @notice Resolve a local metadata name to its numeric key for an asset. + /// @param assetId Asset to query. + /// @param name Metadata name (UTF-8 encoded). + /// @return exists True if the name is registered. + /// @return key The numeric metadata key. + function assetMetadataLocalNameToKey(bytes16 assetId, bytes calldata name) + external + view + returns (bool exists, uint64 key); + + /// @notice Read a metadata value for an asset. + /// @param assetId Asset to query. + /// @param key Numeric metadata key. + /// @param isLocal True for asset-local keys, false for global keys. + /// @return exists True if a value is set. + /// @return value The raw metadata bytes. + function assetMetadataValue(bytes16 assetId, uint64 key, bool isLocal) + external + view + returns (bool exists, bytes memory value); + + // ── Identity (pallet_identity) ── + + /// @notice Look up the Polymesh DID associated with an EVM address. + /// @param account The EVM address to resolve. + /// @return did The associated identity (zero if none). + function getKeyDid(address account) external view returns (bytes32 did); + + /// @notice Get the next asset ID that would be assigned to an identity. + /// @param account The EVM address whose identity to query. + /// @return assetId The next asset identifier. + function getNextAssetId(address account) external view returns (bytes16 assetId); + + // ── NFT (pallet_nft) ── + + /// @notice Look up the owner of an NFT. + /// @param assetId NFT collection asset identifier. + /// @param nftId Token ID within the collection. + /// @return exists True if the NFT exists. + /// @return owner Portfolio that holds the NFT. + function nftOwner(bytes16 assetId, uint64 nftId) + external + view + returns (bool exists, PolymeshPortfolioId memory owner); + + /// @notice Check whether a portfolio holds all the specified NFTs. + /// @param portfolio Portfolio to check. + /// @param assetId NFT collection asset identifier. + /// @param nftIds Array of token IDs to verify. + /// @return True if the portfolio holds every listed NFT. + function holdsNfts(PolymeshPortfolioId calldata portfolio, bytes16 assetId, uint64[] calldata nftIds) + external + view + returns (bool); + + // ── Corporate Actions (pallet_corporate_actions) ── + + /// @notice Query the summary of a capital distribution. + /// @param caId Corporate action identifier. + /// @return exists True if the distribution exists. + /// @return summary The distribution details. + function distributionSummary(PolymeshCAId calldata caId) + external + view + returns (bool exists, PolymeshDistributionSummary memory summary); + + /// @notice Claim a dividend payout for the caller. + /// @param caId Corporate action identifier of the distribution. + function dividendClaim(PolymeshCAId calldata caId) external; + + /// @notice Create a dividend distribution on an existing corporate action. + /// @dev Requires a pre-existing corporate action for the asset. + /// @param dividend The dividend parameters. + function createDividend(PolymeshSimpleDividend calldata dividend) external; +} diff --git a/pallets/stable-api-precompiles/src/v8/asset.rs b/pallets/stable-api-precompiles/src/v8/asset.rs new file mode 100644 index 0000000000..554fb1acdb --- /dev/null +++ b/pallets/stable-api-precompiles/src/v8/asset.rs @@ -0,0 +1,92 @@ +// This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). +// Copyright (c) 2020 Polymesh Association + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3. + +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Asset pallet functions for the Polymesh Stable API v8 precompile. + +use alloc::vec::Vec; + +use pallet_revive::precompiles::{Error as PrecompileError, Ext}; + +use super::IPolymeshStableApiV8; + +pub(crate) fn asset_create_and_issue( + _call: &IPolymeshStableApiV8::assetCreateAndIssueCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_asset::Config, +{ + todo!() +} + +pub(crate) fn asset_issue( + _call: &IPolymeshStableApiV8::assetIssueCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_asset::Config, +{ + todo!() +} + +pub(crate) fn asset_redeem( + _call: &IPolymeshStableApiV8::assetRedeemCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_asset::Config, +{ + todo!() +} + +pub(crate) fn asset_balance_of( + _call: &IPolymeshStableApiV8::assetBalanceOfCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_asset::Config, +{ + todo!() +} + +pub(crate) fn asset_total_supply( + _call: &IPolymeshStableApiV8::assetTotalSupplyCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_asset::Config, +{ + todo!() +} + +pub(crate) fn asset_metadata_local_name_to_key( + _call: &IPolymeshStableApiV8::assetMetadataLocalNameToKeyCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_asset::Config, +{ + todo!() +} + +pub(crate) fn asset_metadata_value( + _call: &IPolymeshStableApiV8::assetMetadataValueCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_asset::Config, +{ + todo!() +} diff --git a/pallets/stable-api-precompiles/src/v8/corporate_actions.rs b/pallets/stable-api-precompiles/src/v8/corporate_actions.rs new file mode 100644 index 0000000000..cc490a44ca --- /dev/null +++ b/pallets/stable-api-precompiles/src/v8/corporate_actions.rs @@ -0,0 +1,52 @@ +// This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). +// Copyright (c) 2020 Polymesh Association + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3. + +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Corporate actions pallet functions for the Polymesh Stable API v8 precompile. + +use alloc::vec::Vec; + +use pallet_revive::precompiles::{Error as PrecompileError, Ext}; + +use super::IPolymeshStableApiV8; + +pub(crate) fn distribution_summary( + _call: &IPolymeshStableApiV8::distributionSummaryCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_corporate_actions::Config, +{ + todo!() +} + +pub(crate) fn dividend_claim( + _call: &IPolymeshStableApiV8::dividendClaimCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_corporate_actions::Config, +{ + todo!() +} + +pub(crate) fn create_dividend( + _call: &IPolymeshStableApiV8::createDividendCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_corporate_actions::Config, +{ + todo!() +} diff --git a/pallets/stable-api-precompiles/src/v8/identity.rs b/pallets/stable-api-precompiles/src/v8/identity.rs new file mode 100644 index 0000000000..239aa1e90d --- /dev/null +++ b/pallets/stable-api-precompiles/src/v8/identity.rs @@ -0,0 +1,63 @@ +// This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). +// Copyright (c) 2020 Polymesh Association + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3. + +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Identity pallet functions for the Polymesh Stable API v8 precompile. + +use alloc::vec::Vec; + +use pallet_revive::precompiles::{ + alloy::{primitives::FixedBytes, sol_types::SolCall}, + Error as PrecompileError, Ext, +}; +use pallet_revive::AddressMapper; +use sp_runtime::traits::Get; + +use super::IPolymeshStableApiV8; + +pub(crate) fn get_key_did( + call: &IPolymeshStableApiV8::getKeyDidCall, + env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_identity::Config, +{ + // Charge for 2 storage read (identity lookup and frozen status lookup for secondary keys). + env.charge(T::DbWeight::get().reads(2))?; + + let account = call.account.into_array().into(); + let account_id = ::AddressMapper::to_account_id(&account); + + let did = pallet_identity::Pallet::::get_identity(&account_id).unwrap_or_default(); + + log::trace!( + target: "runtime::stable-api-precompile", + "getKeyDid address={:?} did={did:?}", call.account + ); + + let did_bytes: FixedBytes<32> = did.0.into(); + Ok(IPolymeshStableApiV8::getKeyDidCall::abi_encode_returns( + &did_bytes, + )) +} + +pub(crate) fn get_next_asset_id( + _call: &IPolymeshStableApiV8::getNextAssetIdCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_identity::Config, +{ + todo!() +} diff --git a/pallets/stable-api-precompiles/src/v8/mod.rs b/pallets/stable-api-precompiles/src/v8/mod.rs new file mode 100644 index 0000000000..c8335a77fd --- /dev/null +++ b/pallets/stable-api-precompiles/src/v8/mod.rs @@ -0,0 +1,175 @@ +// This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). +// Copyright (c) 2020 Polymesh Association + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3. + +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Polymesh Stable API **v8** precompile. +//! +//! Routes ABI-encoded function calls to domain modules for portfolio, settlement, +//! asset, identity, NFT, and corporate actions operations. + +use alloc::vec::Vec; +use core::marker::PhantomData; +use core::num::NonZero; + +use pallet_revive::precompiles::{ + alloy::sol, AddressMatcher, Error as PrecompileError, Ext, Precompile, +}; + +mod asset; +mod corporate_actions; +mod identity; +mod nft; +mod portfolio; +mod settlement; + +// Import the Solidity interface. Generates: +// - `IPolymeshStableApiV8::IPolymeshStableApiV8Calls` enum (23 variants) +// - Struct types: PolymeshPortfolioId, PolymeshLeg, PolymeshCAId, etc. +sol! { + #[sol(all_derives)] + "src/v8/IPolymeshStableApiV8.sol" +} + +use IPolymeshStableApiV8::IPolymeshStableApiV8Calls; + +/// Polymesh Stable API v8 precompile. +/// +/// Routes ABI-encoded function calls to runtime pallets for portfolio, settlement, +/// asset, identity, NFT, and corporate actions operations. +pub struct PolymeshStableApiV8(PhantomData); + +impl Precompile for PolymeshStableApiV8 +where + T: pallet_revive::Config + + pallet_asset::Config + + pallet_portfolio::Config + + pallet_settlement::Config + + pallet_identity::Config + + pallet_nft::Config + + pallet_corporate_actions::Config, +{ + type T = T; + type Interface = IPolymeshStableApiV8Calls; + + // Precompile address = version number (v8 = 8, v9 = 9, …). + // Fixed(8) → 0x0000000000000000000000000000000000080000 + const MATCHER: AddressMatcher = AddressMatcher::Fixed(NonZero::new(8).unwrap()); + const HAS_CONTRACT_INFO: bool = false; + + fn call( + _address: &[u8; 20], + input: &Self::Interface, + env: &mut impl Ext, + ) -> Result, PrecompileError> { + log::trace!(target: "runtime::stable-api-precompile", "v8 call entered"); + + match input { + // ── Read-only guard ── + // Write operations MUST fail in a read-only context. + IPolymeshStableApiV8Calls::createPortfolio(_) + | IPolymeshStableApiV8Calls::acceptPortfolioCustody(_) + | IPolymeshStableApiV8Calls::quitPortfolioCustody(_) + | IPolymeshStableApiV8Calls::movePortfolioFunds(_) + | IPolymeshStableApiV8Calls::createCustodyPortfolio(_) + | IPolymeshStableApiV8Calls::createVenue(_) + | IPolymeshStableApiV8Calls::settlementExecute(_) + | IPolymeshStableApiV8Calls::addAndAffirmInstruction(_) + | IPolymeshStableApiV8Calls::assetCreateAndIssue(_) + | IPolymeshStableApiV8Calls::assetIssue(_) + | IPolymeshStableApiV8Calls::assetRedeem(_) + | IPolymeshStableApiV8Calls::dividendClaim(_) + | IPolymeshStableApiV8Calls::createDividend(_) + if env.is_read_only() => + { + Err(PrecompileError::Error( + pallet_revive::Error::::StateChangeDenied.into(), + )) + } + + // ── Portfolio (pallet_portfolio) ── + IPolymeshStableApiV8Calls::createPortfolio(call) => { + portfolio::create_portfolio::(call, env) + } + IPolymeshStableApiV8Calls::acceptPortfolioCustody(call) => { + portfolio::accept_portfolio_custody::(call, env) + } + IPolymeshStableApiV8Calls::quitPortfolioCustody(call) => { + portfolio::quit_portfolio_custody::(call, env) + } + IPolymeshStableApiV8Calls::movePortfolioFunds(call) => { + portfolio::move_portfolio_funds::(call, env) + } + IPolymeshStableApiV8Calls::portfolioAssetBalances(call) => { + portfolio::portfolio_asset_balances::(call, env) + } + IPolymeshStableApiV8Calls::checkPortfoliosInCustody(call) => { + portfolio::check_portfolios_in_custody::(call, env) + } + IPolymeshStableApiV8Calls::createCustodyPortfolio(call) => { + portfolio::create_custody_portfolio::(call, env) + } + + // ── Settlement (pallet_settlement) ── + IPolymeshStableApiV8Calls::createVenue(call) => { + settlement::create_venue::(call, env) + } + IPolymeshStableApiV8Calls::settlementExecute(call) => { + settlement::settlement_execute::(call, env) + } + IPolymeshStableApiV8Calls::addAndAffirmInstruction(call) => { + settlement::add_and_affirm_instruction::(call, env) + } + + // ── Asset (pallet_asset) ── + IPolymeshStableApiV8Calls::assetCreateAndIssue(call) => { + asset::asset_create_and_issue::(call, env) + } + IPolymeshStableApiV8Calls::assetIssue(call) => asset::asset_issue::(call, env), + IPolymeshStableApiV8Calls::assetRedeem(call) => asset::asset_redeem::(call, env), + IPolymeshStableApiV8Calls::assetBalanceOf(call) => { + asset::asset_balance_of::(call, env) + } + IPolymeshStableApiV8Calls::assetTotalSupply(call) => { + asset::asset_total_supply::(call, env) + } + IPolymeshStableApiV8Calls::assetMetadataLocalNameToKey(call) => { + asset::asset_metadata_local_name_to_key::(call, env) + } + IPolymeshStableApiV8Calls::assetMetadataValue(call) => { + asset::asset_metadata_value::(call, env) + } + + // ── Identity (pallet_identity) ── + IPolymeshStableApiV8Calls::getKeyDid(call) => identity::get_key_did::(call, env), + IPolymeshStableApiV8Calls::getNextAssetId(call) => { + identity::get_next_asset_id::(call, env) + } + + // ── NFT (pallet_nft) ── + IPolymeshStableApiV8Calls::nftOwner(call) => nft::nft_owner::(call, env), + IPolymeshStableApiV8Calls::holdsNfts(call) => nft::holds_nfts::(call, env), + + // ── Corporate Actions (pallet_corporate_actions) ── + IPolymeshStableApiV8Calls::distributionSummary(call) => { + corporate_actions::distribution_summary::(call, env) + } + IPolymeshStableApiV8Calls::dividendClaim(call) => { + corporate_actions::dividend_claim::(call, env) + } + IPolymeshStableApiV8Calls::createDividend(call) => { + corporate_actions::create_dividend::(call, env) + } + } + } +} diff --git a/pallets/runtime/common/src/cdd_check.rs b/pallets/stable-api-precompiles/src/v8/nft.rs similarity index 54% rename from pallets/runtime/common/src/cdd_check.rs rename to pallets/stable-api-precompiles/src/v8/nft.rs index bb74a0910a..9aac5e2e02 100644 --- a/pallets/runtime/common/src/cdd_check.rs +++ b/pallets/stable-api-precompiles/src/v8/nft.rs @@ -13,21 +13,30 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use pallet_identity::{Config as IdentityConfig, Pallet as Identity}; -use polymesh_primitives::traits::CheckCdd; -use polymesh_primitives::IdentityId; +//! NFT pallet functions for the Polymesh Stable API v8 precompile. -pub struct CddChecker(sp_std::marker::PhantomData); +use alloc::vec::Vec; -impl CheckCdd<::AccountId> for CddChecker +use pallet_revive::precompiles::{Error as PrecompileError, Ext}; + +use super::IPolymeshStableApiV8; + +pub(crate) fn nft_owner( + _call: &IPolymeshStableApiV8::nftOwnerCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> where - R: IdentityConfig, + T: pallet_revive::Config + pallet_nft::Config, { - fn check_key_cdd(key: &::AccountId) -> bool { - Self::get_key_cdd_did(key).is_some() - } + todo!() +} - fn get_key_cdd_did(key: &::AccountId) -> Option { - Identity::::get_identity(key).filter(|&did| Identity::::has_valid_cdd(did)) - } +pub(crate) fn holds_nfts( + _call: &IPolymeshStableApiV8::holdsNftsCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_nft::Config, +{ + todo!() } diff --git a/pallets/stable-api-precompiles/src/v8/portfolio.rs b/pallets/stable-api-precompiles/src/v8/portfolio.rs new file mode 100644 index 0000000000..97d8b42ca2 --- /dev/null +++ b/pallets/stable-api-precompiles/src/v8/portfolio.rs @@ -0,0 +1,92 @@ +// This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). +// Copyright (c) 2020 Polymesh Association + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3. + +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Portfolio pallet functions for the Polymesh Stable API v8 precompile. + +use alloc::vec::Vec; + +use pallet_revive::precompiles::{Error as PrecompileError, Ext}; + +use super::IPolymeshStableApiV8; + +pub(crate) fn create_portfolio( + _call: &IPolymeshStableApiV8::createPortfolioCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_portfolio::Config, +{ + todo!() +} + +pub(crate) fn accept_portfolio_custody( + _call: &IPolymeshStableApiV8::acceptPortfolioCustodyCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_portfolio::Config, +{ + todo!() +} + +pub(crate) fn quit_portfolio_custody( + _call: &IPolymeshStableApiV8::quitPortfolioCustodyCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_portfolio::Config, +{ + todo!() +} + +pub(crate) fn move_portfolio_funds( + _call: &IPolymeshStableApiV8::movePortfolioFundsCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_portfolio::Config, +{ + todo!() +} + +pub(crate) fn portfolio_asset_balances( + _call: &IPolymeshStableApiV8::portfolioAssetBalancesCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_portfolio::Config, +{ + todo!() +} + +pub(crate) fn check_portfolios_in_custody( + _call: &IPolymeshStableApiV8::checkPortfoliosInCustodyCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_portfolio::Config, +{ + todo!() +} + +pub(crate) fn create_custody_portfolio( + _call: &IPolymeshStableApiV8::createCustodyPortfolioCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_portfolio::Config, +{ + todo!() +} diff --git a/pallets/stable-api-precompiles/src/v8/settlement.rs b/pallets/stable-api-precompiles/src/v8/settlement.rs new file mode 100644 index 0000000000..b1d6774580 --- /dev/null +++ b/pallets/stable-api-precompiles/src/v8/settlement.rs @@ -0,0 +1,52 @@ +// This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). +// Copyright (c) 2020 Polymesh Association + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3. + +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Settlement pallet functions for the Polymesh Stable API v8 precompile. + +use alloc::vec::Vec; + +use pallet_revive::precompiles::{Error as PrecompileError, Ext}; + +use super::IPolymeshStableApiV8; + +pub(crate) fn create_venue( + _call: &IPolymeshStableApiV8::createVenueCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_settlement::Config, +{ + todo!() +} + +pub(crate) fn settlement_execute( + _call: &IPolymeshStableApiV8::settlementExecuteCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_settlement::Config, +{ + todo!() +} + +pub(crate) fn add_and_affirm_instruction( + _call: &IPolymeshStableApiV8::addAndAffirmInstructionCall, + _env: &mut impl Ext, +) -> Result, PrecompileError> +where + T: pallet_revive::Config + pallet_settlement::Config, +{ + todo!() +} diff --git a/pallets/staking/Cargo.toml b/pallets/staking/Cargo.toml deleted file mode 100644 index 69566dd3ff..0000000000 --- a/pallets/staking/Cargo.toml +++ /dev/null @@ -1,70 +0,0 @@ -[package] -name = "pallet-staking" -version = "2.0.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -polymesh-primitives = { workspace = true, default-features = false } -pallet-identity = { workspace = true, default-features = false} - -# General -static_assertions = "1.1.0" -serde = { version = "1.0.104", optional = true } -log = "0.4.8" - -# Substrate -codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false} -sp-runtime = { version = "7.0.0", default-features = false } -sp-arithmetic = { version = "6.0.0", default-features = false } -sp-staking = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-election-provider-support = { version = "4.0.0-dev", default-features = false } -sp-npos-elections = { version = "4.0.0-dev", default-features = false} - -pallet-session = { features = ["historical"], version = "4.0.0-dev", default-features = false } -pallet-authorship = { version = "4.0.0-dev", default-features = false } -pallet-babe = { version = "4.0.0-dev", default-features = false } - -# Optional imports for benchmarking -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } -rand_chacha = { version = "0.2", default-features = false, optional = true } - -[dev-dependencies] -pallet-staking-reward-curve = { version = "4.0.0-dev", default-features = false } -sp-tracing = "6.0.0" - -[features] -default = ["std"] -no_std = [] -std = [ - "polymesh-primitives/std", - "serde", - "codec/std", - "sp-std/std", - "sp-npos-elections/std", - "sp-io/std", - "frame-support/std", - "frame-election-provider-support/std", - "sp-runtime/std", - "sp-staking/std", - "pallet-session/std", - "frame-system/std", - "pallet-authorship/std", - "pallet-identity/std", - "pallet-babe/std", - "sp-arithmetic/std", - "rand_chacha", - "frame-benchmarking", - "sp-core/std", -] -runtime-benchmarks = [ - "frame-benchmarking", - "rand_chacha", -] -try-runtime = [] diff --git a/pallets/staking/rpc/Cargo.toml b/pallets/staking/rpc/Cargo.toml deleted file mode 100644 index cca6e62550..0000000000 --- a/pallets/staking/rpc/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -name = "pallet-staking-rpc" -version = "2.0.0" -authors = ["Anonymous"] -edition = "2021" - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -codec = { workspace = true, default-features = false, features = ["derive"] } -jsonrpsee = { version = "0.16.2", features = ["server", "macros"] } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-blockchain = { version = "4.0.0-dev" } -sp-core = { version = "7.0.0", default-features = false } -sp-rpc = { version = "6.0.0" } -sp-runtime = { version = "7.0.0", default-features = false } -sp-std = {version = "5.0.0", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } - -# General -serde = { version = "1.0.104", features = ["derive"] } - -node-rpc = { workspace = true } -pallet-staking-rpc-runtime-api = { version = "2.0.0", path = "./runtime-api" } diff --git a/pallets/staking/rpc/runtime-api/Cargo.toml b/pallets/staking/rpc/runtime-api/Cargo.toml deleted file mode 100644 index 7e601e397a..0000000000 --- a/pallets/staking/rpc/runtime-api/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "pallet-staking-rpc-runtime-api" -version = "2.0.0" -authors = ["Anonymous"] -edition = "2021" - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -sp-api = { version = "4.0.0-dev", default-features = false} -sp-runtime = { version = "7.0.0", default-features = false} -frame-support = { version = "4.0.0-dev", default-features = false } - -[features] -default = ["std"] -std = [ - "sp-api/std", - "sp-runtime/std", - "frame-support/std" -] diff --git a/pallets/staking/rpc/runtime-api/src/lib.rs b/pallets/staking/rpc/runtime-api/src/lib.rs deleted file mode 100644 index bdf2e622b7..0000000000 --- a/pallets/staking/rpc/runtime-api/src/lib.rs +++ /dev/null @@ -1,12 +0,0 @@ -//! Runtime API definition for staking module. - -#![cfg_attr(not(feature = "std"), no_std)] - -use frame_support::dispatch::Vec; -use sp_runtime::Perbill; - -sp_api::decl_runtime_apis! { - pub trait StakingApi { - fn get_curve() -> Vec<(Perbill, Perbill)>; - } -} diff --git a/pallets/staking/rpc/src/lib.rs b/pallets/staking/rpc/src/lib.rs deleted file mode 100644 index 06d956d565..0000000000 --- a/pallets/staking/rpc/src/lib.rs +++ /dev/null @@ -1,56 +0,0 @@ -use jsonrpsee::{ - core::RpcResult, - proc_macros::rpc, - types::error::{CallError, ErrorObject}, -}; -use node_rpc::Error; -pub use pallet_staking_rpc_runtime_api::StakingApi as StakingRuntimeApi; -use sp_api::ProvideRuntimeApi; -use sp_blockchain::HeaderBackend; -use sp_runtime::{traits::Block as BlockT, Perbill}; -use std::sync::Arc; - -#[rpc(client, server)] -pub trait StakingApi { - #[method(name = "staking_getCurve")] - fn get_curve(&self, at: Option) -> RpcResult>; -} - -/// A struct that implements the [`StakingApi`]. -pub struct Staking { - client: Arc, - _marker: std::marker::PhantomData, -} - -impl Staking { - /// Create new `Staking` instance with the given reference to the client. - pub fn new(client: Arc) -> Self { - Self { - client, - _marker: Default::default(), - } - } -} - -impl StakingApiServer<::Hash> for Staking -where - Block: BlockT, - C: ProvideRuntimeApi + HeaderBackend + Send + Sync + 'static, - C::Api: StakingRuntimeApi, -{ - fn get_curve(&self, at: Option<::Hash>) -> RpcResult> { - let api = self.client.runtime_api(); - let at_hash = at.unwrap_or_else(|| - // If the block hash is not supplied assume the best block. - self.client.info().best_hash); - - api.get_curve(at_hash).map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Unable to get curve.", - Some(e.to_string()), - )) - .into() - }) - } -} diff --git a/pallets/staking/src/benchmarking.rs b/pallets/staking/src/benchmarking.rs deleted file mode 100644 index 33debdac78..0000000000 --- a/pallets/staking/src/benchmarking.rs +++ /dev/null @@ -1,1113 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Staking pallet benchmarking. - -use super::*; -use crate::{ConfigOp, Pallet as Staking}; -use testing_utils::*; - -use codec::Decode; -use frame_election_provider_support::SortedListProvider; -use frame_support::{ - dispatch::UnfilteredDispatchable, - pallet_prelude::*, - traits::{Currency, Get, Imbalance}, -}; -use sp_runtime::{ - traits::{Bounded, One, StaticLookup, TrailingZeroInput, Zero}, - Perbill, Percent, -}; -use sp_staking::SessionIndex; -use sp_std::prelude::*; - -pub use frame_benchmarking::v1::{ - account, benchmarks, impl_benchmark_test_suite, whitelisted_caller, -}; -use frame_system::RawOrigin; - -const SEED: u32 = 0; -const MAX_SPANS: u32 = 100; -const MAX_SLASHES: u32 = 1000; - -type MaxValidators = <::BenchmarkingConfig as BenchmarkingConfig>::MaxValidators; -type MaxNominators = <::BenchmarkingConfig as BenchmarkingConfig>::MaxNominators; - -// Polymesh change -// ----------------------------------------------------------------- - -use pallet_identity::benchmarking::{User, UserBuilder}; -use polymesh_primitives::{IdentityId, Permissions}; - -use crate::types::SlashingSwitch; -// ----------------------------------------------------------------- - -// Polymesh change -// ----------------------------------------------------------------- -macro_rules! whitelist_account { - ($acc:expr) => { - let x = $acc.account(); - frame_benchmarking::v1::whitelist_account!(x); - }; -} - -fn add_permissioned_validator_(id: IdentityId, intended_count: Option) { - Staking::::set_validator_count(RawOrigin::Root.into(), 10) - .expect("Failed to set the validator count"); - Staking::::add_permissioned_validator(RawOrigin::Root.into(), id, intended_count) - .expect("Failed to add permissioned validator"); -} - -// ----------------------------------------------------------------- - -// Add slashing spans to a user account. Not relevant for actual use, only to benchmark -// read and write operations. -pub fn add_slashing_spans(who: &T::AccountId, spans: u32) { - if spans == 0 { - return; - } - - // For the first slashing span, we initialize - let mut slashing_spans = crate::slashing::SlashingSpans::new(0); - SpanSlash::::insert((who, 0), crate::slashing::SpanRecord::default()); - - for i in 1..spans { - assert!(slashing_spans.end_span(i)); - SpanSlash::::insert((who, i), crate::slashing::SpanRecord::default()); - } - SlashingSpans::::insert(who, slashing_spans); -} - -// This function clears all existing validators and nominators from the set, and generates one new -// validator being nominated by n nominators, and returns the validator stash account and the -// nominators' stash and controller. It also starts an era and creates pending payouts. -pub fn create_validator_with_nominators( - n: u32, - upper_bound: u32, - dead: bool, - destination: RewardDestination, - balance: Option, -) -> Result<(User, Vec<(User, User)>), &'static str> -where - T: Config, -{ - // Clean up any existing state. - clear_validators_and_nominators::(); - - let mut points_total = 0; - let mut points_individual = Vec::new(); - - let (v_stash, v_controller) = - create_stash_controller::(0, balance.unwrap_or_default(), destination.clone())?; - let validator_prefs = ValidatorPrefs { - commission: Perbill::from_percent(50), - ..Default::default() - }; - Staking::::set_commission_cap(RawOrigin::Root.into(), Perbill::from_percent(60)).unwrap(); - Staking::::set_validator_count(RawOrigin::Root.into(), 10)?; - Staking::::add_permissioned_validator(RawOrigin::Root.into(), v_stash.did(), Some(2))?; - Staking::::validate(v_controller.origin().into(), validator_prefs)?; - let stash_lookup = v_stash.lookup(); - - points_total += 10; - points_individual.push((v_stash.account().clone(), 10)); - - let original_nominator_count = Nominators::::count(); - let mut nominators = Vec::new(); - - // Give the validator n nominators, but keep total users in the system the same. - for i in 0..upper_bound { - let (n_stash, n_controller) = if !dead { - create_stash_controller::(u32::MAX - i, 10_000_000, destination.clone())? - } else { - create_stash_and_dead_controller::(u32::MAX - i, 10_000_000, destination.clone())? - }; - if i < n { - Staking::::nominate( - RawOrigin::Signed(n_controller.account()).into(), - vec![stash_lookup.clone()], - )?; - nominators.push((n_stash, n_controller)); - } - } - - ValidatorCount::::put(1); - - // Start a new Era - let new_validators = Staking::::try_trigger_new_era(SessionIndex::one(), true).unwrap(); - - assert_eq!(new_validators.len(), 1); - assert_eq!( - new_validators[0], - v_stash.account(), - "Our validator was not selected!" - ); - assert_ne!(Validators::::count(), 0); - assert_eq!( - Nominators::::count(), - original_nominator_count + nominators.len() as u32 - ); - - // Give Era Points - let reward = EraRewardPoints:: { - total: points_total, - individual: points_individual.into_iter().collect(), - }; - - let current_era = CurrentEra::::get().unwrap(); - ErasRewardPoints::::insert(current_era, reward); - - // Create reward pool - let total_payout: BalanceOf = 10_000u32.into(); - >::insert(current_era, total_payout); - - Ok((v_stash, nominators)) -} - -const USER_SEED: u32 = 999666; - -benchmarks! { - bond { - let stash = create_funded_user::("stash", USER_SEED, 100); - let controller = create_funded_user::("controller", USER_SEED, 100); - let controller_lookup = controller.lookup(); - let reward_destination = RewardDestination::Staked; - whitelist_account!(stash); - }: _(stash.origin(), controller_lookup, 2_000_000u32.into(), reward_destination) - verify { - assert!(Bonded::::contains_key(stash.account())); - assert!(Ledger::::contains_key(controller.account())); - } - - bond_extra { - // clean up any existing state. - clear_validators_and_nominators::(); - - // Polymesh change - // ----------------------------------------------------------------- - // UseNominatorsAndValidatorsMap does not provide nominators in sorted order - // ----------------------------------------------------------------- - - let (stash, controller) = - create_stash_controller::(USER_SEED, 100, RewardDestination::Staked).unwrap(); - let original_bonded = - Ledger::::get(controller.account()).map(|l| l.active).ok_or("ledger not created")?; - - whitelist_account!(stash); - }: _(stash.origin(), 2_000_000u32.into()) - verify { - let ledger = Ledger::::get(controller.account()).ok_or("ledger not created after")?; - let new_bonded: BalanceOf = ledger.active; - assert!(original_bonded < new_bonded); - } - - unbond { - // clean up any existing state. - clear_validators_and_nominators::(); - - // Polymesh change - // ----------------------------------------------------------------- - // UseNominatorsAndValidatorsMap does not provide nominators in sorted order - // ----------------------------------------------------------------- - - let (stash, controller) = - create_stash_controller::(USER_SEED, 100, RewardDestination::Staked).unwrap(); - let original_bonded = - Ledger::::get(controller.account()).map(|l| l.active).ok_or("ledger not created")?; - - whitelist_account!(controller); - }: _(controller.origin(), 20u32.into()) - verify { - let ledger = Ledger::::get(controller.account()).ok_or("ledger not created after")?; - let new_bonded: BalanceOf = ledger.active; - assert!(original_bonded > new_bonded); - } - - // Withdraw only updates the ledger - withdraw_unbonded_update { - // Slashing Spans - let s in 0 .. MAX_SPANS; - - // clean up any existing state. - clear_validators_and_nominators::(); - - let (stash, controller) = create_stash_controller::(0, 10_000_000, Default::default())?; - add_slashing_spans::(&stash.account(), s); - Staking::::unbond(controller.origin().into(), 50u32.into())?; - CurrentEra::::put(EraIndex::max_value()); - let original_total = - Ledger::::get(controller.account()).map(|l| l.total).ok_or("ledger not created before")?; - - whitelist_account!(controller); - }: withdraw_unbonded(controller.origin(), s) - verify { - let ledger = Ledger::::get(controller.account()).ok_or("ledger not created after")?; - let new_total: BalanceOf = ledger.total; - assert!(original_total > new_total); - } - - // Worst case scenario, everything is removed after the bonding duration - withdraw_unbonded_kill { - // Slashing Spans - let s in 0 .. MAX_SPANS; - // clean up any existing state. - clear_validators_and_nominators::(); - - // Polymesh change - // ----------------------------------------------------------------- - // UseNominatorsAndValidatorsMap does not provide nominators in sorted order - // ----------------------------------------------------------------- - - let (stash, controller) = create_stash_controller::(0, 10_000_000, Default::default())?; - add_slashing_spans::(&stash.account(), s); - Staking::::unbond(controller.origin().into(), 10_000_000u32.into())?; - CurrentEra::::put(EraIndex::max_value()); - let _ = Ledger::::get(&controller.account()).expect("ledger not created before"); - - whitelist_account!(controller); - }: withdraw_unbonded(controller.origin(), s) - verify { - assert!(!Ledger::::contains_key(controller.account())); - assert!(!T::VoterList::contains(&stash.account())); - } - - validate { - clear_validators_and_nominators::(); - - let (stash, controller) = create_stash_controller::( - T::MaxNominations::get() - 1, - 100, - Default::default(), - )?; - // because it is chilled. - assert!(!T::VoterList::contains(&stash.account())); - - // Polymesh change - // ----------------------------------------------------------------- - add_permissioned_validator_::(stash.did(), Some(2)); - // ----------------------------------------------------------------- - - whitelist_account!(controller); - }: _(controller.origin(), ValidatorPrefs::default()) - verify { - assert!(Validators::::contains_key(stash.account())); - assert!(T::VoterList::contains(&stash.account())); - } - - kick { - // scenario: we want to kick `k` nominators from nominating us (we are a validator). - // we'll assume that `k` is under 128 for the purposes of determining the slope. - // each nominator should have `T::MaxNominations::get()` validators nominated, and our validator - // should be somewhere in there. - let k in 1 .. 128; - - // these are the other validators; there are `T::MaxNominations::get() - 1` of them, so - // there are a total of `T::MaxNominations::get()` validators in the system. - let rest_of_validators = create_validators_with_seed::(T::MaxNominations::get() - 1, 100, 415)?; - - // this is the validator that will be kicking. - let (stash, controller) = create_stash_controller::( - T::MaxNominations::get() - 1, - 100, - Default::default(), - )?; - let stash_lookup = stash.lookup(); - - add_permissioned_validator_::(stash.did(), Some(2)); - - // they start validating. - Staking::::validate(controller.origin().into(), Default::default())?; - - // we now create the nominators. there will be `k` of them; each will nominate all - // validators. we will then kick each of the `k` nominators from the main validator. - let mut nominator_stashes = Vec::with_capacity(k as usize); - for i in 0 .. k { - // create a nominator stash. - let (n_stash, n_controller) = create_stash_controller::( - T::MaxNominations::get() + i, - 100, - Default::default(), - )?; - - // bake the nominations; we first clone them from the rest of the validators. - let mut nominations = rest_of_validators.clone(); - // then insert "our" validator somewhere in there (we vary it) to avoid accidental - // optimisations/pessimisations. - nominations.insert(i as usize % (nominations.len() + 1), stash_lookup.clone()); - // then we nominate. - Staking::::nominate(n_controller.origin().into(), nominations)?; - - nominator_stashes.push(n_stash.account()); - } - - // all nominators now should be nominating our validator... - for n in nominator_stashes.iter() { - assert!(Nominators::::get(n).unwrap().targets.contains(&stash.account())); - } - - // we need the unlookuped version of the nominator stash for the kick. - let kicks = nominator_stashes.iter() - .map(|n| T::Lookup::unlookup(n.clone())) - .collect::>(); - - whitelist_account!(controller); - }: _(controller.origin(), kicks) - verify { - // all nominators now should *not* be nominating our validator... - for n in nominator_stashes.iter() { - assert!(!Nominators::::get(n).unwrap().targets.contains(&stash.account())); - } - } - - // Worst case scenario, T::MaxNominations::get() - nominate { - let n in 1 .. T::MaxNominations::get(); - - // clean up any existing state. - clear_validators_and_nominators::(); - - let (stash, controller) = create_stash_controller::( - n + 1, - 10_000_000, - Default::default(), - )?; - assert!(!Nominators::::contains_key(&stash.account())); - assert!(!T::VoterList::contains(&stash.account())); - - let validators = create_validators::(n, 100).unwrap(); - - whitelist_account!(controller); - }: _(controller.origin(), validators) - verify { - assert!(Nominators::::contains_key(&stash.account())); - assert!(T::VoterList::contains(&stash.account())) - } - - chill { - // clean up any existing state. - clear_validators_and_nominators::(); - - // Polymesh change - // ----------------------------------------------------------------- - let (stash, controller) = create_stash_controller::(0, 10_000_000, Default::default())?; - Staking::::add_permissioned_validator(RawOrigin::Root.into(), stash.did(), Some(2))?; - Staking::::validate(controller.origin().into(), ValidatorPrefs::default())?; - assert!(T::VoterList::contains(&stash.account())); - assert!(Validators::::contains_key(&stash.account())); - // ----------------------------------------------------------------- - - whitelist_account!(controller); - }: _(controller.origin()) - verify { - assert!(!T::VoterList::contains(&stash.account())); - assert!(!Validators::::contains_key(&stash.account())); - } - - set_payee { - let (stash, controller) = create_stash_controller::(USER_SEED, 100, Default::default())?; - assert_eq!(Payee::::get(&stash.account()), RewardDestination::Staked); - whitelist_account!(controller); - }: _(controller.origin(), RewardDestination::Controller) - verify { - assert_eq!(Payee::::get(&stash.account()), RewardDestination::Controller); - } - - set_controller { - let (stash, _) = create_stash_controller::(USER_SEED, 100, Default::default())?; - let new_controller = create_funded_user::("new_controller", USER_SEED, 100); - whitelist_account!(stash); - }: _(stash.origin(), new_controller.lookup()) - verify { - assert!(Ledger::::contains_key(&new_controller.account())); - } - - set_validator_count { - let validator_count = MaxValidators::::get(); - }: _(RawOrigin::Root, validator_count) - verify { - assert_eq!(ValidatorCount::::get(), validator_count); - } - - force_no_eras {}: _(RawOrigin::Root) - verify { assert_eq!(ForceEra::::get(), Forcing::ForceNone); } - - force_new_era {}: _(RawOrigin::Root) - verify { assert_eq!(ForceEra::::get(), Forcing::ForceNew); } - - force_new_era_always {}: _(RawOrigin::Root) - verify { assert_eq!(ForceEra::::get(), Forcing::ForceAlways); } - - // Worst case scenario, the list of invulnerables is very long. - set_invulnerables { - let v in 0 .. MaxValidators::::get(); - let mut invulnerables = Vec::new(); - for i in 0 .. v { - invulnerables.push(account("invulnerable", i, SEED)); - } - }: _(RawOrigin::Root, invulnerables) - verify { - assert_eq!(Invulnerables::::get().len(), v as usize); - } - - force_unstake { - // Slashing Spans - let s in 0 .. MAX_SPANS; - // Clean up any existing state. - clear_validators_and_nominators::(); - - // Polymesh change - // ----------------------------------------------------------------- - let (stash, controller) = create_stash_controller::(USER_SEED, 10_000_000, Default::default())?; - Staking::::add_permissioned_validator(RawOrigin::Root.into(), stash.did(), Some(2))?; - Staking::::validate(controller.origin().into(), ValidatorPrefs::default())?; - add_slashing_spans::(&stash.account(), s); - assert!(T::VoterList::contains(&stash.account())); - assert!(Validators::::contains_key(&stash.account())); - // ----------------------------------------------------------------- - - }: _(RawOrigin::Root, stash.account(), s) - verify { - assert!(!Ledger::::contains_key(&controller.account())); - assert!(!T::VoterList::contains(&stash.account())); - assert!(!Validators::::contains_key(&stash.account())); - } - - cancel_deferred_slash { - let s in 1 .. MAX_SLASHES; - let mut unapplied_slashes = Vec::new(); - let era = EraIndex::one(); - let dummy = || T::AccountId::decode(&mut TrailingZeroInput::zeroes()).unwrap(); - for _ in 0 .. MAX_SLASHES { - unapplied_slashes.push(UnappliedSlash::>::default_from(dummy())); - } - UnappliedSlashes::::insert(era, &unapplied_slashes); - - let slash_indices: Vec = (0 .. s).collect(); - }: _(RawOrigin::Root, era, slash_indices) - verify { - assert_eq!(UnappliedSlashes::::get(&era).len(), (MAX_SLASHES - s) as usize); - } - - payout_stakers_dead_controller { - let n in 0 .. T::MaxNominatorRewardedPerValidator::get() as u32; - let (validator, nominators) = create_validator_with_nominators::( - n, - T::MaxNominatorRewardedPerValidator::get() as u32, - true, - RewardDestination::Controller, - Some(10_000_000) - )?; - - let current_era = CurrentEra::::get().unwrap(); - // set the commission for this particular era as well. - >::insert(current_era, validator.account().clone(), >::validators(&validator.account())); - - let validator_controller = >::get(&validator.account()).unwrap(); - let balance_before = T::Currency::free_balance(&validator_controller); - for (_, controller) in &nominators { - let balance = T::Currency::free_balance(&controller.account()); - ensure!(balance.is_zero(), "Controller has balance, but should be dead."); - } - - let caller = UserBuilder::::default().seed(SEED).generate_did().build("caller"); - let caller_key = frame_system::Account::::hashed_key_for(&caller.account()); - frame_benchmarking::benchmarking::add_to_whitelist(caller_key.into()); - }: payout_stakers(caller.origin(), validator.account(), current_era) - verify { - let balance_after = T::Currency::free_balance(&validator_controller); - ensure!( - balance_before < balance_after, - "Balance of validator controller should have increased after payout.", - ); - for (_, controller) in &nominators { - let balance = T::Currency::free_balance(&controller.account()); - ensure!(!balance.is_zero(), "Payout not given to controller."); - } - } - - payout_stakers_alive_staked { - let n in 0 .. T::MaxNominatorRewardedPerValidator::get() as u32; - - let (validator, nominators) = create_validator_with_nominators::( - n, - T::MaxNominatorRewardedPerValidator::get() as u32, - false, - RewardDestination::Staked, - Some(10_000_000) - )?; - - let current_era = CurrentEra::::get().unwrap(); - // set the commission for this particular era as well. - >::insert( - current_era, - validator.account().clone(), - >::validators(&validator.account()) - ); - - let caller = UserBuilder::::default().seed(SEED).generate_did().build("caller"); - let caller_key = frame_system::Account::::hashed_key_for(&caller.account()); - frame_benchmarking::benchmarking::add_to_whitelist(caller_key.into()); - - let balance_before = T::Currency::free_balance(&validator.account()); - let mut nominator_balances_before = Vec::new(); - for (stash, _) in &nominators { - let balance = T::Currency::free_balance(&stash.account()); - nominator_balances_before.push(balance); - } - }: payout_stakers(caller.origin(), validator.account().clone(), current_era) - verify { - let balance_after = T::Currency::free_balance(&validator.account()); - ensure!( - balance_before < balance_after, - "Balance of validator stash should have increased after payout.", - ); - for ((stash, _), balance_before) in nominators.iter().zip(nominator_balances_before.iter()) { - let balance_after = T::Currency::free_balance(&stash.account()); - ensure!( - balance_before < &balance_after, - "Balance of nominator stash should have increased after payout.", - ); - } - } - - rebond { - let l in 1 .. T::MaxUnlockingChunks::get() as u32; - - // clean up any existing state. - clear_validators_and_nominators::(); - - let (stash, controller) = - create_stash_controller::(1, 10_000_000, RewardDestination::Staked)?; - - let mut staking_ledger = Ledger::::get(controller.account()).unwrap(); - let unlock_chunk = UnlockChunk::> { - value: 1u32.into(), - era: EraIndex::zero(), - }; - for _ in 0 .. l { - staking_ledger.unlocking.try_push(unlock_chunk.clone()).unwrap() - } - Ledger::::insert(controller.account(), staking_ledger.clone()); - let original_bonded: BalanceOf = staking_ledger.active; - - whitelist_account!(controller); - }: _(controller.origin(), 101u32.into()) - verify { - let ledger = Ledger::::get(&controller.account()).ok_or("ledger not created after")?; - let new_bonded: BalanceOf = ledger.active; - assert!(original_bonded < new_bonded); - } - - reap_stash { - let s in 1 .. MAX_SPANS; - // clean up any existing state. - clear_validators_and_nominators::(); - - let (stash, controller) = - create_stash_controller::(1, 1, RewardDestination::Staked)?; - Staking::::add_permissioned_validator(RawOrigin::Root.into(), stash.did(), Some(2))?; - Staking::::validate(controller.origin().into(), ValidatorPrefs::default())?; - - add_slashing_spans::(&stash.account(), s); - let l = StakingLedger { - stash: stash.account().clone(), - active: T::Currency::minimum_balance(), - total: T::Currency::minimum_balance(), - unlocking: Default::default(), - claimed_rewards: Default::default(), - }; - T::Currency::make_free_balance_be(&stash.account(), 0u32.into()); - Ledger::::insert(&controller.account(), l); - - assert!(Bonded::::contains_key(&stash.account())); - assert!(T::VoterList::contains(&stash.account())); - - whitelist_account!(controller); - }: _(controller.origin(), stash.account(), s) - verify { - assert!(!Bonded::::contains_key(&stash.account())); - assert!(!T::VoterList::contains(&stash.account())); - } - - new_era { - let v in 1 .. 10; - let n in 0 .. 100; - - create_validators_with_nominators_for_era::( - v, - n, - ::MaxNominations::get() as usize, - false, - None, - )?; - let session_index = SessionIndex::one(); - }: { - let validators = Staking::::try_trigger_new_era(session_index, true) - .ok_or("`new_era` failed")?; - assert!(validators.len() == v as usize); - } - - #[extra] - payout_all { - let v in 1 .. 10; - let n in 0 .. 100; - create_validators_with_nominators_for_era::( - v, - n, - ::MaxNominations::get() as usize, - false, - None, - )?; - // Start a new Era - let new_validators = Staking::::try_trigger_new_era(SessionIndex::one(), true).unwrap(); - assert!(new_validators.len() == v as usize); - - let current_era = CurrentEra::::get().unwrap(); - let mut points_total = 0; - let mut points_individual = Vec::new(); - let mut payout_calls_arg = Vec::new(); - - for validator in new_validators.iter() { - points_total += 10; - points_individual.push((validator.clone(), 10)); - payout_calls_arg.push((validator.clone(), current_era)); - } - - // Give Era Points - let reward = EraRewardPoints:: { - total: points_total, - individual: points_individual.into_iter().collect(), - }; - - ErasRewardPoints::::insert(current_era, reward); - - // Create reward pool - let total_payout = T::Currency::minimum_balance() * 1000u32.into(); - >::insert(current_era, total_payout); - - let caller: T::AccountId = whitelisted_caller(); - let origin = RawOrigin::Signed(caller); - let calls: Vec<_> = payout_calls_arg.iter().map(|arg| - Call::::payout_stakers { validator_stash: arg.0.clone(), era: arg.1 }.encode() - ).collect(); - }: { - for call in calls { - as Decode>::decode(&mut &*call) - .expect("call is encoded above, encoding must be correct") - .dispatch_bypass_filter(origin.clone().into())?; - } - } - - #[extra] - do_slash { - let l in 1 .. T::MaxUnlockingChunks::get() as u32; - let (stash, controller) = create_stash_controller::(0, 100, Default::default())?; - let mut staking_ledger = Ledger::::get(controller.account()).unwrap(); - let unlock_chunk = UnlockChunk::> { - value: 1u32.into(), - era: EraIndex::zero(), - }; - for _ in 0 .. l { - staking_ledger.unlocking.try_push(unlock_chunk.clone()).unwrap(); - } - Ledger::::insert(controller.account(), staking_ledger); - let balance_before = T::Currency::free_balance(&stash.account()); - }: { - crate::slashing::do_slash::( - &stash.account(), - 10u32.into(), - &mut BalanceOf::::zero(), - &mut NegativeImbalanceOf::::zero(), - EraIndex::zero() - ); - } verify { - let balance_after = T::Currency::free_balance(&stash.account()); - assert!(balance_before > balance_after); - } - - get_npos_voters { - // number of validator intention. we will iterate all of them. - let v in (MaxValidators::::get() / 2) .. MaxValidators::::get(); - // number of nominator intention. we will iterate all of them. - let n in (MaxNominators::::get() / 2) .. MaxNominators::::get(); - - let validators = create_validators_with_nominators_for_era::( - v, n, T::MaxNominations::get() as usize, false, None - )? - .into_iter() - .map(|v| T::Lookup::lookup(v).unwrap()) - .collect::>(); - - assert_eq!(Validators::::count(), v); - assert_eq!(Nominators::::count(), n); - - let num_voters = (v + n) as usize; - }: { - let voters = >::get_npos_voters(None); - assert_eq!(voters.len(), num_voters); - } - - get_npos_targets { - // number of validator intention. - let v in (MaxValidators::::get() / 2) .. MaxValidators::::get(); - // number of nominator intention. - let n = MaxNominators::::get(); - - let _ = create_validators_with_nominators_for_era::( - v, n, T::MaxNominations::get() as usize, false, None - )?; - }: { - let targets = >::get_npos_targets(None); - assert_eq!(targets.len() as u32, v); - } - - set_staking_configs_all_set { - }: set_staking_configs( - RawOrigin::Root, - ConfigOp::Set(BalanceOf::::max_value()), - ConfigOp::Set(BalanceOf::::max_value()), - ConfigOp::Set(u32::MAX), - ConfigOp::Set(u32::MAX), - ConfigOp::Set(Percent::max_value()), - ConfigOp::Set(Perbill::max_value()) - ) verify { - assert_eq!(MinNominatorBond::::get(), BalanceOf::::max_value()); - assert_eq!(MinValidatorBond::::get(), BalanceOf::::max_value()); - assert_eq!(MaxNominatorsCount::::get(), Some(u32::MAX)); - assert_eq!(MaxValidatorsCount::::get(), Some(u32::MAX)); - assert_eq!(ChillThreshold::::get(), Some(Percent::from_percent(100))); - assert_eq!(MinCommission::::get(), Perbill::from_percent(100)); - } - - set_staking_configs_all_remove { - }: set_staking_configs( - RawOrigin::Root, - ConfigOp::Remove, - ConfigOp::Remove, - ConfigOp::Remove, - ConfigOp::Remove, - ConfigOp::Remove, - ConfigOp::Remove - ) verify { - assert!(!MinNominatorBond::::exists()); - assert!(!MinValidatorBond::::exists()); - assert!(!MaxNominatorsCount::::exists()); - assert!(!MaxValidatorsCount::::exists()); - assert!(!ChillThreshold::::exists()); - assert!(!MinCommission::::exists()); - } - - chill_other { - // clean up any existing state. - clear_validators_and_nominators::(); - - // Create a validator with a commission of 50% - let (stash, controller) = - create_stash_controller::(1, 1, RewardDestination::Staked)?; - let validator_prefs = - ValidatorPrefs { commission: Perbill::from_percent(50), ..Default::default() }; - Staking::::set_commission_cap(RawOrigin::Root.into(), Perbill::from_percent(60)).unwrap(); - Staking::::add_permissioned_validator(RawOrigin::Root.into(), stash.did(), Some(2))?; - Staking::::validate(controller.origin().into(), validator_prefs)?; - assert!(T::VoterList::contains(&stash.account())); - - Staking::::set_staking_configs( - RawOrigin::Root.into(), - ConfigOp::Set(BalanceOf::::max_value()), - ConfigOp::Set(BalanceOf::::max_value()), - ConfigOp::Set(0), - ConfigOp::Set(0), - ConfigOp::Set(Percent::from_percent(0)), - ConfigOp::Set(Zero::zero()), - )?; - - let caller = UserBuilder::::default().seed(SEED).generate_did().build("caller"); - }: _(caller.origin(), controller.account()) - verify { - assert!(!T::VoterList::contains(&stash.account())); - } - - force_apply_min_commission { - // Clean up any existing state - clear_validators_and_nominators::(); - - // Create a validator with a commission of 50% - let (stash, controller) = - create_stash_controller::(1, 1, RewardDestination::Staked)?; - let validator_prefs = - ValidatorPrefs { commission: Perbill::from_percent(50), ..Default::default() }; - Staking::::set_commission_cap(RawOrigin::Root.into(), Perbill::from_percent(60)).unwrap(); - Staking::::add_permissioned_validator(RawOrigin::Root.into(), stash.did(), Some(2))?; - Staking::::validate(controller.origin().into(), validator_prefs)?; - - // Sanity check - assert_eq!( - Validators::::get(&stash.account()), - ValidatorPrefs { commission: Perbill::from_percent(50), ..Default::default() } - ); - - // Set the min commission to 75% - MinCommission::::set(Perbill::from_percent(75)); - }: _(stash.origin(), stash.account().clone()) - verify { - // The validators commission has been bumped to 75% - assert_eq!( - Validators::::get(&stash.account()), - ValidatorPrefs { commission: Perbill::from_percent(75), ..Default::default() } - ); - } - - set_min_commission { - let min_commission = Perbill::max_value(); - }: _(RawOrigin::Root, min_commission) - verify { - assert_eq!(MinCommission::::get(), Perbill::from_percent(100)); - } - - // Polymesh change - // ----------------------------------------------------------------- - add_permissioned_validator { - clear_validators_and_nominators::(); - let (stash, controller) = - create_stash_controller::(1, 1, RewardDestination::Staked)?; - Staking::::set_validator_count(RawOrigin::Root.into(), 10).unwrap(); - }: _(RawOrigin::Root, stash.did(), Some(1)) - verify { - let identity_preferences = Staking::::permissioned_identity(stash.did()); - assert!(identity_preferences.is_some()); - assert_eq!(identity_preferences.unwrap().intended_count, 1); - } - - remove_permissioned_validator { - clear_validators_and_nominators::(); - let (stash, controller) = - create_stash_controller::(1, 1, RewardDestination::Staked)?; - add_permissioned_validator_::(stash.did(), Some(1)); - }: _(RawOrigin::Root, stash.did()) - verify { - let identity_preferences = Staking::::permissioned_identity(stash.did()); - assert!(identity_preferences.is_none()); - } - - change_slashing_allowed_for {}: _(RawOrigin::Root, SlashingSwitch::ValidatorAndNominator) - verify { - assert_eq!(Staking::::slashing_allowed_for(), SlashingSwitch::ValidatorAndNominator); - } - - update_permissioned_validator_intended_count { - clear_validators_and_nominators::(); - let (stash, controller) = - create_stash_controller::(1, 1, RewardDestination::Staked)?; - add_permissioned_validator_::(stash.did(), Some(1)); - }: _(RawOrigin::Root, stash.did(), 2) - verify { - assert_eq!(Staking::::permissioned_identity(stash.did()).unwrap().intended_count, 2); - } - - chill_from_governance { - let s in 1..100; - - let validator = create_funded_user::("validator", USER_SEED, 10_000); - - Staking::::set_validator_count(RawOrigin::Root.into(), 1_000).unwrap(); - assert_eq!(Staking::::validator_count(), 1_000); - - Staking::::add_permissioned_validator( - RawOrigin::Root.into(), - validator.did(), - Some(100) - ).unwrap(); - - whitelist_account!(validator); - - let mut signatories = Vec::new(); - for x in 0 .. s { - let key = UserBuilder::::default().seed(x).balance(10_000u32).build("key"); - let _ = T::Currency::issue(10_000u32.into()); - - pallet_identity::Pallet::::unsafe_join_identity( - validator.did(), - Permissions::default(), - key.account.clone() - ); - Staking::::bond( - key.origin().into(), - key.lookup(), - 2_000_000u32.into(), - RewardDestination::Staked - ) - .unwrap(); - whitelist_account!(key); - - Staking::::validate(key.origin().into(), ValidatorPrefs::default()).unwrap(); - assert_eq!(>::contains_key(&key.account), true); - signatories.push(key.account.clone()); - } - }: _(RawOrigin::Root, validator.did(), signatories.clone()) - verify { - for key in signatories { - assert!(!>::contains_key(&key)); - } - } - - set_commission_cap { - let m in 0 .. 150; - - let mut stashes = Vec::with_capacity(m as usize); - for i in 0 .. m { - let stash = create_funded_user::("stash", i, 1000); - stashes.push(stash.account()); - Validators::::insert( - stash.account(), - ValidatorPrefs { - commission: Perbill::from_percent(70), - ..Default::default() - } - ); - } - }: _(RawOrigin::Root, Perbill::from_percent(50)) - verify { - stashes.iter().for_each(|s| { - assert_eq!( - Staking::::validators(s), - ValidatorPrefs { commission: Perbill::from_percent(50), ..Default::default() } - ); - }); - } - - // ----------------------------------------------------------------- -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::mock::{Balances, ExtBuilder, RuntimeOrigin, Staking, Test}; - use frame_support::assert_ok; - - #[test] - fn create_validators_with_nominators_for_era_works() { - ExtBuilder::default().build_and_execute(|| { - let v = 10; - let n = 100; - - create_validators_with_nominators_for_era::( - v, - n, - ::MaxNominations::get() as usize, - false, - None, - ) - .unwrap(); - - let count_validators = Validators::::iter().count(); - let count_nominators = Nominators::::iter().count(); - - assert_eq!(count_validators, Validators::::count() as usize); - assert_eq!(count_nominators, Nominators::::count() as usize); - - assert_eq!(count_validators, v as usize); - assert_eq!(count_nominators, n as usize); - }); - } - - #[test] - fn create_validator_with_nominators_works() { - ExtBuilder::default().build_and_execute(|| { - let n = 10; - - let (validator_stash, nominators) = create_validator_with_nominators::( - n, - <::MaxNominatorRewardedPerValidator as Get<_>>::get(), - false, - RewardDestination::Staked, - ) - .unwrap(); - - assert_eq!(nominators.len() as u32, n); - - let current_era = CurrentEra::::get().unwrap(); - - let original_free_balance = Balances::free_balance(&validator_stash); - assert_ok!(Staking::payout_stakers( - RuntimeOrigin::signed(1337), - validator_stash, - current_era - )); - let new_free_balance = Balances::free_balance(&validator_stash); - - assert!(original_free_balance < new_free_balance); - }); - } - - #[test] - fn add_slashing_spans_works() { - ExtBuilder::default().build_and_execute(|| { - let n = 10; - - let (validator_stash, _nominators) = create_validator_with_nominators::( - n, - <::MaxNominatorRewardedPerValidator as Get<_>>::get(), - false, - RewardDestination::Staked, - ) - .unwrap(); - - // Add 20 slashing spans - let num_of_slashing_spans = 20; - add_slashing_spans::(&validator_stash, num_of_slashing_spans); - - let slashing_spans = SlashingSpans::::get(&validator_stash).unwrap(); - assert_eq!( - slashing_spans.iter().count(), - num_of_slashing_spans as usize - ); - for i in 0..num_of_slashing_spans { - assert!(SpanSlash::::contains_key((&validator_stash, i))); - } - - // Test everything is cleaned up - assert_ok!(Staking::kill_stash(&validator_stash, num_of_slashing_spans)); - assert!(SlashingSpans::::get(&validator_stash).is_none()); - for i in 0..num_of_slashing_spans { - assert!(!SpanSlash::::contains_key((&validator_stash, i))); - } - }); - } - - #[test] - fn test_payout_all() { - ExtBuilder::default().build_and_execute(|| { - let v = 10; - let n = 100; - - let selected_benchmark = SelectedBenchmark::payout_all; - let c = vec![ - (frame_benchmarking::BenchmarkParameter::v, v), - (frame_benchmarking::BenchmarkParameter::n, n), - ]; - let closure_to_benchmark = - >::instance( - &selected_benchmark, - &c, - true, - ) - .unwrap(); - - assert_ok!(closure_to_benchmark()); - }); - } -} diff --git a/pallets/staking/src/lib.rs b/pallets/staking/src/lib.rs deleted file mode 100644 index 99ffdcdeb4..0000000000 --- a/pallets/staking/src/lib.rs +++ /dev/null @@ -1,1057 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! # Staking Pallet -//! -//! The Staking pallet is used to manage funds at stake by network maintainers. -//! -//! - [`Config`] -//! - [`Call`] -//! - [`Pallet`] -//! -//! ## Overview -//! -//! The Staking pallet is the means by which a set of network maintainers (known as _authorities_ in -//! some contexts and _validators_ in others) are chosen based upon those who voluntarily place -//! funds under deposit. Under deposit, those funds are rewarded under normal operation but are held -//! at pain of _slash_ (expropriation) should the staked maintainer be found not to be discharging -//! its duties properly. -//! -//! ### Terminology -//! -//! -//! - Staking: The process of locking up funds for some time, placing them at risk of slashing -//! (loss) in order to become a rewarded maintainer of the network. -//! - Validating: The process of running a node to actively maintain the network, either by -//! producing blocks or guaranteeing finality of the chain. -//! - Nominating: The process of placing staked funds behind one or more validators in order to -//! share in any reward, and punishment, they take. -//! - Stash account: The account holding an owner's funds used for staking. -//! - Controller account: The account that controls an owner's funds for staking. -//! - Era: A (whole) number of sessions, which is the period that the validator set (and each -//! validator's active nominator set) is recalculated and where rewards are paid out. -//! - Slash: The punishment of a staker by reducing its funds. -//! -//! ### Goals -//! -//! -//! The staking system in Substrate NPoS is designed to make the following possible: -//! -//! - Stake funds that are controlled by a cold wallet. -//! - Withdraw some, or deposit more, funds without interrupting the role of an entity. -//! - Switch between roles (nominator, validator, idle) with minimal overhead. -//! -//! ### Scenarios -//! -//! #### Staking -//! -//! Almost any interaction with the Staking pallet requires a process of _**bonding**_ (also known -//! as being a _staker_). To become *bonded*, a fund-holding register known as the _stash account_, -//! which holds some or all of the funds that become frozen in place as part of the staking process, -//! is paired with an active **controller** account, which issues instructions on how they shall be -//! used. -//! -//! An account pair can become bonded using the [`bond`](Call::bond) call. -//! -//! Stash accounts can change their associated controller using the -//! [`set_controller`](Call::set_controller) call. -//! -//! There are three possible roles that any staked account pair can be in: `Validator`, `Nominator` -//! and `Idle` (defined in [`StakerStatus`]). There are three -//! corresponding instructions to change between roles, namely: -//! [`validate`](Call::validate), -//! [`nominate`](Call::nominate), and [`chill`](Call::chill). -//! -//! #### Validating -//! -//! A **validator** takes the role of either validating blocks or ensuring their finality, -//! maintaining the veracity of the network. A validator should avoid both any sort of malicious -//! misbehavior and going offline. Bonded accounts that state interest in being a validator do NOT -//! get immediately chosen as a validator. Instead, they are declared as a _candidate_ and they -//! _might_ get elected at the _next era_ as a validator. The result of the election is determined -//! by nominators and their votes. -//! -//! An account can become a validator candidate via the -//! [`validate`](Call::validate) call. -//! -//! #### Nomination -//! -//! A **nominator** does not take any _direct_ role in maintaining the network, instead, it votes on -//! a set of validators to be elected. Once interest in nomination is stated by an account, it -//! takes effect at the next election round. The funds in the nominator's stash account indicate the -//! _weight_ of its vote. Both the rewards and any punishment that a validator earns are shared -//! between the validator and its nominators. This rule incentivizes the nominators to NOT vote for -//! the misbehaving/offline validators as much as possible, simply because the nominators will also -//! lose funds if they vote poorly. -//! -//! An account can become a nominator via the [`nominate`](Call::nominate) call. -//! -//! #### Voting -//! -//! Staking is closely related to elections; actual validators are chosen from among all potential -//! validators via election by the potential validators and nominators. To reduce use of the phrase -//! "potential validators and nominators", we often use the term **voters**, who are simply -//! the union of potential validators and nominators. -//! -//! #### Rewards and Slash -//! -//! The **reward and slashing** procedure is the core of the Staking pallet, attempting to _embrace -//! valid behavior_ while _punishing any misbehavior or lack of availability_. -//! -//! Rewards must be claimed for each era before it gets too old by `$HISTORY_DEPTH` using the -//! `payout_stakers` call. Any account can call `payout_stakers`, which pays the reward to the -//! validator as well as its nominators. Only the [`Config::MaxNominatorRewardedPerValidator`] -//! biggest stakers can claim their reward. This is to limit the i/o cost to mutate storage for each -//! nominator's account. -//! -//! Slashing can occur at any point in time, once misbehavior is reported. Once slashing is -//! determined, a value is deducted from the balance of the validator and all the nominators who -//! voted for this validator (values are deducted from the _stash_ account of the slashed entity). -//! -//! Slashing logic is further described in the documentation of the `slashing` pallet. -//! -//! Similar to slashing, rewards are also shared among a validator and its associated nominators. -//! Yet, the reward funds are not always transferred to the stash account and can be configured. See -//! [Reward Calculation](#reward-calculation) for more details. -//! -//! #### Chilling -//! -//! Finally, any of the roles above can choose to step back temporarily and just chill for a while. -//! This means that if they are a nominator, they will not be considered as voters anymore and if -//! they are validators, they will no longer be a candidate for the next election. -//! -//! An account can step back via the [`chill`](Call::chill) call. -//! -//! ### Session managing -//! -//! The pallet implement the trait `SessionManager`. Which is the only API to query new validator -//! set and allowing these validator set to be rewarded once their era is ended. -//! -//! ## Interface -//! -//! ### Dispatchable Functions -//! -//! The dispatchable functions of the Staking pallet enable the steps needed for entities to accept -//! and change their role, alongside some helper functions to get/set the metadata of the pallet. -//! -//! ### Public Functions -//! -//! The Staking pallet contains many public storage items and (im)mutable functions. -//! -//! ## Usage -//! -//! ### Example: Rewarding a validator by id. -//! -//! ``` -//! use pallet_staking::{self as staking}; -//! -//! #[frame_support::pallet] -//! pub mod pallet { -//! use super::*; -//! use frame_support::pallet_prelude::*; -//! use frame_system::pallet_prelude::*; -//! -//! #[pallet::pallet] -//! pub struct Pallet(_); -//! -//! #[pallet::config] -//! pub trait Config: frame_system::Config + staking::Config {} -//! -//! #[pallet::call] -//! impl Pallet { -//! /// Reward a validator. -//! #[pallet::weight(0)] -//! pub fn reward_myself(origin: OriginFor) -> DispatchResult { -//! let reported = ensure_signed(origin)?; -//! >::reward_by_ids(vec![(reported, 10)]); -//! Ok(()) -//! } -//! } -//! } -//! # fn main() { } -//! ``` -//! -//! ## Implementation Details -//! -//! ### Era payout -//! -//! The era payout is computed using yearly inflation curve defined at -//! [`Config::EraPayout`] as such: -//! -//! ```nocompile -//! staker_payout = yearly_inflation(npos_token_staked / total_tokens) * total_tokens / era_per_year -//! ``` -//! This payout is used to reward stakers as defined in next section -//! -//! ```nocompile -//! remaining_payout = max_yearly_inflation * total_tokens / era_per_year - staker_payout -//! ``` -//! The remaining reward is send to the configurable end-point -//! [`Config::RewardRemainder`]. -//! -//! ### Reward Calculation -//! -//! Validators and nominators are rewarded at the end of each era. The total reward of an era is -//! calculated using the era duration and the staking rate (the total amount of tokens staked by -//! nominators and validators, divided by the total token supply). It aims to incentivize toward a -//! defined staking rate. The full specification can be found -//! [here](https://research.web3.foundation/en/latest/polkadot/Token%20Economics.html#inflation-model). -//! -//! Total reward is split among validators and their nominators depending on the number of points -//! they received during the era. Points are added to a validator using -//! [`reward_by_ids`](Pallet::reward_by_ids). -//! -//! [`Pallet`] implements -//! [`pallet_authorship::EventHandler`] to add reward -//! points to block producer and block producer of referenced uncles. -//! -//! The validator and its nominator split their reward as following: -//! -//! The validator can declare an amount, named [`commission`](ValidatorPrefs::commission), that does -//! not get shared with the nominators at each reward payout through its [`ValidatorPrefs`]. This -//! value gets deducted from the total reward that is paid to the validator and its nominators. The -//! remaining portion is split pro rata among the validator and the top -//! [`Config::MaxNominatorRewardedPerValidator`] nominators that nominated the validator, -//! proportional to the value staked behind the validator (_i.e._ dividing the -//! [`own`](Exposure::own) or [`others`](Exposure::others) by [`total`](Exposure::total) in -//! [`Exposure`]). Note that the pro rata division of rewards uses the total exposure behind the -//! validator, *not* just the exposure of the validator and the top -//! [`Config::MaxNominatorRewardedPerValidator`] nominators. -//! -//! All entities who receive a reward have the option to choose their reward destination through the -//! [`Payee`] storage item (see -//! [`set_payee`](Call::set_payee)), to be one of the following: -//! -//! - Controller account, (obviously) not increasing the staked value. -//! - Stash account, not increasing the staked value. -//! - Stash account, also increasing the staked value. -//! -//! ### Additional Fund Management Operations -//! -//! Any funds already placed into stash can be the target of the following operations: -//! -//! The controller account can free a portion (or all) of the funds using the -//! [`unbond`](Call::unbond) call. Note that the funds are not immediately -//! accessible. Instead, a duration denoted by -//! [`Config::BondingDuration`] (in number of eras) must -//! pass until the funds can actually be removed. Once the `BondingDuration` is over, the -//! [`withdraw_unbonded`](Call::withdraw_unbonded) call can be used to actually -//! withdraw the funds. -//! -//! Note that there is a limitation to the number of fund-chunks that can be scheduled to be -//! unlocked in the future via [`unbond`](Call::unbond). In case this maximum -//! (`MAX_UNLOCKING_CHUNKS`) is reached, the bonded account _must_ first wait until a successful -//! call to `withdraw_unbonded` to remove some of the chunks. -//! -//! ### Election Algorithm -//! -//! The current election algorithm is implemented based on Phragmén. The reference implementation -//! can be found [here](https://github.com/w3f/consensus/tree/master/NPoS). -//! -//! The election algorithm, aside from electing the validators with the most stake value and votes, -//! tries to divide the nominator votes among candidates in an equal manner. To further assure this, -//! an optional post-processing can be applied that iteratively normalizes the nominator staked -//! values until the total difference among votes of a particular nominator are less than a -//! threshold. -//! -//! ## GenesisConfig -//! -//! The Staking pallet depends on the [`GenesisConfig`]. The -//! `GenesisConfig` is optional and allow to set some initial stakers. -//! -//! ## Related Modules -//! -//! - [Balances](../pallet_balances/index.html): Used to manage values at stake. -//! - [Session](../pallet_session/index.html): Used to manage sessions. Also, a list of new -//! validators is stored in the Session pallet's `Validators` at the end of each era. - -#![cfg_attr(not(feature = "std"), no_std)] -#![recursion_limit = "256"] - -#[cfg(feature = "runtime-benchmarks")] -pub mod benchmarking; -#[cfg(any(feature = "runtime-benchmarks"))] -pub mod testing_utils; - -pub mod inflation; -pub mod slashing; -pub mod types; -pub mod weights; - -pub mod pallet; - -use codec::{Decode, Encode, HasCompact, MaxEncodedLen}; -use frame_support::{ - traits::{Currency, Defensive, Get}, - BoundedVec, CloneNoBound, EqNoBound, PartialEqNoBound, RuntimeDebugNoBound, -}; -use scale_info::TypeInfo; -use sp_runtime::{ - curve::PiecewiseLinear, - traits::{AtLeast32BitUnsigned, Convert, Saturating, StaticLookup, Zero}, - Perbill, Perquintill, Rounding, RuntimeDebug, -}; -use sp_staking::{ - offence::{Offence, OffenceError, ReportOffence}, - EraIndex, SessionIndex, -}; -use sp_std::{collections::btree_map::BTreeMap, prelude::*}; -pub use weights::WeightInfo; - -pub use pallet::{pallet::*, *}; - -pub(crate) const LOG_TARGET: &str = "runtime::staking"; - -// syntactic sugar for logging. -#[macro_export] -macro_rules! log { - ($level:tt, $patter:expr $(, $values:expr)* $(,)?) => { - log::$level!( - target: crate::LOG_TARGET, - concat!("[{:?}] 💸 ", $patter), >::block_number() $(, $values)* - ) - }; -} - -/// Maximum number of winners (aka. active validators), as defined in the election provider of this -/// pallet. -pub type MaxWinnersOf = <::ElectionProvider as frame_election_provider_support::ElectionProviderBase>::MaxWinners; - -/// Counter for the number of "reward" points earned by a given validator. -pub type RewardPoint = u32; - -/// The balance type of this pallet. -pub type BalanceOf = ::CurrencyBalance; - -pub type PositiveImbalanceOf = <::Currency as Currency< - ::AccountId, ->>::PositiveImbalance; -pub type NegativeImbalanceOf = <::Currency as Currency< - ::AccountId, ->>::NegativeImbalance; - -type AccountIdLookupOf = <::Lookup as StaticLookup>::Source; - -/// Information regarding the active era (era in used in session). -#[derive(Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] -pub struct ActiveEraInfo { - /// Index of era. - pub index: EraIndex, - /// Moment of start expressed as millisecond from `$UNIX_EPOCH`. - /// - /// Start can be none if start hasn't been set for the era yet, - /// Start is set on the first on_finalize of the era to guarantee usage of `Time`. - start: Option, -} - -/// Reward points of an era. Used to split era total payout between validators. -/// -/// This points will be used to reward validators and their respective nominators. -#[derive(PartialEq, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct EraRewardPoints { - /// Total number of points. Equals the sum of reward points for each validator. - pub total: RewardPoint, - /// The reward points earned by a given validator. - pub individual: BTreeMap, -} - -impl Default for EraRewardPoints { - fn default() -> Self { - EraRewardPoints { - total: Default::default(), - individual: BTreeMap::new(), - } - } -} - -/// Indicates the initial status of the staker. -#[derive(RuntimeDebug, TypeInfo)] -#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize, Clone))] -pub enum StakerStatus { - /// Chilling. - Idle, - /// Declared desire in validating or already participating in it. - Validator, - /// Nominating for a group of other stakers. - Nominator(Vec), -} - -/// A destination account for payment. -#[derive( - PartialEq, - Eq, - Copy, - Clone, - Encode, - Decode, - RuntimeDebug, - TypeInfo, - MaxEncodedLen -)] -pub enum RewardDestination { - /// Pay into the stash account, increasing the amount at stake accordingly. - Staked, - /// Pay into the stash account, not increasing the amount at stake. - Stash, - /// Pay into the controller account. - Controller, - /// Pay into a specified account. - Account(AccountId), - /// Receive no reward. - None, -} - -impl Default for RewardDestination { - fn default() -> Self { - RewardDestination::Staked - } -} - -/// Preference of what happens regarding validation. -#[derive( - PartialEq, - Eq, - Clone, - Encode, - Decode, - RuntimeDebug, - TypeInfo, - Default, - MaxEncodedLen -)] -pub struct ValidatorPrefs { - /// Reward that validator takes up-front; only the rest is split between themselves and - /// nominators. - #[codec(compact)] - pub commission: Perbill, - /// Whether or not this validator is accepting more nominations. If `true`, then no nominator - /// who is not already nominating this validator may nominate them. By default, validators - /// are accepting nominations. - pub blocked: bool, -} - -/// Just a Balance/BlockNumber tuple to encode when a chunk of funds will be unlocked. -#[derive( - PartialEq, - Eq, - Clone, - Encode, - Decode, - RuntimeDebug, - TypeInfo, - MaxEncodedLen -)] -pub struct UnlockChunk { - /// Amount of funds to be unlocked. - #[codec(compact)] - pub value: Balance, - /// Era number at which point it'll be unlocked. - #[codec(compact)] - pub era: EraIndex, -} - -/// The ledger of a (bonded) stash. -#[derive( - PartialEqNoBound, - EqNoBound, - CloneNoBound, - Encode, - Decode, - RuntimeDebugNoBound, - TypeInfo, - MaxEncodedLen -)] -#[scale_info(skip_type_params(T))] -pub struct StakingLedger { - /// The stash account whose balance is actually locked and at stake. - pub stash: T::AccountId, - /// The total amount of the stash's balance that we are currently accounting for. - /// It's just `active` plus all the `unlocking` balances. - #[codec(compact)] - pub total: BalanceOf, - /// The total amount of the stash's balance that will be at stake in any forthcoming - /// rounds. - #[codec(compact)] - pub active: BalanceOf, - /// Any balance that is becoming free, which may eventually be transferred out of the stash - /// (assuming it doesn't get slashed first). It is assumed that this will be treated as a first - /// in, first out queue where the new (higher value) eras get pushed on the back. - pub unlocking: BoundedVec>, T::MaxUnlockingChunks>, - /// List of eras for which the stakers behind a validator have claimed rewards. Only updated - /// for validators. - pub claimed_rewards: BoundedVec, -} - -impl StakingLedger { - /// Initializes the default object using the given `validator`. - pub fn default_from(stash: T::AccountId) -> Self { - Self { - stash, - total: Zero::zero(), - active: Zero::zero(), - unlocking: Default::default(), - claimed_rewards: Default::default(), - } - } - - /// Remove entries from `unlocking` that are sufficiently old and reduce the - /// total by the sum of their balances. - fn consolidate_unlocked(self, current_era: EraIndex) -> Self { - let mut total = self.total; - let unlocking: BoundedVec<_, _> = self - .unlocking - .into_iter() - .filter(|chunk| { - if chunk.era > current_era { - true - } else { - total = total.saturating_sub(chunk.value); - false - } - }) - .collect::>() - .try_into() - .expect( - "filtering items from a bounded vec always leaves length less than bounds. qed", - ); - - Self { - stash: self.stash, - total, - active: self.active, - unlocking, - claimed_rewards: self.claimed_rewards, - } - } - - /// Re-bond funds that were scheduled for unlocking. - /// - /// Returns the updated ledger, and the amount actually rebonded. - fn rebond(mut self, value: BalanceOf) -> (Self, BalanceOf) { - let mut unlocking_balance = BalanceOf::::zero(); - - while let Some(last) = self.unlocking.last_mut() { - if unlocking_balance + last.value <= value { - unlocking_balance += last.value; - self.active += last.value; - self.unlocking.pop(); - } else { - let diff = value - unlocking_balance; - - unlocking_balance += diff; - self.active += diff; - last.value -= diff; - } - - if unlocking_balance >= value { - break; - } - } - - (self, unlocking_balance) - } - - /// Slash the staker for a given amount of balance. - /// - /// This implements a proportional slashing system, whereby we set our preference to slash as - /// such: - /// - /// - If any unlocking chunks exist that are scheduled to be unlocked at `slash_era + - /// bonding_duration` and onwards, the slash is divided equally between the active ledger and - /// the unlocking chunks. - /// - If no such chunks exist, then only the active balance is slashed. - /// - /// Note that the above is only a *preference*. If for any reason the active ledger, with or - /// without some portion of the unlocking chunks that are more justified to be slashed are not - /// enough, then the slashing will continue and will consume as much of the active and unlocking - /// chunks as needed. - /// - /// This will never slash more than the given amount. If any of the chunks become dusted, the - /// last chunk is slashed slightly less to compensate. Returns the amount of funds actually - /// slashed. - /// - /// `slash_era` is the era in which the slash (which is being enacted now) actually happened. - /// - /// This calls `Config::OnStakerSlash::on_slash` with information as to how the slash was - /// applied. - pub fn slash( - &mut self, - slash_amount: BalanceOf, - minimum_balance: BalanceOf, - slash_era: EraIndex, - ) -> BalanceOf { - if slash_amount.is_zero() { - return Zero::zero(); - } - - use sp_runtime::PerThing as _; - use sp_staking::OnStakerSlash as _; - let mut remaining_slash = slash_amount; - let pre_slash_total = self.total; - - // for a `slash_era = x`, any chunk that is scheduled to be unlocked at era `x + 28` - // (assuming 28 is the bonding duration) onwards should be slashed. - let slashable_chunks_start = slash_era + T::BondingDuration::get(); - - // `Some(ratio)` if this is proportional, with `ratio`, `None` otherwise. In both cases, we - // slash first the active chunk, and then `slash_chunks_priority`. - let (maybe_proportional, slash_chunks_priority) = { - if let Some(first_slashable_index) = self - .unlocking - .iter() - .position(|c| c.era >= slashable_chunks_start) - { - // If there exists a chunk who's after the first_slashable_start, then this is a - // proportional slash, because we want to slash active and these chunks - // proportionally. - - // The indices of the first chunk after the slash up through the most recent chunk. - // (The most recent chunk is at greatest from this era) - let affected_indices = first_slashable_index..self.unlocking.len(); - let unbonding_affected_balance = - affected_indices - .clone() - .fold(BalanceOf::::zero(), |sum, i| { - if let Some(chunk) = self.unlocking.get(i).defensive() { - sum.saturating_add(chunk.value) - } else { - sum - } - }); - let affected_balance = self.active.saturating_add(unbonding_affected_balance); - let ratio = Perquintill::from_rational_with_rounding( - slash_amount, - affected_balance, - Rounding::Up, - ) - .unwrap_or_else(|_| Perquintill::one()); - ( - Some(ratio), - affected_indices - .chain((0..first_slashable_index).rev()) - .collect::>(), - ) - } else { - // We just slash from the last chunk to the most recent one, if need be. - (None, (0..self.unlocking.len()).rev().collect::>()) - } - }; - - // Helper to update `target` and the ledgers total after accounting for slashing `target`. - log!( - debug, - "slashing {:?} for era {:?} out of {:?}, priority: {:?}, proportional = {:?}", - slash_amount, - slash_era, - self, - slash_chunks_priority, - maybe_proportional, - ); - - let mut slash_out_of = |target: &mut BalanceOf, slash_remaining: &mut BalanceOf| { - let mut slash_from_target = if let Some(ratio) = maybe_proportional { - ratio.mul_ceil(*target) - } else { - *slash_remaining - } - // this is the total that that the slash target has. We can't slash more than - // this anyhow! - .min(*target) - // this is the total amount that we would have wanted to slash - // non-proportionally, a proportional slash should never exceed this either! - .min(*slash_remaining); - - // slash out from *target exactly `slash_from_target`. - *target = *target - slash_from_target; - if *target < minimum_balance { - // Slash the rest of the target if it's dust. This might cause the last chunk to be - // slightly under-slashed, by at most `MaxUnlockingChunks * ED`, which is not a big - // deal. - slash_from_target = - sp_std::mem::replace(target, Zero::zero()).saturating_add(slash_from_target) - } - - self.total = self.total.saturating_sub(slash_from_target); - *slash_remaining = slash_remaining.saturating_sub(slash_from_target); - }; - - // If this is *not* a proportional slash, the active will always wiped to 0. - slash_out_of(&mut self.active, &mut remaining_slash); - - let mut slashed_unlocking = BTreeMap::<_, _>::new(); - for i in slash_chunks_priority { - if remaining_slash.is_zero() { - break; - } - - if let Some(chunk) = self.unlocking.get_mut(i).defensive() { - slash_out_of(&mut chunk.value, &mut remaining_slash); - // write the new slashed value of this chunk to the map. - slashed_unlocking.insert(chunk.era, chunk.value); - } else { - break; - } - } - - // clean unlocking chunks that are set to zero. - self.unlocking.retain(|c| !c.value.is_zero()); - - T::OnStakerSlash::on_slash(&self.stash, self.active, &slashed_unlocking); - pre_slash_total.saturating_sub(self.total) - } -} - -/// A record of the nominations made by a specific account. -#[derive( - PartialEqNoBound, - EqNoBound, - Clone, - Encode, - Decode, - RuntimeDebugNoBound, - TypeInfo, - MaxEncodedLen -)] -#[codec(mel_bound())] -#[scale_info(skip_type_params(T))] -pub struct Nominations { - /// The targets of nomination. - pub targets: BoundedVec, - /// The era the nominations were submitted. - /// - /// Except for initial nominations which are considered submitted at era 0. - pub submitted_in: EraIndex, - /// Whether the nominations have been suppressed. This can happen due to slashing of the - /// validators, or other events that might invalidate the nomination. - /// - /// NOTE: this for future proofing and is thus far not used. - pub suppressed: bool, -} - -/// The amount of exposure (to slashing) than an individual nominator has. -#[derive( - PartialEq, - Eq, - PartialOrd, - Ord, - Clone, - Encode, - Decode, - RuntimeDebug, - TypeInfo -)] -pub struct IndividualExposure { - /// The stash account of the nominator in question. - pub who: AccountId, - /// Amount of funds exposed. - #[codec(compact)] - pub value: Balance, -} - -/// A snapshot of the stake backing a single validator in the system. -#[derive( - PartialEq, - Eq, - PartialOrd, - Ord, - Clone, - Encode, - Decode, - RuntimeDebug, - TypeInfo -)] -pub struct Exposure { - /// The total balance backing this validator. - #[codec(compact)] - pub total: Balance, - /// The validator's own stash that is exposed. - #[codec(compact)] - pub own: Balance, - /// The portions of nominators stashes that are exposed. - pub others: Vec>, -} - -impl Default for Exposure { - fn default() -> Self { - Self { - total: Default::default(), - own: Default::default(), - others: vec![], - } - } -} - -/// A pending slash record. The value of the slash has been computed but not applied yet, -/// rather deferred for several eras. -#[derive(Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct UnappliedSlash { - /// The stash ID of the offending validator. - pub validator: AccountId, - /// The validator's own slash. - pub own: Balance, - /// All other slashed stakers and amounts. - pub others: Vec<(AccountId, Balance)>, - /// Reporters of the offence; bounty payout recipients. - pub reporters: Vec, - /// The amount of payout. - pub payout: Balance, -} - -impl UnappliedSlash { - /// Initializes the default object using the given `validator`. - pub fn default_from(validator: AccountId) -> Self { - Self { - validator, - own: Zero::zero(), - others: vec![], - reporters: vec![], - payout: Zero::zero(), - } - } -} - -/// Means for interacting with a specialized version of the `session` trait. -/// -/// This is needed because `Staking` sets the `ValidatorIdOf` of the `pallet_session::Config` -pub trait SessionInterface { - /// Disable the validator at the given index, returns `false` if the validator was already - /// disabled or the index is out of bounds. - fn disable_validator(validator_index: u32) -> bool; - /// Get the validators from session. - fn validators() -> Vec; - /// Prune historical session tries up to but not including the given index. - fn prune_historical_up_to(up_to: SessionIndex); -} - -impl SessionInterface<::AccountId> for T -where - T: pallet_session::Config::AccountId>, - T: pallet_session::historical::Config< - FullIdentification = Exposure<::AccountId, BalanceOf>, - FullIdentificationOf = ExposureOf, - >, - T::SessionHandler: pallet_session::SessionHandler<::AccountId>, - T::SessionManager: pallet_session::SessionManager<::AccountId>, - T::ValidatorIdOf: Convert< - ::AccountId, - Option<::AccountId>, - >, -{ - fn disable_validator(validator_index: u32) -> bool { - >::disable_index(validator_index) - } - - fn validators() -> Vec<::AccountId> { - >::validators() - } - - fn prune_historical_up_to(up_to: SessionIndex) { - >::prune_up_to(up_to); - } -} - -impl SessionInterface for () { - fn disable_validator(_: u32) -> bool { - true - } - fn validators() -> Vec { - Vec::new() - } - fn prune_historical_up_to(_: SessionIndex) { - () - } -} - -/// Handler for determining how much of a balance should be paid out on the current era. -pub trait EraPayout { - /// Determine the payout for this era. - /// - /// Returns the amount to be paid to stakers in this era, as well as whatever else should be - /// paid out ("the rest"). - fn era_payout( - total_staked: Balance, - total_issuance: Balance, - era_duration_millis: u64, - max_inflated_issuance: Balance, - non_inflated_yearly_reward: Balance, - ) -> (Balance, Balance); -} - -impl EraPayout for () { - fn era_payout( - _total_staked: Balance, - _total_issuance: Balance, - _era_duration_millis: u64, - _max_inflated_issuance: Balance, - _non_inflated_yearly_reward: Balance, - ) -> (Balance, Balance) { - (Default::default(), Default::default()) - } -} - -/// Adaptor to turn a `PiecewiseLinear` curve definition into an `EraPayout` impl, used for -/// backwards compatibility. -pub struct ConvertCurve(sp_std::marker::PhantomData); - -impl>> - EraPayout for ConvertCurve -{ - fn era_payout( - total_staked: Balance, - total_issuance: Balance, - era_duration_millis: u64, - max_inflated_issuance: Balance, - non_inflated_yearly_reward: Balance, - ) -> (Balance, Balance) { - let (validator_payout, max_payout) = inflation::compute_total_payout( - T::get(), - total_staked, - total_issuance, - // Duration of era; more than u64::MAX is rewarded as u64::MAX. - era_duration_millis, - max_inflated_issuance, - non_inflated_yearly_reward, - ); - let rest = max_payout.saturating_sub(validator_payout.clone()); - (validator_payout, rest) - } -} - -/// Mode of era-forcing. -#[derive( - Copy, - Clone, - PartialEq, - Eq, - Encode, - Decode, - RuntimeDebug, - TypeInfo, - MaxEncodedLen -)] -#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] -pub enum Forcing { - /// Not forcing anything - just let whatever happen. - NotForcing, - /// Force a new era, then reset to `NotForcing` as soon as it is done. - /// Note that this will force to trigger an election until a new era is triggered, if the - /// election failed, the next session end will trigger a new election again, until success. - ForceNew, - /// Avoid a new era indefinitely. - ForceNone, - /// Force a new era at the end of all sessions indefinitely. - ForceAlways, -} - -impl Default for Forcing { - fn default() -> Self { - Forcing::NotForcing - } -} - -/// A `Convert` implementation that finds the stash of the given controller account, -/// if any. -pub struct StashOf(sp_std::marker::PhantomData); - -impl Convert> for StashOf { - fn convert(controller: T::AccountId) -> Option { - >::ledger(&controller).map(|l| l.stash) - } -} - -/// A typed conversion from stash account ID to the active exposure of nominators -/// on that account. -/// -/// Active exposure is the exposure of the validator set currently validating, i.e. in -/// `active_era`. It can differ from the latest planned exposure in `current_era`. -pub struct ExposureOf(sp_std::marker::PhantomData); - -impl Convert>>> - for ExposureOf -{ - fn convert(validator: T::AccountId) -> Option>> { - >::active_era() - .map(|active_era| >::eras_stakers(active_era.index, &validator)) - } -} - -/// Filter historical offences out and only allow those from the bonding period. -pub struct FilterHistoricalOffences { - _inner: sp_std::marker::PhantomData<(T, R)>, -} - -impl ReportOffence - for FilterHistoricalOffences, R> -where - T: Config, - R: ReportOffence, - O: Offence, -{ - fn report_offence(reporters: Vec, offence: O) -> Result<(), OffenceError> { - // Disallow any slashing from before the current bonding period. - let offence_session = offence.session_index(); - let bonded_eras = BondedEras::::get(); - - if bonded_eras - .first() - .filter(|(_, start)| offence_session >= *start) - .is_some() - { - R::report_offence(reporters, offence) - } else { - >::deposit_event(Event::::OldSlashingReportDiscarded { - session_index: offence_session, - }); - Ok(()) - } - } - - fn is_known_offence(offenders: &[Offender], time_slot: &O::TimeSlot) -> bool { - R::is_known_offence(offenders, time_slot) - } -} - -pub struct OnStakerSlashMock(core::marker::PhantomData); - -impl sp_staking::OnStakerSlash - for OnStakerSlashMock -{ - fn on_slash( - _pool_account: &T::AccountId, - _slashed_bonded: T::CurrencyBalance, - _slashed_chunks: &BTreeMap, - ) { - } -} - -/// Configurations of the benchmarking of the pallet. -pub trait BenchmarkingConfig { - /// The maximum number of validators to use. - type MaxValidators: Get; - /// The maximum number of nominators to use. - type MaxNominators: Get; -} - -/// A mock benchmarking config for pallet-staking. -/// -/// Should only be used for testing. -pub struct SampleBenchmarkingConfig; - -impl BenchmarkingConfig for SampleBenchmarkingConfig { - type MaxValidators = frame_support::traits::ConstU32<100>; - type MaxNominators = frame_support::traits::ConstU32<100>; -} diff --git a/pallets/staking/src/pallet/impls.rs b/pallets/staking/src/pallet/impls.rs deleted file mode 100644 index 5c66658b32..0000000000 --- a/pallets/staking/src/pallet/impls.rs +++ /dev/null @@ -1,2124 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Implementations for the Staking FRAME Pallet. - -use frame_election_provider_support::{ - data_provider, BoundedSupportsOf, ElectionDataProvider, ElectionProvider, ScoreProvider, - SortedListProvider, VoteWeight, VoterOf, -}; -use frame_support::{ - dispatch::WithPostDispatchInfo, - pallet_prelude::*, - traits::{ - Currency, CurrencyToVote, Defensive, DefensiveResult, EstimateNextNewSession, Get, - Imbalance, LockableCurrency, OnUnbalanced, TryCollect, UnixTime, WithdrawReasons, - }, - weights::Weight, -}; -use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin}; -use pallet_session::historical; -use sp_runtime::{ - traits::{Bounded, Convert, One, SaturatedConversion, Saturating, StaticLookup, Zero}, - Perbill, -}; -use sp_staking::{ - offence::{DisableStrategy, OffenceDetails, OnOffenceHandler}, - EraIndex, SessionIndex, Stake, StakingInterface, -}; -use sp_std::prelude::*; - -use crate::{ - log, slashing, weights::WeightInfo, ActiveEraInfo, BalanceOf, EraPayout, Exposure, ExposureOf, - Forcing, IndividualExposure, MaxWinnersOf, Nominations, PositiveImbalanceOf, RewardDestination, - SessionInterface, StakingLedger, ValidatorPrefs, -}; - -use super::{pallet::*, STAKING_ID}; - -// Polymesh change -// ----------------------------------------------------------------- - -use frame_support::traits::schedule::Anon; -use frame_support::traits::schedule::{DispatchTime, HIGHEST_PRIORITY}; -use frame_support::traits::DefensiveSaturating; - -use polymesh_primitives::traits::IdentityFnTrait; -use polymesh_primitives::IdentityId; -use polymesh_primitives::GC_DID; - -use crate::pallet::SlashingSwitch; -use crate::UnlockChunk; -// ----------------------------------------------------------------- - -/// The maximum number of iterations that we do whilst iterating over `T::VoterList` in -/// `get_npos_voters`. -/// -/// In most cases, if we want n items, we iterate exactly n times. In rare cases, if a voter is -/// invalid (for any reason) the iteration continues. With this constant, we iterate at most 2 * n -/// times and then give up. -const NPOS_MAX_ITERATIONS_COEFFICIENT: u32 = 2; - -impl Pallet { - /// The total balance that can be slashed from a stash account as of right now. - pub fn slashable_balance_of(stash: &T::AccountId) -> BalanceOf { - // Weight note: consider making the stake accessible through stash. - Self::bonded(stash) - .and_then(Self::ledger) - .map(|l| l.active) - .unwrap_or_default() - } - - /// Internal impl of [`Self::slashable_balance_of`] that returns [`VoteWeight`]. - pub fn slashable_balance_of_vote_weight( - stash: &T::AccountId, - issuance: BalanceOf, - ) -> VoteWeight { - T::CurrencyToVote::to_vote(Self::slashable_balance_of(stash), issuance) - } - - /// Returns a closure around `slashable_balance_of_vote_weight` that can be passed around. - /// - /// This prevents call sites from repeatedly requesting `total_issuance` from backend. But it is - /// important to be only used while the total issuance is not changing. - pub fn weight_of_fn() -> Box VoteWeight> { - // NOTE: changing this to unboxed `impl Fn(..)` return type and the pallet will still - // compile, while some types in mock fail to resolve. - let issuance = T::Currency::total_issuance(); - Box::new(move |who: &T::AccountId| -> VoteWeight { - Self::slashable_balance_of_vote_weight(who, issuance) - }) - } - - /// Same as `weight_of_fn`, but made for one time use. - pub fn weight_of(who: &T::AccountId) -> VoteWeight { - let issuance = T::Currency::total_issuance(); - Self::slashable_balance_of_vote_weight(who, issuance) - } - - pub(super) fn do_withdraw_unbonded( - controller: &T::AccountId, - num_slashing_spans: u32, - ) -> Result { - let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - let (stash, old_total) = (ledger.stash.clone(), ledger.total); - if let Some(current_era) = Self::current_era() { - ledger = ledger.consolidate_unlocked(current_era) - } - - let used_weight = - if ledger.unlocking.is_empty() && ledger.active <= T::Currency::minimum_balance() { - // This account must have called `unbond()` with some value that caused the active - // portion to fall below existential deposit + will have no more unlocking chunks - // left. We can now safely remove all staking-related information. - Self::kill_stash(&stash, num_slashing_spans)?; - // Remove the lock. - T::Currency::remove_lock(STAKING_ID, &stash); - - ::WeightInfo::withdraw_unbonded_kill(num_slashing_spans) - } else { - // This was the consequence of a partial unbond. just update the ledger and move on. - Self::update_ledger(&controller, &ledger); - - // This is only an update, so we use less overall weight. - ::WeightInfo::withdraw_unbonded_update(num_slashing_spans) - }; - - // `old_total` should never be less than the new total because - // `consolidate_unlocked` strictly subtracts balance. - if ledger.total < old_total { - // Already checked that this won't overflow by entry condition. - let value = old_total - ledger.total; - Self::deposit_event(Event::::Withdrawn { - stash, - amount: value, - }); - } - - Ok(used_weight) - } - - pub(super) fn do_payout_stakers( - validator_stash: T::AccountId, - era: EraIndex, - ) -> DispatchResultWithPostInfo { - // Validate input data - let current_era = CurrentEra::::get().ok_or_else(|| { - Error::::InvalidEraToReward - .with_weight(::WeightInfo::payout_stakers_alive_staked(0)) - })?; - let history_depth = T::HistoryDepth::get(); - ensure!( - era <= current_era && era >= current_era.saturating_sub(history_depth), - Error::::InvalidEraToReward - .with_weight(::WeightInfo::payout_stakers_alive_staked(0)) - ); - - // Note: if era has no reward to be claimed, era may be future. better not to update - // `ledger.claimed_rewards` in this case. - let era_payout = >::get(&era).ok_or_else(|| { - Error::::InvalidEraToReward - .with_weight(::WeightInfo::payout_stakers_alive_staked(0)) - })?; - - let controller = Self::bonded(&validator_stash).ok_or_else(|| { - Error::::NotStash - .with_weight(::WeightInfo::payout_stakers_alive_staked(0)) - })?; - let mut ledger = >::get(&controller).ok_or(Error::::NotController)?; - - ledger - .claimed_rewards - .retain(|&x| x >= current_era.saturating_sub(history_depth)); - - match ledger.claimed_rewards.binary_search(&era) { - Ok(_) => { - return Err(Error::::AlreadyClaimed - .with_weight(::WeightInfo::payout_stakers_alive_staked(0))) - } - Err(pos) => ledger - .claimed_rewards - .try_insert(pos, era) - // Since we retain era entries in `claimed_rewards` only upto - // `HistoryDepth`, following bound is always expected to be - // satisfied. - .defensive_map_err(|_| Error::::BoundNotMet)?, - } - - let exposure = >::get(&era, &ledger.stash); - - // Input data seems good, no errors allowed after this point - - >::insert(&controller, &ledger); - - // Get Era reward points. It has TOTAL and INDIVIDUAL - // Find the fraction of the era reward that belongs to the validator - // Take that fraction of the eras rewards to split to nominator and validator - // - // Then look at the validator, figure out the proportion of their reward - // which goes to them and each of their nominators. - - let era_reward_points = >::get(&era); - let total_reward_points = era_reward_points.total; - let validator_reward_points = era_reward_points - .individual - .get(&ledger.stash) - .copied() - .unwrap_or_else(Zero::zero); - - // Nothing to do if they have no reward points. - if validator_reward_points.is_zero() { - return Ok(Some(::WeightInfo::payout_stakers_alive_staked(0)).into()); - } - - // This is the fraction of the total reward that the validator and the - // nominators will get. - let validator_total_reward_part = - Perbill::from_rational(validator_reward_points, total_reward_points); - - // This is how much validator + nominators are entitled to. - let validator_total_payout = validator_total_reward_part * era_payout; - - let validator_prefs = Self::eras_validator_prefs(&era, &validator_stash); - // Validator first gets a cut off the top. - let validator_commission = validator_prefs.commission; - let validator_commission_payout = validator_commission * validator_total_payout; - - let validator_leftover_payout = validator_total_payout - validator_commission_payout; - // Now let's calculate how this is split to the validator. - let validator_exposure_part = Perbill::from_rational(exposure.own, exposure.total); - let validator_staking_payout = validator_exposure_part * validator_leftover_payout; - - Self::deposit_event(Event::::PayoutStarted { - era_index: era, - validator_stash: ledger.stash.clone(), - }); - - let mut total_imbalance = PositiveImbalanceOf::::zero(); - // We can now make total validator payout: - if let Some(imbalance) = Self::make_payout( - &ledger.stash, - validator_staking_payout + validator_commission_payout, - ) { - // Polymesh change - // ----------------------------------------------------------------- - let stash_did = - pallet_identity::Pallet::::get_identity(&ledger.stash).unwrap_or_default(); - // ----------------------------------------------------------------- - Self::deposit_event(Event::::Rewarded { - identity: stash_did, - stash: ledger.stash, - amount: imbalance.peek(), - }); - total_imbalance.subsume(imbalance); - } - - // Track the number of payout ops to nominators. Note: - // `WeightInfo::payout_stakers_alive_staked` always assumes at least a validator is paid - // out, so we do not need to count their payout op. - let mut nominator_payout_count: u32 = 0; - - // Lets now calculate how this is split to the nominators. - // Reward only the clipped exposures. Note this is not necessarily sorted. - for nominator in exposure.others.iter() { - let nominator_exposure_part = Perbill::from_rational(nominator.value, exposure.total); - - let nominator_reward: BalanceOf = - nominator_exposure_part * validator_leftover_payout; - // We can now make nominator payout: - if let Some(imbalance) = Self::make_payout(&nominator.who, nominator_reward) { - // Note: this logic does not count payouts for `RewardDestination::None`. - nominator_payout_count += 1; - // Polymesh change - // ----------------------------------------------------------------- - let nominator_did = - pallet_identity::Pallet::::get_identity(&nominator.who).unwrap_or_default(); - // ----------------------------------------------------------------- - let e = Event::::Rewarded { - identity: nominator_did, - stash: nominator.who.clone(), - amount: imbalance.peek(), - }; - Self::deposit_event(e); - total_imbalance.subsume(imbalance); - } - } - - T::Reward::on_unbalanced(total_imbalance); - debug_assert!(nominator_payout_count <= T::MaxNominatorRewardedPerValidator::get()); - Ok(Some(::WeightInfo::payout_stakers_alive_staked( - nominator_payout_count, - )) - .into()) - } - - /// Update the ledger for a controller. - /// - /// This will also update the stash lock. - pub(crate) fn update_ledger(controller: &T::AccountId, ledger: &StakingLedger) { - T::Currency::set_lock( - STAKING_ID, - &ledger.stash, - ledger.total, - WithdrawReasons::all(), - ); - >::insert(controller, ledger); - } - - /// Chill a stash account. - pub(crate) fn chill_stash(stash: &T::AccountId) { - // Polymesh change - // ----------------------------------------------------------------- - Self::release_running_validator(stash); - // ----------------------------------------------------------------- - let chilled_as_validator = Self::do_remove_validator(stash); - let chilled_as_nominator = Self::do_remove_nominator(stash); - if chilled_as_validator || chilled_as_nominator { - Self::deposit_event(Event::::Chilled { - stash: stash.clone(), - }); - } - } - - /// Actually make a payment to a staker. This uses the currency's reward function - /// to pay the right payee for the given staker account. - fn make_payout(stash: &T::AccountId, amount: BalanceOf) -> Option> { - let dest = Self::payee(stash); - match dest { - RewardDestination::Controller => Self::bonded(stash) - .map(|controller| T::Currency::deposit_creating(&controller, amount)), - RewardDestination::Stash => T::Currency::deposit_into_existing(stash, amount).ok(), - RewardDestination::Staked => Self::bonded(stash) - .and_then(|c| Self::ledger(&c).map(|l| (c, l))) - .and_then(|(controller, mut l)| { - l.active += amount; - l.total += amount; - let r = T::Currency::deposit_into_existing(stash, amount).ok(); - Self::update_ledger(&controller, &l); - r - }), - RewardDestination::Account(dest_account) => { - Some(T::Currency::deposit_creating(&dest_account, amount)) - } - RewardDestination::None => None, - } - } - - /// Plan a new session potentially trigger a new era. - fn new_session( - session_index: SessionIndex, - is_genesis: bool, - ) -> Option>> { - if let Some(current_era) = Self::current_era() { - // Initial era has been set. - let current_era_start_session_index = Self::eras_start_session_index(current_era) - .unwrap_or_else(|| { - frame_support::print("Error: start_session_index must be set for current_era"); - 0 - }); - - let era_length = session_index.saturating_sub(current_era_start_session_index); // Must never happen. - - match ForceEra::::get() { - // Will be set to `NotForcing` again if a new era has been triggered. - Forcing::ForceNew => (), - // Short circuit to `try_trigger_new_era`. - Forcing::ForceAlways => (), - // Only go to `try_trigger_new_era` if deadline reached. - Forcing::NotForcing if era_length >= T::SessionsPerEra::get() => (), - _ => { - // Either `Forcing::ForceNone`, - // or `Forcing::NotForcing if era_length >= T::SessionsPerEra::get()`. - return None; - } - } - - // New era. - let maybe_new_era_validators = Self::try_trigger_new_era(session_index, is_genesis); - if maybe_new_era_validators.is_some() - && matches!(ForceEra::::get(), Forcing::ForceNew) - { - Self::set_force_era(Forcing::NotForcing); - } - - maybe_new_era_validators - } else { - // Set initial era. - log!(debug, "Starting the first era."); - Self::try_trigger_new_era(session_index, is_genesis) - } - } - - /// Start a session potentially starting an era. - fn start_session(start_session: SessionIndex) { - let next_active_era = Self::active_era().map(|e| e.index + 1).unwrap_or(0); - // This is only `Some` when current era has already progressed to the next era, while the - // active era is one behind (i.e. in the *last session of the active era*, or *first session - // of the new current era*, depending on how you look at it). - if let Some(next_active_era_start_session_index) = - Self::eras_start_session_index(next_active_era) - { - if next_active_era_start_session_index == start_session { - Self::start_era(start_session); - } else if next_active_era_start_session_index < start_session { - // This arm should never happen, but better handle it than to stall the staking - // pallet. - frame_support::print("Warning: A session appears to have been skipped."); - Self::start_era(start_session); - } - } - - // disable all offending validators that have been disabled for the whole era - for (index, disabled) in >::get() { - if disabled { - T::SessionInterface::disable_validator(index); - } - } - } - - /// End a session potentially ending an era. - fn end_session(session_index: SessionIndex) { - if let Some(active_era) = Self::active_era() { - if let Some(next_active_era_start_session_index) = - Self::eras_start_session_index(active_era.index + 1) - { - if next_active_era_start_session_index == session_index + 1 { - Self::end_era(active_era, session_index); - } - } - } - } - - /// Start a new era. It does: - /// - /// * Increment `active_era.index`, - /// * reset `active_era.start`, - /// * update `BondedEras` and apply slashes. - fn start_era(start_session: SessionIndex) { - let active_era = ActiveEra::::mutate(|active_era| { - let new_index = active_era.as_ref().map(|info| info.index + 1).unwrap_or(0); - *active_era = Some(ActiveEraInfo { - index: new_index, - // Set new active era start in next `on_finalize`. To guarantee usage of `Time` - start: None, - }); - new_index - }); - - let bonding_duration = T::BondingDuration::get(); - - BondedEras::::mutate(|bonded| { - bonded.push((active_era, start_session)); - - if active_era > bonding_duration { - let first_kept = active_era - bonding_duration; - - // Prune out everything that's from before the first-kept index. - let n_to_prune = bonded - .iter() - .take_while(|&&(era_idx, _)| era_idx < first_kept) - .count(); - - // Kill slashing metadata. - for (pruned_era, _) in bonded.drain(..n_to_prune) { - slashing::clear_era_metadata::(pruned_era); - } - - if let Some(&(_, first_session)) = bonded.first() { - T::SessionInterface::prune_historical_up_to(first_session); - } - } - }); - - Self::apply_unapplied_slashes(active_era); - } - - /// Compute payout for era. - fn end_era(active_era: ActiveEraInfo, _session_index: SessionIndex) { - // Note: active_era_start can be None if end era is called during genesis config. - if let Some(active_era_start) = active_era.start { - let now_as_millis_u64 = T::UnixTime::now().as_millis().saturated_into::(); - - let era_duration = (now_as_millis_u64 - active_era_start).saturated_into::(); - let staked = Self::eras_total_stake(&active_era.index); - let issuance = T::Currency::total_issuance(); - let (validator_payout, remainder) = T::EraPayout::era_payout( - staked, - issuance, - era_duration, - T::MaxVariableInflationTotalIssuance::get(), - T::FixedYearlyReward::get(), - ); - - // Polymesh change - // ----------------------------------------------------------------- - // Schedule rewards - let next_block_number = >::block_number() + 1u32.into(); - for (index, validator_id) in T::SessionInterface::validators().into_iter().enumerate() { - let schedule_block_number = - next_block_number + index.saturated_into::(); - match T::RewardScheduler::schedule( - DispatchTime::At(schedule_block_number), - None, - HIGHEST_PRIORITY, - RawOrigin::Root.into(), - Call::::payout_stakers_by_system { - validator_stash: validator_id.clone(), - era: active_era.index, - }.into() - ) { - Ok(_) => log!( - info, - "💸 Rewards are successfully scheduled for validator id: {:?} at block number: {:?}", - &validator_id, - schedule_block_number, - ), - Err(error) => { - log!( - error, - "⛔ Detected error in scheduling the reward payment: {:?}", - error - ); - Self::deposit_event(Event::::RewardPaymentSchedulingInterrupted { - account_id: validator_id, - era: active_era.index, - error - }); - } - } - } - // ----------------------------------------------------------------- - - Self::deposit_event(Event::::EraPaid { - era_index: active_era.index, - validator_payout, - remainder, - }); - - // Set ending era reward. - >::insert(&active_era.index, validator_payout); - T::RewardRemainder::on_unbalanced(T::Currency::issue(remainder)); - - // Clear offending validators. - >::kill(); - } - } - - /// Plan a new era. - /// - /// * Bump the current era storage (which holds the latest planned era). - /// * Store start session index for the new planned era. - /// * Clean old era information. - /// * Store staking information for the new planned era - /// - /// Returns the new validator set. - pub fn trigger_new_era( - start_session_index: SessionIndex, - exposures: BoundedVec< - (T::AccountId, Exposure>), - MaxWinnersOf, - >, - ) -> BoundedVec> { - // Increment or set current era. - let new_planned_era = CurrentEra::::mutate(|s| { - *s = Some(s.map(|s| s + 1).unwrap_or(0)); - s.unwrap() - }); - ErasStartSessionIndex::::insert(&new_planned_era, &start_session_index); - - // Clean old era information. - if let Some(old_era) = new_planned_era.checked_sub(T::HistoryDepth::get() + 1) { - Self::clear_era_information(old_era); - } - - // Set staking information for the new era. - Self::store_stakers_info(exposures, new_planned_era) - } - - /// Potentially plan a new era. - /// - /// Get election result from `T::ElectionProvider`. - /// In case election result has more than [`MinimumValidatorCount`] validator trigger a new era. - /// - /// In case a new era is planned, the new validator set is returned. - pub(crate) fn try_trigger_new_era( - start_session_index: SessionIndex, - is_genesis: bool, - ) -> Option>> { - let election_result: BoundedVec<_, MaxWinnersOf> = if is_genesis { - let result = ::elect().map_err(|e| { - log!(warn, "genesis election provider failed due to {:?}", e); - Self::deposit_event(Event::StakingElectionFailed); - }); - - result - .ok()? - .into_inner() - .try_into() - // both bounds checked in integrity test to be equal - .defensive_unwrap_or_default() - } else { - let result = ::elect().map_err(|e| { - log!(warn, "election provider failed due to {:?}", e); - Self::deposit_event(Event::StakingElectionFailed); - }); - result.ok()? - }; - - let exposures = Self::collect_exposures(election_result); - if (exposures.len() as u32) < Self::minimum_validator_count().max(1) { - // Session will panic if we ever return an empty validator set, thus max(1) ^^. - match CurrentEra::::get() { - Some(current_era) if current_era > 0 => log!( - warn, - "chain does not have enough staking candidates to operate for era {:?} ({} \ - elected, minimum is {})", - CurrentEra::::get().unwrap_or(0), - exposures.len(), - Self::minimum_validator_count(), - ), - None => { - // The initial era is allowed to have no exposures. - // In this case the SessionManager is expected to choose a sensible validator - // set. - // TODO: this should be simplified #8911 - CurrentEra::::put(0); - ErasStartSessionIndex::::insert(&0, &start_session_index); - } - _ => (), - } - - Self::deposit_event(Event::StakingElectionFailed); - return None; - } - - Self::deposit_event(Event::StakersElected); - Some(Self::trigger_new_era(start_session_index, exposures)) - } - - /// Process the output of the election. - /// - /// Store staking information for the new planned era - pub fn store_stakers_info( - exposures: BoundedVec< - (T::AccountId, Exposure>), - MaxWinnersOf, - >, - new_planned_era: EraIndex, - ) -> BoundedVec> { - let elected_stashes: BoundedVec<_, MaxWinnersOf> = exposures - .iter() - .cloned() - .map(|(x, _)| x) - .collect::>() - .try_into() - .expect("since we only map through exposures, size of elected_stashes is always same as exposures; qed"); - - // Populate stakers, exposures, and the snapshot of validator prefs. - let mut total_stake: BalanceOf = Zero::zero(); - exposures.into_iter().for_each(|(stash, exposure)| { - total_stake = total_stake.saturating_add(exposure.total); - >::insert(new_planned_era, &stash, &exposure); - - let mut exposure_clipped = exposure; - let clipped_max_len = T::MaxNominatorRewardedPerValidator::get() as usize; - if exposure_clipped.others.len() > clipped_max_len { - exposure_clipped - .others - .sort_by(|a, b| a.value.cmp(&b.value).reverse()); - exposure_clipped.others.truncate(clipped_max_len); - } - >::insert(&new_planned_era, &stash, exposure_clipped); - }); - - // Insert current era staking information - >::insert(&new_planned_era, total_stake); - - // Collect the pref of all winners. - for stash in &elected_stashes { - let pref = Self::validators(stash); - >::insert(&new_planned_era, stash, pref); - } - - if new_planned_era > 0 { - log!( - info, - "new validator set of size {:?} has been processed for era {:?}", - elected_stashes.len(), - new_planned_era, - ); - } - - elected_stashes - } - - /// Consume a set of [`BoundedSupports`] from [`sp_npos_elections`] and collect them into a - /// [`Exposure`]. - fn collect_exposures( - supports: BoundedSupportsOf, - ) -> BoundedVec<(T::AccountId, Exposure>), MaxWinnersOf> { - let total_issuance = T::Currency::total_issuance(); - let to_currency = |e: frame_election_provider_support::ExtendedBalance| { - T::CurrencyToVote::to_currency(e, total_issuance) - }; - - supports - .into_iter() - .map(|(validator, support)| { - // Build `struct exposure` from `support`. - let mut others = Vec::with_capacity(support.voters.len()); - let mut own: BalanceOf = Zero::zero(); - let mut total: BalanceOf = Zero::zero(); - support - .voters - .into_iter() - .map(|(nominator, weight)| (nominator, to_currency(weight))) - .for_each(|(nominator, stake)| { - if nominator == validator { - own = own.saturating_add(stake); - } else { - others.push(IndividualExposure { - who: nominator, - value: stake, - }); - } - total = total.saturating_add(stake); - }); - - let exposure = Exposure { own, others, total }; - (validator, exposure) - }) - .try_collect() - .expect("we only map through support vector which cannot change the size; qed") - } - - /// Remove all associated data of a stash account from the staking system. - /// - /// Assumes storage is upgraded before calling. - /// - /// This is called: - /// - after a `withdraw_unbonded()` call that frees all of a stash's bonded balance. - /// - through `reap_stash()` if the balance has fallen to zero (through slashing). - pub fn kill_stash(stash: &T::AccountId, num_slashing_spans: u32) -> DispatchResult { - let controller = >::get(stash).ok_or(Error::::NotStash)?; - - slashing::clear_stash_metadata::(stash, num_slashing_spans)?; - - >::remove(stash); - >::remove(&controller); - - >::remove(stash); - Self::do_remove_validator(stash); - Self::do_remove_nominator(stash); - - frame_system::Pallet::::dec_consumers(stash); - - Ok(()) - } - - /// Clear all era information for given era. - pub(crate) fn clear_era_information(era_index: EraIndex) { - #[allow(deprecated)] - >::remove_prefix(era_index, None); - #[allow(deprecated)] - >::remove_prefix(era_index, None); - #[allow(deprecated)] - >::remove_prefix(era_index, None); - >::remove(era_index); - >::remove(era_index); - >::remove(era_index); - ErasStartSessionIndex::::remove(era_index); - } - - /// Apply previously-unapplied slashes on the beginning of a new era, after a delay. - fn apply_unapplied_slashes(active_era: EraIndex) { - let era_slashes = ::UnappliedSlashes::take(&active_era); - log!( - debug, - "found {} slashes scheduled to be executed in era {:?}", - era_slashes.len(), - active_era, - ); - for slash in era_slashes { - let slash_era = active_era.saturating_sub(T::SlashDeferDuration::get()); - slashing::apply_slash::(slash, slash_era); - } - } - - /// Add reward points to validators using their stash account ID. - /// - /// Validators are keyed by stash account ID and must be in the current elected set. - /// - /// For each element in the iterator the given number of points in u32 is added to the - /// validator, thus duplicates are handled. - /// - /// At the end of the era each the total payout will be distributed among validator - /// relatively to their points. - /// - /// COMPLEXITY: Complexity is `number_of_validator_to_reward x current_elected_len`. - pub fn reward_by_ids(validators_points: impl IntoIterator) { - if let Some(active_era) = Self::active_era() { - >::mutate(active_era.index, |era_rewards| { - for (validator, points) in validators_points.into_iter() { - *era_rewards.individual.entry(validator).or_default() += points; - era_rewards.total += points; - } - }); - } - } - - /// Helper to set a new `ForceEra` mode. - pub fn set_force_era(mode: Forcing) { - log!(info, "Setting force era mode {:?}.", mode); - ForceEra::::put(mode); - Self::deposit_event(Event::::ForceEra { mode }); - } - - /// Ensures that at the end of the current session there will be a new era. - pub(crate) fn ensure_new_era() { - match ForceEra::::get() { - Forcing::ForceAlways | Forcing::ForceNew => (), - _ => Self::set_force_era(Forcing::ForceNew), - } - } - - #[cfg(feature = "runtime-benchmarks")] - pub fn add_era_stakers( - current_era: EraIndex, - stash: T::AccountId, - exposure: Exposure>, - ) { - >::insert(¤t_era, &stash, &exposure); - } - - #[cfg(feature = "runtime-benchmarks")] - pub fn set_slash_reward_fraction(fraction: Perbill) { - SlashRewardFraction::::put(fraction); - } - - /// Get all of the voters that are eligible for the npos election. - /// - /// `maybe_max_len` can imposes a cap on the number of voters returned; - /// - /// Sets `MinimumActiveStake` to the minimum active nominator stake in the returned set of - /// nominators. - /// - /// This function is self-weighing as [`DispatchClass::Mandatory`]. - pub fn get_npos_voters(maybe_max_len: Option) -> Vec> { - let max_allowed_len = { - let all_voter_count = T::VoterList::count() as usize; - maybe_max_len - .unwrap_or(all_voter_count) - .min(all_voter_count) - }; - - let mut all_voters = Vec::<_>::with_capacity(max_allowed_len); - - // cache a few things. - let weight_of = Self::weight_of_fn(); - - let mut voters_seen = 0u32; - let mut validators_seen = 0u32; - let mut nominators_seen = 0u32; - let mut min_active_stake = u64::MAX; - - let mut sorted_voters = T::VoterList::iter(); - while all_voters.len() < max_allowed_len - && voters_seen < (NPOS_MAX_ITERATIONS_COEFFICIENT * max_allowed_len as u32) - { - let voter = match sorted_voters.next() { - Some(voter) => { - voters_seen.saturating_inc(); - voter - } - None => break, - }; - - if let Some(Nominations { targets, .. }) = >::get(&voter) { - nominators_seen.saturating_inc(); - - let voter_weight = weight_of(&voter); - if !targets.is_empty() { - all_voters.push((voter.clone(), voter_weight, targets)); - } - min_active_stake = { - if voter_weight < min_active_stake { - voter_weight - } else { - min_active_stake - } - }; - } else if Validators::::contains_key(&voter) { - validators_seen.saturating_inc(); - if Self::is_validator_compliant(&voter) - && Self::is_validator_active_balance_valid(&voter) - { - // if this voter is a validator: - let self_vote = ( - voter.clone(), - weight_of(&voter), - vec![voter.clone()] - .try_into() - .expect("`MaxVotesPerVoter` must be greater than or equal to 1"), - ); - all_voters.push(self_vote); - } - } else { - // this can only happen if: 1. there a bug in the bags-list (or whatever is the - // sorted list) logic and the state of the two pallets is no longer compatible, or - // because the nominators is not decodable since they have more nomination than - // `T::MaxNominations`. The latter can rarely happen, and is not really an emergency - // or bug if it does. - log!( - warn, - "DEFENSIVE: invalid item in `VoterList`: {:?}, this nominator probably has too many nominations now", - voter - ); - } - } - - // all_voters should have not re-allocated. - debug_assert!(all_voters.capacity() == max_allowed_len); - - Self::register_weight(::WeightInfo::get_npos_voters( - validators_seen, - nominators_seen, - )); - - let min_active_stake: T::CurrencyBalance = if all_voters.len() == 0 { - 0u64.into() - } else { - min_active_stake.into() - }; - - MinimumActiveStake::::put(min_active_stake); - - log!( - info, - "generated {} npos voters, {} from validators and {} nominators", - all_voters.len(), - validators_seen, - nominators_seen - ); - - all_voters - } - - /// Get the targets for an upcoming npos election. - /// - /// This function is self-weighing as [`DispatchClass::Mandatory`]. - pub fn get_npos_targets(maybe_max_len: Option) -> Vec { - let max_allowed_len = maybe_max_len.unwrap_or_else(|| T::TargetList::count() as usize); - let mut all_targets = Vec::::with_capacity(max_allowed_len); - let mut targets_seen = 0; - let mut validators_seen = 0; - - let mut targets_iter = T::TargetList::iter(); - while all_targets.len() < max_allowed_len - && targets_seen < (NPOS_MAX_ITERATIONS_COEFFICIENT * max_allowed_len as u32) - { - let target = match targets_iter.next() { - Some(target) => { - targets_seen.saturating_inc(); - target - } - None => break, - }; - - if Validators::::contains_key(&target) { - validators_seen.saturating_inc(); - if Self::is_validator_compliant(&target) - && Self::is_validator_active_balance_valid(&target) - { - all_targets.push(target); - } - } - } - - Self::register_weight(::WeightInfo::get_npos_targets(validators_seen)); - log!(info, "generated {} npos targets", all_targets.len()); - - all_targets - } - - /// This function will add a nominator to the `Nominators` storage map, - /// and `VoterList`. - /// - /// If the nominator already exists, their nominations will be updated. - /// - /// NOTE: you must ALWAYS use this function to add nominator or update their targets. Any access - /// to `Nominators` or `VoterList` outside of this function is almost certainly - /// wrong. - pub fn do_add_nominator(who: &T::AccountId, nominations: Nominations) { - if !Nominators::::contains_key(who) { - // maybe update sorted list. - let _ = T::VoterList::on_insert(who.clone(), Self::weight_of(who)) - .defensive_unwrap_or_default(); - } - Nominators::::insert(who, nominations); - - debug_assert_eq!( - Nominators::::count() + Validators::::count(), - T::VoterList::count() - ); - } - - /// This function will remove a nominator from the `Nominators` storage map, - /// and `VoterList`. - /// - /// Returns true if `who` was removed from `Nominators`, otherwise false. - /// - /// NOTE: you must ALWAYS use this function to remove a nominator from the system. Any access to - /// `Nominators` or `VoterList` outside of this function is almost certainly - /// wrong. - pub fn do_remove_nominator(who: &T::AccountId) -> bool { - let outcome = if Nominators::::contains_key(who) { - Nominators::::remove(who); - let _ = T::VoterList::on_remove(who).defensive(); - true - } else { - false - }; - - debug_assert_eq!( - Nominators::::count() + Validators::::count(), - T::VoterList::count() - ); - - outcome - } - - /// This function will add a validator to the `Validators` storage map. - /// - /// If the validator already exists, their preferences will be updated. - /// - /// NOTE: you must ALWAYS use this function to add a validator to the system. Any access to - /// `Validators` or `VoterList` outside of this function is almost certainly - /// wrong. - pub fn do_add_validator(who: &T::AccountId, prefs: ValidatorPrefs) { - if !Validators::::contains_key(who) { - // maybe update sorted list. - let _ = T::VoterList::on_insert(who.clone(), Self::weight_of(who)) - .defensive_unwrap_or_default(); - } - Validators::::insert(who, prefs); - - debug_assert_eq!( - Nominators::::count() + Validators::::count(), - T::VoterList::count() - ); - } - - /// This function will remove a validator from the `Validators` storage map. - /// - /// Returns true if `who` was removed from `Validators`, otherwise false. - /// - /// NOTE: you must ALWAYS use this function to remove a validator from the system. Any access to - /// `Validators` or `VoterList` outside of this function is almost certainly - /// wrong. - pub fn do_remove_validator(who: &T::AccountId) -> bool { - let outcome = if Validators::::contains_key(who) { - Validators::::remove(who); - let _ = T::VoterList::on_remove(who).defensive(); - true - } else { - false - }; - - debug_assert_eq!( - Nominators::::count() + Validators::::count(), - T::VoterList::count() - ); - - outcome - } - - /// Register some amount of weight directly with the system pallet. - /// - /// This is always mandatory weight. - fn register_weight(weight: Weight) { - >::register_extra_weight_unchecked( - weight, - DispatchClass::Mandatory, - ); - } - - // Polymesh change - // ----------------------------------------------------------------- - - /// Returns `true` if active balance is above [`MinValidatorBond`]. Otherwise, returns `false`. - pub(crate) fn is_validator_active_balance_valid(who: &T::AccountId) -> bool { - if let Some(controller) = Self::bonded(&who) { - if let Some(ledger) = Self::ledger(&controller) { - return ledger.active >= MinValidatorBond::::get(); - } - } - false - } - - /// Returns `true` if `stash` has a valid cdd claim and is permissioned. Otherwise, returns `false`. - pub(crate) fn is_validator_compliant(stash: &T::AccountId) -> bool { - pallet_identity::Pallet::::get_identity(stash).map_or(false, |id| { - pallet_identity::Pallet::::has_valid_cdd(id) - && Self::permissioned_identity(id).is_some() - }) - } - - /// Decrease the running count of validators by 1 for the stash identity. - pub(crate) fn release_running_validator(stash: &T::AccountId) { - if !>::contains_key(stash) { - return; - } - - if let Some(did) = pallet_identity::Pallet::::get_identity(stash) { - PermissionedIdentity::::mutate(&did, |preferences| { - if let Some(p) = preferences { - if p.running_count > 0 { - p.running_count -= 1; - } - } - }); - pallet_identity::Pallet::::remove_account_key_ref_count(&stash); - } - } - - /// Returns the maximum number of validators per identiy - pub fn maximum_number_of_validators_per_identity() -> u32 { - (T::MaxValidatorPerIdentity::get() * Self::validator_count()).max(1) - } - - pub fn unbond_balance( - controller_account: T::AccountId, - ledger: &mut StakingLedger, - value: BalanceOf, - ) -> DispatchResult { - let mut value = value.min(ledger.active); - - if !value.is_zero() { - ledger.active -= value; - - // Avoid there being a dust balance left in the staking system. - if ledger.active < T::Currency::minimum_balance() { - value += ledger.active; - ledger.active = Zero::zero(); - } - - let min_active_bond = if Nominators::::contains_key(&ledger.stash) { - MinNominatorBond::::get() - } else if Validators::::contains_key(&ledger.stash) { - MinValidatorBond::::get() - } else { - Zero::zero() - }; - - // Make sure that the user maintains enough active bond for their role. - // If a user runs into this error, they should chill first. - ensure!( - ledger.active >= min_active_bond, - Error::::InsufficientBond - ); - - // Note: in case there is no current era it is fine to bond one era more. - let era = Self::current_era().unwrap_or(0) + T::BondingDuration::get(); - if let Some(chunk) = ledger.unlocking.last_mut().filter(|chunk| chunk.era == era) { - // To keep the chunk count down, we only keep one chunk per era. Since - // `unlocking` is a FiFo queue, if a chunk exists for `era` we know that it will - // be the last one. - chunk.value = chunk.value.defensive_saturating_add(value) - } else { - ledger - .unlocking - .try_push(UnlockChunk { value, era }) - .map_err(|_| Error::::NoMoreChunks)?; - }; - // NOTE: ledger must be updated prior to calling `Self::weight_of`. - Self::update_ledger(&controller_account, &ledger); - - // update this staker in the sorted list, if they exist in it. - if T::VoterList::contains(&ledger.stash) { - let _ = T::VoterList::on_update(&ledger.stash, Self::weight_of(&ledger.stash)) - .defensive(); - } - - // Polymesh change - // ----------------------------------------------------------------- - let controller_did = - T::IdentityFn::get_identity(&controller_account).unwrap_or_default(); - Self::deposit_event(Event::::Unbonded { - identity: controller_did, - stash: ledger.stash.clone(), - amount: value, - }); - // ----------------------------------------------------------------- - } - - Ok(()) - } - - pub(crate) fn base_chill_from_governance( - origin: T::RuntimeOrigin, - identity: IdentityId, - stash_keys: Vec, - ) -> DispatchResult { - T::AdminOrigin::ensure_origin(origin)?; - - for key in &stash_keys { - let key_did = pallet_identity::Pallet::::get_identity(&key); - // Checks if the stash key identity is the same as the identity given. - ensure!(key_did == Some(identity), Error::::NotStash); - // Checks if the key is a validator if not returns an error. - ensure!( - >::contains_key(&key), - Error::::ValidatorNotFound - ); - } - - for key in stash_keys { - Self::chill_stash(&key); - } - - // Change identity status to be Non-Permissioned - PermissionedIdentity::::remove(&identity); - - Self::deposit_event(Event::::PermissionedIdentityRemoved { - governance_councill_did: GC_DID, - validators_identity: identity, - }); - Ok(()) - } - - // ----------------------------------------------------------------- -} - -impl Pallet { - /// Returns the current nominations quota for nominators. - /// - /// Used by the runtime API. - /// Note: for now, this api runtime will always return value of `T::MaxNominations` and thus it - /// is redundant. However, with the upcoming changes in - /// , the nominations quota will change - /// depending on the nominators balance. We're introducing this runtime API now to prepare the - /// community to use it before rolling out PR#12970. - pub fn api_nominations_quota(_balance: BalanceOf) -> u32 { - T::MaxNominations::get() - } -} - -impl ElectionDataProvider for Pallet { - type AccountId = T::AccountId; - type BlockNumber = BlockNumberFor; - type MaxVotesPerVoter = T::MaxNominations; - - fn desired_targets() -> data_provider::Result { - Self::register_weight(T::DbWeight::get().reads(1)); - Ok(Self::validator_count()) - } - - fn electing_voters(maybe_max_len: Option) -> data_provider::Result>> { - // This can never fail -- if `maybe_max_len` is `Some(_)` we handle it. - let voters = Self::get_npos_voters(maybe_max_len); - debug_assert!(maybe_max_len.map_or(true, |max| voters.len() <= max)); - - Ok(voters) - } - - fn electable_targets(maybe_max_len: Option) -> data_provider::Result> { - let target_count = T::TargetList::count(); - - // We can't handle this case yet -- return an error. - if maybe_max_len.map_or(false, |max_len| target_count > max_len as u32) { - return Err("Target snapshot too big"); - } - - Ok(Self::get_npos_targets(None)) - } - - fn next_election_prediction(now: T::BlockNumber) -> T::BlockNumber { - let current_era = Self::current_era().unwrap_or(0); - let current_session = Self::current_planned_session(); - let current_era_start_session_index = - Self::eras_start_session_index(current_era).unwrap_or(0); - // Number of session in the current era or the maximum session per era if reached. - let era_progress = current_session - .saturating_sub(current_era_start_session_index) - .min(T::SessionsPerEra::get()); - - let until_this_session_end = T::NextNewSession::estimate_next_new_session(now) - .0 - .unwrap_or_default() - .saturating_sub(now); - - let session_length = T::NextNewSession::average_session_length(); - - let sessions_left: T::BlockNumber = match ForceEra::::get() { - Forcing::ForceNone => Bounded::max_value(), - Forcing::ForceNew | Forcing::ForceAlways => Zero::zero(), - Forcing::NotForcing if era_progress >= T::SessionsPerEra::get() => Zero::zero(), - Forcing::NotForcing => T::SessionsPerEra::get() - .saturating_sub(era_progress) - // One session is computed in this_session_end. - .saturating_sub(1) - .into(), - }; - - now.saturating_add( - until_this_session_end.saturating_add(sessions_left.saturating_mul(session_length)), - ) - } - - #[cfg(feature = "runtime-benchmarks")] - fn add_voter( - voter: T::AccountId, - weight: VoteWeight, - targets: BoundedVec, - ) { - let stake = >::try_from(weight).unwrap_or_else(|_| { - panic!("cannot convert a VoteWeight into BalanceOf, benchmark needs reconfiguring.") - }); - >::insert(voter.clone(), voter.clone()); - >::insert( - voter.clone(), - StakingLedger { - stash: voter.clone(), - active: stake, - total: stake, - unlocking: Default::default(), - claimed_rewards: Default::default(), - }, - ); - - Self::do_add_nominator( - &voter, - Nominations { - targets, - submitted_in: 0, - suppressed: false, - }, - ); - } - - #[cfg(feature = "runtime-benchmarks")] - fn add_target(target: T::AccountId) { - let stake = MinValidatorBond::::get() * 100u32.into(); - >::insert(target.clone(), target.clone()); - >::insert( - target.clone(), - StakingLedger { - stash: target.clone(), - active: stake, - total: stake, - unlocking: Default::default(), - claimed_rewards: Default::default(), - }, - ); - Self::do_add_validator( - &target, - ValidatorPrefs { - commission: Perbill::zero(), - blocked: false, - }, - ); - } - - #[cfg(feature = "runtime-benchmarks")] - fn clear() { - #[allow(deprecated)] - >::remove_all(None); - #[allow(deprecated)] - >::remove_all(None); - #[allow(deprecated)] - >::remove_all(); - #[allow(deprecated)] - >::remove_all(); - - T::VoterList::unsafe_clear(); - } - - #[cfg(feature = "runtime-benchmarks")] - fn put_snapshot( - voters: Vec>, - targets: Vec, - target_stake: Option, - ) { - targets.into_iter().for_each(|v| { - let stake: BalanceOf = target_stake - .and_then(|w| >::try_from(w).ok()) - .unwrap_or_else(|| MinNominatorBond::::get() * 100u32.into()); - >::insert(v.clone(), v.clone()); - >::insert( - v.clone(), - StakingLedger { - stash: v.clone(), - active: stake, - total: stake, - unlocking: Default::default(), - claimed_rewards: Default::default(), - }, - ); - Self::do_add_validator( - &v, - ValidatorPrefs { - commission: Perbill::zero(), - blocked: false, - }, - ); - }); - - voters.into_iter().for_each(|(v, s, t)| { - let stake = >::try_from(s).unwrap_or_else(|_| { - panic!("cannot convert a VoteWeight into BalanceOf, benchmark needs reconfiguring.") - }); - >::insert(v.clone(), v.clone()); - >::insert( - v.clone(), - StakingLedger { - stash: v.clone(), - active: stake, - total: stake, - unlocking: Default::default(), - claimed_rewards: Default::default(), - }, - ); - Self::do_add_nominator( - &v, - Nominations { - targets: t, - submitted_in: 0, - suppressed: false, - }, - ); - }); - } -} - -/// In this implementation `new_session(session)` must be called before `end_session(session-1)` -/// i.e. the new session must be planned before the ending of the previous session. -/// -/// Once the first new_session is planned, all session must start and then end in order, though -/// some session can lag in between the newest session planned and the latest session started. -impl pallet_session::SessionManager for Pallet { - fn new_session(new_index: SessionIndex) -> Option> { - log!(trace, "planning new session {}", new_index); - CurrentPlannedSession::::put(new_index); - Self::new_session(new_index, false).map(|v| v.into_inner()) - } - fn new_session_genesis(new_index: SessionIndex) -> Option> { - log!(trace, "planning new session {} at genesis", new_index); - CurrentPlannedSession::::put(new_index); - Self::new_session(new_index, true).map(|v| v.into_inner()) - } - fn start_session(start_index: SessionIndex) { - log!(trace, "starting session {}", start_index); - Self::start_session(start_index) - } - fn end_session(end_index: SessionIndex) { - log!(trace, "ending session {}", end_index); - Self::end_session(end_index) - } -} - -impl historical::SessionManager>> - for Pallet -{ - fn new_session( - new_index: SessionIndex, - ) -> Option>)>> { - >::new_session(new_index).map(|validators| { - let current_era = Self::current_era() - // Must be some as a new era has been created. - .unwrap_or(0); - - validators - .into_iter() - .map(|v| { - let exposure = Self::eras_stakers(current_era, &v); - (v, exposure) - }) - .collect() - }) - } - fn new_session_genesis( - new_index: SessionIndex, - ) -> Option>)>> { - >::new_session_genesis(new_index).map( - |validators| { - let current_era = Self::current_era() - // Must be some as a new era has been created. - .unwrap_or(0); - - validators - .into_iter() - .map(|v| { - let exposure = Self::eras_stakers(current_era, &v); - (v, exposure) - }) - .collect() - }, - ) - } - fn start_session(start_index: SessionIndex) { - >::start_session(start_index) - } - fn end_session(end_index: SessionIndex) { - >::end_session(end_index) - } -} - -/// Add reward points to block authors: -/// * 20 points to the block producer for producing a (non-uncle) block in the relay chain, -impl pallet_authorship::EventHandler for Pallet -where - T: Config + pallet_authorship::Config + pallet_session::Config, -{ - fn note_author(author: T::AccountId) { - Self::reward_by_ids(vec![(author, 20)]) - } -} - -/// This is intended to be used with `FilterHistoricalOffences`. -impl - OnOffenceHandler, Weight> - for Pallet -where - T: pallet_session::Config::AccountId>, - T: pallet_session::historical::Config< - FullIdentification = Exposure<::AccountId, BalanceOf>, - FullIdentificationOf = ExposureOf, - >, - T::SessionHandler: pallet_session::SessionHandler<::AccountId>, - T::SessionManager: pallet_session::SessionManager<::AccountId>, - T::ValidatorIdOf: Convert< - ::AccountId, - Option<::AccountId>, - >, -{ - fn on_offence( - offenders: &[OffenceDetails< - T::AccountId, - pallet_session::historical::IdentificationTuple, - >], - slash_fraction: &[Perbill], - slash_session: SessionIndex, - disable_strategy: DisableStrategy, - ) -> Weight { - // Polymesh change - // ----------------------------------------------------------------- - let slash_fraction_none = vec![Perbill::from_parts(0); slash_fraction.len()]; - let slash_fraction = if SlashingAllowedFor::::get() == SlashingSwitch::None { - slash_fraction_none.as_slice() - } else { - slash_fraction - }; - // ----------------------------------------------------------------- - - let reward_proportion = SlashRewardFraction::::get(); - let mut consumed_weight = Weight::from_ref_time(0); - let mut add_db_reads_writes = |reads, writes| { - consumed_weight += T::DbWeight::get().reads_writes(reads, writes); - }; - - let active_era = { - let active_era = Self::active_era(); - add_db_reads_writes(1, 0); - if active_era.is_none() { - // This offence need not be re-submitted. - return consumed_weight; - } - active_era - .expect("value checked not to be `None`; qed") - .index - }; - let active_era_start_session_index = Self::eras_start_session_index(active_era) - .unwrap_or_else(|| { - frame_support::print("Error: start_session_index must be set for current_era"); - 0 - }); - add_db_reads_writes(1, 0); - - let window_start = active_era.saturating_sub(T::BondingDuration::get()); - - // Fast path for active-era report - most likely. - // `slash_session` cannot be in a future active era. It must be in `active_era` or before. - let slash_era = if slash_session >= active_era_start_session_index { - active_era - } else { - let eras = BondedEras::::get(); - add_db_reads_writes(1, 0); - - // Reverse because it's more likely to find reports from recent eras. - match eras - .iter() - .rev() - .find(|&&(_, ref sesh)| sesh <= &slash_session) - { - Some(&(ref slash_era, _)) => *slash_era, - // Before bonding period. defensive - should be filtered out. - None => return consumed_weight, - } - }; - - add_db_reads_writes(1, 1); - - let slash_defer_duration = T::SlashDeferDuration::get(); - - let invulnerables = Self::invulnerables(); - add_db_reads_writes(1, 0); - - for (details, slash_fraction) in offenders.iter().zip(slash_fraction) { - let (stash, exposure) = &details.offender; - - // Skip if the validator is invulnerable. - if invulnerables.contains(stash) { - continue; - } - - let unapplied = slashing::compute_slash::(slashing::SlashParams { - stash, - slash: *slash_fraction, - exposure, - slash_era, - window_start, - now: active_era, - reward_proportion, - disable_strategy, - }); - - Self::deposit_event(Event::::SlashReported { - validator: stash.clone(), - fraction: *slash_fraction, - slash_era, - }); - - if let Some(mut unapplied) = unapplied { - let nominators_len = unapplied.others.len() as u64; - let reporters_len = details.reporters.len() as u64; - - { - let upper_bound = 1 /* Validator/NominatorSlashInEra */ + 2 /* fetch_spans */; - let rw = upper_bound + nominators_len * upper_bound; - add_db_reads_writes(rw, rw); - } - unapplied.reporters = details.reporters.clone(); - if slash_defer_duration == 0 { - // Apply right away. - slashing::apply_slash::(unapplied, slash_era); - { - let slash_cost = (6, 5); - let reward_cost = (2, 2); - add_db_reads_writes( - (1 + nominators_len) * slash_cost.0 + reward_cost.0 * reporters_len, - (1 + nominators_len) * slash_cost.1 + reward_cost.1 * reporters_len, - ); - } - } else { - // Defer to end of some `slash_defer_duration` from now. - log!( - debug, - "deferring slash of {:?}% happened in {:?} (reported in {:?}) to {:?}", - slash_fraction, - slash_era, - active_era, - slash_era + slash_defer_duration + 1, - ); - ::UnappliedSlashes::mutate( - slash_era - .saturating_add(slash_defer_duration) - .saturating_add(One::one()), - move |for_later| for_later.push(unapplied), - ); - add_db_reads_writes(1, 1); - } - } else { - add_db_reads_writes(4 /* fetch_spans */, 5 /* kick_out_if_recent */) - } - } - - consumed_weight - } -} - -impl ScoreProvider for Pallet { - type Score = VoteWeight; - - fn score(who: &T::AccountId) -> Self::Score { - Self::weight_of(who) - } - - #[cfg(feature = "runtime-benchmarks")] - fn set_score_of(who: &T::AccountId, weight: Self::Score) { - // this will clearly results in an inconsistent state, but it should not matter for a - // benchmark. - let active: BalanceOf = weight.try_into().map_err(|_| ()).unwrap(); - let mut ledger = match Self::ledger(who) { - None => StakingLedger::default_from(who.clone()), - Some(l) => l, - }; - ledger.active = active; - - >::insert(who, ledger); - >::insert(who, who); - - // also, we play a trick to make sure that a issuance based-`CurrencyToVote` behaves well: - // This will make sure that total issuance is zero, thus the currency to vote will be a 1-1 - // conversion. - let imbalance = T::Currency::burn(T::Currency::total_issuance()); - // kinda ugly, but gets the job done. The fact that this works here is a HUGE exception. - // Don't try this pattern in other places. - sp_std::mem::forget(imbalance); - } -} - -/// A simple sorted list implementation that does not require any additional pallets. Note, this -/// does not provide validators in sorted order. If you desire nominators in a sorted order take -/// a look at [`pallet-bags-list`]. -pub struct UseValidatorsMap(sp_std::marker::PhantomData); -impl SortedListProvider for UseValidatorsMap { - type Score = BalanceOf; - type Error = (); - - /// Returns iterator over voter list, which can have `take` called on it. - fn iter() -> Box> { - Box::new(Validators::::iter().map(|(v, _)| v)) - } - fn iter_from( - start: &T::AccountId, - ) -> Result>, Self::Error> { - if Validators::::contains_key(start) { - let start_key = Validators::::hashed_key_for(start); - Ok(Box::new( - Validators::::iter_from(start_key).map(|(n, _)| n), - )) - } else { - Err(()) - } - } - fn count() -> u32 { - Validators::::count() - } - fn contains(id: &T::AccountId) -> bool { - Validators::::contains_key(id) - } - fn on_insert(_: T::AccountId, _weight: Self::Score) -> Result<(), Self::Error> { - // nothing to do on insert. - Ok(()) - } - fn get_score(id: &T::AccountId) -> Result { - Ok(Pallet::::weight_of(id).into()) - } - fn on_update(_: &T::AccountId, _weight: Self::Score) -> Result<(), Self::Error> { - // nothing to do on update. - Ok(()) - } - fn on_remove(_: &T::AccountId) -> Result<(), Self::Error> { - // nothing to do on remove. - Ok(()) - } - fn unsafe_regenerate( - _: impl IntoIterator, - _: Box Self::Score>, - ) -> u32 { - // nothing to do upon regenerate. - 0 - } - #[cfg(feature = "try-runtime")] - fn try_state() -> Result<(), &'static str> { - Ok(()) - } - - fn unsafe_clear() { - #[allow(deprecated)] - Validators::::remove_all(); - } - - #[cfg(feature = "runtime-benchmarks")] - fn score_update_worst_case(_who: &T::AccountId, _is_increase: bool) -> Self::Score { - unimplemented!() - } -} - -/// A simple voter list implementation that does not require any additional pallets. Note, this -/// does not provided nominators in sorted ordered. If you desire nominators in a sorted order take -/// a look at [`pallet-bags-list]. -pub struct UseNominatorsAndValidatorsMap(sp_std::marker::PhantomData); -impl SortedListProvider for UseNominatorsAndValidatorsMap { - type Error = (); - type Score = VoteWeight; - - fn iter() -> Box> { - Box::new( - Validators::::iter() - .map(|(v, _)| v) - .chain(Nominators::::iter().map(|(n, _)| n)), - ) - } - fn iter_from( - start: &T::AccountId, - ) -> Result>, Self::Error> { - if Validators::::contains_key(start) { - let start_key = Validators::::hashed_key_for(start); - Ok(Box::new( - Validators::::iter_from(start_key) - .map(|(n, _)| n) - .chain(Nominators::::iter().map(|(x, _)| x)), - )) - } else if Nominators::::contains_key(start) { - let start_key = Nominators::::hashed_key_for(start); - Ok(Box::new( - Nominators::::iter_from(start_key).map(|(n, _)| n), - )) - } else { - Err(()) - } - } - fn count() -> u32 { - Nominators::::count().saturating_add(Validators::::count()) - } - fn contains(id: &T::AccountId) -> bool { - Nominators::::contains_key(id) || Validators::::contains_key(id) - } - fn on_insert(_: T::AccountId, _weight: Self::Score) -> Result<(), Self::Error> { - // nothing to do on insert. - Ok(()) - } - fn get_score(id: &T::AccountId) -> Result { - Ok(Pallet::::weight_of(id)) - } - fn on_update(_: &T::AccountId, _weight: Self::Score) -> Result<(), Self::Error> { - // nothing to do on update. - Ok(()) - } - fn on_remove(_: &T::AccountId) -> Result<(), Self::Error> { - // nothing to do on remove. - Ok(()) - } - fn unsafe_regenerate( - _: impl IntoIterator, - _: Box Self::Score>, - ) -> u32 { - // nothing to do upon regenerate. - 0 - } - - #[cfg(feature = "try-runtime")] - fn try_state() -> Result<(), &'static str> { - Ok(()) - } - - fn unsafe_clear() { - // NOTE: Caller must ensure this doesn't lead to too many storage accesses. This is a - // condition of SortedListProvider::unsafe_clear. - #[allow(deprecated)] - Nominators::::remove_all(); - #[allow(deprecated)] - Validators::::remove_all(); - } - - #[cfg(feature = "runtime-benchmarks")] - fn score_update_worst_case(_who: &T::AccountId, _is_increase: bool) -> Self::Score { - unimplemented!() - } -} - -// NOTE: in this entire impl block, the assumption is that `who` is a stash account. -impl StakingInterface for Pallet { - type AccountId = T::AccountId; - type Balance = BalanceOf; - - fn minimum_nominator_bond() -> Self::Balance { - MinNominatorBond::::get() - } - - fn minimum_validator_bond() -> Self::Balance { - MinValidatorBond::::get() - } - - fn desired_validator_count() -> u32 { - ValidatorCount::::get() - } - - fn election_ongoing() -> bool { - T::ElectionProvider::ongoing() - } - - fn force_unstake(who: Self::AccountId) -> sp_runtime::DispatchResult { - let num_slashing_spans = Self::slashing_spans(&who).map_or(0, |s| s.iter().count() as u32); - Self::force_unstake(RawOrigin::Root.into(), who.clone(), num_slashing_spans) - } - - fn stash_by_ctrl(controller: &Self::AccountId) -> Result { - Self::ledger(controller) - .map(|l| l.stash) - .ok_or(Error::::NotController.into()) - } - - fn is_exposed_in_era(who: &Self::AccountId, era: &EraIndex) -> bool { - ErasStakers::::iter_prefix(era).any(|(validator, exposures)| { - validator == *who || exposures.others.iter().any(|i| i.who == *who) - }) - } - - fn bonding_duration() -> EraIndex { - T::BondingDuration::get() - } - - fn current_era() -> EraIndex { - Self::current_era().unwrap_or(Zero::zero()) - } - - fn stake(who: &Self::AccountId) -> Result, DispatchError> { - Self::bonded(who) - .and_then(|c| Self::ledger(c)) - .map(|l| Stake { - stash: l.stash, - total: l.total, - active: l.active, - }) - .ok_or(Error::::NotStash.into()) - } - - fn bond_extra(who: &Self::AccountId, extra: Self::Balance) -> DispatchResult { - Self::bond_extra(RawOrigin::Signed(who.clone()).into(), extra) - } - - fn unbond(who: &Self::AccountId, value: Self::Balance) -> DispatchResult { - let ctrl = Self::bonded(who).ok_or(Error::::NotStash)?; - Self::unbond(RawOrigin::Signed(ctrl).into(), value) - .map_err(|with_post| with_post.error) - .map(|_| ()) - } - - fn chill(who: &Self::AccountId) -> DispatchResult { - // defensive-only: any account bonded via this interface has the stash set as the - // controller, but we have to be sure. Same comment anywhere else that we read this. - let ctrl = Self::bonded(who).ok_or(Error::::NotStash)?; - Self::chill(RawOrigin::Signed(ctrl).into()) - } - - fn withdraw_unbonded( - who: Self::AccountId, - num_slashing_spans: u32, - ) -> Result { - let ctrl = Self::bonded(who).ok_or(Error::::NotStash)?; - Self::withdraw_unbonded(RawOrigin::Signed(ctrl.clone()).into(), num_slashing_spans) - .map(|_| !Ledger::::contains_key(&ctrl)) - .map_err(|with_post| with_post.error) - } - - fn bond( - who: &Self::AccountId, - value: Self::Balance, - payee: &Self::AccountId, - ) -> DispatchResult { - Self::bond( - RawOrigin::Signed(who.clone()).into(), - T::Lookup::unlookup(who.clone()), - value, - RewardDestination::Account(payee.clone()), - ) - } - - fn nominate(who: &Self::AccountId, targets: Vec) -> DispatchResult { - let ctrl = Self::bonded(who).ok_or(Error::::NotStash)?; - let targets = targets - .into_iter() - .map(T::Lookup::unlookup) - .collect::>(); - Self::nominate(RawOrigin::Signed(ctrl).into(), targets) - } - - sp_staking::runtime_benchmarks_enabled! { - fn nominations(who: Self::AccountId) -> Option> { - Nominators::::get(who).map(|n| n.targets.into_inner()) - } - - fn add_era_stakers( - current_era: &EraIndex, - stash: &T::AccountId, - exposures: Vec<(Self::AccountId, Self::Balance)>, - ) { - let others = exposures - .iter() - .map(|(who, value)| IndividualExposure { who: who.clone(), value: value.clone() }) - .collect::>(); - let exposure = Exposure { total: Default::default(), own: Default::default(), others }; - >::insert(¤t_era, &stash, &exposure); - } - - fn set_current_era(era: EraIndex) { - CurrentEra::::put(era); - } - } -} - -#[cfg(feature = "std")] -impl Pallet { - pub fn do_try_state(_: BlockNumberFor) -> Result<(), &'static str> { - ensure!( - T::VoterList::iter() - .all(|x| >::contains_key(&x) || >::contains_key(&x)), - "VoterList contains non-staker" - ); - - Self::check_nominators()?; - Self::check_exposures()?; - Self::check_ledgers()?; - Self::check_count() - } - - fn check_count() -> Result<(), &'static str> { - ensure!( - ::VoterList::count() - == Nominators::::count() + Validators::::count(), - "wrong external count" - ); - ensure!( - ::TargetList::count() == Validators::::count(), - "wrong external count" - ); - ensure!( - ValidatorCount::::get() <= - ::MaxWinners::get(), - "validator count exceeded election max winners" - ); - Ok(()) - } - - fn check_ledgers() -> Result<(), &'static str> { - Bonded::::iter() - .map(|(_, ctrl)| Self::ensure_ledger_consistent(ctrl)) - .collect::>() - } - - fn check_exposures() -> Result<(), &'static str> { - // a check per validator to ensure the exposure struct is always sane. - let era = Self::active_era().unwrap().index; - ErasStakers::::iter_prefix_values(era) - .map(|expo| { - ensure!( - expo.total - == expo.own - + expo - .others - .iter() - .map(|e| e.value) - .fold(Zero::zero(), |acc, x| acc + x), - "wrong total exposure.", - ); - Ok(()) - }) - .collect::>() - } - - fn check_nominators() -> Result<(), &'static str> { - // a check per nominator to ensure their entire stake is correctly distributed. Will only - // kick-in if the nomination was submitted before the current era. - let era = Self::active_era().unwrap().index; - >::iter() - .filter_map(|(nominator, nomination)| { - if nomination.submitted_in < era { - Some(nominator) - } else { - None - } - }) - .map(|nominator| { - // must be bonded. - Self::ensure_is_stash(&nominator)?; - let mut sum = BalanceOf::::zero(); - T::SessionInterface::validators() - .iter() - .map(|v| Self::eras_stakers(era, v)) - .map(|e| { - let individual = e - .others - .iter() - .filter(|e| e.who == nominator) - .collect::>(); - let len = individual.len(); - match len { - 0 => { /* not supporting this validator at all. */ } - 1 => sum += individual[0].value, - _ => return Err("nominator cannot back a validator more than once."), - }; - Ok(()) - }) - .collect::>() - }) - .collect::>() - } - - fn ensure_is_stash(who: &T::AccountId) -> Result<(), &'static str> { - ensure!(Self::bonded(who).is_some(), "Not a stash."); - Ok(()) - } - - fn ensure_ledger_consistent(ctrl: T::AccountId) -> Result<(), &'static str> { - // ensures ledger.total == ledger.active + sum(ledger.unlocking). - let ledger = Self::ledger(ctrl.clone()).ok_or("Not a controller.")?; - let real_total: BalanceOf = ledger - .unlocking - .iter() - .fold(ledger.active, |a, c| a + c.value); - ensure!(real_total == ledger.total, "ledger.total corrupt"); - - if !(ledger.active >= T::Currency::minimum_balance() || ledger.active.is_zero()) { - log!(warn, "ledger.active less than ED: {:?}, {:?}", ctrl, ledger) - } - - Ok(()) - } -} diff --git a/pallets/staking/src/pallet/mod.rs b/pallets/staking/src/pallet/mod.rs deleted file mode 100644 index 76c103a480..0000000000 --- a/pallets/staking/src/pallet/mod.rs +++ /dev/null @@ -1,2246 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Staking FRAME Pallet. - -use frame_election_provider_support::{ - ElectionProvider, ElectionProviderBase, SortedListProvider, VoteWeight, -}; -use frame_support::{ - dispatch::Codec, - pallet_prelude::*, - traits::{ - Currency, CurrencyToVote, Defensive, DefensiveResult, EnsureOrigin, EstimateNextNewSession, - Get, LockIdentifier, LockableCurrency, OnUnbalanced, TryCollect, UnixTime, - }, - weights::Weight, - BoundedVec, -}; -use frame_system::{ensure_root, ensure_signed, pallet_prelude::*}; -use sp_runtime::{ - traits::{CheckedSub, SaturatedConversion, StaticLookup, Zero}, - ArithmeticError, Perbill, Percent, -}; -use sp_staking::{EraIndex, SessionIndex}; -use sp_std::prelude::*; - -mod impls; - -pub use impls::*; - -use crate::{ - slashing, weights::WeightInfo, AccountIdLookupOf, ActiveEraInfo, BalanceOf, EraPayout, - EraRewardPoints, Exposure, Forcing, NegativeImbalanceOf, Nominations, PositiveImbalanceOf, - RewardDestination, SessionInterface, StakingLedger, UnappliedSlash, ValidatorPrefs, -}; - -// Polymesh change -// ----------------------------------------------------------------- -use frame_support::traits::schedule::Anon; -use frame_support::traits::IsSubType; -use frame_system::offchain::SendTransactionTypes; -use sp_runtime::traits::Dispatchable; -use sp_runtime::Permill; - -use pallet_identity::Config as IdentityConfig; -use polymesh_primitives::GC_DID; -use polymesh_primitives::{storage_migration_ver, traits::IdentityFnTrait, IdentityId}; - -use crate::types::{PermissionedIdentityPrefs, SlashingSwitch}; -// ----------------------------------------------------------------- - -const STAKING_ID: LockIdentifier = *b"staking "; -// The speculative number of spans are used as an input of the weight annotation of -// [`Call::unbond`], as the post dipatch weight may depend on the number of slashing span on the -// account which is not provided as an input. The value set should be conservative but sensible. -pub(crate) const SPECULATIVE_NUM_SPANS: u32 = 32; - -storage_migration_ver!(2); - -mod migrations { - use super::pallet::*; - use frame_support::{ - pallet_prelude::*, - storage_alias, - traits::{Get, GetStorageVersion}, - }; - - /// Alias to the old storage item used for release versioning. Obsolete since v13. - #[storage_alias] - type StorageVersion = StorageValue, u8, ValueQuery>; - - pub fn migrate_v13() -> Weight { - let in_code = Pallet::::current_storage_version(); - let on_chain = Pallet::::on_chain_storage_version(); - - // We need to remove the old obsolete storage version and - // initialize the pallet storage version. - if in_code == 13 && on_chain < 13 { - // The old storage item is not used anymore, so we can just remove it. - StorageVersion::::kill(); - // Make sure that the new storage version is initialized. - in_code.put::>(); - - crate::log!(info, "v13 applied successfully"); - T::DbWeight::get().reads_writes(1, 2) - } else { - T::DbWeight::get().reads(1) - } - } -} - -#[frame_support::pallet] -pub mod pallet { - use frame_election_provider_support::ElectionDataProvider; - - use crate::BenchmarkingConfig; - - use super::*; - - /// The in-code storage version. - const STORAGE_VERSION: StorageVersion = StorageVersion::new(13); - - #[pallet::pallet] - #[pallet::generate_store(pub(crate) trait Store)] - #[pallet::storage_version(STORAGE_VERSION)] - pub struct Pallet(_); - - /// Possible operations on the configuration values of this pallet. - #[derive(TypeInfo, Debug, Clone, Encode, Decode, PartialEq)] - pub enum ConfigOp { - /// Don't change. - Noop, - /// Set the given value. - Set(T), - /// Remove from storage. - Remove, - } - - #[pallet::config] - pub trait Config: - frame_system::Config - + SendTransactionTypes> - + pallet_babe::Config - + IdentityConfig - { - /// The staking balance. - type Currency: LockableCurrency< - Self::AccountId, - Moment = Self::BlockNumber, - Balance = Self::CurrencyBalance, - >; - /// Just the `Currency::Balance` type; we have this item to allow us to constrain it to - /// `From`. - type CurrencyBalance: sp_runtime::traits::AtLeast32BitUnsigned - + codec::FullCodec - + Copy - + MaybeSerializeDeserialize - + sp_std::fmt::Debug - + Default - + From - + TypeInfo - + MaxEncodedLen; - /// Time used for computing era duration. - /// - /// It is guaranteed to start being called from the first `on_finalize`. Thus value at - /// genesis is not used. - type UnixTime: UnixTime; - - /// Convert a balance into a number used for election calculation. This must fit into a - /// `u64` but is allowed to be sensibly lossy. The `u64` is used to communicate with the - /// [`frame_election_provider_support`] crate which accepts u64 numbers and does operations - /// in 128. - /// Consequently, the backward convert is used convert the u128s from sp-elections back to a - /// [`BalanceOf`]. - type CurrencyToVote: CurrencyToVote>; - - /// Something that provides the election functionality. - type ElectionProvider: ElectionProvider< - AccountId = Self::AccountId, - BlockNumber = Self::BlockNumber, - // we only accept an election provider that has staking as data provider. - DataProvider = Pallet, - >; - /// Something that provides the election functionality at genesis. - type GenesisElectionProvider: ElectionProvider< - AccountId = Self::AccountId, - BlockNumber = Self::BlockNumber, - DataProvider = Pallet, - >; - - /// Maximum number of nominations per nominator. - #[pallet::constant] - type MaxNominations: Get; - - /// Number of eras to keep in history. - /// - /// Following information is kept for eras in `[current_era - - /// HistoryDepth, current_era]`: `ErasStakers`, `ErasStakersClipped`, - /// `ErasValidatorPrefs`, `ErasValidatorReward`, `ErasRewardPoints`, - /// `ErasTotalStake`, `ErasStartSessionIndex`, - /// `StakingLedger.claimed_rewards`. - /// - /// Must be more than the number of eras delayed by session. - /// I.e. active era must always be in history. I.e. `active_era > - /// current_era - history_depth` must be guaranteed. - /// - /// If migrating an existing pallet from storage value to config value, - /// this should be set to same value or greater as in storage. - /// - /// Note: `HistoryDepth` is used as the upper bound for the `BoundedVec` - /// item `StakingLedger.claimed_rewards`. Setting this value lower than - /// the existing value can lead to inconsistencies in the - /// `StakingLedger` and will need to be handled properly in a migration. - /// The test `reducing_history_depth_abrupt` shows this effect. - #[pallet::constant] - type HistoryDepth: Get; - - /// Tokens have been minted and are unused for validator-reward. - /// See [Era payout](./index.html#era-payout). - type RewardRemainder: OnUnbalanced>; - - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - /// Handler for the unbalanced reduction when slashing a staker. - type Slash: OnUnbalanced>; - - /// Handler for the unbalanced increment when rewarding a staker. - /// NOTE: in most cases, the implementation of `OnUnbalanced` should modify the total - /// issuance. - type Reward: OnUnbalanced>; - - /// Number of sessions per era. - #[pallet::constant] - type SessionsPerEra: Get; - - /// Number of eras that staked funds must remain bonded for. - #[pallet::constant] - type BondingDuration: Get; - - /// Number of eras that slashes are deferred by, after computation. - /// - /// This should be less than the bonding duration. Set to 0 if slashes - /// should be applied immediately, without opportunity for intervention. - #[pallet::constant] - type SlashDeferDuration: Get; - - /// The origin which can manage less critical staking parameters that does not require root. - /// - /// Supported actions: (1) cancel deferred slash, (2) set minimum commission. - type AdminOrigin: EnsureOrigin; - - /// Interface for interacting with a session pallet. - type SessionInterface: SessionInterface; - - /// The payout for validators and the system for the current era. - /// See [Era payout](./index.html#era-payout). - type EraPayout: EraPayout>; - - /// Something that can estimate the next session change, accurately or as a best effort - /// guess. - type NextNewSession: EstimateNextNewSession; - - /// The maximum number of nominators rewarded for each validator. - /// - /// For each validator only the `$MaxNominatorRewardedPerValidator` biggest stakers can - /// claim their reward. This used to limit the i/o cost for the nominator payout. - #[pallet::constant] - type MaxNominatorRewardedPerValidator: Get; - - /// The fraction of the validator set that is safe to be offending. - /// After the threshold is reached a new era will be forced. - type OffendingValidatorsThreshold: Get; - - /// Something that provides a best-effort sorted list of voters aka electing nominators, - /// used for NPoS election. - /// - /// The changes to nominators are reported to this. Moreover, each validator's self-vote is - /// also reported as one independent vote. - /// - /// To keep the load off the chain as much as possible, changes made to the staked amount - /// via rewards and slashes are not reported and thus need to be manually fixed by the - /// staker. In case of `bags-list`, this always means using `rebag` and `putInFrontOf`. - /// - /// Invariant: what comes out of this list will always be a nominator. - type VoterList: SortedListProvider; - - /// WIP: This is a noop as of now, the actual business logic that's described below is going - /// to be introduced in a follow-up PR. - /// - /// Something that provides a best-effort sorted list of targets aka electable validators, - /// used for NPoS election. - /// - /// The changes to the approval stake of each validator are reported to this. This means any - /// change to: - /// 1. The stake of any validator or nominator. - /// 2. The targets of any nominator - /// 3. The role of any staker (e.g. validator -> chilled, nominator -> validator, etc) - /// - /// Unlike `VoterList`, the values in this list are always kept up to date with reward and - /// slash as well, and thus represent the accurate approval stake of all account being - /// nominated by nominators. - /// - /// Note that while at the time of nomination, all targets are checked to be real - /// validators, they can chill at any point, and their approval stakes will still be - /// recorded. This implies that what comes out of iterating this list MIGHT NOT BE AN ACTIVE - /// VALIDATOR. - type TargetList: SortedListProvider>; - - /// The maximum number of `unlocking` chunks a [`StakingLedger`] can - /// have. Effectively determines how many unique eras a staker may be - /// unbonding in. - /// - /// Note: `MaxUnlockingChunks` is used as the upper bound for the - /// `BoundedVec` item `StakingLedger.unlocking`. Setting this value - /// lower than the existing value can lead to inconsistencies in the - /// `StakingLedger` and will need to be handled properly in a runtime - /// migration. The test `reducing_max_unlocking_chunks_abrupt` shows - /// this effect. - #[pallet::constant] - type MaxUnlockingChunks: Get; - - /// A hook called when any staker is slashed. Mostly likely this can be a no-op unless - /// other pallets exist that are affected by slashing per-staker. - type OnStakerSlash: sp_staking::OnStakerSlash>; - - /// Some parameters of the benchmarking. - type BenchmarkingConfig: BenchmarkingConfig; - - /// Weight information for extrinsics in this pallet. - type WeightInfo: WeightInfo; - - // Polymesh change - // ----------------------------------------------------------------- - - /// Maximum amount of validators that can run by an identity. - /// It will be MaxValidatorPerIdentity * Self::validator_count(). - #[pallet::constant] - type MaxValidatorPerIdentity: Get; - - /// Maximum amount of total issuance after which fixed rewards kicks in. - #[pallet::constant] - type MaxVariableInflationTotalIssuance: Get>; - - /// Yearly total reward amount that gets distributed when fixed rewards kicks in. - #[pallet::constant] - type FixedYearlyReward: Get>; - - /// The overarching call type. - type Call: Dispatchable + From> + IsSubType> + Clone; - - /// Overarching type of all pallets origins. - type PalletsOrigin: From>; - - /// To schedule the rewards for the stakers after the end of era. - type RewardScheduler: Anon::Call, Self::PalletsOrigin>; - - // ----------------------------------------------------------------- - } - - /// The ideal number of active validators. - #[pallet::storage] - #[pallet::getter(fn validator_count)] - pub type ValidatorCount = StorageValue<_, u32, ValueQuery>; - - /// Minimum number of staking participants before emergency conditions are imposed. - #[pallet::storage] - #[pallet::getter(fn minimum_validator_count)] - pub type MinimumValidatorCount = StorageValue<_, u32, ValueQuery>; - - /// Any validators that may never be slashed or forcibly kicked. It's a Vec since they're - /// easy to initialize and the performance hit is minimal (we expect no more than four - /// invulnerables) and restricted to testnets. - #[pallet::storage] - #[pallet::getter(fn invulnerables)] - #[pallet::unbounded] - pub type Invulnerables = StorageValue<_, Vec, ValueQuery>; - - /// Map from all locked "stash" accounts to the controller account. - /// - /// TWOX-NOTE: SAFE since `AccountId` is a secure hash. - #[pallet::storage] - #[pallet::getter(fn bonded)] - pub type Bonded = StorageMap<_, Twox64Concat, T::AccountId, T::AccountId>; - - /// The minimum active bond to become and maintain the role of a nominator. - #[pallet::storage] - pub type MinNominatorBond = StorageValue<_, BalanceOf, ValueQuery>; - - /// The minimum active bond to become and maintain the role of a validator. - #[pallet::storage] - pub type MinValidatorBond = StorageValue<_, BalanceOf, ValueQuery>; - - /// The minimum active nominator stake of the last successful election. - #[pallet::storage] - pub type MinimumActiveStake = StorageValue<_, BalanceOf, ValueQuery>; - - /// The minimum amount of commission that validators can set. - /// - /// If set to `0`, no limit exists. - #[pallet::storage] - pub type MinCommission = StorageValue<_, Perbill, ValueQuery>; - - /// Map from all (unlocked) "controller" accounts to the info regarding the staking. - #[pallet::storage] - #[pallet::getter(fn ledger)] - pub type Ledger = StorageMap<_, Blake2_128Concat, T::AccountId, StakingLedger>; - - /// Where the reward payment should be made. Keyed by stash. - /// - /// TWOX-NOTE: SAFE since `AccountId` is a secure hash. - #[pallet::storage] - #[pallet::getter(fn payee)] - pub type Payee = - StorageMap<_, Twox64Concat, T::AccountId, RewardDestination, ValueQuery>; - - /// The map from (wannabe) validator stash key to the preferences of that validator. - /// - /// TWOX-NOTE: SAFE since `AccountId` is a secure hash. - #[pallet::storage] - #[pallet::getter(fn validators)] - pub type Validators = - CountedStorageMap<_, Twox64Concat, T::AccountId, ValidatorPrefs, ValueQuery>; - - /// The maximum validator count before we stop allowing new validators to join. - /// - /// When this value is not set, no limits are enforced. - #[pallet::storage] - pub type MaxValidatorsCount = StorageValue<_, u32, OptionQuery>; - - /// The map from nominator stash key to their nomination preferences, namely the validators that - /// they wish to support. - /// - /// Note that the keys of this storage map might become non-decodable in case the - /// [`Config::MaxNominations`] configuration is decreased. In this rare case, these nominators - /// are still existent in storage, their key is correct and retrievable (i.e. `contains_key` - /// indicates that they exist), but their value cannot be decoded. Therefore, the non-decodable - /// nominators will effectively not-exist, until they re-submit their preferences such that it - /// is within the bounds of the newly set `Config::MaxNominations`. - /// - /// This implies that `::iter_keys().count()` and `::iter().count()` might return different - /// values for this map. Moreover, the main `::count()` is aligned with the former, namely the - /// number of keys that exist. - /// - /// Lastly, if any of the nominators become non-decodable, they can be chilled immediately via - /// [`Call::chill_other`] dispatchable by anyone. - /// - /// TWOX-NOTE: SAFE since `AccountId` is a secure hash. - #[pallet::storage] - #[pallet::getter(fn nominators)] - pub type Nominators = - CountedStorageMap<_, Twox64Concat, T::AccountId, Nominations>; - - /// The maximum nominator count before we stop allowing new validators to join. - /// - /// When this value is not set, no limits are enforced. - #[pallet::storage] - pub type MaxNominatorsCount = StorageValue<_, u32, OptionQuery>; - - /// The current era index. - /// - /// This is the latest planned era, depending on how the Session pallet queues the validator - /// set, it might be active or not. - #[pallet::storage] - #[pallet::getter(fn current_era)] - pub type CurrentEra = StorageValue<_, EraIndex>; - - /// The active era information, it holds index and start. - /// - /// The active era is the era being currently rewarded. Validator set of this era must be - /// equal to [`SessionInterface::validators`]. - #[pallet::storage] - #[pallet::getter(fn active_era)] - pub type ActiveEra = StorageValue<_, ActiveEraInfo>; - - /// The session index at which the era start for the last `HISTORY_DEPTH` eras. - /// - /// Note: This tracks the starting session (i.e. session index when era start being active) - /// for the eras in `[CurrentEra - HISTORY_DEPTH, CurrentEra]`. - #[pallet::storage] - #[pallet::getter(fn eras_start_session_index)] - pub type ErasStartSessionIndex = StorageMap<_, Twox64Concat, EraIndex, SessionIndex>; - - /// Exposure of validator at era. - /// - /// This is keyed first by the era index to allow bulk deletion and then the stash account. - /// - /// Is it removed after `HISTORY_DEPTH` eras. - /// If stakers hasn't been set or has been removed then empty exposure is returned. - #[pallet::storage] - #[pallet::getter(fn eras_stakers)] - #[pallet::unbounded] - pub type ErasStakers = StorageDoubleMap< - _, - Twox64Concat, - EraIndex, - Twox64Concat, - T::AccountId, - Exposure>, - ValueQuery, - >; - - /// Clipped Exposure of validator at era. - /// - /// This is similar to [`ErasStakers`] but number of nominators exposed is reduced to the - /// `T::MaxNominatorRewardedPerValidator` biggest stakers. - /// (Note: the field `total` and `own` of the exposure remains unchanged). - /// This is used to limit the i/o cost for the nominator payout. - /// - /// This is keyed fist by the era index to allow bulk deletion and then the stash account. - /// - /// Is it removed after `HISTORY_DEPTH` eras. - /// If stakers hasn't been set or has been removed then empty exposure is returned. - #[pallet::storage] - #[pallet::unbounded] - #[pallet::getter(fn eras_stakers_clipped)] - pub type ErasStakersClipped = StorageDoubleMap< - _, - Twox64Concat, - EraIndex, - Twox64Concat, - T::AccountId, - Exposure>, - ValueQuery, - >; - - /// Similar to `ErasStakers`, this holds the preferences of validators. - /// - /// This is keyed first by the era index to allow bulk deletion and then the stash account. - /// - /// Is it removed after `HISTORY_DEPTH` eras. - // If prefs hasn't been set or has been removed then 0 commission is returned. - #[pallet::storage] - #[pallet::getter(fn eras_validator_prefs)] - pub type ErasValidatorPrefs = StorageDoubleMap< - _, - Twox64Concat, - EraIndex, - Twox64Concat, - T::AccountId, - ValidatorPrefs, - ValueQuery, - >; - - /// The total validator era payout for the last `HISTORY_DEPTH` eras. - /// - /// Eras that haven't finished yet or has been removed doesn't have reward. - #[pallet::storage] - #[pallet::getter(fn eras_validator_reward)] - pub type ErasValidatorReward = StorageMap<_, Twox64Concat, EraIndex, BalanceOf>; - - /// Rewards for the last `HISTORY_DEPTH` eras. - /// If reward hasn't been set or has been removed then 0 reward is returned. - #[pallet::storage] - #[pallet::unbounded] - #[pallet::getter(fn eras_reward_points)] - pub type ErasRewardPoints = - StorageMap<_, Twox64Concat, EraIndex, EraRewardPoints, ValueQuery>; - - /// The total amount staked for the last `HISTORY_DEPTH` eras. - /// If total hasn't been set or has been removed then 0 stake is returned. - #[pallet::storage] - #[pallet::getter(fn eras_total_stake)] - pub type ErasTotalStake = - StorageMap<_, Twox64Concat, EraIndex, BalanceOf, ValueQuery>; - - /// Mode of era forcing. - #[pallet::storage] - #[pallet::getter(fn force_era)] - pub type ForceEra = StorageValue<_, Forcing, ValueQuery>; - - /// The percentage of the slash that is distributed to reporters. - /// - /// The rest of the slashed value is handled by the `Slash`. - #[pallet::storage] - #[pallet::getter(fn slash_reward_fraction)] - pub type SlashRewardFraction = StorageValue<_, Perbill, ValueQuery>; - - /// The amount of currency given to reporters of a slash event which was - /// canceled by extraordinary circumstances (e.g. governance). - #[pallet::storage] - #[pallet::getter(fn canceled_payout)] - pub type CanceledSlashPayout = StorageValue<_, BalanceOf, ValueQuery>; - - /// All unapplied slashes that are queued for later. - #[pallet::storage] - #[pallet::unbounded] - pub type UnappliedSlashes = StorageMap< - _, - Twox64Concat, - EraIndex, - Vec>>, - ValueQuery, - >; - - /// A mapping from still-bonded eras to the first session index of that era. - /// - /// Must contains information for eras for the range: - /// `[active_era - bounding_duration; active_era]` - #[pallet::storage] - #[pallet::unbounded] - pub type BondedEras = StorageValue<_, Vec<(EraIndex, SessionIndex)>, ValueQuery>; - - /// All slashing events on validators, mapped by era to the highest slash proportion - /// and slash value of the era. - #[pallet::storage] - pub type ValidatorSlashInEra = StorageDoubleMap< - _, - Twox64Concat, - EraIndex, - Twox64Concat, - T::AccountId, - (Perbill, BalanceOf), - >; - - /// All slashing events on nominators, mapped by era to the highest slash value of the era. - #[pallet::storage] - pub type NominatorSlashInEra = - StorageDoubleMap<_, Twox64Concat, EraIndex, Twox64Concat, T::AccountId, BalanceOf>; - - /// Slashing spans for stash accounts. - #[pallet::storage] - #[pallet::getter(fn slashing_spans)] - #[pallet::unbounded] - pub type SlashingSpans = - StorageMap<_, Twox64Concat, T::AccountId, slashing::SlashingSpans>; - - /// Records information about the maximum slash of a stash within a slashing span, - /// as well as how much reward has been paid out. - #[pallet::storage] - pub type SpanSlash = StorageMap< - _, - Twox64Concat, - (T::AccountId, slashing::SpanIndex), - slashing::SpanRecord>, - ValueQuery, - >; - - /// The last planned session scheduled by the session pallet. - /// - /// This is basically in sync with the call to [`pallet_session::SessionManager::new_session`]. - #[pallet::storage] - #[pallet::getter(fn current_planned_session)] - pub type CurrentPlannedSession = StorageValue<_, SessionIndex, ValueQuery>; - - /// Indices of validators that have offended in the active era and whether they are currently - /// disabled. - /// - /// This value should be a superset of disabled validators since not all offences lead to the - /// validator being disabled (if there was no slash). This is needed to track the percentage of - /// validators that have offended in the current era, ensuring a new era is forced if - /// `OffendingValidatorsThreshold` is reached. The vec is always kept sorted so that we can find - /// whether a given validator has previously offended using binary search. It gets cleared when - /// the era ends. - #[pallet::storage] - #[pallet::unbounded] - #[pallet::getter(fn offending_validators)] - pub type OffendingValidators = StorageValue<_, Vec<(u32, bool)>, ValueQuery>; - - /// The threshold for when users can start calling `chill_other` for other validators / - /// nominators. The threshold is compared to the actual number of validators / nominators - /// (`CountFor*`) in the system compared to the configured max (`Max*Count`). - #[pallet::storage] - pub type ChillThreshold = StorageValue<_, Percent, OptionQuery>; - - // Polymesh change - // ----------------------------------------------------------------- - - /// Entities that are allowed to run operator/validator nodes. - #[pallet::storage] - #[pallet::unbounded] - #[pallet::getter(fn permissioned_identity)] - pub type PermissionedIdentity = - StorageMap<_, Twox64Concat, IdentityId, PermissionedIdentityPrefs, OptionQuery>; - - /// Slashing switch for validators & Nominators. - #[pallet::storage] - #[pallet::getter(fn slashing_allowed_for)] - pub type SlashingAllowedFor = StorageValue<_, SlashingSwitch, ValueQuery>; - - /// Allows flexibility in commission. Every validator has commission that should be in the range [0, Cap]. - #[pallet::storage] - #[pallet::getter(fn validator_commission_cap)] - pub type ValidatorCommissionCap = StorageValue<_, Perbill, ValueQuery>; - - #[pallet::storage] - pub type PolymeshStorageVersion = StorageValue<_, Version, ValueQuery>; - - // ----------------------------------------------------------------- - - #[pallet::genesis_config] - pub struct GenesisConfig { - pub validator_count: u32, - pub minimum_validator_count: u32, - pub invulnerables: Vec, - pub force_era: Forcing, - pub slash_reward_fraction: Perbill, - pub canceled_payout: BalanceOf, - pub stakers: Vec<( - IdentityId, - T::AccountId, - T::AccountId, - BalanceOf, - crate::StakerStatus, - )>, - pub min_nominator_bond: BalanceOf, - pub min_validator_bond: BalanceOf, - pub max_validator_count: Option, - pub max_nominator_count: Option, - pub slashing_allowed_for: SlashingSwitch, - pub validator_commission_cap: Perbill, - } - - #[cfg(feature = "std")] - impl Default for GenesisConfig { - fn default() -> Self { - GenesisConfig { - validator_count: Default::default(), - minimum_validator_count: Default::default(), - invulnerables: Default::default(), - force_era: Default::default(), - slash_reward_fraction: Default::default(), - canceled_payout: Default::default(), - stakers: Default::default(), - min_nominator_bond: Default::default(), - min_validator_bond: Default::default(), - max_validator_count: None, - max_nominator_count: None, - slashing_allowed_for: Default::default(), - validator_commission_cap: Default::default(), - } - } - } - - #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { - fn build(&self) { - ValidatorCount::::put(self.validator_count); - MinimumValidatorCount::::put(self.minimum_validator_count); - Invulnerables::::put(&self.invulnerables); - ForceEra::::put(self.force_era); - CanceledSlashPayout::::put(self.canceled_payout); - SlashRewardFraction::::put(self.slash_reward_fraction); - MinNominatorBond::::put(self.min_nominator_bond); - MinValidatorBond::::put(self.min_validator_bond); - SlashingAllowedFor::::put(self.slashing_allowed_for); - ValidatorCommissionCap::::put(self.validator_commission_cap); - PolymeshStorageVersion::::put(Version::new(2)); - if let Some(x) = self.max_validator_count { - MaxValidatorsCount::::put(x); - } - if let Some(x) = self.max_nominator_count { - MaxNominatorsCount::::put(x); - } - - for &(did, ref stash, ref controller, balance, ref status) in &self.stakers { - crate::log!( - trace, - "inserting genesis staker: {:?} => {:?} => {:?}", - stash, - balance, - status - ); - assert!( - T::Currency::free_balance(stash) >= balance, - "Stash does not have enough balance to bond." - ); - frame_support::assert_ok!(>::bond( - T::RuntimeOrigin::from(Some(stash.clone()).into()), - T::Lookup::unlookup(controller.clone()), - balance, - RewardDestination::Staked, - )); - frame_support::assert_ok!(match status { - crate::StakerStatus::Validator => { - // Polymesh change - // ----------------------------------------------------------------- - if >::permissioned_identity(&did).is_none() { - // Adding identity directly in the storage by assuming it is CDD'ed - PermissionedIdentity::::insert( - &did, - PermissionedIdentityPrefs::new(3), - ); - >::deposit_event(Event::::PermissionedIdentityAdded { - governance_councill_did: GC_DID, - validators_identity: did, - }); - } - // ----------------------------------------------------------------- - >::validate( - T::RuntimeOrigin::from(Some(controller.clone()).into()), - ValidatorPrefs { - commission: self.validator_commission_cap, - blocked: Default::default(), - }, - ) - } - crate::StakerStatus::Nominator(votes) => >::nominate( - T::RuntimeOrigin::from(Some(controller.clone()).into()), - votes - .iter() - .map(|l| T::Lookup::unlookup(l.clone())) - .collect(), - ), - _ => Ok(()), - }); - assert!( - ValidatorCount::::get() - <= ::MaxWinners::get() - ); - } - - // all voters are reported to the `VoterList`. - assert_eq!( - T::VoterList::count(), - Nominators::::count() + Validators::::count(), - "not all genesis stakers were inserted into sorted list provider, something is wrong." - ); - } - } - - #[pallet::event] - #[pallet::generate_deposit(pub(crate) fn deposit_event)] - pub enum Event { - /// The era payout has been set; the first balance is the validator-payout; the second is - /// the remainder from the maximum amount of reward. - EraPaid { - era_index: EraIndex, - validator_payout: BalanceOf, - remainder: BalanceOf, - }, - /// The nominator has been rewarded by this amount. - Rewarded { - identity: IdentityId, - stash: T::AccountId, - amount: BalanceOf, - }, - /// A staker (validator or nominator) has been slashed by the given amount. - Slashed { - staker: T::AccountId, - amount: BalanceOf, - }, - /// A slash for the given validator, for the given percentage of their stake, at the given - /// era as been reported. - SlashReported { - validator: T::AccountId, - fraction: Perbill, - slash_era: EraIndex, - }, - /// An old slashing report from a prior era was discarded because it could - /// not be processed. - OldSlashingReportDiscarded { session_index: SessionIndex }, - /// A new set of stakers was elected. - StakersElected, - /// An account has bonded this amount. \[stash, amount\] - /// - /// NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, - /// it will not be emitted for staking rewards when they are added to stake. - Bonded { - identity: IdentityId, - stash: T::AccountId, - amount: BalanceOf, - }, - /// An account has unbonded this amount. - Unbonded { - identity: IdentityId, - stash: T::AccountId, - amount: BalanceOf, - }, - /// An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` - /// from the unlocking queue. - Withdrawn { - stash: T::AccountId, - amount: BalanceOf, - }, - /// A nominator has been kicked from a validator. - Kicked { - nominator: T::AccountId, - stash: T::AccountId, - }, - /// The election failed. No new era is planned. - StakingElectionFailed, - /// An account has stopped participating as either a validator or nominator. - Chilled { stash: T::AccountId }, - /// The stakers' rewards are getting paid. - PayoutStarted { - era_index: EraIndex, - validator_stash: T::AccountId, - }, - /// A validator has set their preferences. - ValidatorPrefsSet { - stash: T::AccountId, - prefs: ValidatorPrefs, - }, - /// A new force era mode was set. - ForceEra { mode: Forcing }, - - // Polymesh change - // ----------------------------------------------------------------- - /// User has updated their nominations. - Nominated { - nominator_identity: IdentityId, - stash: T::AccountId, - targets: Vec, - }, - /// An identity has issued a candidacy for becoming a validator. - PermissionedIdentityAdded { - governance_councill_did: IdentityId, - validators_identity: IdentityId, - }, - /// An identity has been removed from the permissioned identities pool. - PermissionedIdentityRemoved { - governance_councill_did: IdentityId, - validators_identity: IdentityId, - }, - /// Remove the nominators from the valid nominators when there CDD expired. - InvalidatedNominators { - governance_councill_did: IdentityId, - governance_councill_account: IdentityId, - expired_nominators: Vec, - }, - /// Slashing allowed has been updated. - SlashingAllowedForChanged { slashing_switch: SlashingSwitch }, - /// Reward scheduling interrupted. - RewardPaymentSchedulingInterrupted { - account_id: T::AccountId, - era: EraIndex, - error: DispatchError, - }, - /// Commission cap has been updated. - CommissionCapUpdated { - governance_councill_did: IdentityId, - old_commission_cap: Perbill, - new_commission_cap: Perbill, - }, - // ----------------------------------------------------------------- - } - - #[pallet::error] - pub enum Error { - /// Not a controller account. - NotController, - /// Not a stash account. - NotStash, - /// Stash is already bonded. - AlreadyBonded, - /// Controller is already paired. - AlreadyPaired, - /// Targets cannot be empty. - EmptyTargets, - /// Duplicate index. - DuplicateIndex, - /// Slash record index out of bounds. - InvalidSlashIndex, - /// Cannot have a validator or nominator role, with value less than the minimum defined by - /// governance (see `MinValidatorBond` and `MinNominatorBond`). If unbonding is the - /// intention, `chill` first to remove one's role as validator/nominator. - InsufficientBond, - /// Can not schedule more unlock chunks. - NoMoreChunks, - /// Can not rebond without unlocking chunks. - NoUnlockChunk, - /// Attempting to target a stash that still has funds. - FundedTarget, - /// Invalid era to reward. - InvalidEraToReward, - /// Invalid number of nominations. - InvalidNumberOfNominations, - /// Items are not sorted and unique. - NotSortedAndUnique, - /// Rewards for this era have already been claimed for this validator. - AlreadyClaimed, - /// Incorrect previous history depth input provided. - IncorrectHistoryDepth, - /// Incorrect number of slashing spans provided. - IncorrectSlashingSpans, - /// Internal state has become somehow corrupted and the operation cannot continue. - BadState, - /// Too many nomination targets supplied. - TooManyTargets, - /// A nomination target was supplied that was blocked or otherwise not a validator. - BadTarget, - /// The user has enough bond and thus cannot be chilled forcefully by an external person. - CannotChillOther, - /// There are too many nominators in the system. Governance needs to adjust the staking - /// settings to keep things safe for the runtime. - TooManyNominators, - /// There are too many validator candidates in the system. - TooManyValidators, - /// Commission is too low. Must be at least `MinCommission`. - CommissionTooLow, - /// Some bound is not met. - BoundNotMet, - /// Validator or nominator stash identity does not exist. - StashIdentityDoesNotExist, - /// Validator's stash identity is not permissioned. - StashIdentityNotPermissioned, - /// Nominator stash has not gone through CDD. - StashIdentityNotCDDed, - /// Permissioned validator already exists. - IdentityIsAlreadyPermissioned, - /// Identity has not gone throught CDD. - IdentityIsMissingCDD, - /// When the intended number of validators to run is >= 2/3 of `validator_count`. - IntendedCountIsExceedingConsensusLimit, - /// Identity was not found in the permissioned identity pool. - IdentityNotFound, - /// No validator was found for the given key. - ValidatorNotFound, - /// Validator commiission is above maximum. - CommissionTooHigh, - /// New commission must be different from previous commission. - CommissionUnchanged, - } - - #[pallet::hooks] - impl Hooks> for Pallet { - fn on_runtime_upgrade() -> frame_support::weights::Weight { - migrations::migrate_v13::() - } - - fn on_initialize(_now: BlockNumberFor) -> Weight { - // just return the weight of the on_finalize. - T::DbWeight::get().reads(1) - } - - fn on_finalize(_n: BlockNumberFor) { - // Set the start of the first era. - if let Some(mut active_era) = Self::active_era() { - if active_era.start.is_none() { - let now_as_millis_u64 = T::UnixTime::now().as_millis().saturated_into::(); - active_era.start = Some(now_as_millis_u64); - // This write only ever happens once, we don't include it in the weight in - // general - ActiveEra::::put(active_era); - } - } - // `on_finalize` weight is tracked in `on_initialize` - } - - fn integrity_test() { - // ensure that we funnel the correct value to the `DataProvider::MaxVotesPerVoter`; - assert_eq!( - T::MaxNominations::get(), - ::MaxVotesPerVoter::get() - ); - // and that MaxNominations is always greater than 1, since we count on this. - assert!(!T::MaxNominations::get().is_zero()); - - // ensure election results are always bounded with the same value - assert!( - ::MaxWinners::get() - == ::MaxWinners::get() - ); - - sp_std::if_std! { - sp_io::TestExternalities::new_empty().execute_with(|| - assert!( - T::SlashDeferDuration::get() < T::BondingDuration::get() || T::BondingDuration::get() == 0, - "As per documentation, slash defer duration ({}) should be less than bonding duration ({}).", - T::SlashDeferDuration::get(), - T::BondingDuration::get(), - ) - ); - } - } - - #[cfg(feature = "try-runtime")] - fn try_state(n: BlockNumberFor) -> Result<(), &'static str> { - Self::do_try_state(n) - } - } - - #[pallet::call] - impl Pallet { - /// Take the origin account as a stash and lock up `value` of its balance. `controller` will - /// be the account that controls it. - /// - /// `value` must be more than the `minimum_balance` specified by `T::Currency`. - /// - /// The dispatch origin for this call must be _Signed_ by the stash account. - /// - /// Emits `Bonded`. - /// ## Complexity - /// - Independent of the arguments. Moderate complexity. - /// - O(1). - /// - Three extra DB entries. - /// - /// NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned - /// unless the `origin` falls below _existential deposit_ and gets removed as dust. - #[pallet::call_index(0)] - #[pallet::weight(::WeightInfo::bond())] - pub fn bond( - origin: OriginFor, - controller: AccountIdLookupOf, - #[pallet::compact] value: BalanceOf, - payee: RewardDestination, - ) -> DispatchResult { - let stash = ensure_signed(origin)?; - - if >::contains_key(&stash) { - return Err(Error::::AlreadyBonded.into()); - } - - // An existing controller cannot become a stash. - if >::contains_key(&stash) { - return Err(Error::::AlreadyPaired.into()); - } - - let controller = T::Lookup::lookup(controller)?; - - if >::contains_key(&controller) { - return Err(Error::::AlreadyPaired.into()); - } - - // Reject a bond which is considered to be _dust_. - if value < T::Currency::minimum_balance() { - return Err(Error::::InsufficientBond.into()); - } - - frame_system::Pallet::::inc_consumers(&stash).map_err(|_| Error::::BadState)?; - - // You're auto-bonded forever, here. We might improve this by only bonding when - // you actually validate/nominate and remove once you unbond __everything__. - >::insert(&stash, &controller); - >::insert(&stash, payee); - - let current_era = CurrentEra::::get().unwrap_or(0); - let history_depth = T::HistoryDepth::get(); - let last_reward_era = current_era.saturating_sub(history_depth); - - let stash_balance = T::Currency::free_balance(&stash); - let value = value.min(stash_balance); - - // Polymesh change - // ----------------------------------------------------------------- - let stash_did = T::IdentityFn::get_identity(&stash).unwrap_or_default(); - Self::deposit_event(Event::::Bonded { - identity: stash_did, - stash: stash.clone(), - amount: value, - }); - // ----------------------------------------------------------------- - - let item = StakingLedger { - stash, - total: value, - active: value, - unlocking: Default::default(), - claimed_rewards: (last_reward_era..current_era) - .try_collect() - // Since last_reward_era is calculated as `current_era - - // HistoryDepth`, following bound is always expected to be - // satisfied. - .defensive_map_err(|_| Error::::BoundNotMet)?, - }; - Self::update_ledger(&controller, &item); - Ok(()) - } - - /// Add some extra amount that have appeared in the stash `free_balance` into the balance up - /// for staking. - /// - /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. - /// - /// Use this if there are additional funds in your stash account that you wish to bond. - /// Unlike [`bond`](Self::bond) or [`unbond`](Self::unbond) this function does not impose - /// any limitation on the amount that can be added. - /// - /// Emits `Bonded`. - /// - /// ## Complexity - /// - Independent of the arguments. Insignificant complexity. - /// - O(1). - #[pallet::call_index(1)] - #[pallet::weight(::WeightInfo::bond_extra())] - pub fn bond_extra( - origin: OriginFor, - #[pallet::compact] max_additional: BalanceOf, - ) -> DispatchResult { - let stash = ensure_signed(origin)?; - - let controller = Self::bonded(&stash).ok_or(Error::::NotStash)?; - let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - - let stash_balance = T::Currency::free_balance(&stash); - if let Some(extra) = stash_balance.checked_sub(&ledger.total) { - let extra = extra.min(max_additional); - ledger.total += extra; - ledger.active += extra; - // Last check: the new active amount of ledger must be more than ED. - ensure!( - ledger.active >= T::Currency::minimum_balance(), - Error::::InsufficientBond - ); - - // NOTE: ledger must be updated prior to calling `Self::weight_of`. - Self::update_ledger(&controller, &ledger); - // update this staker in the sorted list, if they exist in it. - if T::VoterList::contains(&stash) { - let _ = - T::VoterList::on_update(&stash, Self::weight_of(&ledger.stash)).defensive(); - } - - // Polymesh change - // ----------------------------------------------------------------- - let stash_did = T::IdentityFn::get_identity(&stash).unwrap_or_default(); - Self::deposit_event(Event::::Bonded { - identity: stash_did, - stash, - amount: extra, - }); - // ----------------------------------------------------------------- - } - Ok(()) - } - - /// Schedule a portion of the stash to be unlocked ready for transfer out after the bond - /// period ends. If this leaves an amount actively bonded less than - /// T::Currency::minimum_balance(), then it is increased to the full amount. - /// - /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. - /// - /// Once the unlock period is done, you can call `withdraw_unbonded` to actually move - /// the funds out of management ready for transfer. - /// - /// No more than a limited number of unlocking chunks (see `MaxUnlockingChunks`) - /// can co-exists at the same time. If there are no unlocking chunks slots available - /// [`Call::withdraw_unbonded`] is called to remove some of the chunks (if possible). - /// - /// If a user encounters the `InsufficientBond` error when calling this extrinsic, - /// they should call `chill` first in order to free up their bonded funds. - /// - /// Emits `Unbonded`. - /// - /// See also [`Call::withdraw_unbonded`]. - #[pallet::call_index(2)] - #[pallet::weight( - ::WeightInfo::withdraw_unbonded_kill(SPECULATIVE_NUM_SPANS).saturating_add(::WeightInfo::unbond())) - ] - pub fn unbond( - origin: OriginFor, - #[pallet::compact] value: BalanceOf, - ) -> DispatchResultWithPostInfo { - let controller = ensure_signed(origin)?; - let unlocking = Self::ledger(&controller) - .map(|l| l.unlocking.len()) - .ok_or(Error::::NotController)?; - - // if there are no unlocking chunks available, try to withdraw chunks older than - // `BondingDuration` to proceed with the unbonding. - let maybe_withdraw_weight = { - if unlocking == T::MaxUnlockingChunks::get() as usize { - let real_num_slashing_spans = - Self::slashing_spans(&controller).map_or(0, |s| s.iter().count()); - Some(Self::do_withdraw_unbonded( - &controller, - real_num_slashing_spans as u32, - )?) - } else { - None - } - }; - - // we need to fetch the ledger again because it may have been mutated in the call - // to `Self::do_withdraw_unbonded` above. - let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - - ensure!( - ledger.unlocking.len() < T::MaxUnlockingChunks::get() as usize, - Error::::NoMoreChunks, - ); - - Self::unbond_balance(controller, &mut ledger, value)?; - - let actual_weight = if let Some(withdraw_weight) = maybe_withdraw_weight { - Some(::WeightInfo::unbond().saturating_add(withdraw_weight)) - } else { - Some(::WeightInfo::unbond()) - }; - - Ok(actual_weight.into()) - } - - /// Remove any unlocked chunks from the `unlocking` queue from our management. - /// - /// This essentially frees up that balance to be used by the stash account to do - /// whatever it wants. - /// - /// The dispatch origin for this call must be _Signed_ by the controller. - /// - /// Emits `Withdrawn`. - /// - /// See also [`Call::unbond`]. - /// - /// ## Complexity - /// O(S) where S is the number of slashing spans to remove - /// NOTE: Weight annotation is the kill scenario, we refund otherwise. - #[pallet::call_index(3)] - #[pallet::weight(::WeightInfo::withdraw_unbonded_kill(*num_slashing_spans))] - pub fn withdraw_unbonded( - origin: OriginFor, - num_slashing_spans: u32, - ) -> DispatchResultWithPostInfo { - let controller = ensure_signed(origin)?; - - let actual_weight = Self::do_withdraw_unbonded(&controller, num_slashing_spans)?; - Ok(Some(actual_weight).into()) - } - - /// Declare the desire to validate for the origin controller. - /// - /// Effects will be felt at the beginning of the next era. - /// - /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. - #[pallet::call_index(4)] - #[pallet::weight(::WeightInfo::validate())] - pub fn validate(origin: OriginFor, prefs: ValidatorPrefs) -> DispatchResult { - let controller = ensure_signed(origin)?; - - let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - - ensure!( - ledger.active >= MinValidatorBond::::get(), - Error::::InsufficientBond - ); - let stash = &ledger.stash; - - // ensure their commission is correct. - ensure!( - prefs.commission >= MinCommission::::get(), - Error::::CommissionTooLow - ); - - // ensure their commission is correct. - ensure!( - prefs.commission <= Self::validator_commission_cap(), - Error::::CommissionTooHigh - ); - - // Polymesh change - // ----------------------------------------------------------------- - let stash_did = pallet_identity::Pallet::::get_identity(stash) - .ok_or(Error::::StashIdentityDoesNotExist)?; - let mut stash_did_prefs = Self::permissioned_identity(stash_did) - .ok_or(Error::::StashIdentityNotPermissioned)?; - - // Only check limits if they are not already a validator. - if !Validators::::contains_key(stash) { - // If this error is reached, we need to adjust the `MinValidatorBond` and start - // calling `chill_other`. Until then, we explicitly block new validators to protect - // the runtime. - if let Some(max_validators) = MaxValidatorsCount::::get() { - ensure!( - Validators::::count() < max_validators, - Error::::TooManyValidators - ); - } - // Ensure the identity doesn't run more validators than the intended count - ensure!( - stash_did_prefs.running_count < stash_did_prefs.intended_count, - Error::::TooManyValidators - ); - stash_did_prefs.running_count += 1; - pallet_identity::Pallet::::add_account_key_ref_count(&stash); - PermissionedIdentity::::insert(stash_did, stash_did_prefs); - } - // ----------------------------------------------------------------- - - Self::do_remove_nominator(stash); - Self::do_add_validator(stash, prefs.clone()); - Self::deposit_event(Event::::ValidatorPrefsSet { - stash: ledger.stash, - prefs, - }); - - Ok(()) - } - - /// Declare the desire to nominate `targets` for the origin controller. - /// - /// Effects will be felt at the beginning of the next era. - /// - /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. - /// - /// ## Complexity - /// - The transaction's complexity is proportional to the size of `targets` (N) - /// which is capped at CompactAssignments::LIMIT (T::MaxNominations). - /// - Both the reads and writes follow a similar pattern. - #[pallet::call_index(5)] - #[pallet::weight(::WeightInfo::nominate(targets.len() as u32))] - pub fn nominate( - origin: OriginFor, - targets: Vec>, - ) -> DispatchResult { - let controller = ensure_signed(origin)?; - - let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - ensure!( - ledger.active >= MinNominatorBond::::get(), - Error::::InsufficientBond - ); - let stash = &ledger.stash; - - // Only check limits if they are not already a nominator. - if !Nominators::::contains_key(stash) { - // If this error is reached, we need to adjust the `MinNominatorBond` and start - // calling `chill_other`. Until then, we explicitly block new nominators to protect - // the runtime. - if let Some(max_nominators) = MaxNominatorsCount::::get() { - ensure!( - Nominators::::count() < max_nominators, - Error::::TooManyNominators - ); - } - } - - ensure!(!targets.is_empty(), Error::::EmptyTargets); - ensure!( - targets.len() <= T::MaxNominations::get() as usize, - Error::::TooManyTargets - ); - - let old = Nominators::::get(stash).map_or_else(Vec::new, |x| x.targets.into_inner()); - - let targets: BoundedVec<_, _> = targets - .into_iter() - .map(|t| T::Lookup::lookup(t).map_err(DispatchError::from)) - .map(|n| { - n.and_then(|n| { - if old.contains(&n) || !Validators::::get(&n).blocked { - Ok(n) - } else { - Err(Error::::BadTarget.into()) - } - }) - }) - .collect::, _>>()? - .try_into() - .map_err(|_| Error::::TooManyNominators)?; - - // Polymesh change - // ----------------------------------------------------------------- - let nominator_did = pallet_identity::Pallet::::get_identity(&stash); - - Self::release_running_validator(&stash); - Self::deposit_event(Event::::Nominated { - nominator_identity: nominator_did.unwrap_or_default(), - stash: ledger.stash.clone(), - targets: targets.to_vec(), - }); - // ----------------------------------------------------------------- - - let nominations = Nominations { - targets, - // Initial nominations are considered submitted at era 0. See `Nominations` doc. - submitted_in: Self::current_era().unwrap_or(0), - suppressed: false, - }; - - Self::do_remove_validator(stash); - Self::do_add_nominator(stash, nominations); - Ok(()) - } - - /// Declare no desire to either validate or nominate. - /// - /// Effects will be felt at the beginning of the next era. - /// - /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. - /// - /// ## Complexity - /// - Independent of the arguments. Insignificant complexity. - /// - Contains one read. - /// - Writes are limited to the `origin` account key. - #[pallet::call_index(6)] - #[pallet::weight(::WeightInfo::chill())] - pub fn chill(origin: OriginFor) -> DispatchResult { - let controller = ensure_signed(origin)?; - let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - Self::chill_stash(&ledger.stash); - Ok(()) - } - - /// (Re-)set the payment target for a controller. - /// - /// Effects will be felt instantly (as soon as this function is completed successfully). - /// - /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. - /// - /// ## Complexity - /// - O(1) - /// - Independent of the arguments. Insignificant complexity. - /// - Contains a limited number of reads. - /// - Writes are limited to the `origin` account key. - /// --------- - #[pallet::call_index(7)] - #[pallet::weight(::WeightInfo::set_payee())] - pub fn set_payee( - origin: OriginFor, - payee: RewardDestination, - ) -> DispatchResult { - let controller = ensure_signed(origin)?; - let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - let stash = &ledger.stash; - >::insert(stash, payee); - Ok(()) - } - - /// (Re-)set the controller of a stash. - /// - /// Effects will be felt instantly (as soon as this function is completed successfully). - /// - /// The dispatch origin for this call must be _Signed_ by the stash, not the controller. - /// - /// ## Complexity - /// O(1) - /// - Independent of the arguments. Insignificant complexity. - /// - Contains a limited number of reads. - /// - Writes are limited to the `origin` account key. - #[pallet::call_index(8)] - #[pallet::weight(::WeightInfo::set_controller())] - pub fn set_controller( - origin: OriginFor, - controller: AccountIdLookupOf, - ) -> DispatchResult { - let stash = ensure_signed(origin)?; - let old_controller = Self::bonded(&stash).ok_or(Error::::NotStash)?; - let controller = T::Lookup::lookup(controller)?; - if >::contains_key(&controller) { - return Err(Error::::AlreadyPaired.into()); - } - - // Prevents stashes which are controllers of another ledger from calling the extrinsic - if old_controller != stash { - if >::contains_key(&stash) { - return Err(Error::::BadState.into()); - } - } - - if controller != old_controller { - >::insert(&stash, &controller); - if let Some(l) = >::take(&old_controller) { - >::insert(&controller, l); - } - } - Ok(()) - } - - /// Sets the ideal number of validators. - /// - /// The dispatch origin must be Root. - /// - /// ## Complexity - /// O(1) - #[pallet::call_index(9)] - #[pallet::weight(::WeightInfo::set_validator_count())] - pub fn set_validator_count( - origin: OriginFor, - #[pallet::compact] new: u32, - ) -> DispatchResult { - ensure_root(origin)?; - // ensure new validator count does not exceed maximum winners - // support by election provider. - ensure!( - new <= ::MaxWinners::get(), - Error::::TooManyValidators - ); - ValidatorCount::::put(new); - Ok(()) - } - - /// Increments the ideal number of validators upto maximum of - /// `ElectionProviderBase::MaxWinners`. - /// - /// The dispatch origin must be Root. - /// - /// ## Complexity - /// Same as [`Self::set_validator_count`]. - #[pallet::call_index(10)] - #[pallet::weight(::WeightInfo::set_validator_count())] - pub fn increase_validator_count( - origin: OriginFor, - #[pallet::compact] additional: u32, - ) -> DispatchResult { - ensure_root(origin)?; - let old = ValidatorCount::::get(); - let new = old - .checked_add(additional) - .ok_or(ArithmeticError::Overflow)?; - ensure!( - new <= ::MaxWinners::get(), - Error::::TooManyValidators - ); - - ValidatorCount::::put(new); - Ok(()) - } - - /// Scale up the ideal number of validators by a factor upto maximum of - /// `ElectionProviderBase::MaxWinners`. - /// - /// The dispatch origin must be Root. - /// - /// ## Complexity - /// Same as [`Self::set_validator_count`]. - #[pallet::call_index(11)] - #[pallet::weight(::WeightInfo::set_validator_count())] - pub fn scale_validator_count(origin: OriginFor, factor: Percent) -> DispatchResult { - ensure_root(origin)?; - let old = ValidatorCount::::get(); - let new = old - .checked_add(factor.mul_floor(old)) - .ok_or(ArithmeticError::Overflow)?; - - ensure!( - new <= ::MaxWinners::get(), - Error::::TooManyValidators - ); - - ValidatorCount::::put(new); - Ok(()) - } - - /// Force there to be no new eras indefinitely. - /// - /// The dispatch origin must be Root. - /// - /// # Warning - /// - /// The election process starts multiple blocks before the end of the era. - /// Thus the election process may be ongoing when this is called. In this case the - /// election will continue until the next era is triggered. - /// - /// ## Complexity - /// - No arguments. - /// - Weight: O(1) - #[pallet::call_index(12)] - #[pallet::weight(::WeightInfo::force_no_eras())] - pub fn force_no_eras(origin: OriginFor) -> DispatchResult { - ensure_root(origin)?; - Self::set_force_era(Forcing::ForceNone); - Ok(()) - } - - /// Force there to be a new era at the end of the next session. After this, it will be - /// reset to normal (non-forced) behaviour. - /// - /// The dispatch origin must be Root. - /// - /// # Warning - /// - /// The election process starts multiple blocks before the end of the era. - /// If this is called just before a new era is triggered, the election process may not - /// have enough blocks to get a result. - /// - /// ## Complexity - /// - No arguments. - /// - Weight: O(1) - #[pallet::call_index(13)] - #[pallet::weight(::WeightInfo::force_new_era())] - pub fn force_new_era(origin: OriginFor) -> DispatchResult { - ensure_root(origin)?; - Self::set_force_era(Forcing::ForceNew); - Ok(()) - } - - /// Set the validators who cannot be slashed (if any). - /// - /// The dispatch origin must be Root. - #[pallet::call_index(14)] - #[pallet::weight(::WeightInfo::set_invulnerables(invulnerables.len() as u32))] - pub fn set_invulnerables( - origin: OriginFor, - invulnerables: Vec, - ) -> DispatchResult { - ensure_root(origin)?; - >::put(invulnerables); - Ok(()) - } - - /// Force a current staker to become completely unstaked, immediately. - /// - /// The dispatch origin must be Root. - #[pallet::call_index(15)] - #[pallet::weight(::WeightInfo::force_unstake(*num_slashing_spans))] - pub fn force_unstake( - origin: OriginFor, - stash: T::AccountId, - num_slashing_spans: u32, - ) -> DispatchResult { - ensure_root(origin)?; - - // Remove all staking-related information. - Self::kill_stash(&stash, num_slashing_spans)?; - - // Remove the lock. - T::Currency::remove_lock(STAKING_ID, &stash); - Ok(()) - } - - /// Force there to be a new era at the end of sessions indefinitely. - /// - /// The dispatch origin must be Root. - /// - /// # Warning - /// - /// The election process starts multiple blocks before the end of the era. - /// If this is called just before a new era is triggered, the election process may not - /// have enough blocks to get a result. - #[pallet::call_index(16)] - #[pallet::weight(::WeightInfo::force_new_era_always())] - pub fn force_new_era_always(origin: OriginFor) -> DispatchResult { - ensure_root(origin)?; - Self::set_force_era(Forcing::ForceAlways); - Ok(()) - } - - /// Cancel enactment of a deferred slash. - /// - /// Can be called by the `T::AdminOrigin`. - /// - /// Parameters: era and indices of the slashes for that era to kill. - #[pallet::call_index(17)] - #[pallet::weight(::WeightInfo::cancel_deferred_slash(slash_indices.len() as u32))] - pub fn cancel_deferred_slash( - origin: OriginFor, - era: EraIndex, - slash_indices: Vec, - ) -> DispatchResult { - T::AdminOrigin::ensure_origin(origin)?; - - ensure!(!slash_indices.is_empty(), Error::::EmptyTargets); - ensure!( - is_sorted_and_unique(&slash_indices), - Error::::NotSortedAndUnique - ); - - let mut unapplied = ::UnappliedSlashes::get(&era); - let last_item = slash_indices[slash_indices.len() - 1]; - ensure!( - (last_item as usize) < unapplied.len(), - Error::::InvalidSlashIndex - ); - - for (removed, index) in slash_indices.into_iter().enumerate() { - let index = (index as usize) - removed; - unapplied.remove(index); - } - - ::UnappliedSlashes::insert(&era, &unapplied); - Ok(()) - } - - /// Pay out all the stakers behind a single validator for a single era. - /// - /// - `validator_stash` is the stash account of the validator. Their nominators, up to - /// `T::MaxNominatorRewardedPerValidator`, will also receive their rewards. - /// - `era` may be any era between `[current_era - history_depth; current_era]`. - /// - /// The origin of this call must be _Signed_. Any account can call this function, even if - /// it is not one of the stakers. - /// - /// ## Complexity - /// - At most O(MaxNominatorRewardedPerValidator). - #[pallet::call_index(18)] - #[pallet::weight(::WeightInfo::payout_stakers_alive_staked( - T::MaxNominatorRewardedPerValidator::get() - ))] - pub fn payout_stakers( - origin: OriginFor, - validator_stash: T::AccountId, - era: EraIndex, - ) -> DispatchResultWithPostInfo { - ensure_signed(origin)?; - Self::do_payout_stakers(validator_stash, era) - } - - /// Rebond a portion of the stash scheduled to be unlocked. - /// - /// The dispatch origin must be signed by the controller. - /// - /// ## Complexity - /// - Time complexity: O(L), where L is unlocking chunks - /// - Bounded by `MaxUnlockingChunks`. - #[pallet::call_index(19)] - #[pallet::weight(::WeightInfo::rebond(T::MaxUnlockingChunks::get() as u32))] - pub fn rebond( - origin: OriginFor, - #[pallet::compact] value: BalanceOf, - ) -> DispatchResultWithPostInfo { - let controller = ensure_signed(origin)?; - let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - ensure!(!ledger.unlocking.is_empty(), Error::::NoUnlockChunk); - - let initial_unlocking = ledger.unlocking.len() as u32; - let (ledger, rebonded_value) = ledger.rebond(value); - // Last check: the new active amount of ledger must be more than ED. - ensure!( - ledger.active >= T::Currency::minimum_balance(), - Error::::InsufficientBond - ); - - Self::deposit_event(Event::::Bonded { - identity: IdentityId::default(), - stash: ledger.stash.clone(), - amount: rebonded_value, - }); - - // NOTE: ledger must be updated prior to calling `Self::weight_of`. - Self::update_ledger(&controller, &ledger); - if T::VoterList::contains(&ledger.stash) { - let _ = T::VoterList::on_update(&ledger.stash, Self::weight_of(&ledger.stash)) - .defensive(); - } - - let removed_chunks = 1u32 // for the case where the last iterated chunk is not removed - .saturating_add(initial_unlocking) - .saturating_sub(ledger.unlocking.len() as u32); - Ok(Some(::WeightInfo::rebond(removed_chunks)).into()) - } - - /// Remove all data structures concerning a staker/stash once it is at a state where it can - /// be considered `dust` in the staking system. The requirements are: - /// - /// 1. the `total_balance` of the stash is below existential deposit. - /// 2. or, the `ledger.total` of the stash is below existential deposit. - /// - /// The former can happen in cases like a slash; the latter when a fully unbonded account - /// is still receiving staking rewards in `RewardDestination::Staked`. - /// - /// It can be called by anyone, as long as `stash` meets the above requirements. - /// - /// Refunds the transaction fees upon successful execution. - #[pallet::call_index(20)] - #[pallet::weight(::WeightInfo::reap_stash(*num_slashing_spans))] - pub fn reap_stash( - origin: OriginFor, - stash: T::AccountId, - num_slashing_spans: u32, - ) -> DispatchResultWithPostInfo { - let _ = ensure_signed(origin)?; - - let ed = T::Currency::minimum_balance(); - let reapable = T::Currency::total_balance(&stash) <= ed - || Self::ledger(Self::bonded(stash.clone()).ok_or(Error::::NotStash)?) - .map(|l| l.total) - .unwrap_or_default() - < ed; - ensure!(reapable, Error::::FundedTarget); - - Self::kill_stash(&stash, num_slashing_spans)?; - T::Currency::remove_lock(STAKING_ID, &stash); - - Ok(Pays::No.into()) - } - - /// Remove the given nominations from the calling validator. - /// - /// Effects will be felt at the beginning of the next era. - /// - /// The dispatch origin for this call must be _Signed_ by the controller, not the stash. - /// - /// - `who`: A list of nominator stash accounts who are nominating this validator which - /// should no longer be nominating this validator. - /// - /// Note: Making this call only makes sense if you first set the validator preferences to - /// block any further nominations. - #[pallet::call_index(21)] - #[pallet::weight(::WeightInfo::kick(who.len() as u32))] - pub fn kick(origin: OriginFor, who: Vec>) -> DispatchResult { - let controller = ensure_signed(origin)?; - let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - let stash = &ledger.stash; - - for nom_stash in who - .into_iter() - .map(T::Lookup::lookup) - .collect::, _>>()? - .into_iter() - { - Nominators::::mutate(&nom_stash, |maybe_nom| { - if let Some(ref mut nom) = maybe_nom { - if let Some(pos) = nom.targets.iter().position(|v| v == stash) { - nom.targets.swap_remove(pos); - Self::deposit_event(Event::::Kicked { - nominator: nom_stash.clone(), - stash: stash.clone(), - }); - } - } - }); - } - - Ok(()) - } - - /// Update the various staking configurations . - /// - /// * `min_nominator_bond`: The minimum active bond needed to be a nominator. - /// * `min_validator_bond`: The minimum active bond needed to be a validator. - /// * `max_nominator_count`: The max number of users who can be a nominator at once. When - /// set to `None`, no limit is enforced. - /// * `max_validator_count`: The max number of users who can be a validator at once. When - /// set to `None`, no limit is enforced. - /// * `chill_threshold`: The ratio of `max_nominator_count` or `max_validator_count` which - /// should be filled in order for the `chill_other` transaction to work. - /// * `min_commission`: The minimum amount of commission that each validators must maintain. - /// This is checked only upon calling `validate`. Existing validators are not affected. - /// - /// RuntimeOrigin must be Root to call this function. - /// - /// NOTE: Existing nominators and validators will not be affected by this update. - /// to kick people under the new limits, `chill_other` should be called. - // We assume the worst case for this call is either: all items are set or all items are - // removed. - #[pallet::call_index(22)] - #[pallet::weight( - ::WeightInfo::set_staking_configs_all_set() - .max(::WeightInfo::set_staking_configs_all_remove()) - )] - pub fn set_staking_configs( - origin: OriginFor, - min_nominator_bond: ConfigOp>, - min_validator_bond: ConfigOp>, - max_nominator_count: ConfigOp, - max_validator_count: ConfigOp, - chill_threshold: ConfigOp, - min_commission: ConfigOp, - ) -> DispatchResult { - ensure_root(origin)?; - - macro_rules! config_op_exp { - ($storage:ty, $op:ident) => { - match $op { - ConfigOp::Noop => (), - ConfigOp::Set(v) => <$storage>::put(v), - ConfigOp::Remove => <$storage>::kill(), - } - }; - } - - config_op_exp!(MinNominatorBond, min_nominator_bond); - config_op_exp!(MinValidatorBond, min_validator_bond); - config_op_exp!(MaxNominatorsCount, max_nominator_count); - config_op_exp!(MaxValidatorsCount, max_validator_count); - config_op_exp!(ChillThreshold, chill_threshold); - config_op_exp!(MinCommission, min_commission); - Ok(()) - } - /// Declare a `controller` to stop participating as either a validator or nominator. - /// - /// Effects will be felt at the beginning of the next era. - /// - /// The dispatch origin for this call must be _Signed_, but can be called by anyone. - /// - /// If the caller is the same as the controller being targeted, then no further checks are - /// enforced, and this function behaves just like `chill`. - /// - /// If the caller is different than the controller being targeted, the following conditions - /// must be met: - /// - /// * `controller` must belong to a nominator who has become non-decodable, - /// - /// Or: - /// - /// * A `ChillThreshold` must be set and checked which defines how close to the max - /// nominators or validators we must reach before users can start chilling one-another. - /// * A `MaxNominatorCount` and `MaxValidatorCount` must be set which is used to determine - /// how close we are to the threshold. - /// * A `MinNominatorBond` and `MinValidatorBond` must be set and checked, which determines - /// if this is a person that should be chilled because they have not met the threshold - /// bond required. - /// - /// This can be helpful if bond requirements are updated, and we need to remove old users - /// who do not satisfy these requirements. - #[pallet::call_index(23)] - #[pallet::weight(::WeightInfo::chill_other())] - pub fn chill_other(origin: OriginFor, controller: T::AccountId) -> DispatchResult { - // Anyone can call this function. - let caller = ensure_signed(origin)?; - let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; - let stash = ledger.stash; - - // In order for one user to chill another user, the following conditions must be met: - // - // * `controller` belongs to a nominator who has become non-decodable, - // - // Or - // - // * A `ChillThreshold` is set which defines how close to the max nominators or - // validators we must reach before users can start chilling one-another. - // * A `MaxNominatorCount` and `MaxValidatorCount` which is used to determine how close - // we are to the threshold. - // * A `MinNominatorBond` and `MinValidatorBond` which is the final condition checked to - // determine this is a person that should be chilled because they have not met the - // threshold bond required. - // - // Otherwise, if caller is the same as the controller, this is just like `chill`. - - if Nominators::::contains_key(&stash) && Nominators::::get(&stash).is_none() { - Self::chill_stash(&stash); - return Ok(()); - } - - if caller != controller { - let threshold = ChillThreshold::::get().ok_or(Error::::CannotChillOther)?; - let min_active_bond = if Nominators::::contains_key(&stash) { - let max_nominator_count = - MaxNominatorsCount::::get().ok_or(Error::::CannotChillOther)?; - let current_nominator_count = Nominators::::count(); - ensure!( - threshold * max_nominator_count < current_nominator_count, - Error::::CannotChillOther - ); - MinNominatorBond::::get() - } else if Validators::::contains_key(&stash) { - let max_validator_count = - MaxValidatorsCount::::get().ok_or(Error::::CannotChillOther)?; - let current_validator_count = Validators::::count(); - ensure!( - threshold * max_validator_count < current_validator_count, - Error::::CannotChillOther - ); - MinValidatorBond::::get() - } else { - Zero::zero() - }; - - ensure!( - ledger.active < min_active_bond, - Error::::CannotChillOther - ); - } - - Self::chill_stash(&stash); - Ok(()) - } - - /// Force a validator to have at least the minimum commission. This will not affect a - /// validator who already has a commission greater than or equal to the minimum. Any account - /// can call this. - #[pallet::call_index(24)] - #[pallet::weight(::WeightInfo::force_apply_min_commission())] - pub fn force_apply_min_commission( - origin: OriginFor, - validator_stash: T::AccountId, - ) -> DispatchResult { - ensure_signed(origin)?; - let min_commission = MinCommission::::get(); - Validators::::try_mutate_exists(validator_stash, |maybe_prefs| { - maybe_prefs - .as_mut() - .map(|prefs| { - (prefs.commission < min_commission) - .then(|| prefs.commission = min_commission) - }) - .ok_or(Error::::NotStash) - })?; - Ok(()) - } - - /// Sets the minimum amount of commission that each validators must maintain. - /// - /// This call has lower privilege requirements than `set_staking_config` and can be called - /// by the `T::AdminOrigin`. Root can always call this. - #[pallet::call_index(25)] - #[pallet::weight(::WeightInfo::set_min_commission())] - pub fn set_min_commission(origin: OriginFor, new: Perbill) -> DispatchResult { - T::AdminOrigin::ensure_origin(origin)?; - MinCommission::::put(new); - Ok(()) - } - - // Polymesh change - // ----------------------------------------------------------------- - - /// Adds a permissioned identity and sets its preferences. - /// - /// The dispatch origin must be Root. - #[pallet::call_index(26)] - #[pallet::weight(::WeightInfo::add_permissioned_validator())] - pub fn add_permissioned_validator( - origin: OriginFor, - identity: IdentityId, - intended_count: Option, - ) -> DispatchResult { - T::AdminOrigin::ensure_origin(origin)?; - - ensure!( - Self::permissioned_identity(&identity).is_none(), - Error::::IdentityIsAlreadyPermissioned - ); - - ensure!( - pallet_identity::Pallet::::has_valid_cdd(identity), - Error::::IdentityIsMissingCDD - ); - - match intended_count { - Some(intended_count) => { - ensure!( - intended_count < Self::maximum_number_of_validators_per_identity(), - Error::::IntendedCountIsExceedingConsensusLimit - ); - PermissionedIdentity::::insert( - &identity, - PermissionedIdentityPrefs::new(intended_count), - ); - } - None => { - PermissionedIdentity::::insert( - &identity, - PermissionedIdentityPrefs::default(), - ); - } - } - - Self::deposit_event(Event::::PermissionedIdentityAdded { - governance_councill_did: GC_DID, - validators_identity: identity, - }); - Ok(()) - } - - /// Remove an identity from the pool of (wannabe) validator identities. Effects are known in the next session. - /// - /// The dispatch origin must be Root. - /// - /// # Arguments - /// * origin Required origin for removing a potential validator. - /// * identity Validator's IdentityId. - #[pallet::call_index(27)] - #[pallet::weight(::WeightInfo::remove_permissioned_validator())] - pub fn remove_permissioned_validator( - origin: OriginFor, - identity: IdentityId, - ) -> DispatchResult { - T::AdminOrigin::ensure_origin(origin)?; - - ensure!( - Self::permissioned_identity(&identity).is_some(), - Error::::IdentityNotFound - ); - - PermissionedIdentity::::remove(&identity); - - Self::deposit_event(Event::::PermissionedIdentityRemoved { - governance_councill_did: GC_DID, - validators_identity: identity, - }); - Ok(()) - } - - #[pallet::call_index(29)] - #[pallet::weight(::WeightInfo::payout_stakers_alive_staked( - T::MaxNominatorRewardedPerValidator::get() - ))] - pub fn payout_stakers_by_system( - origin: OriginFor, - validator_stash: T::AccountId, - era: EraIndex, - ) -> DispatchResultWithPostInfo { - ensure_root(origin)?; - Self::do_payout_stakers(validator_stash, era) - } - - /// Switch slashing status on the basis of given `slashing_switch`. Can only be called by root. - #[pallet::call_index(30)] - #[pallet::weight(::WeightInfo::change_slashing_allowed_for())] - pub fn change_slashing_allowed_for( - origin: OriginFor, - slashing_switch: SlashingSwitch, - ) -> DispatchResult { - ensure_root(origin)?; - SlashingAllowedFor::::put(slashing_switch); - Self::deposit_event(Event::::SlashingAllowedForChanged { slashing_switch }); - Ok(()) - } - - /// Sets the intended count to `new_intended_count` for the given `identity`. - #[pallet::call_index(31)] - #[pallet::weight(::WeightInfo::update_permissioned_validator_intended_count())] - pub fn update_permissioned_validator_intended_count( - origin: OriginFor, - identity: IdentityId, - new_intended_count: u32, - ) -> DispatchResult { - T::AdminOrigin::ensure_origin(origin)?; - - ensure!( - Self::maximum_number_of_validators_per_identity() > new_intended_count, - Error::::IntendedCountIsExceedingConsensusLimit - ); - - PermissionedIdentity::::try_mutate(&identity, |pref| { - pref.as_mut() - .ok_or_else(|| Error::::IdentityNotFound.into()) - .map(|p| p.intended_count = new_intended_count) - }) - } - - /// Governance council forcefully chills a validator. Effects will be felt at the beginning of the next era. - #[pallet::call_index(32)] - #[pallet::weight(::WeightInfo::chill_from_governance(stash_keys.len() as u32))] - pub fn chill_from_governance( - origin: OriginFor, - identity: IdentityId, - stash_keys: Vec, - ) -> DispatchResult { - Self::base_chill_from_governance(origin, identity, stash_keys) - } - - /// Changes commission rate which applies to all validators. Only Governance - /// committee is allowed to change this value. - /// - /// # Arguments - /// * `new_cap` the new commission cap. - #[pallet::call_index(33)] - #[pallet::weight(::WeightInfo::set_commission_cap(150))] - pub fn set_commission_cap(origin: OriginFor, new_cap: Perbill) -> DispatchResult { - T::AdminOrigin::ensure_origin(origin.clone())?; - - // Update the cap, assuming it changed, or error. - let old_cap = - ValidatorCommissionCap::::try_mutate(|cap| -> Result<_, DispatchError> { - ensure!(*cap != new_cap, Error::::CommissionUnchanged); - Ok(core::mem::replace(cap, new_cap)) - })?; - - // Update `commission` in each validator prefs to `min(comission, new_cap)`. - >::translate(|_, mut prefs: ValidatorPrefs| { - prefs.commission = prefs.commission.min(new_cap); - Some(prefs) - }); - - Self::deposit_event(Event::::CommissionCapUpdated { - governance_councill_did: GC_DID, - old_commission_cap: old_cap, - new_commission_cap: new_cap, - }); - - Ok(()) - } - // ----------------------------------------------------------------- - } -} - -/// Check that list is sorted and has no duplicates. -fn is_sorted_and_unique(list: &[u32]) -> bool { - list.windows(2).all(|w| w[0] < w[1]) -} diff --git a/pallets/staking/src/slashing.rs b/pallets/staking/src/slashing.rs deleted file mode 100644 index 5314bb97a2..0000000000 --- a/pallets/staking/src/slashing.rs +++ /dev/null @@ -1,996 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! A slashing implementation for NPoS systems. -//! -//! For the purposes of the economic model, it is easiest to think of each validator as a nominator -//! which nominates only its own identity. -//! -//! The act of nomination signals intent to unify economic identity with the validator - to take -//! part in the rewards of a job well done, and to take part in the punishment of a job done badly. -//! -//! There are 3 main difficulties to account for with slashing in NPoS: -//! - A nominator can nominate multiple validators and be slashed via any of them. -//! - Until slashed, stake is reused from era to era. Nominating with N coins for E eras in a row -//! does not mean you have N*E coins to be slashed - you've only ever had N. -//! - Slashable offences can be found after the fact and out of order. -//! -//! The algorithm implemented in this module tries to balance these 3 difficulties. -//! -//! First, we only slash participants for the _maximum_ slash they receive in some time period, -//! rather than the sum. This ensures a protection from overslashing. -//! -//! Second, we do not want the time period (or "span") that the maximum is computed -//! over to last indefinitely. That would allow participants to begin acting with -//! impunity after some point, fearing no further repercussions. For that reason, we -//! automatically "chill" validators and withdraw a nominator's nomination after a slashing event, -//! requiring them to re-enlist voluntarily (acknowledging the slash) and begin a new -//! slashing span. -//! -//! Typically, you will have a single slashing event per slashing span. Only in the case -//! where a validator releases many misbehaviors at once, or goes "back in time" to misbehave in -//! eras that have already passed, would you encounter situations where a slashing span -//! has multiple misbehaviors. However, accounting for such cases is necessary -//! to deter a class of "rage-quit" attacks. -//! -//! Based on research at - -use crate::{ - types::SlashingSwitch, BalanceOf, Config, Error, Exposure, NegativeImbalanceOf, Pallet, - Perbill, SessionInterface, SlashingAllowedFor, Store, UnappliedSlash, -}; -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{ - ensure, - traits::{Currency, Defensive, Get, Imbalance, OnUnbalanced}, -}; -use scale_info::TypeInfo; -use sp_runtime::{ - traits::{Saturating, Zero}, - DispatchResult, RuntimeDebug, -}; -use sp_staking::{offence::DisableStrategy, EraIndex}; -use sp_std::vec::Vec; - -/// The proportion of the slashing reward to be paid out on the first slashing detection. -/// This is f_1 in the paper. -const REWARD_F1: Perbill = Perbill::from_percent(50); - -/// The index of a slashing span - unique to each stash. -pub type SpanIndex = u32; - -// A range of start..end eras for a slashing span. -#[derive(Encode, Decode, TypeInfo)] -#[cfg_attr(feature = "std", derive(Debug, PartialEq))] -pub struct SlashingSpan { - pub index: SpanIndex, - pub start: EraIndex, - pub length: Option, // the ongoing slashing span has indeterminate length. -} - -impl SlashingSpan { - fn contains_era(&self, era: EraIndex) -> bool { - self.start <= era && self.length.map_or(true, |l| self.start + l > era) - } -} - -/// An encoding of all of a nominator's slashing spans. -#[derive(Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct SlashingSpans { - // the index of the current slashing span of the nominator. different for - // every stash, resets when the account hits free balance 0. - span_index: SpanIndex, - // the start era of the most recent (ongoing) slashing span. - last_start: EraIndex, - // the last era at which a non-zero slash occurred. - last_nonzero_slash: EraIndex, - // all prior slashing spans' start indices, in reverse order (most recent first) - // encoded as offsets relative to the slashing span after it. - prior: Vec, -} - -impl SlashingSpans { - // creates a new record of slashing spans for a stash, starting at the beginning - // of the bonding period, relative to now. - pub(crate) fn new(window_start: EraIndex) -> Self { - SlashingSpans { - span_index: 0, - last_start: window_start, - // initialize to zero, as this structure is lazily created until - // the first slash is applied. setting equal to `window_start` would - // put a time limit on nominations. - last_nonzero_slash: 0, - prior: Vec::new(), - } - } - - // update the slashing spans to reflect the start of a new span at the era after `now` - // returns `true` if a new span was started, `false` otherwise. `false` indicates - // that internal state is unchanged. - pub(crate) fn end_span(&mut self, now: EraIndex) -> bool { - let next_start = now + 1; - if next_start <= self.last_start { - return false; - } - - let last_length = next_start - self.last_start; - self.prior.insert(0, last_length); - self.last_start = next_start; - self.span_index += 1; - true - } - - // an iterator over all slashing spans in _reverse_ order - most recent first. - pub fn iter(&'_ self) -> impl Iterator + '_ { - let mut last_start = self.last_start; - let mut index = self.span_index; - let last = SlashingSpan { - index, - start: last_start, - length: None, - }; - let prior = self.prior.iter().cloned().map(move |length| { - let start = last_start - length; - last_start = start; - index -= 1; - - SlashingSpan { - index, - start, - length: Some(length), - } - }); - - sp_std::iter::once(last).chain(prior) - } - - /// Yields the era index where the most recent non-zero slash occurred. - pub fn last_nonzero_slash(&self) -> EraIndex { - self.last_nonzero_slash - } - - // prune the slashing spans against a window, whose start era index is given. - // - // If this returns `Some`, then it includes a range start..end of all the span - // indices which were pruned. - fn prune(&mut self, window_start: EraIndex) -> Option<(SpanIndex, SpanIndex)> { - let old_idx = self - .iter() - .skip(1) // skip ongoing span. - .position(|span| { - span.length - .map_or(false, |len| span.start + len <= window_start) - }); - - let earliest_span_index = self.span_index - self.prior.len() as SpanIndex; - let pruned = match old_idx { - Some(o) => { - self.prior.truncate(o); - let new_earliest = self.span_index - self.prior.len() as SpanIndex; - Some((earliest_span_index, new_earliest)) - } - None => None, - }; - - // readjust the ongoing span, if it started before the beginning of the window. - self.last_start = sp_std::cmp::max(self.last_start, window_start); - pruned - } -} - -/// A slashing-span record for a particular stash. -#[derive(Encode, Decode, Default, TypeInfo, MaxEncodedLen)] -pub struct SpanRecord { - slashed: Balance, - paid_out: Balance, -} - -impl SpanRecord { - /// The value of stash balance slashed in this span. - pub fn amount(&self) -> &Balance { - &self.slashed - } -} - -/// Parameters for performing a slash. -#[derive(Clone)] -pub(crate) struct SlashParams<'a, T: 'a + Config> { - /// The stash account being slashed. - pub(crate) stash: &'a T::AccountId, - /// The proportion of the slash. - pub(crate) slash: Perbill, - /// The exposure of the stash and all nominators. - pub(crate) exposure: &'a Exposure>, - /// The era where the offence occurred. - pub(crate) slash_era: EraIndex, - /// The first era in the current bonding period. - pub(crate) window_start: EraIndex, - /// The current era. - pub(crate) now: EraIndex, - /// The maximum percentage of a slash that ever gets paid out. - /// This is f_inf in the paper. - pub(crate) reward_proportion: Perbill, - /// When to disable offenders. - pub(crate) disable_strategy: DisableStrategy, -} - -/// Computes a slash of a validator and nominators. It returns an unapplied -/// record to be applied at some later point. Slashing metadata is updated in storage, -/// since unapplied records are only rarely intended to be dropped. -/// -/// The pending slash record returned does not have initialized reporters. Those have -/// to be set at a higher level, if any. -pub(crate) fn compute_slash( - params: SlashParams, -) -> Option>> { - let mut reward_payout = Zero::zero(); - let mut val_slashed = Zero::zero(); - - // is the slash amount here a maximum for the era? - let own_slash = params.slash * params.exposure.own; - if params.slash * params.exposure.total == Zero::zero() { - // kick out the validator even if they won't be slashed, - // as long as the misbehavior is from their most recent slashing span. - kick_out_if_recent::(params); - return None; - } - - let prior_slash_p = - as Store>::ValidatorSlashInEra::get(¶ms.slash_era, params.stash) - .map_or(Zero::zero(), |(prior_slash_proportion, _)| { - prior_slash_proportion - }); - - // compare slash proportions rather than slash values to avoid issues due to rounding - // error. - if params.slash.deconstruct() > prior_slash_p.deconstruct() { - as Store>::ValidatorSlashInEra::insert( - ¶ms.slash_era, - params.stash, - &(params.slash, own_slash), - ); - } else { - // we slash based on the max in era - this new event is not the max, - // so neither the validator or any nominators will need an update. - // - // this does lead to a divergence of our system from the paper, which - // pays out some reward even if the latest report is not max-in-era. - // we opt to avoid the nominator lookups and edits and leave more rewards - // for more drastic misbehavior. - return None; - } - - // apply slash to validator. - { - let mut spans = fetch_spans::( - params.stash, - params.window_start, - &mut reward_payout, - &mut val_slashed, - params.reward_proportion, - ); - - let target_span = spans.compare_and_update_span_slash(params.slash_era, own_slash); - - if target_span == Some(spans.span_index()) { - // misbehavior occurred within the current slashing span - take appropriate - // actions. - - // chill the validator - it misbehaved in the current span and should - // not continue in the next election. also end the slashing span. - spans.end_span(params.now); - >::chill_stash(params.stash); - } - } - - let disable_when_slashed = params.disable_strategy != DisableStrategy::Never; - add_offending_validator::(params.stash, disable_when_slashed); - - // Polymesh change - // ----------------------------------------------------------------- - let mut nominators_slashed = Vec::new(); - if SlashingAllowedFor::::get() == SlashingSwitch::ValidatorAndNominator { - reward_payout += - slash_nominators::(params.clone(), prior_slash_p, &mut nominators_slashed); - } - // ----------------------------------------------------------------- - - Some(UnappliedSlash { - validator: params.stash.clone(), - own: val_slashed, - others: nominators_slashed, - reporters: Vec::new(), - payout: reward_payout, - }) -} - -// doesn't apply any slash, but kicks out the validator if the misbehavior is from -// the most recent slashing span. -fn kick_out_if_recent(params: SlashParams) { - // these are not updated by era-span or end-span. - let mut reward_payout = Zero::zero(); - let mut val_slashed = Zero::zero(); - let mut spans = fetch_spans::( - params.stash, - params.window_start, - &mut reward_payout, - &mut val_slashed, - params.reward_proportion, - ); - - if spans.era_span(params.slash_era).map(|s| s.index) == Some(spans.span_index()) { - spans.end_span(params.now); - >::chill_stash(params.stash); - } - - let disable_without_slash = params.disable_strategy == DisableStrategy::Always; - add_offending_validator::(params.stash, disable_without_slash); -} - -/// Add the given validator to the offenders list and optionally disable it. -/// If after adding the validator `OffendingValidatorsThreshold` is reached -/// a new era will be forced. -fn add_offending_validator(stash: &T::AccountId, disable: bool) { - as Store>::OffendingValidators::mutate(|offending| { - let validators = T::SessionInterface::validators(); - let validator_index = match validators.iter().position(|i| i == stash) { - Some(index) => index, - None => return, - }; - - let validator_index_u32 = validator_index as u32; - - match offending.binary_search_by_key(&validator_index_u32, |(index, _)| *index) { - // this is a new offending validator - Err(index) => { - offending.insert(index, (validator_index_u32, disable)); - - let offending_threshold = - T::OffendingValidatorsThreshold::get() * validators.len() as u32; - - if offending.len() >= offending_threshold as usize { - // force a new era, to select a new validator set - >::ensure_new_era() - } - - if disable { - T::SessionInterface::disable_validator(validator_index_u32); - } - } - Ok(index) => { - if disable && !offending[index].1 { - // the validator had previously offended without being disabled, - // let's make sure we disable it now - offending[index].1 = true; - T::SessionInterface::disable_validator(validator_index_u32); - } - } - } - }); -} - -/// Slash nominators. Accepts general parameters and the prior slash percentage of the validator. -/// -/// Returns the amount of reward to pay out. -fn slash_nominators( - params: SlashParams, - prior_slash_p: Perbill, - nominators_slashed: &mut Vec<(T::AccountId, BalanceOf)>, -) -> BalanceOf { - let mut reward_payout = Zero::zero(); - - nominators_slashed.reserve(params.exposure.others.len()); - for nominator in ¶ms.exposure.others { - let stash = &nominator.who; - let mut nom_slashed = Zero::zero(); - - // the era slash of a nominator always grows, if the validator - // had a new max slash for the era. - let era_slash = { - let own_slash_prior = prior_slash_p * nominator.value; - let own_slash_by_validator = params.slash * nominator.value; - let own_slash_difference = own_slash_by_validator.saturating_sub(own_slash_prior); - - let mut era_slash = - as Store>::NominatorSlashInEra::get(¶ms.slash_era, stash) - .unwrap_or_else(Zero::zero); - era_slash += own_slash_difference; - as Store>::NominatorSlashInEra::insert(¶ms.slash_era, stash, &era_slash); - - era_slash - }; - - // compare the era slash against other eras in the same span. - { - let mut spans = fetch_spans::( - stash, - params.window_start, - &mut reward_payout, - &mut nom_slashed, - params.reward_proportion, - ); - - let target_span = spans.compare_and_update_span_slash(params.slash_era, era_slash); - - if target_span == Some(spans.span_index()) { - // end the span, but don't chill the nominator. - spans.end_span(params.now); - } - } - nominators_slashed.push((stash.clone(), nom_slashed)); - } - - reward_payout -} - -// helper struct for managing a set of spans we are currently inspecting. -// writes alterations to disk on drop, but only if a slash has been carried out. -// -// NOTE: alterations to slashing metadata should not be done after this is dropped. -// dropping this struct applies any necessary slashes, which can lead to free balance -// being 0, and the account being garbage-collected -- a dead account should get no new -// metadata. -struct InspectingSpans<'a, T: Config + 'a> { - dirty: bool, - window_start: EraIndex, - stash: &'a T::AccountId, - spans: SlashingSpans, - paid_out: &'a mut BalanceOf, - slash_of: &'a mut BalanceOf, - reward_proportion: Perbill, - _marker: sp_std::marker::PhantomData, -} - -// fetches the slashing spans record for a stash account, initializing it if necessary. -fn fetch_spans<'a, T: Config + 'a>( - stash: &'a T::AccountId, - window_start: EraIndex, - paid_out: &'a mut BalanceOf, - slash_of: &'a mut BalanceOf, - reward_proportion: Perbill, -) -> InspectingSpans<'a, T> { - let spans = as Store>::SlashingSpans::get(stash).unwrap_or_else(|| { - let spans = SlashingSpans::new(window_start); - as Store>::SlashingSpans::insert(stash, &spans); - spans - }); - - InspectingSpans { - dirty: false, - window_start, - stash, - spans, - slash_of, - paid_out, - reward_proportion, - _marker: sp_std::marker::PhantomData, - } -} - -impl<'a, T: 'a + Config> InspectingSpans<'a, T> { - fn span_index(&self) -> SpanIndex { - self.spans.span_index - } - - fn end_span(&mut self, now: EraIndex) { - self.dirty = self.spans.end_span(now) || self.dirty; - } - - // add some value to the slash of the staker. - // invariant: the staker is being slashed for non-zero value here - // although `amount` may be zero, as it is only a difference. - fn add_slash(&mut self, amount: BalanceOf, slash_era: EraIndex) { - *self.slash_of += amount; - self.spans.last_nonzero_slash = sp_std::cmp::max(self.spans.last_nonzero_slash, slash_era); - } - - // find the span index of the given era, if covered. - fn era_span(&self, era: EraIndex) -> Option { - self.spans.iter().find(|span| span.contains_era(era)) - } - - // compares the slash in an era to the overall current span slash. - // if it's higher, applies the difference of the slashes and then updates the span on disk. - // - // returns the span index of the era where the slash occurred, if any. - fn compare_and_update_span_slash( - &mut self, - slash_era: EraIndex, - slash: BalanceOf, - ) -> Option { - let target_span = self.era_span(slash_era)?; - let span_slash_key = (self.stash.clone(), target_span.index); - let mut span_record = as Store>::SpanSlash::get(&span_slash_key); - let mut changed = false; - - let reward = if span_record.slashed < slash { - // new maximum span slash. apply the difference. - let difference = slash - span_record.slashed; - span_record.slashed = slash; - - // compute reward. - let reward = - REWARD_F1 * (self.reward_proportion * slash).saturating_sub(span_record.paid_out); - - self.add_slash(difference, slash_era); - changed = true; - - reward - } else if span_record.slashed == slash { - // compute reward. no slash difference to apply. - REWARD_F1 * (self.reward_proportion * slash).saturating_sub(span_record.paid_out) - } else { - Zero::zero() - }; - - if !reward.is_zero() { - changed = true; - span_record.paid_out += reward; - *self.paid_out += reward; - } - - if changed { - self.dirty = true; - as Store>::SpanSlash::insert(&span_slash_key, &span_record); - } - - Some(target_span.index) - } -} - -impl<'a, T: 'a + Config> Drop for InspectingSpans<'a, T> { - fn drop(&mut self) { - // only update on disk if we slashed this account. - if !self.dirty { - return; - } - - if let Some((start, end)) = self.spans.prune(self.window_start) { - for span_index in start..end { - as Store>::SpanSlash::remove(&(self.stash.clone(), span_index)); - } - } - - as Store>::SlashingSpans::insert(self.stash, &self.spans); - } -} - -/// Clear slashing metadata for an obsolete era. -pub(crate) fn clear_era_metadata(obsolete_era: EraIndex) { - #[allow(deprecated)] - as Store>::ValidatorSlashInEra::remove_prefix(&obsolete_era, None); - #[allow(deprecated)] - as Store>::NominatorSlashInEra::remove_prefix(&obsolete_era, None); -} - -/// Clear slashing metadata for a dead account. -pub(crate) fn clear_stash_metadata( - stash: &T::AccountId, - num_slashing_spans: u32, -) -> DispatchResult { - let spans = match as Store>::SlashingSpans::get(stash) { - None => return Ok(()), - Some(s) => s, - }; - - ensure!( - num_slashing_spans as usize >= spans.iter().count(), - Error::::IncorrectSlashingSpans - ); - - as Store>::SlashingSpans::remove(stash); - - // kill slashing-span metadata for account. - // - // this can only happen while the account is staked _if_ they are completely slashed. - // in that case, they may re-bond, but it would count again as span 0. Further ancient - // slashes would slash into this new bond, since metadata has now been cleared. - for span in spans.iter() { - as Store>::SpanSlash::remove(&(stash.clone(), span.index)); - } - - Ok(()) -} - -// apply the slash to a stash account, deducting any missing funds from the reward -// payout, saturating at 0. this is mildly unfair but also an edge-case that -// can only occur when overlapping locked funds have been slashed. -pub fn do_slash( - stash: &T::AccountId, - value: BalanceOf, - reward_payout: &mut BalanceOf, - slashed_imbalance: &mut NegativeImbalanceOf, - slash_era: EraIndex, -) { - let controller = match >::bonded(stash).defensive() { - None => return, - Some(c) => c, - }; - - let mut ledger = match >::ledger(&controller) { - Some(ledger) => ledger, - None => return, // nothing to do. - }; - - let value = ledger.slash(value, T::Currency::minimum_balance(), slash_era); - - if !value.is_zero() { - let (imbalance, missing) = T::Currency::slash(stash, value); - slashed_imbalance.subsume(imbalance); - - if !missing.is_zero() { - // deduct overslash from the reward payout - *reward_payout = reward_payout.saturating_sub(missing); - } - - >::update_ledger(&controller, &ledger); - - // trigger the event - >::deposit_event(super::Event::::Slashed { - staker: stash.clone(), - amount: value, - }); - } -} - -/// Apply a previously-unapplied slash. -pub(crate) fn apply_slash( - unapplied_slash: UnappliedSlash>, - slash_era: EraIndex, -) { - let mut slashed_imbalance = NegativeImbalanceOf::::zero(); - let mut reward_payout = unapplied_slash.payout; - - do_slash::( - &unapplied_slash.validator, - unapplied_slash.own, - &mut reward_payout, - &mut slashed_imbalance, - slash_era, - ); - - // Polymesh change - // ----------------------------------------------------------------- - if SlashingAllowedFor::::get() == SlashingSwitch::ValidatorAndNominator { - for &(ref nominator, nominator_slash) in &unapplied_slash.others { - do_slash::( - nominator, - nominator_slash, - &mut reward_payout, - &mut slashed_imbalance, - slash_era, - ); - } - } - // ----------------------------------------------------------------- - - pay_reporters::(reward_payout, slashed_imbalance, &unapplied_slash.reporters); -} - -/// Apply a reward payout to some reporters, paying the rewards out of the slashed imbalance. -fn pay_reporters( - reward_payout: BalanceOf, - slashed_imbalance: NegativeImbalanceOf, - reporters: &[T::AccountId], -) { - if reward_payout.is_zero() || reporters.is_empty() { - // nobody to pay out to or nothing to pay; - // just treat the whole value as slashed. - T::Slash::on_unbalanced(slashed_imbalance); - return; - } - - // take rewards out of the slashed imbalance. - let reward_payout = reward_payout.min(slashed_imbalance.peek()); - let (mut reward_payout, mut value_slashed) = slashed_imbalance.split(reward_payout); - - let per_reporter = reward_payout.peek() / (reporters.len() as u32).into(); - for reporter in reporters { - let (reporter_reward, rest) = reward_payout.split(per_reporter); - reward_payout = rest; - - // this cancels out the reporter reward imbalance internally, leading - // to no change in total issuance. - T::Currency::resolve_creating(reporter, reporter_reward); - } - - // the rest goes to the on-slash imbalance handler (e.g. treasury) - value_slashed.subsume(reward_payout); // remainder of reward division remains. - T::Slash::on_unbalanced(value_slashed); -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn span_contains_era() { - // unbounded end - let span = SlashingSpan { - index: 0, - start: 1000, - length: None, - }; - assert!(!span.contains_era(0)); - assert!(!span.contains_era(999)); - - assert!(span.contains_era(1000)); - assert!(span.contains_era(1001)); - assert!(span.contains_era(10000)); - - // bounded end - non-inclusive range. - let span = SlashingSpan { - index: 0, - start: 1000, - length: Some(10), - }; - assert!(!span.contains_era(0)); - assert!(!span.contains_era(999)); - - assert!(span.contains_era(1000)); - assert!(span.contains_era(1001)); - assert!(span.contains_era(1009)); - assert!(!span.contains_era(1010)); - assert!(!span.contains_era(1011)); - } - - #[test] - fn single_slashing_span() { - let spans = SlashingSpans { - span_index: 0, - last_start: 1000, - last_nonzero_slash: 0, - prior: Vec::new(), - }; - - assert_eq!( - spans.iter().collect::>(), - vec![SlashingSpan { - index: 0, - start: 1000, - length: None - }], - ); - } - - #[test] - fn many_prior_spans() { - let spans = SlashingSpans { - span_index: 10, - last_start: 1000, - last_nonzero_slash: 0, - prior: vec![10, 9, 8, 10], - }; - - assert_eq!( - spans.iter().collect::>(), - vec![ - SlashingSpan { - index: 10, - start: 1000, - length: None - }, - SlashingSpan { - index: 9, - start: 990, - length: Some(10) - }, - SlashingSpan { - index: 8, - start: 981, - length: Some(9) - }, - SlashingSpan { - index: 7, - start: 973, - length: Some(8) - }, - SlashingSpan { - index: 6, - start: 963, - length: Some(10) - }, - ], - ) - } - - #[test] - fn pruning_spans() { - let mut spans = SlashingSpans { - span_index: 10, - last_start: 1000, - last_nonzero_slash: 0, - prior: vec![10, 9, 8, 10], - }; - - assert_eq!(spans.prune(981), Some((6, 8))); - assert_eq!( - spans.iter().collect::>(), - vec![ - SlashingSpan { - index: 10, - start: 1000, - length: None - }, - SlashingSpan { - index: 9, - start: 990, - length: Some(10) - }, - SlashingSpan { - index: 8, - start: 981, - length: Some(9) - }, - ], - ); - - assert_eq!(spans.prune(982), None); - assert_eq!( - spans.iter().collect::>(), - vec![ - SlashingSpan { - index: 10, - start: 1000, - length: None - }, - SlashingSpan { - index: 9, - start: 990, - length: Some(10) - }, - SlashingSpan { - index: 8, - start: 981, - length: Some(9) - }, - ], - ); - - assert_eq!(spans.prune(989), None); - assert_eq!( - spans.iter().collect::>(), - vec![ - SlashingSpan { - index: 10, - start: 1000, - length: None - }, - SlashingSpan { - index: 9, - start: 990, - length: Some(10) - }, - SlashingSpan { - index: 8, - start: 981, - length: Some(9) - }, - ], - ); - - assert_eq!(spans.prune(1000), Some((8, 10))); - assert_eq!( - spans.iter().collect::>(), - vec![SlashingSpan { - index: 10, - start: 1000, - length: None - },], - ); - - assert_eq!(spans.prune(2000), None); - assert_eq!( - spans.iter().collect::>(), - vec![SlashingSpan { - index: 10, - start: 2000, - length: None - },], - ); - - // now all in one shot. - let mut spans = SlashingSpans { - span_index: 10, - last_start: 1000, - last_nonzero_slash: 0, - prior: vec![10, 9, 8, 10], - }; - assert_eq!(spans.prune(2000), Some((6, 10))); - assert_eq!( - spans.iter().collect::>(), - vec![SlashingSpan { - index: 10, - start: 2000, - length: None - },], - ); - } - - #[test] - fn ending_span() { - let mut spans = SlashingSpans { - span_index: 1, - last_start: 10, - last_nonzero_slash: 0, - prior: Vec::new(), - }; - - assert!(spans.end_span(10)); - - assert_eq!( - spans.iter().collect::>(), - vec![ - SlashingSpan { - index: 2, - start: 11, - length: None - }, - SlashingSpan { - index: 1, - start: 10, - length: Some(1) - }, - ], - ); - - assert!(spans.end_span(15)); - assert_eq!( - spans.iter().collect::>(), - vec![ - SlashingSpan { - index: 3, - start: 16, - length: None - }, - SlashingSpan { - index: 2, - start: 11, - length: Some(5) - }, - SlashingSpan { - index: 1, - start: 10, - length: Some(1) - }, - ], - ); - - // does nothing if not a valid end. - assert!(!spans.end_span(15)); - assert_eq!( - spans.iter().collect::>(), - vec![ - SlashingSpan { - index: 3, - start: 16, - length: None - }, - SlashingSpan { - index: 2, - start: 11, - length: Some(5) - }, - SlashingSpan { - index: 1, - start: 10, - length: Some(1) - }, - ], - ); - } -} diff --git a/pallets/staking/src/testing_utils.rs b/pallets/staking/src/testing_utils.rs deleted file mode 100644 index 089673a73b..0000000000 --- a/pallets/staking/src/testing_utils.rs +++ /dev/null @@ -1,273 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Testing utils for staking. Provides some common functions to setup staking state, such as -//! bonding validators, nominators, and generating different types of solutions. - -use crate::{Pallet as Staking, *}; -use frame_benchmarking::account; -use frame_system::RawOrigin; -use rand_chacha::{ - rand_core::{RngCore, SeedableRng}, - ChaChaRng, -}; -use sp_io::hashing::blake2_256; - -use frame_election_provider_support::SortedListProvider; -use frame_support::{pallet_prelude::*, traits::Currency}; -use sp_runtime::Perbill; -use sp_std::prelude::*; - -const SEED: u32 = 0; - -// Polymesh change -// ----------------------------------------------------------------- -use pallet_identity::benchmarking::{User, UserBuilder}; -use polymesh_primitives::{AuthorizationData, Permissions, Signatory}; -// ----------------------------------------------------------------- - -/// This function removes all validators and nominators from storage. -pub fn clear_validators_and_nominators() { - #[allow(deprecated)] - Validators::::remove_all(); - - // whenever we touch nominators counter we should update `T::VoterList` as well. - #[allow(deprecated)] - Nominators::::remove_all(); - - // NOTE: safe to call outside block production - T::VoterList::unsafe_clear(); -} - -/// Grab a funded user. -pub fn create_funded_user(string: &'static str, n: u32, balance: u32) -> User -where - T: Config, -{ - // Polymesh change - // ----------------------------------------------------------------- - let _ = T::Currency::issue(balance.into()); - UserBuilder::::default() - .balance(balance) - .seed(n) - .generate_did() - .build(string) - // ----------------------------------------------------------------- -} - -/// Create a stash and controller pair. -pub fn create_stash_controller( - n: u32, - balance: u32, - destination: RewardDestination, -) -> Result<(User, User), &'static str> -where - T: Config, -{ - let stash = create_funded_user::("stash", n, balance); - let controller = UserBuilder::::default() - .balance(balance) - .seed(n) - .build("controller"); - - // Polymesh change - // ----------------------------------------------------------------- - // Attach the controller key as secondary key of the stash - let auth_id = pallet_identity::Pallet::::add_auth( - stash.did(), - Signatory::Account(controller.account()), - AuthorizationData::JoinIdentity(Permissions::default()), - None, - )?; - pallet_identity::Pallet::::join_identity_as_key(controller.origin().into(), auth_id)?; - // ----------------------------------------------------------------- - - let controller_lookup = controller.lookup(); - Staking::::bond( - stash.origin().into(), - controller_lookup, - (balance / 10).into(), - destination, - )?; - Ok((stash, controller)) -} - -/// Create a stash and controller pair, where the controller is dead, and payouts go to controller. -/// This is used to test worst case payout scenarios. -pub fn create_stash_and_dead_controller( - n: u32, - balance: u32, - destination: RewardDestination, -) -> Result<(User, User), &'static str> -where - T: Config, -{ - let stash = create_funded_user::("stash", n, balance); - let controller_account: T::AccountId = account("controller", n, 100); - let controller = User { - account: controller_account.clone(), - origin: RawOrigin::Signed(controller_account), - did: None, - secret: None, - }; - - // Polymesh change - // ----------------------------------------------------------------- - // Attach the controller key as secondary key of the stash - let auth_id = pallet_identity::Pallet::::add_auth( - stash.did(), - Signatory::Account(controller.account()), - AuthorizationData::JoinIdentity(Permissions::default()), - None, - )?; - pallet_identity::Pallet::::join_identity_as_key(controller.origin().into(), auth_id)?; - // ----------------------------------------------------------------- - - let controller_lookup = controller.lookup(); - Staking::::bond( - stash.origin().into(), - controller_lookup, - (balance / 10).into(), - destination, - )?; - Ok((stash, controller)) -} - -/// create `max` validators. -pub fn create_validators( - max: u32, - balance: u32, -) -> Result>, &'static str> -where - T: Config, -{ - create_validators_with_seed::(max, balance, 0) -} - -/// create `max` validators, with a seed to help unintentional prevent account collisions. -pub fn create_validators_with_seed( - max: u32, - balance: u32, - seed: u32, -) -> Result>, &'static str> -where - T: Config, -{ - Staking::::set_commission_cap(RawOrigin::Root.into(), Perbill::from_percent(50)).unwrap(); - let mut validators: Vec> = Vec::with_capacity(max as usize); - for i in 0..max { - let (stash, controller) = - create_stash_controller::(i + seed, balance, RewardDestination::Staked)?; - let validator_prefs = ValidatorPrefs { - commission: Perbill::from_percent(50), - ..Default::default() - }; - // Polymesh change - // ----------------------------------------------------------------- - Staking::::add_permissioned_validator(RawOrigin::Root.into(), stash.did(), Some(2))?; - // ----------------------------------------------------------------- - Staking::::validate(controller.origin().into(), validator_prefs)?; - validators.push(stash.lookup()); - } - - Ok(validators) -} - -/// This function generates validators and nominators who are randomly nominating -/// `edge_per_nominator` random validators (until `to_nominate` if provided). -/// -/// NOTE: This function will remove any existing validators or nominators to ensure -/// we are working with a clean state. -/// -/// Parameters: -/// - `validators`: number of bonded validators -/// - `nominators`: number of bonded nominators. -/// - `edge_per_nominator`: number of edge (vote) per nominator. -/// - `randomize_stake`: whether to randomize the stakes. -/// - `to_nominate`: if `Some(n)`, only the first `n` bonded validator are voted upon. Else, all of -/// them are considered and `edge_per_nominator` random validators are voted for. -/// -/// Return the validators chosen to be nominated. -pub fn create_validators_with_nominators_for_era( - validators: u32, - nominators: u32, - edge_per_nominator: usize, - randomize_stake: bool, - to_nominate: Option, -) -> Result>, &'static str> -where - T: Config, -{ - clear_validators_and_nominators::(); - - Staking::::set_commission_cap(RawOrigin::Root.into(), Perbill::from_percent(50)).unwrap(); - let mut validators_stash: Vec> = Vec::with_capacity(validators as usize); - let mut rng = ChaChaRng::from_seed(SEED.using_encoded(blake2_256)); - - // Create validators - for i in 0..validators { - let balance_factor = if randomize_stake { - rng.next_u32() % 255 + 10 - } else { - 100u32 - }; - let (v_stash, v_controller) = - create_stash_controller::(i, balance_factor, RewardDestination::Staked)?; - Staking::::add_permissioned_validator(RawOrigin::Root.into(), v_stash.did(), Some(2))?; - let validator_prefs = ValidatorPrefs { - commission: Perbill::from_percent(50), - ..Default::default() - }; - Staking::::validate(v_controller.origin().into(), validator_prefs)?; - let stash_lookup = v_stash.lookup(); - validators_stash.push(stash_lookup.clone()); - } - - let to_nominate = to_nominate.unwrap_or(validators_stash.len() as u32) as usize; - let validator_chosen = validators_stash[0..to_nominate].to_vec(); - - // Create nominators - for j in 0..nominators { - let balance_factor = if randomize_stake { - rng.next_u32() % 100_000_000u32 + 10_000_000u32 - } else { - 10_000_000u32 - }; - let (_n_stash, n_controller) = - create_stash_controller::(u32::MAX - j, balance_factor, RewardDestination::Staked)?; - - // Have them randomly validate - let mut available_validators = validator_chosen.clone(); - let mut selected_validators: Vec> = - Vec::with_capacity(edge_per_nominator); - - for _ in 0..validators.min(edge_per_nominator as u32) { - let selected = rng.next_u32() as usize % available_validators.len(); - let validator = available_validators.remove(selected); - selected_validators.push(validator); - } - Staking::::nominate(n_controller.origin().into(), selected_validators)?; - } - - ValidatorCount::::put(validators); - - Ok(validator_chosen) -} -/// get the current era. -pub fn current_era() -> EraIndex { - >::current_era().unwrap_or(0) -} diff --git a/pallets/staking/src/weights.rs b/pallets/staking/src/weights.rs deleted file mode 100644 index b6df69cbc4..0000000000 --- a/pallets/staking/src/weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; -use sp_std::marker::PhantomData; - -/// Weight functions needed for pallet_staking. -pub trait WeightInfo { - fn bond() -> Weight; - fn bond_extra() -> Weight; - fn unbond() -> Weight; - fn withdraw_unbonded_update(s: u32, ) -> Weight; - fn withdraw_unbonded_kill(s: u32, ) -> Weight; - fn validate() -> Weight; - fn kick(k: u32, ) -> Weight; - fn nominate(n: u32, ) -> Weight; - fn chill() -> Weight; - fn set_payee() -> Weight; - fn set_controller() -> Weight; - fn set_validator_count() -> Weight; - fn force_no_eras() -> Weight; - fn force_new_era() -> Weight; - fn force_new_era_always() -> Weight; - fn set_invulnerables(v: u32, ) -> Weight; - fn force_unstake(s: u32, ) -> Weight; - fn cancel_deferred_slash(s: u32, ) -> Weight; - fn payout_stakers_dead_controller(n: u32, ) -> Weight; - fn payout_stakers_alive_staked(n: u32, ) -> Weight; - fn rebond(l: u32, ) -> Weight; - fn reap_stash(s: u32, ) -> Weight; - fn new_era(v: u32, n: u32, ) -> Weight; - fn get_npos_voters(v: u32, n: u32, ) -> Weight; - fn get_npos_targets(v: u32, ) -> Weight; - fn set_staking_configs_all_set() -> Weight; - fn set_staking_configs_all_remove() -> Weight; - fn chill_other() -> Weight; - fn force_apply_min_commission() -> Weight; - fn set_min_commission() -> Weight; - fn add_permissioned_validator() -> Weight; - fn remove_permissioned_validator() -> Weight; - fn change_slashing_allowed_for() -> Weight; - fn update_permissioned_validator_intended_count() -> Weight; - fn chill_from_governance(n: u32) -> Weight; - fn set_commission_cap(n: u32) -> Weight; -} diff --git a/pallets/statistics/Cargo.toml b/pallets/statistics/Cargo.toml index e740db9215..eb13b0da1c 100644 --- a/pallets/statistics/Cargo.toml +++ b/pallets/statistics/Cargo.toml @@ -16,20 +16,20 @@ serde_derive = { version = "1.0.112", optional = true, default-features = false} # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-arithmetic = { version = "6.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } +sp-core = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } +sp-arithmetic = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } +pallet-timestamp = { workspace = true, default-features = false } # Only in Benchmarks -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [dev-dependencies] lazy_static = "1.4.0" @@ -58,8 +58,10 @@ std = [ "pallet-external-agents/std", ] runtime-benchmarks = [ - "frame-benchmarking", - "pallet-identity/runtime-benchmarks", + "frame-benchmarking", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", "pallet-external-agents/runtime-benchmarks", + "pallet-identity/runtime-benchmarks" ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/statistics/src/lib.rs b/pallets/statistics/src/lib.rs index 30f8169d33..98738e48d6 100644 --- a/pallets/statistics/src/lib.rs +++ b/pallets/statistics/src/lib.rs @@ -52,8 +52,6 @@ pub mod pallet { pub trait Config: frame_system::Config + pallet_identity::Config + EAConfig + AssetFnConfig { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; /// Maximum stats that can be enabled for an Asset. #[pallet::constant] type MaxStatsPerAsset: Get; @@ -185,11 +183,14 @@ pub mod pallet { pub(super) type StorageVersion = StorageValue<_, Version, ValueQuery>; #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig; + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { StorageVersion::::put(Version::new(3)); } diff --git a/pallets/sto/Cargo.toml b/pallets/sto/Cargo.toml index 86c59dd273..4ceb9627b5 100644 --- a/pallets/sto/Cargo.toml +++ b/pallets/sto/Cargo.toml @@ -22,20 +22,20 @@ serde_derive = { version = "1.0.104", optional = true, default-features = false log = "0.4.8" codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } +pallet-timestamp = { workspace = true, default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } # Only in STD -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [features] equalize = [] @@ -64,6 +64,13 @@ std = [ "pallet-timestamp/std" ] runtime-benchmarks = [ - "frame-benchmarking" + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-asset/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-settlement/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", + "sp-runtime/runtime-benchmarks" ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/sto/src/benchmarking.rs b/pallets/sto/src/benchmarking.rs index c41a8df22b..50805c8e91 100644 --- a/pallets/sto/src/benchmarking.rs +++ b/pallets/sto/src/benchmarking.rs @@ -1,5 +1,5 @@ use frame_benchmarking::benchmarks; -use frame_support::dispatch::DispatchError; +use frame_support::pallet_prelude::DispatchError; use scale_info::prelude::format; use sp_runtime::MultiSignature; diff --git a/pallets/sto/src/lib.rs b/pallets/sto/src/lib.rs index eee783ab7a..b698106296 100644 --- a/pallets/sto/src/lib.rs +++ b/pallets/sto/src/lib.rs @@ -54,12 +54,11 @@ #[cfg(feature = "runtime-benchmarks")] pub mod benchmarking; -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use frame_support::dispatch::DispatchResult; use frame_support::ensure; use frame_support::weights::Weight; use frame_system::pallet_prelude::OriginFor; -use polymesh_primitives::crypto::verify_signature; use scale_info::TypeInfo; use sp_runtime::DispatchError; use sp_std::collections::btree_set::BTreeSet; @@ -69,6 +68,7 @@ use pallet_base::try_next_post; use pallet_identity::PermissionedCallOriginData; use pallet_settlement::VenueInfo; use polymesh_primitives::asset::AssetId; +use polymesh_primitives::crypto::verify_signature; use polymesh_primitives::settlement::{Leg, SettlementType, VenueId, VenueType}; use polymesh_primitives::sto::{FundraiserId, FundraiserReceipt, FundraiserReceiptDetails}; use polymesh_primitives::traits::PortfolioSubTrait; @@ -88,8 +88,8 @@ type Settlement = pallet_settlement::Pallet; type Timestamp = pallet_timestamp::Pallet; /// Status of a Fundraiser. -#[derive(Encode, Decode, Default, TypeInfo)] -#[derive(Clone, Debug, Eq, MaxEncodedLen, PartialEq, PartialOrd, Ord)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo)] +#[derive(Clone, Debug, Default, Eq, MaxEncodedLen, PartialEq, PartialOrd, Ord)] pub enum FundraiserStatus { /// Fundraiser is open for investments if start_time <= current_time < end_time. Live, @@ -103,7 +103,7 @@ pub enum FundraiserStatus { } /// Funding method. On-chain asset or off-chain receipt. -#[derive(Encode, Decode, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo)] #[derive(Clone, PartialEq, Eq, PartialOrd, Ord)] #[cfg_attr(feature = "std", derive(Debug))] pub enum FundingMethod { @@ -120,9 +120,8 @@ impl FundingMethod { } /// Which funding asset was used to invest in the fundraiser. -#[derive(Encode, Decode, TypeInfo)] -#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo)] +#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)] pub enum FundingAsset { /// On-chain asset. OnChain(AssetId), @@ -131,9 +130,8 @@ pub enum FundingAsset { } /// Details about the Fundraiser. -#[derive(Encode, Decode, TypeInfo)] -#[derive(Default, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo)] +#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord)] pub struct Fundraiser { /// The permissioned agent that created the `Fundraiser`. pub creator: IdentityId, @@ -168,8 +166,8 @@ impl Fundraiser { } /// Single tier of a tiered pricing model. -#[derive(Encode, Decode, TypeInfo)] -#[derive(Default, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo)] +#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord)] pub struct PriceTier { /// Total amount available. pub total: Balance, @@ -179,9 +177,8 @@ pub struct PriceTier { /// Single price tier of a `Fundraiser`. /// Similar to a `PriceTier` but with an extra field `remaining` for tracking the amount available for purchase in a tier. -#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] -#[derive(Default, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, MaxEncodedLen)] +#[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord)] pub struct FundraiserTier { /// Total amount available. pub total: Balance, @@ -202,7 +199,7 @@ impl Into for PriceTier { } /// Wrapper type for Fundraiser name. -#[derive(Encode, Decode, TypeInfo, VecU8StrongTyped)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, VecU8StrongTyped)] #[derive(Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord)] pub struct FundraiserName(Vec); @@ -242,7 +239,6 @@ pub mod pallet { + pallet_portfolio::Config + pallet_base::Config { - type RuntimeEvent: From> + IsType<::RuntimeEvent>; type WeightInfo: WeightInfo; } @@ -435,11 +431,14 @@ pub mod pallet { pub(super) type StorageVersion = StorageValue<_, Version, ValueQuery>; #[pallet::genesis_config] - #[derive(Default)] - pub struct GenesisConfig; + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { StorageVersion::::put(Version::new(1)); } diff --git a/pallets/sudo/Cargo.toml b/pallets/sudo/Cargo.toml deleted file mode 100644 index e7193007f3..0000000000 --- a/pallets/sudo/Cargo.toml +++ /dev/null @@ -1,40 +0,0 @@ -[package] -name = "pallet-sudo" -version = "2.0.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "Apache-2.0" -homepage = "https://substrate.dev" -repository = "https://github.com/PolymeshAssociation/substrate/" -description = "FRAME pallet for sudo" -readme = "README.md" - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { workspace = true, default-features = false, features = [ - "derive", -] } -frame-support = { workspace = true, default-features = false } -frame-system = { workspace = true, default-features = false } -sp-io = { workspace = true, default-features = false } -sp-runtime = { workspace = true, default-features = false } -sp-std = { workspace = true, default-features = false } - -[dev-dependencies] -sp-core = { workspace = true, default-features = false } - -[features] -default = ["std"] -std = [ - "codec/std", - "frame-support/std", - "frame-system/std", - "scale-info/std", - "sp-io/std", - "sp-runtime/std", - "sp-std/std", -] -try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/sudo/README.md b/pallets/sudo/README.md deleted file mode 100644 index 886dc59817..0000000000 --- a/pallets/sudo/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# Sudo Module - -- [`Config`](https://docs.rs/pallet-sudo/latest/pallet_sudo/pallet/trait.Config.html) -- [`Call`](https://docs.rs/pallet-sudo/latest/pallet_sudo/pallet/enum.Call.html) - -## Overview - -The Sudo module allows for a single account (called the "sudo key") -to execute dispatchable functions that require a `Root` call -or designate a new account to replace them as the sudo key. -Only one account can be the sudo key at a time. - -## Interface - -### Dispatchable Functions - -Only the sudo key can call the dispatchable functions from the Sudo module. - -* `sudo` - Make a `Root` call to a dispatchable function. -* `set_key` - Assign a new account to be the sudo key. - -## Usage - -### Executing Privileged Functions - -The Sudo module itself is not intended to be used within other modules. -Instead, you can build "privileged functions" (i.e. functions that require `Root` origin) in other modules. -You can execute these privileged functions by calling `sudo` with the sudo key account. -Privileged functions cannot be directly executed via an extrinsic. - -Learn more about privileged functions and `Root` origin in the [`Origin`] type documentation. - -### Simple Code Snippet - -This is an example of a module that exposes a privileged function: - -```rust -#[frame_support::pallet] -pub mod pallet { - use super::*; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::pallet] - pub struct Pallet(_); - - #[pallet::config] - pub trait Config: frame_system::Config {} - - #[pallet::call] - impl Pallet { - #[pallet::weight(0)] - pub fn privileged_function(origin: OriginFor) -> DispatchResult { - ensure_root(origin)?; - - // do something... - - Ok(()) - } - } -} -``` - -## Genesis Config - -The Sudo module depends on the [`GenesisConfig`](https://docs.rs/pallet-sudo/latest/pallet_sudo/struct.GenesisConfig.html). -You need to set an initial superuser account as the sudo `key`. - -## Related Modules - -* [Democracy](https://docs.rs/pallet-democracy/latest/pallet_democracy/) - -[`Call`]: ./enum.Call.html -[`Config`]: ./trait.Config.html -[`Origin`]: https://docs.substrate.io/main-docs/build/origins/ - -License: Apache-2.0 diff --git a/pallets/sudo/src/extension.rs b/pallets/sudo/src/extension.rs deleted file mode 100644 index 6eccb0146c..0000000000 --- a/pallets/sudo/src/extension.rs +++ /dev/null @@ -1,108 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use codec::{Decode, Encode}; -use frame_support::{dispatch::DispatchInfo, ensure}; -use scale_info::TypeInfo; -use sp_runtime::{ - traits::{DispatchInfoOf, Dispatchable, SignedExtension}, - transaction_validity::{ - InvalidTransaction, TransactionPriority, TransactionValidity, TransactionValidityError, - UnknownTransaction, ValidTransaction, - }, -}; -use sp_std::{fmt, marker::PhantomData}; - -use crate::{Config, Key}; - -/// Ensure that signed transactions are only valid if they are signed by sudo account. -/// -/// In the initial phase of a chain without any tokens you can not prevent accounts from sending -/// transactions. -/// These transactions would enter the transaction pool as the succeed the validation, but would -/// fail on applying them as they are not allowed/disabled/whatever. This would be some huge dos -/// vector to any kind of chain. This extension solves the dos vector by preventing any kind of -/// transaction entering the pool as long as it is not signed by the sudo account. -#[derive(Clone, Eq, PartialEq, Encode, Decode, TypeInfo)] -#[scale_info(skip_type_params(T))] -pub struct CheckOnlySudoAccount(PhantomData); - -impl Default for CheckOnlySudoAccount { - fn default() -> Self { - Self(Default::default()) - } -} - -impl fmt::Debug for CheckOnlySudoAccount { - #[cfg(feature = "std")] - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "CheckOnlySudoAccount") - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result { - Ok(()) - } -} - -impl CheckOnlySudoAccount { - /// Creates new `SignedExtension` to check sudo key. - pub fn new() -> Self { - Self::default() - } -} - -impl SignedExtension for CheckOnlySudoAccount -where - ::RuntimeCall: Dispatchable, -{ - const IDENTIFIER: &'static str = "CheckOnlySudoAccount"; - type AccountId = T::AccountId; - type Call = ::RuntimeCall; - type AdditionalSigned = (); - type Pre = (); - - fn additional_signed(&self) -> Result { - Ok(()) - } - - fn validate( - &self, - who: &Self::AccountId, - _call: &Self::Call, - info: &DispatchInfoOf, - _len: usize, - ) -> TransactionValidity { - let sudo_key: T::AccountId = Key::::get().ok_or(UnknownTransaction::CannotLookup)?; - ensure!(*who == sudo_key, InvalidTransaction::BadSigner); - - Ok(ValidTransaction { - priority: info.weight.ref_time() as TransactionPriority, - ..Default::default() - }) - } - - fn pre_dispatch( - self, - who: &Self::AccountId, - call: &Self::Call, - info: &DispatchInfoOf, - len: usize, - ) -> Result { - self.validate(who, call, info, len).map(|_| ()) - } -} diff --git a/pallets/sudo/src/lib.rs b/pallets/sudo/src/lib.rs deleted file mode 100644 index 40952d5ff6..0000000000 --- a/pallets/sudo/src/lib.rs +++ /dev/null @@ -1,315 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! # Sudo Pallet -//! -//! - [`Config`] -//! - [`Call`] -//! -//! ## Overview -//! -//! The Sudo pallet allows for a single account (called the "sudo key") -//! to execute dispatchable functions that require a `Root` call -//! or designate a new account to replace them as the sudo key. -//! Only one account can be the sudo key at a time. -//! -//! ## Interface -//! -//! ### Dispatchable Functions -//! -//! Only the sudo key can call the dispatchable functions from the Sudo pallet. -//! -//! * `sudo` - Make a `Root` call to a dispatchable function. -//! * `set_key` - Assign a new account to be the sudo key. -//! -//! ## Usage -//! -//! ### Executing Privileged Functions -//! -//! The Sudo pallet itself is not intended to be used within other pallets. -//! Instead, you can build "privileged functions" (i.e. functions that require `Root` origin) in -//! other pallets. You can execute these privileged functions by calling `sudo` with the sudo key -//! account. Privileged functions cannot be directly executed via an extrinsic. -//! -//! Learn more about privileged functions and `Root` origin in the [`Origin`] type documentation. -//! -//! ### Simple Code Snippet -//! -//! This is an example of a pallet that exposes a privileged function: -//! -//! ``` -//! #[frame_support::pallet] -//! pub mod pallet { -//! use super::*; -//! use frame_support::pallet_prelude::*; -//! use frame_system::pallet_prelude::*; -//! -//! #[pallet::pallet] -//! pub struct Pallet(PhantomData); -//! -//! #[pallet::config] -//! pub trait Config: frame_system::Config {} -//! -//! #[pallet::call] -//! impl Pallet { -//! #[pallet::weight(0)] -//! pub fn privileged_function(origin: OriginFor) -> DispatchResult { -//! ensure_root(origin)?; -//! -//! // do something... -//! -//! Ok(()) -//! } -//! } -//! } -//! # fn main() {} -//! ``` -//! -//! ### Signed Extension -//! -//! The Sudo pallet defines the following extension: -//! -//! - [`CheckOnlySudoAccount`]: Ensures that the signed transactions are only valid if they are -//! signed by sudo account. -//! -//! ## Genesis Config -//! -//! The Sudo pallet depends on the [`GenesisConfig`]. -//! You need to set an initial superuser account as the sudo `key`. -//! -//! ## Related Pallets -//! -//! * [Democracy](../pallet_democracy/index.html) -//! -//! [`Origin`]: https://docs.substrate.io/main-docs/build/origins/ - -#![cfg_attr(not(feature = "std"), no_std)] - -use sp_runtime::{traits::StaticLookup, DispatchResult}; -use sp_std::prelude::*; - -use frame_support::{ - dispatch::{DispatchErrorWithPostInfo, DispatchResultWithPostInfo, GetDispatchInfo}, - traits::UnfilteredDispatchable, -}; - -mod extension; -#[cfg(test)] -mod mock; -#[cfg(test)] -mod tests; - -pub use extension::CheckOnlySudoAccount; -pub use pallet::*; - -type AccountIdLookupOf = <::Lookup as StaticLookup>::Source; - -#[frame_support::pallet] -pub mod pallet { - use super::{DispatchResult, *}; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - pub const MIN_WEIGHT: Weight = Weight::from_ref_time(1_000); - - #[pallet::config] - pub trait Config: frame_system::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - /// A sudo-able call. - type RuntimeCall: Parameter - + UnfilteredDispatchable - + GetDispatchInfo; - } - - #[pallet::pallet] - pub struct Pallet(PhantomData); - - #[pallet::call] - impl Pallet { - /// Authenticates the sudo key and dispatches a function call with `Root` origin. - /// - /// The dispatch origin for this call must be _Signed_. - /// - /// ## Complexity - /// - O(1). - #[pallet::call_index(0)] - #[pallet::weight({ - let dispatch_info = call.get_dispatch_info(); - (dispatch_info.weight.max(MIN_WEIGHT), dispatch_info.class) - })] - pub fn sudo( - origin: OriginFor, - call: Box<::RuntimeCall>, - ) -> DispatchResultWithPostInfo { - Self::ensure_sudo(origin)?; - - let res = call.dispatch_bypass_filter(frame_system::RawOrigin::Root.into()); - Self::deposit_event(Event::Sudid { - sudo_result: res.map(|_| ()).map_err(|e| e.error), - }); - // Sudo user does not pay a fee. - Ok(Pays::No.into()) - } - - /// Authenticates the sudo key and dispatches a function call with `Root` origin. - /// This function does not check the weight of the call, and instead allows the - /// Sudo user to specify the weight of the call. - /// - /// The dispatch origin for this call must be _Signed_. - /// - /// ## Complexity - /// - O(1). - #[pallet::call_index(1)] - #[pallet::weight((_weight.max(MIN_WEIGHT), call.get_dispatch_info().class))] - pub fn sudo_unchecked_weight( - origin: OriginFor, - call: Box<::RuntimeCall>, - _weight: Weight, - ) -> DispatchResultWithPostInfo { - Self::ensure_sudo(origin)?; - - let res = call.dispatch_bypass_filter(frame_system::RawOrigin::Root.into()); - Self::deposit_event(Event::Sudid { - sudo_result: res.map(|_| ()).map_err(|e| e.error), - }); - // Sudo user does not pay a fee. - Ok(Pays::No.into()) - } - - /// Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo - /// key. - /// - /// The dispatch origin for this call must be _Signed_. - /// - /// ## Complexity - /// - O(1). - #[pallet::call_index(2)] - #[pallet::weight(MIN_WEIGHT)] - pub fn set_key( - origin: OriginFor, - new: AccountIdLookupOf, - ) -> DispatchResultWithPostInfo { - Self::ensure_sudo(origin)?; - let new = T::Lookup::lookup(new)?; - - Self::deposit_event(Event::KeyChanged { - old_sudoer: Key::::get(), - }); - Key::::put(&new); - // Sudo user does not pay a fee. - Ok(Pays::No.into()) - } - - /// Authenticates the sudo key and dispatches a function call with `Signed` origin from - /// a given account. - /// - /// The dispatch origin for this call must be _Signed_. - /// - /// ## Complexity - /// - O(1). - #[pallet::call_index(3)] - #[pallet::weight({ - let dispatch_info = call.get_dispatch_info(); - ( - dispatch_info.weight.max(MIN_WEIGHT) - // AccountData for inner call origin accountdata. - .saturating_add(T::DbWeight::get().reads_writes(1, 1)), - dispatch_info.class, - ) - })] - pub fn sudo_as( - origin: OriginFor, - who: AccountIdLookupOf, - call: Box<::RuntimeCall>, - ) -> DispatchResultWithPostInfo { - Self::ensure_sudo(origin)?; - - let who = T::Lookup::lookup(who)?; - - let res = call.dispatch_bypass_filter(frame_system::RawOrigin::Signed(who).into()); - - Self::deposit_event(Event::SudoAsDone { - sudo_result: res.map(|_| ()).map_err(|e| e.error), - }); - // Sudo user does not pay a fee. - Ok(Pays::No.into()) - } - } - - impl Pallet { - /// Ensure `origin` is from the current Sudo key. - fn ensure_sudo(origin: T::RuntimeOrigin) -> DispatchResultWithPostInfo { - // Only allow signed origins. - let sender = ensure_signed(origin)?; - // Ensure the signer is the current Sudo key. - if Some(sender) != Key::::get() { - // roughly same as a 4 byte remark since perbill is u32. - return Err(DispatchErrorWithPostInfo { - post_info: Some(MIN_WEIGHT).into(), - error: Error::::RequireSudo.into(), - }); - } - Ok(().into()) - } - } - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - /// A sudo just took place. \[result\] - Sudid { sudo_result: DispatchResult }, - /// The \[sudoer\] just switched identity; the old key is supplied if one existed. - KeyChanged { old_sudoer: Option }, - /// A sudo just took place. \[result\] - SudoAsDone { sudo_result: DispatchResult }, - } - - #[pallet::error] - /// Error for the Sudo pallet - pub enum Error { - /// Sender must be the Sudo account - RequireSudo, - } - - /// The `AccountId` of the sudo key. - #[pallet::storage] - pub type Key = StorageValue<_, T::AccountId, OptionQuery>; - - #[pallet::genesis_config] - pub struct GenesisConfig { - /// The `AccountId` of the sudo key. - pub key: Option, - } - - #[cfg(feature = "std")] - impl Default for GenesisConfig { - fn default() -> Self { - Self { key: None } - } - } - - #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { - fn build(&self) { - if let Some(ref key) = self.key { - Key::::put(key); - } - } - } -} diff --git a/pallets/sudo/src/mock.rs b/pallets/sudo/src/mock.rs deleted file mode 100644 index bf43e49636..0000000000 --- a/pallets/sudo/src/mock.rs +++ /dev/null @@ -1,177 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Test utilities - -use super::*; -use crate as sudo; -use frame_support::traits::{ConstU32, ConstU64, Contains, GenesisBuild}; -use sp_core::H256; -use sp_io; -use sp_runtime::{ - testing::Header, - traits::{BlakeTwo256, IdentityLookup}, -}; - -// Logger module to track execution. -#[frame_support::pallet] -pub mod logger { - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::config] - pub trait Config: frame_system::Config { - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - } - - #[pallet::pallet] - pub struct Pallet(PhantomData); - - #[pallet::call] - impl Pallet { - #[pallet::call_index(0)] - #[pallet::weight(*weight)] - pub fn privileged_i32_log( - origin: OriginFor, - i: i32, - weight: Weight, - ) -> DispatchResultWithPostInfo { - // Ensure that the `origin` is `Root`. - ensure_root(origin)?; - >::try_append(i).map_err(|_| "could not append")?; - Self::deposit_event(Event::AppendI32 { value: i, weight }); - Ok(().into()) - } - - #[pallet::call_index(1)] - #[pallet::weight(*weight)] - pub fn non_privileged_log( - origin: OriginFor, - i: i32, - weight: Weight, - ) -> DispatchResultWithPostInfo { - // Ensure that the `origin` is some signed account. - let sender = ensure_signed(origin)?; - >::try_append(i).map_err(|_| "could not append")?; - >::try_append(sender.clone()).map_err(|_| "could not append")?; - Self::deposit_event(Event::AppendI32AndAccount { - sender, - value: i, - weight, - }); - Ok(().into()) - } - } - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - AppendI32 { - value: i32, - weight: Weight, - }, - AppendI32AndAccount { - sender: T::AccountId, - value: i32, - weight: Weight, - }, - } - - #[pallet::storage] - pub type AccountLog = - StorageValue<_, BoundedVec>, ValueQuery>; - - #[pallet::storage] - pub type I32Log = StorageValue<_, BoundedVec>, ValueQuery>; -} - -type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; -type Block = frame_system::mocking::MockBlock; - -frame_support::construct_runtime!( - pub enum Test where - Block = Block, - NodeBlock = Block, - UncheckedExtrinsic = UncheckedExtrinsic, - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - Sudo: sudo::{Pallet, Call, Config, Storage, Event}, - Logger: logger::{Pallet, Call, Storage, Event}, - } -); - -pub struct BlockEverything; -impl Contains for BlockEverything { - fn contains(_: &RuntimeCall) -> bool { - false - } -} - -impl frame_system::Config for Test { - type BaseCallFilter = BlockEverything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Index = u64; - type BlockNumber = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; - type Header = Header; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; -} - -// Implement the logger module's `Config` on the Test runtime. -impl logger::Config for Test { - type RuntimeEvent = RuntimeEvent; -} - -// Implement the sudo module's `Config` on the Test runtime. -impl Config for Test { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; -} - -// New types for dispatchable functions. -pub type SudoCall = sudo::Call; -pub type LoggerCall = logger::Call; - -// Build test environment by setting the root `key` for the Genesis. -pub fn new_test_ext(root_key: u64) -> sp_io::TestExternalities { - let mut t = frame_system::GenesisConfig::default() - .build_storage::() - .unwrap(); - sudo::GenesisConfig:: { - key: Some(root_key), - } - .assimilate_storage(&mut t) - .unwrap(); - t.into() -} diff --git a/pallets/sudo/src/tests.rs b/pallets/sudo/src/tests.rs deleted file mode 100644 index c11f692b38..0000000000 --- a/pallets/sudo/src/tests.rs +++ /dev/null @@ -1,247 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Tests for the module. - -use frame_support::{assert_noop, assert_ok, weights::Weight}; - -use crate::mock::logger::{AccountLog, I32Log}; -use crate::mock::{ - new_test_ext, LoggerCall, RuntimeCall, RuntimeEvent as TestEvent, RuntimeOrigin, Sudo, - SudoCall, System, Test, -}; -use crate::*; - -#[test] -fn test_setup_works() { - // Environment setup, logger storage, and sudo `key` retrieval should work as expected. - new_test_ext(1).execute_with(|| { - assert_eq!(Key::::get(), Some(1u64)); - assert!(I32Log::::get().is_empty()); - assert!(AccountLog::::get().is_empty()); - }); -} - -#[test] -fn sudo_basics() { - // Configure a default test environment and set the root `key` to 1. - new_test_ext(1).execute_with(|| { - // A privileged function should work when `sudo` is passed the root `key` as `origin`. - let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { - i: 42, - weight: Weight::from_ref_time(1_000), - })); - assert_ok!(Sudo::sudo(RuntimeOrigin::signed(1), call)); - assert_eq!(I32Log::::get(), vec![42i32]); - - // A privileged function should not work when `sudo` is passed a non-root `key` as `origin`. - let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { - i: 42, - weight: Weight::from_ref_time(1_000), - })); - assert_noop!( - Sudo::sudo(RuntimeOrigin::signed(2), call), - DispatchErrorWithPostInfo { - post_info: Some(MIN_WEIGHT).into(), - error: Error::::RequireSudo.into(), - } - ); - }); -} - -#[test] -fn sudo_emits_events_correctly() { - new_test_ext(1).execute_with(|| { - // Set block number to 1 because events are not emitted on block 0. - System::set_block_number(1); - - // Should emit event to indicate success when called with the root `key` and `call` is `Ok`. - let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { - i: 42, - weight: Weight::from_ref_time(1), - })); - assert_ok!(Sudo::sudo(RuntimeOrigin::signed(1), call)); - System::assert_has_event(TestEvent::Sudo(Event::Sudid { - sudo_result: Ok(()), - })); - }) -} - -#[test] -fn sudo_unchecked_weight_basics() { - new_test_ext(1).execute_with(|| { - // A privileged function should work when `sudo` is passed the root `key` as origin. - let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { - i: 42, - weight: Weight::from_ref_time(1_000), - })); - assert_ok!(Sudo::sudo_unchecked_weight( - RuntimeOrigin::signed(1), - call, - Weight::from_ref_time(1_000) - )); - assert_eq!(I32Log::::get(), vec![42i32]); - - // A privileged function should not work when called with a non-root `key`. - let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { - i: 42, - weight: Weight::from_ref_time(1_000), - })); - assert_noop!( - Sudo::sudo_unchecked_weight( - RuntimeOrigin::signed(2), - call, - Weight::from_ref_time(1_000) - ), - DispatchErrorWithPostInfo { - post_info: Some(MIN_WEIGHT).into(), - error: Error::::RequireSudo.into(), - } - ); - // `I32Log` is unchanged after unsuccessful call. - assert_eq!(I32Log::::get(), vec![42i32]); - - // Controls the dispatched weight. - let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { - i: 42, - weight: Weight::from_ref_time(1), - })); - let sudo_unchecked_weight_call = SudoCall::sudo_unchecked_weight { - call, - weight: Weight::from_ref_time(1_000), - }; - let info = sudo_unchecked_weight_call.get_dispatch_info(); - assert_eq!(info.weight, Weight::from_ref_time(1_000)); - }); -} - -#[test] -fn sudo_unchecked_weight_emits_events_correctly() { - new_test_ext(1).execute_with(|| { - // Set block number to 1 because events are not emitted on block 0. - System::set_block_number(1); - - // Should emit event to indicate success when called with the root `key` and `call` is `Ok`. - let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { - i: 42, - weight: Weight::from_ref_time(1), - })); - assert_ok!(Sudo::sudo_unchecked_weight( - RuntimeOrigin::signed(1), - call, - Weight::from_ref_time(1_000) - )); - System::assert_has_event(TestEvent::Sudo(Event::Sudid { - sudo_result: Ok(()), - })); - }) -} - -#[test] -fn set_key_basics() { - new_test_ext(1).execute_with(|| { - // A root `key` can change the root `key` - assert_ok!(Sudo::set_key(RuntimeOrigin::signed(1), 2)); - assert_eq!(Key::::get(), Some(2u64)); - }); - - new_test_ext(1).execute_with(|| { - // A non-root `key` will trigger a `RequireSudo` error and a non-root `key` cannot change - // the root `key`. - assert_noop!( - Sudo::set_key(RuntimeOrigin::signed(2), 3), - DispatchErrorWithPostInfo { - post_info: Some(MIN_WEIGHT).into(), - error: Error::::RequireSudo.into(), - } - ); - }); -} - -#[test] -fn set_key_emits_events_correctly() { - new_test_ext(1).execute_with(|| { - // Set block number to 1 because events are not emitted on block 0. - System::set_block_number(1); - - // A root `key` can change the root `key`. - assert_ok!(Sudo::set_key(RuntimeOrigin::signed(1), 2)); - System::assert_has_event(TestEvent::Sudo(Event::KeyChanged { - old_sudoer: Some(1), - })); - // Double check. - assert_ok!(Sudo::set_key(RuntimeOrigin::signed(2), 4)); - System::assert_has_event(TestEvent::Sudo(Event::KeyChanged { - old_sudoer: Some(2), - })); - }); -} - -#[test] -fn sudo_as_basics() { - new_test_ext(1).execute_with(|| { - // A privileged function will not work when passed to `sudo_as`. - let call = Box::new(RuntimeCall::Logger(LoggerCall::privileged_i32_log { - i: 42, - weight: Weight::from_ref_time(1_000), - })); - assert_ok!(Sudo::sudo_as(RuntimeOrigin::signed(1), 2, call)); - assert!(I32Log::::get().is_empty()); - assert!(AccountLog::::get().is_empty()); - - // A non-privileged function should not work when called with a non-root `key`. - let call = Box::new(RuntimeCall::Logger(LoggerCall::non_privileged_log { - i: 42, - weight: Weight::from_ref_time(1), - })); - assert_noop!( - Sudo::sudo_as(RuntimeOrigin::signed(3), 2, call), - DispatchErrorWithPostInfo { - post_info: Some(MIN_WEIGHT).into(), - error: Error::::RequireSudo.into(), - } - ); - - // A non-privileged function will work when passed to `sudo_as` with the root `key`. - let call = Box::new(RuntimeCall::Logger(LoggerCall::non_privileged_log { - i: 42, - weight: Weight::from_ref_time(1), - })); - assert_ok!(Sudo::sudo_as(RuntimeOrigin::signed(1), 2, call)); - assert_eq!(I32Log::::get(), vec![42i32]); - // The correct user makes the call within `sudo_as`. - assert_eq!(AccountLog::::get(), vec![2]); - }); -} - -#[test] -fn sudo_as_emits_events_correctly() { - new_test_ext(1).execute_with(|| { - // Set block number to 1 because events are not emitted on block 0. - System::set_block_number(1); - - // A non-privileged function will work when passed to `sudo_as` with the root `key`. - let call = Box::new(RuntimeCall::Logger(LoggerCall::non_privileged_log { - i: 42, - weight: Weight::from_ref_time(1), - })); - assert_ok!(Sudo::sudo_as(RuntimeOrigin::signed(1), 2, call)); - System::assert_has_event(TestEvent::Sudo(Event::SudoAsDone { - sudo_result: Ok(()), - })); - }); -} diff --git a/pallets/transaction-payment/Cargo.toml b/pallets/transaction-payment/Cargo.toml index a469be17bc..12b38f2217 100644 --- a/pallets/transaction-payment/Cargo.toml +++ b/pallets/transaction-payment/Cargo.toml @@ -1,7 +1,7 @@ [package] -name = "pallet-transaction-payment" +name = "polymesh-transaction-payment" version = "2.0.0" -authors = ["Parity Technologies "] +authors = ["PolymeshAssociation"] edition = "2021" [dependencies] @@ -13,14 +13,16 @@ serde = { version = "1.0.104", default-features = false, optional = true } # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-std = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-std = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +frame-benchmarking = { workspace = true, default-features = false, optional = true } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +pallet-timestamp = { workspace = true, default-features = false } +pallet-transaction-payment = { workspace = true, default-features = false } [dev-dependencies] serde_json = "1.0.56" @@ -29,15 +31,22 @@ serde_json = "1.0.56" default = ["std"] disable_fees = [] no_std = [] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "pallet-transaction-payment/runtime-benchmarks", +] std = [ - "serde", + "frame-benchmarking?/std", + "serde/std", "polymesh-primitives/std", "codec/std", "sp-api/std", "sp-std/std", + "sp-io/std", "sp-runtime/std", "frame-support/std", "frame-system/std", "pallet-timestamp/std", + "pallet-transaction-payment/std", ] try-runtime = [] diff --git a/pallets/transaction-payment/src/benchmarking.rs b/pallets/transaction-payment/src/benchmarking.rs new file mode 100644 index 0000000000..8b6778d7f4 --- /dev/null +++ b/pallets/transaction-payment/src/benchmarking.rs @@ -0,0 +1,105 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Benchmarks for Transaction Payment Pallet's transaction extension + +extern crate alloc; + +use super::*; +use crate::Pallet; +use frame_benchmarking::v2::*; +use frame_support::dispatch::{DispatchInfo, PostDispatchInfo}; +use frame_system::{EventRecord, RawOrigin}; +use sp_runtime::traits::{AsTransactionAuthorizedOrigin, DispatchTransaction, Dispatchable}; + +fn assert_last_event( + generic_event: ::RuntimeEvent, +) { + let events = frame_system::Pallet::::events(); + let system_event: ::RuntimeEvent = generic_event.into(); + // compare to the last event record + let EventRecord { event, .. } = &events[events.len() - 1]; + assert_eq!(event, &system_event); +} + +#[benchmarks(where + T: Config, + T::RuntimeOrigin: AsTransactionAuthorizedOrigin, + T::RuntimeCall: Dispatchable, + BalanceOf: Send + Sync + Into, +)] +mod benchmarks { + use super::*; + + #[benchmark] + fn charge_transaction_payment() { + let caller: T::AccountId = account("caller", 0, 0); + + let amount_to_endow = 1_000_000_000u32.into(); + let tip = 0u32.into(); + + >::endow_account(&caller, amount_to_endow); + + let ext: ChargeTransactionPayment = ChargeTransactionPayment::from(tip); + let inner = frame_system::Call::remark { + remark: alloc::vec![], + }; + let call = T::RuntimeCall::from(inner); + let extension_weight = ext.weight(&call); + let info = DispatchInfo { + call_weight: Weight::from_parts(100, 0), + extension_weight, + class: DispatchClass::Operational, + pays_fee: Pays::Yes, + }; + let mut post_info = PostDispatchInfo { + actual_weight: Some(Weight::from_parts(10, 0)), + pays_fee: Pays::Yes, + }; + + #[block] + { + assert!(ext + .test_run( + RawOrigin::Signed(caller.clone()).into(), + &call, + &info, + 10, + 0, + |_| Ok(post_info) + ) + .unwrap() + .is_ok()); + } + + post_info + .actual_weight + .as_mut() + .map(|w| w.saturating_accrue(extension_weight)); + let actual_fee = TransactionPallet::::compute_actual_fee(10, &info, &post_info, tip); + assert_last_event::( + pallet_transaction_payment::Event::::TransactionFeePaid { + who: caller, + actual_fee, + tip, + } + .into(), + ); + } + + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Runtime); +} diff --git a/pallets/transaction-payment/src/lib.rs b/pallets/transaction-payment/src/lib.rs index 2cc548ba20..966de5a888 100644 --- a/pallets/transaction-payment/src/lib.rs +++ b/pallets/transaction-payment/src/lib.rs @@ -1,303 +1,59 @@ -// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. -// This file is part of Substrate. +// This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). +// Copyright (c) 2020 Polymesh Association -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -// Modified by Polymesh Association - 13rd March 2020 -// - Charge fee from the identity in the signed extension -// - Tips have been removed. - -//! # Transaction Payment Module -//! -//! This pallet provides the basic logic needed to pay the absolute minimum amount needed for a -//! transaction to be included. This includes: -//! - _base fee_: This is the minimum amount a user pays for a transaction. It is declared -//! as a base _weight_ in the runtime and converted to a fee using `WeightToFee`. -//! - _weight fee_: A fee proportional to amount of weight a transaction consumes. -//! - _length fee_: A fee proportional to the encoded length of the transaction. -//! - _tip_: An optional tip. Tip increases the priority of the transaction, giving it a higher -//! chance to be included by the transaction queue. -//! -//! The base fee and adjusted weight and length fees constitute the _inclusion fee_, which is -//! the minimum fee for a transaction to be included in a block. -//! -//! The formula of final fee: -//! ```ignore -//! inclusion_fee = base_fee + length_fee + [targeted_fee_adjustment * weight_fee]; -//! final_fee = inclusion_fee + tip; -//! ``` -//! -//! - `targeted_fee_adjustment`: This is a multiplier that can tune the final fee based on -//! the congestion of the network. +//! # Polymesh Transaction Payment Module //! -//! Additionally, this pallet allows one to configure: -//! - The mapping between one unit of weight to one unit of fee via [`Config::WeightToFee`]. -//! - A means of updating the fee for the next block, via defining a multiplier, based on the -//! final state of the chain at the end of the previous block. This can be configured via -//! [`Config::FeeMultiplierUpdate`] -//! - How the fees are paid via [`Config::OnChargeTransaction`]. +//! This module provides the TransactionExtension implementation to charge transaction fees +//! in Polymesh. +//! It extends the default functionality provided by `pallet_transaction_payment` to allow +//! subsidised transactions and to enforce tipping rules for Governance Committee and CDD +//! Providers members. #![cfg_attr(not(feature = "std"), no_std)] -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{ - dispatch::{ - DispatchClass, DispatchInfo, DispatchResult, GetDispatchInfo, Pays, PostDispatchInfo, - Weight, - }, - pallet_prelude::*, - traits::{Currency, Get, GetCallMetadata}, - weights::{WeightToFee, WeightToFeeCoefficient, WeightToFeePolynomial}, -}; -use frame_system::pallet_prelude::{BlockNumberFor, OriginFor}; -use polymesh_primitives::{ - traits::{group::GroupTrait, CddAndFeeDetails, IdentityFnTrait, SubsidiserTrait}, - TransactionError, -}; +use codec::{Decode, DecodeWithMemTracking, Encode}; +use frame_support::dispatch::PostDispatchInfo; +use frame_support::dispatch::{DispatchClass, DispatchInfo, DispatchResult}; +use frame_support::pallet_prelude::*; +use frame_support::weights::Weight; +use frame_support::RuntimeDebugNoBound; +use frame_system::pallet_prelude::OriginFor; use scale_info::TypeInfo; -use sp_runtime::{ - traits::{ - Convert, DispatchInfoOf, Dispatchable, PostDispatchInfoOf, SaturatedConversion, Saturating, - SignedExtension, Zero, - }, - transaction_validity::{ - InvalidTransaction, TransactionPriority, TransactionValidity, TransactionValidityError, - ValidTransaction, - }, - FixedPointNumber, FixedPointOperand, FixedU128, Perquintill, RuntimeDebug, -}; -use sp_std::prelude::*; +use sp_runtime::traits::{DispatchInfoOf, Dispatchable, PostDispatchInfoOf}; +use sp_runtime::traits::{TransactionExtension, Zero}; +use sp_runtime::transaction_validity::{TransactionValidityError, ValidTransaction}; -mod payment; -mod types; +use polymesh_primitives::traits::group::GroupTrait; +use polymesh_primitives::traits::{CddAndFeeDetails, IdentityFnTrait, SubsidiserTrait}; +use polymesh_primitives::TransactionError; pub use pallet::*; -pub use payment::{CurrencyAdapter, OnChargeTransaction}; -pub use types::{FeeDetails, InclusionFee, RuntimeDispatchInfo}; - -/// Fee multiplier. -pub type Multiplier = FixedU128; -type BalanceOf = - <::OnChargeTransaction as OnChargeTransaction>::Balance; +pub use pallet_transaction_payment::{ + ChargeFeesControl, FeeDetails, InclusionFee, OnChargeTransaction, RuntimeDispatchInfo, + WeightInfo, +}; -/// A struct to update the weight multiplier per block. It implements `Convert`, meaning that it can convert the previous multiplier to the next one. This should -/// be called on `on_finalize` of a block, prior to potentially cleaning the weight data from the -/// system pallet. -/// -/// given: -/// s = previous block weight -/// s'= ideal block weight -/// m = maximum block weight -/// diff = (s - s')/m -/// v = 0.00001 -/// t1 = (v * diff) -/// t2 = (v * diff)^2 / 2 -/// then: -/// next_multiplier = prev_multiplier * (1 + t1 + t2) -/// -/// Where `(s', v)` must be given as the `Get` implementation of the `T` generic type. Moreover, `M` -/// must provide the minimum allowed value for the multiplier. Note that a runtime should ensure -/// with tests that the combination of this `M` and `V` is not such that the multiplier can drop to -/// zero and never recover. -/// -/// note that `s'` is interpreted as a portion in the _normal transaction_ capacity of the block. -/// For example, given `s' == 0.25` and `AvailableBlockRatio = 0.75`, then the target fullness is -/// _0.25 of the normal capacity_ and _0.1875 of the entire block_. -/// -/// This implementation implies the bound: -/// - `v ≤ p / k * (s − s')` -/// - or, solving for `p`: `p >= v * k * (s - s')` -/// -/// where `p` is the amount of change over `k` blocks. -/// -/// Hence: -/// - in a fully congested chain: `p >= v * k * (1 - s')`. -/// - in an empty chain: `p >= v * k * (-s')`. -/// -/// For example, when all blocks are full and there are 28800 blocks per day (default in `substrate-node`) -/// and v == 0.00001, s' == 0.1875, we'd have: -/// -/// p >= 0.00001 * 28800 * 0.8125 -/// p >= 0.234 -/// -/// Meaning that fees can change by around ~23% per day, given extreme congestion. -/// -/// More info can be found at: -/// -pub struct TargetedFeeAdjustment(sp_std::marker::PhantomData<(T, S, V, M, X)>); - -/// Something that can convert the current multiplier to the next one. -pub trait MultiplierUpdate: Convert { - /// Minimum multiplier. Any outcome of the `convert` function should be at least this. - fn min() -> Multiplier; - /// Maximum multiplier. Any outcome of the `convert` function should be less or equal this. - fn max() -> Multiplier; - /// Target block saturation level - fn target() -> Perquintill; - /// Variability factor - fn variability() -> Multiplier; -} +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; -impl MultiplierUpdate for () { - fn min() -> Multiplier { - Default::default() - } - fn max() -> Multiplier { - ::max_value() - } - fn target() -> Perquintill { - Default::default() - } - fn variability() -> Multiplier { - Default::default() - } -} +pub type TransactionPallet = pallet_transaction_payment::Pallet; -impl MultiplierUpdate for TargetedFeeAdjustment -where - T: frame_system::Config, - S: Get, - V: Get, - M: Get, - X: Get, -{ - fn min() -> Multiplier { - M::get() - } - fn max() -> Multiplier { - X::get() - } - fn target() -> Perquintill { - S::get() - } - fn variability() -> Multiplier { - V::get() - } -} +pub(crate) type BalanceOf = <::OnChargeTransaction as OnChargeTransaction>::Balance; -impl Convert for TargetedFeeAdjustment -where - T: frame_system::Config, - S: Get, - V: Get, - M: Get, - X: Get, -{ - fn convert(previous: Multiplier) -> Multiplier { - // Defensive only. The multiplier in storage should always be at most positive. Nonetheless - // we recover here in case of errors, because any value below this would be stale and can - // never change. - let min_multiplier = M::get(); - let max_multiplier = X::get(); - let previous = previous.max(min_multiplier); - - let weights = T::BlockWeights::get(); - // the computed ratio is only among the normal class. - let normal_max_weight = weights - .get(DispatchClass::Normal) - .max_total - .unwrap_or(weights.max_block); - let current_block_weight = >::block_weight(); - let normal_block_weight = current_block_weight - .get(DispatchClass::Normal) - .min(normal_max_weight); - - // TODO: Handle all weight dimensions - let normal_max_weight = normal_max_weight.ref_time(); - let normal_block_weight = normal_block_weight.ref_time(); - - let s = S::get(); - let v = V::get(); - - let target_weight = (s * normal_max_weight) as u128; - let block_weight = normal_block_weight as u128; - - // determines if the first_term is positive - let positive = block_weight >= target_weight; - let diff_abs = block_weight.max(target_weight) - block_weight.min(target_weight); - - // defensive only, a test case assures that the maximum weight diff can fit in Multiplier - // without any saturation. - let diff = Multiplier::saturating_from_rational(diff_abs, normal_max_weight.max(1)); - let diff_squared = diff.saturating_mul(diff); - - let v_squared_2 = v.saturating_mul(v) / Multiplier::saturating_from_integer(2); - - let first_term = v.saturating_mul(diff); - let second_term = v_squared_2.saturating_mul(diff_squared); - - if positive { - let excess = first_term - .saturating_add(second_term) - .saturating_mul(previous); - previous - .saturating_add(excess) - .clamp(min_multiplier, max_multiplier) - } else { - // Defensive-only: first_term > second_term. Safe subtraction. - let negative = first_term - .saturating_sub(second_term) - .saturating_mul(previous); - previous - .saturating_sub(negative) - .clamp(min_multiplier, max_multiplier) +impl ChargeFeesControl for Pallet { + fn disabled() -> bool { + #[cfg(feature = "disable_fees")] + { + DisableFees::::get() + } + #[cfg(not(feature = "disable_fees"))] + { + false } } } -/// A struct to make the fee multiplier a constant -pub struct ConstFeeMultiplier>(sp_std::marker::PhantomData); - -impl> MultiplierUpdate for ConstFeeMultiplier { - fn min() -> Multiplier { - M::get() - } - fn max() -> Multiplier { - M::get() - } - fn target() -> Perquintill { - Default::default() - } - fn variability() -> Multiplier { - Default::default() - } -} - -impl Convert for ConstFeeMultiplier -where - M: Get, -{ - fn convert(_previous: Multiplier) -> Multiplier { - Self::min() - } -} - -/// Storage releases of the pallet. -#[derive(Decode, Encode, TypeInfo)] -#[derive(Clone, Copy, Default, Eq, MaxEncodedLen, PartialEq, RuntimeDebug)] -enum Releases { - /// Original version of the pallet. - #[default] - V1Ancient, - /// One that bumps the usage to FixedU128 from FixedI128. - V2, -} - -const MULTIPLIER_DEFAULT_VALUE: Multiplier = Multiplier::from_u32(1); - #[frame_support::pallet] pub mod pallet { use super::*; @@ -306,97 +62,38 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config + pallet_timestamp::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - /// The currency type in which fees will be paid. - type Currency: Currency + Send + Sync; - - /// Handler for withdrawing, refunding and depositing the transaction fee. - /// Transaction fees are withdrawn before the transaction is executed. - /// After the transaction was executed the transaction weight can be - /// adjusted, depending on the used resources by the transaction. If the - /// transaction weight is lower than expected, parts of the transaction fee - /// might be refunded. In the end the fees can be deposited. - type OnChargeTransaction: OnChargeTransaction; - - /// The fee to be paid for making a transaction; the per-byte portion. - #[pallet::constant] - type TransactionByteFee: Get>; - - /// Convert a weight value into a deductible fee based on the currency type. - type WeightToFee: WeightToFeePolynomial>; - - /// Update the multiplier of the next block, based on the previous block's weight. - type FeeMultiplierUpdate: MultiplierUpdate; - - // Polymesh note: This was specifically added for Polymesh + pub trait Config: + frame_system::Config + pallet_transaction_payment::Config + pallet_timestamp::Config + { /// Fetch the signatory to charge fee from. Also sets fee payer and identity in context. type CddHandler: CddAndFeeDetails; - // Polymesh note: This was specifically added for Polymesh - /// Connection to the `Relayer` pallet. - /// Used to charge transaction fees to a subsidiser, if any, instead of the payer. + /// Used to charge transaction fees to a subsidiser, instead of the payer. type Subsidiser: SubsidiserTrait; - // Polymesh note: This was specifically added for Polymesh - /// CDD providers group. type CddProviders: GroupTrait; - // Polymesh note: This was specifically added for Polymesh - /// Governance committee. type GovernanceCommittee: GroupTrait; - // Polymesh note: This was specifically added for Polymesh - /// Identity functionality. type Identity: IdentityFnTrait; - - /// The polynomial that is applied in order to derive fee from weight. - #[pallet::constant] - type WeightToFeeConst: Get>>>; } - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - /// A transaction fee `actual_fee`, of which `tip` was added to the minimum inclusion fee, - /// has been paid by `who`. - TransactionFeePaid { - who: T::AccountId, - actual_fee: BalanceOf, - tip: BalanceOf, - }, - } - - #[pallet::type_value] - pub fn NextFeeMultiplierOnEmpty() -> Multiplier { - MULTIPLIER_DEFAULT_VALUE - } - - #[pallet::storage] - pub type NextFeeMultiplier = - StorageValue<_, Multiplier, ValueQuery, NextFeeMultiplierOnEmpty>; - #[cfg(feature = "disable_fees")] #[pallet::storage] pub type DisableFees = StorageValue<_, bool, ValueQuery>; - #[pallet::storage] - pub(super) type StorageVersion = StorageValue<_, Releases, ValueQuery>; - #[pallet::genesis_config] - pub struct GenesisConfig { - pub multiplier: Multiplier, + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, #[cfg(feature = "disable_fees")] pub disable_fees: bool, } - #[cfg(feature = "std")] - impl Default for GenesisConfig { + impl Default for GenesisConfig { fn default() -> Self { Self { - multiplier: MULTIPLIER_DEFAULT_VALUE, + _config: Default::default(), #[cfg(feature = "disable_fees")] disable_fees: false, } @@ -404,75 +101,17 @@ pub mod pallet { } #[pallet::genesis_build] - impl GenesisBuild for GenesisConfig { + impl BuildGenesisConfig for GenesisConfig { fn build(&self) { - StorageVersion::::put(Releases::V2); - NextFeeMultiplier::::put(self.multiplier); #[cfg(feature = "disable_fees")] DisableFees::::put(self.disable_fees); } } - #[pallet::hooks] - impl Hooks> for Pallet { - fn integrity_test() { - // given weight == u64, we build multipliers from `diff` of two weight values, which can - // at most be maximum block weight. Make sure that this can fit in a multiplier without - // loss. - assert!( - ::max_value() - >= Multiplier::checked_from_integer::( - T::BlockWeights::get().max_block.ref_time() - ) - .unwrap(), - ); - - // This is the minimum value of the multiplier. Make sure that if we collapse to this - // value, we can recover with a reasonable amount of traffic. For this test we assert - // that if we collapse to minimum, the trend will be positive with a weight value - // which is 1% more than the target. - let target = T::FeeMultiplierUpdate::target() - * T::BlockWeights::get() - .get(DispatchClass::Normal) - .max_total - .expect( - "Setting `max_total` for `Normal` dispatch class is not compatible with \ - `transaction-payment` pallet.", - ); - - // add 1 percent; - let addition = target / 100; - if addition == Weight::zero() { - // this is most likely because in a test setup we set everything to (). - return; - } - - #[cfg(any(feature = "std", test))] - sp_io::TestExternalities::new_empty().execute_with(|| { - // This is the minimum value of the multiplier. Make sure that if we collapse to - // this value, we can recover with a reasonable amount of traffic. For this test we - // assert that if we collapse to minimum, the trend will be positive with a weight - // value which is 1% more than the target. - let min_value = T::FeeMultiplierUpdate::min(); - - let target = target + addition; - - >::set_block_consumed_resources(target, 0); - let next = T::FeeMultiplierUpdate::convert(min_value); - assert!( - next > min_value, - "The minimum bound of the multiplier is too low. When \ - block saturation is more than target by 1% and multiplier is minimal then \ - the multiplier doesn't increase." - ); - }) - } - } - #[pallet::call] impl Pallet { #[pallet::call_index(0)] - #[pallet::weight(Weight::from_ref_time(25_000_000))] + #[pallet::weight(Weight::from_parts(25_000_000, 0))] pub fn set_disable_fees(origin: OriginFor, _value: bool) -> DispatchResult { frame_system::ensure_root(origin)?; #[cfg(feature = "disable_fees")] @@ -482,349 +121,201 @@ pub mod pallet { } } -impl Pallet +/// Require the transactor pay for themselves and maybe include a tip to gain additional priority +/// in the queue. +/// +/// # Transaction Validity +/// +/// This extension sets the `priority` field of `TransactionValidity` depending on the amount +/// of tip being paid per weight unit. +/// +/// Operational transactions will receive an additional priority bump, so that they are normally +/// considered before regular transactions. +#[derive(Encode, Decode, DecodeWithMemTracking, Clone, Eq, PartialEq, TypeInfo)] +#[scale_info(skip_type_params(T))] +pub struct ChargeTransactionPayment(#[codec(compact)] BalanceOf); + +impl ChargeTransactionPayment where - BalanceOf: FixedPointOperand, + T::RuntimeCall: Dispatchable, + BalanceOf: Send + Sync + Into, { - /// Query the data that we know about the fee of a given `call`. - /// - /// This pallet is not and cannot be aware of the internals of a signed extension, for example - /// a tip. It only interprets the extrinsic as some encoded value and accounts for its weight - /// and length, the runtime's extrinsic base weight, and the current fee multiplier. - /// - /// All dispatchables must be annotated with weight and will have some fee info. This function - /// always returns. - pub fn query_info( - unchecked_extrinsic: Extrinsic, - len: u32, - actual: Option, - ) -> RuntimeDispatchInfo> - where - T::RuntimeCall: Dispatchable, - { - // NOTE: we can actually make it understand `ChargeTransactionPayment`, but would be some - // hassle for sure. We have to make it aware of the index of `ChargeTransactionPayment` in - // `Extra`. Alternatively, we could actually execute the tx's per-dispatch and record the - // balance of the sender before and after the pipeline.. but this is way too much hassle for - // a very very little potential gain in the future. - let mut dispatch_info = - ::get_dispatch_info(&unchecked_extrinsic); - if let Some(weight) = actual { - dispatch_info.weight = weight; - } - - let partial_fee = if unchecked_extrinsic.is_signed().unwrap_or(false) { - Self::compute_fee(len, &dispatch_info, 0u32.into()) - } else { - // Unsigned extrinsics have no partial fee. - 0u32.into() - }; - - let DispatchInfo { weight, class, .. } = dispatch_info; + /// utility constructor. Used only in client/factory code. + pub fn from(fee: BalanceOf) -> Self { + Self(fee) + } - RuntimeDispatchInfo { - weight, - class, - partial_fee, - } + /// Returns the tip as being chosen by the transaction sender. + pub fn tip(&self) -> BalanceOf { + self.0 } - /// Query the detailed fee of a given `call`. - pub fn query_fee_details( - unchecked_extrinsic: Extrinsic, - len: u32, - actual: Option, - ) -> FeeDetails> - where - T::RuntimeCall: Dispatchable, - { - let mut dispatch_info = - ::get_dispatch_info(&unchecked_extrinsic); - if let Some(weight) = actual { - dispatch_info.weight = weight; - } + pub(crate) fn can_withdraw_fee( + &self, + who: T::AccountId, + call: &T::RuntimeCall, + info: &DispatchInfoOf, + len: usize, + ) -> Result<(BalanceOf, Option), TransactionValidityError> { + let tip = self.0; + let fee_with_tip = TransactionPallet::::compute_fee(len as u32, info, tip); - let tip = 0u32.into(); + // Polymesh change + // ----------------------------------------------------------------- - if unchecked_extrinsic.is_signed().unwrap_or(false) { - Self::compute_fee_details(len, &dispatch_info, tip) - } else { - // Unsigned extrinsics have no inclusion fee. - FeeDetails { - inclusion_fee: None, - tip, - } + if fee_with_tip.is_zero() { + return Ok((fee_with_tip, None)); } - } - /// Query information of a dispatch class, weight, and fee of a given encoded `Call`. - pub fn query_call_info( - call: T::RuntimeCall, - len: u32, - actual: Option, - ) -> RuntimeDispatchInfo> - where - T::RuntimeCall: Dispatchable + GetDispatchInfo, - { - let mut dispatch_info = ::get_dispatch_info(&call); - if let Some(weight) = actual { - dispatch_info.weight = weight; - } - let DispatchInfo { weight, class, .. } = dispatch_info; + let (payers_key, subsidiser) = Self::check_subsidy_conditions(&who, call, fee_with_tip)?; - RuntimeDispatchInfo { - weight, - class, - partial_fee: Self::compute_fee(len, &dispatch_info, 0u32.into()), - } - } + // key to pay the fee. + let fee_key = subsidiser.as_ref().unwrap_or(&payers_key); - /// Query fee details of a given encoded `Call`. - pub fn query_call_fee_details( - call: T::RuntimeCall, - len: u32, - actual: Option, - ) -> FeeDetails> - where - T::RuntimeCall: Dispatchable + GetDispatchInfo, - { - let mut dispatch_info = ::get_dispatch_info(&call); - if let Some(weight) = actual { - dispatch_info.weight = weight; - } - let tip = 0u32.into(); + <::OnChargeTransaction as OnChargeTransaction< + T, + >>::can_withdraw_fee(fee_key, call, info, fee_with_tip, tip)?; - Self::compute_fee_details(len, &dispatch_info, tip) - } + T::CddHandler::set_payer_context(Some(payers_key)); - /// Compute the final fee value for a particular transaction. - pub fn compute_fee( - len: u32, - info: &DispatchInfoOf, - tip: BalanceOf, - ) -> BalanceOf - where - T::RuntimeCall: Dispatchable, - { - Self::compute_fee_details(len, info, tip).final_fee() - } + // ----------------------------------------------------------------- - /// Compute the fee details for a particular transaction. - pub fn compute_fee_details( - len: u32, - info: &DispatchInfoOf, - tip: BalanceOf, - ) -> FeeDetails> - where - T::RuntimeCall: Dispatchable, - { - Self::compute_fee_raw(len, info.weight, tip, info.pays_fee, info.class) + Ok((fee_with_tip, subsidiser)) } - /// Compute the actual post dispatch fee for a particular transaction. - /// - /// Identical to `compute_fee` with the only difference that the post dispatch corrected - /// weight is used for the weight fee calculation. - pub fn compute_actual_fee( - len: u32, + pub(crate) fn withdraw_fee( + &self, + who: &T::AccountId, + call: &T::RuntimeCall, info: &DispatchInfoOf, - post_info: &PostDispatchInfoOf, - tip: BalanceOf, - ) -> BalanceOf - where - T::RuntimeCall: Dispatchable, - { - Self::compute_actual_fee_details(len, info, post_info, tip).final_fee() - } + fee_with_tip: BalanceOf, + ) -> Result< + ( + BalanceOf, + Option, + <::OnChargeTransaction as OnChargeTransaction>::LiquidityInfo, + ), + TransactionValidityError, + >{ + let tip = self.0; - /// Compute the actual post dispatch fee details for a particular transaction. - pub fn compute_actual_fee_details( - len: u32, - info: &DispatchInfoOf, - post_info: &PostDispatchInfoOf, - tip: BalanceOf, - ) -> FeeDetails> - where - T::RuntimeCall: Dispatchable, - { - Self::compute_fee_raw( - len, - post_info.calc_actual_weight(info), - tip, - post_info.pays_fee(info), - info.class, - ) - } + // Polymesh change + // ----------------------------------------------------------------- - fn compute_fee_raw( - len: u32, - weight: Weight, - tip: BalanceOf, - pays_fee: Pays, - class: DispatchClass, - ) -> FeeDetails> { - #[cfg(feature = "disable_fees")] - if DisableFees::::get() { - return FeeDetails { - inclusion_fee: None, - tip: 0u32.into(), - }; + if fee_with_tip.is_zero() { + return Ok((fee_with_tip, None, Default::default())); } - if pays_fee == Pays::Yes { - // the adjustable part of the fee. - let unadjusted_weight_fee = Self::weight_to_fee(weight); - let multiplier = NextFeeMultiplier::::get(); - - // final adjusted weight fee. - let adjusted_weight_fee = multiplier.saturating_mul_int(unadjusted_weight_fee); - - // length fee. this is adjusted via `LengthToFee`. - let len_fee = Self::length_to_fee(len); + let (payers_key, subsidiser) = Self::check_subsidy_conditions(who, call, fee_with_tip)?; - let base_fee = Self::weight_to_fee(T::BlockWeights::get().get(class).base_extrinsic); - FeeDetails { - inclusion_fee: Some(InclusionFee { - base_fee, - len_fee, - adjusted_weight_fee, - }), - tip, - } - } else { - FeeDetails { - inclusion_fee: None, + // key to pay the fee. + let fee_key = subsidiser.as_ref().unwrap_or(&payers_key); + + let liq_info = + <::OnChargeTransaction as OnChargeTransaction>::withdraw_fee( + fee_key, + call, + info, + fee_with_tip, tip, - } - } - } + )?; - fn length_to_fee(length: u32) -> BalanceOf { - let len = >::from(length); - let per_byte = T::TransactionByteFee::get(); + T::CddHandler::set_payer_context(Some(payers_key)); - per_byte.saturating_mul(len) - } + // ----------------------------------------------------------------- - fn weight_to_fee(weight: Weight) -> BalanceOf { - // cap the weight to the maximum defined in runtime, otherwise it will be the - // `Bounded` maximum of its data type, which is not desired. - let capped_weight = weight.min(T::BlockWeights::get().max_block); - T::WeightToFee::weight_to_fee(&capped_weight) + Ok((fee_with_tip, subsidiser, liq_info)) } - /// Polymesh-Note :- Change for the supporting the test - #[cfg(debug_assertions)] - pub fn put_next_fee_multiplier(m: Multiplier) { - NextFeeMultiplier::::put(m) - } -} - -impl Convert> for Pallet -where - T: Config, - BalanceOf: FixedPointOperand, -{ - /// Compute the fee for the specified weight. - /// - /// This fee is already adjusted by the per block fee adjustment factor and is therefore the - /// share that the weight contributes to the overall fee of a transaction. It is mainly - /// for informational purposes and not used in the actual fee calculation. - fn convert(weight: Weight) -> BalanceOf { - NextFeeMultiplier::::get().saturating_mul_int(Self::weight_to_fee(weight)) - } -} - -pub type WithdrawFeeInfo = ( - BalanceOf, - <::OnChargeTransaction as OnChargeTransaction>::LiquidityInfo, - Option, -); - -/// Require the transactor pay for themselves and maybe include a tip to gain additional priority -/// in the queue. -#[derive(Encode, Decode, TypeInfo, Clone, Eq, PartialEq)] -#[scale_info(skip_type_params(T))] -pub struct ChargeTransactionPayment(#[codec(compact)] BalanceOf); - -impl ChargeTransactionPayment -where - T::RuntimeCall: - Dispatchable + GetCallMetadata, - BalanceOf: Send + Sync + FixedPointOperand + Into, -{ - /// utility constructor. Used only in client/factory code. - pub fn from(fee: BalanceOf) -> Self { - Self(fee) - } - - fn withdraw_fee( - &self, - who: T::AccountId, + fn check_subsidy_conditions( + who: &T::AccountId, call: &T::RuntimeCall, - info: &DispatchInfoOf, - len: usize, - ) -> Result, TransactionValidityError> { - let tip = self.0; - let fee = Pallet::::compute_fee(len as u32, info, tip); - - // Polymesh: Changed how the tx fee payer is selected. - - // Only mess with balances if fee is not zero. - if fee.is_zero() { - let liquidity_info = Default::default(); - return Ok((fee, liquidity_info, None)); - } - + fee_with_tip: BalanceOf, + ) -> Result<(T::AccountId, Option), InvalidTransaction> { // Get the payer for this transaction. - let payer_key = - T::CddHandler::get_valid_payer(call, who)?.ok_or(InvalidTransaction::Payment)?; + let payers_key = T::CddHandler::get_valid_payer(call, who.clone())? + .ok_or(InvalidTransaction::Payment)?; // Check if the payer is being subsidised. - let subsidiser = T::Subsidiser::check_subsidy(&payer_key, fee.into(), Some(call))?; + let subsidiser = + T::Subsidiser::check_subsidy(&payers_key, fee_with_tip.into(), Some(call))?; - // key to pay the fee. - let fee_key = subsidiser.as_ref().unwrap_or(&payer_key); - let liquidity_info = - <::OnChargeTransaction as OnChargeTransaction>::withdraw_fee( - fee_key, call, info, fee, tip, - )?; - T::CddHandler::set_payer_context(Some(payer_key)); - Ok((fee, liquidity_info, subsidiser)) + Ok((payers_key, subsidiser)) } - // Polymesh: Used to allow GC/CDD member to include a `tip`. - /// Returns `true` iff `who` is member of `T::GovernanceCommittee` or `T::CddProviders`. + // Polymesh change: Used to allow GC/CDD member to include a `tip`. + // ----------------------------------------------------------------- + + /// Returns `true` if `who` is member of `T::GovernanceCommittee` or `T::CddProviders`. fn is_gc_or_cdd_member(who: &T::AccountId) -> bool { T::Identity::get_identity(who) .map(|did| T::GovernanceCommittee::is_member(&did) || T::CddProviders::is_member(&did)) .unwrap_or(false) } - // Polymesh: Used to allow GC/CDD member to include a `tip`. /// Ensures that the transaction tip is valid. /// - /// We only allow tip != 0 if the transaction is `DispatchClass::Operational` and it was - /// created by a Governance or CDD Provider member. - /// A `DispatchClass::Mandatory` transaction is going to be included in the block, so adding a - /// tip does not matter. - fn ensure_valid_tip( + /// Tipping is allowed for `DispatchClass::Operational` created by a Governance or CDD Provider member. + /// Mandatory transactions are going to be included in the block, so adding a tip does not matter. + pub(crate) fn ensure_valid_tip( &self, who: &T::AccountId, info: &DispatchInfoOf, ) -> Result, TransactionValidityError> { - let is_valid_tip = match info.class { - DispatchClass::Normal => self.0 == Zero::zero(), - DispatchClass::Operational => self.0 == Zero::zero() || Self::is_gc_or_cdd_member(who), - DispatchClass::Mandatory => true, - }; - - is_valid_tip - .then_some(self.0) - .ok_or(TransactionValidityError::Invalid( - InvalidTransaction::Custom(TransactionError::ZeroTip as u8), - )) + match info.class { + DispatchClass::Normal | DispatchClass::Operational => { + if self.0.is_zero() { + return Ok(self.0); + } + + if info.class == DispatchClass::Operational && Self::is_gc_or_cdd_member(who) { + return Ok(self.0); + } + + Err(TransactionValidityError::Invalid( + InvalidTransaction::Custom(TransactionError::ZeroTip as u8), + )) + } + DispatchClass::Mandatory => Ok(self.0), + } } + + // ----------------------------------------------------------------- +} + +/// The info passed between the validate and prepare steps for the `ChargeAssetTxPayment` extension. +#[derive(RuntimeDebugNoBound)] +pub enum Val { + Charge { + tip: BalanceOf, + // who called the transaction + who: T::AccountId, + // transaction fee + fee_with_tip: BalanceOf, + // Polymesh Subsidiser account (who paid the fee) + subsidiser: Option, + }, + NoCharge, +} + +/// The info passed between the prepare and post-dispatch steps for the `ChargeAssetTxPayment` +/// extension. +pub enum Pre { + Charge { + tip: BalanceOf, + // who paid the fee + who: T::AccountId, + // imbalance resulting from withdrawing the fee + imbalance: <::OnChargeTransaction as OnChargeTransaction>::LiquidityInfo, + // Polymesh Subsidiser account (who paid the fee) + subsidiser: Option, + // The AuthId of the call + auth_id: Option, + }, + NoCharge { + // weight initially estimated by the extension, to be refunded + refund: Weight, + }, } impl sp_std::fmt::Debug for ChargeTransactionPayment { @@ -838,73 +329,117 @@ impl sp_std::fmt::Debug for ChargeTransactionPayment { } } -// Polymesh: Almost all of this implementation was changed to enforce zero tip, support subsidiser and charge fee to proper payer. -impl SignedExtension for ChargeTransactionPayment +impl TransactionExtension for ChargeTransactionPayment where - BalanceOf: Send + Sync + From + FixedPointOperand + Into, - T::RuntimeCall: - Dispatchable + GetCallMetadata, + T::RuntimeCall: Dispatchable, + BalanceOf: Send + Sync + Into, { const IDENTIFIER: &'static str = "ChargeTransactionPayment"; - type AccountId = T::AccountId; - type Call = T::RuntimeCall; - type AdditionalSigned = (); - type Pre = ( - // tip - BalanceOf, - // The payer for the transaction, they might be subsidised. - Self::AccountId, - // Imbalance resulting from withdrawing the fee. - <::OnChargeTransaction as OnChargeTransaction>::LiquidityInfo, - // Polymesh: Subsidiser - Option, - // The AuthId of the call - Option, - ); - fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { - Ok(()) + type Implicit = (); + type Val = Val; + type Pre = Pre; + + fn weight(&self, _call: &T::RuntimeCall) -> Weight { + // TODO: improve weight based on the call. + ::WeightInfo::charge_transaction_payment() } fn validate( &self, - who: &Self::AccountId, - call: &Self::Call, - info: &DispatchInfoOf, + origin: ::RuntimeOrigin, + call: &T::RuntimeCall, + info: &DispatchInfoOf, len: usize, - ) -> TransactionValidity { - let tip = self.ensure_valid_tip(who, info)?; + _: (), + _implication: &impl Encode, + _source: TransactionSource, + ) -> Result< + ( + ValidTransaction, + Self::Val, + ::RuntimeOrigin, + ), + TransactionValidityError, + > { + let Ok(who) = frame_system::ensure_signed(origin.clone()) else { + return Ok((ValidTransaction::default(), Val::NoCharge, origin)); + }; + + let tip = self.ensure_valid_tip(&who, info)?; + + let (fee_with_tip, subsidiser) = self.can_withdraw_fee(who.clone(), call, info, len)?; - let (_fee, _, _) = self.withdraw_fee(who.clone(), call, info, len)?; - // Polymesh: `tip` can only be used by GC/CDD members. - Ok(ValidTransaction { - priority: tip.saturated_into::(), + let valid_transaction = ValidTransaction { + priority: pallet_transaction_payment::ChargeTransactionPayment::::get_priority( + info, + len, + tip, + fee_with_tip, + ), ..Default::default() - }) + }; + + let val = Val::Charge { + tip, + who, + fee_with_tip, + subsidiser, + }; + + Ok((valid_transaction, val, origin)) } - fn pre_dispatch( + fn prepare( self, - who: &Self::AccountId, - call: &Self::Call, - info: &DispatchInfoOf, - len: usize, + val: Self::Val, + _origin: &::RuntimeOrigin, + call: &T::RuntimeCall, + info: &DispatchInfoOf, + _len: usize, ) -> Result { - let tip = self.ensure_valid_tip(who, info)?; - let (_fee, imbalance, subsidiser) = self.withdraw_fee(who.clone(), call, info, len)?; - let auth_id = T::CddHandler::get_authorization_id(call); - Ok((tip, who.clone(), imbalance, subsidiser, auth_id)) + match val { + Val::NoCharge => Ok(Pre::NoCharge { + refund: self.weight(call), + }), + Val::Charge { + tip, + who, + fee_with_tip, + subsidiser: _, + } => { + let (_, subsidiser, imbalance) = + self.withdraw_fee(&who, call, info, fee_with_tip)?; + let auth_id = T::CddHandler::get_authorization_id(call); + + Ok(Pre::Charge { + tip, + who, + imbalance, + subsidiser, + auth_id, + }) + } + } } fn post_dispatch( - pre: Option, - info: &DispatchInfoOf, - post_info: &PostDispatchInfoOf, + pre: Self::Pre, + info: &DispatchInfoOf, + post_info: &mut PostDispatchInfoOf, len: usize, result: &DispatchResult, ) -> Result<(), TransactionValidityError> { - let (tip, who, imbalance, subsidiser, auth_id) = match pre { - Some(pre) => pre, - None => return Ok(()), + let (tip, who, imbalance, subsidiser, auth_id) = { + match pre { + Pre::Charge { + tip, + who, + imbalance, + subsidiser, + auth_id, + } => (tip, who, imbalance, subsidiser, auth_id), + Pre::NoCharge { .. } => return Ok(()), + } }; // We want to decrease the counter of Authorization.count when the caller is not paying for the fee and the call failed @@ -912,31 +447,26 @@ where T::CddHandler::decrease_authorization_count(&who, auth_id); } - let actual_fee = Pallet::::compute_actual_fee(len as u32, info, post_info, tip); + let actual_fee = + TransactionPallet::::compute_actual_fee(len as u32, info, post_info, tip); // Fee returned to original payer. - // If payer context is empty, the fee is returned to the caller account. - let payer = T::CddHandler::get_payer_from_context().unwrap_or(who.clone()); - - // `fee_key` is either a subsidiser or the original payer. - let fee_key = if let Some(subsidiser_key) = subsidiser { - // Debit the actual fee from the subsidy. - // This shouldn't fail, since the subsidy was checked in `pre_dispatch`. - T::Subsidiser::debit_subsidy(&payer, actual_fee.into())?; - subsidiser_key - } else { - // No subsidy. - payer + let payers_key = T::CddHandler::get_payer_from_context().unwrap_or(who.clone()); + + let fee_key = { + if let Some(subsidiser_acc) = subsidiser { + T::Subsidiser::debit_subsidy(&payers_key, actual_fee.into())?; + subsidiser_acc + } else { + payers_key + } }; T::OnChargeTransaction::correct_and_deposit_fee( &fee_key, info, post_info, actual_fee, tip, imbalance, )?; - Pallet::::deposit_event(Event::::TransactionFeePaid { - who: fee_key, - actual_fee, - tip, - }); + + TransactionPallet::::deposit_fee_paid_event(fee_key, actual_fee, tip); // It clears the identity and payer in the context after transaction. T::CddHandler::clear_context(); diff --git a/pallets/transaction-payment/src/payment.rs b/pallets/transaction-payment/src/payment.rs deleted file mode 100644 index bb9f99d3bb..0000000000 --- a/pallets/transaction-payment/src/payment.rs +++ /dev/null @@ -1,171 +0,0 @@ -/// ! Traits and default implementation for paying transaction fees. -use crate::pallet::Config; - -use codec::FullCodec; -use sp_runtime::{ - traits::{ - AtLeast32BitUnsigned, DispatchInfoOf, MaybeSerializeDeserialize, PostDispatchInfoOf, - Saturating, Zero, - }, - transaction_validity::InvalidTransaction, -}; -use sp_std::{fmt::Debug, marker::PhantomData}; - -use frame_support::{ - traits::{Currency, ExistenceRequirement, Imbalance, OnUnbalanced, WithdrawReasons}, - unsigned::TransactionValidityError, -}; - -type NegativeImbalanceOf = - ::AccountId>>::NegativeImbalance; - -/// Handle withdrawing, refunding and depositing of transaction fees. -pub trait OnChargeTransaction { - /// The underlying integer type in which fees are calculated. - type Balance: AtLeast32BitUnsigned - + FullCodec - + Copy - + MaybeSerializeDeserialize - + Debug - + Default - + scale_info::TypeInfo; - type LiquidityInfo: Default; - - /// Before the transaction is executed the payment of the transaction fees - /// need to be secured. - /// - /// Note: The `fee` already includes the `tip`. - fn withdraw_fee( - who: &T::AccountId, - call: &T::RuntimeCall, - dispatch_info: &DispatchInfoOf, - fee: Self::Balance, - tip: Self::Balance, - ) -> Result; - - /// After the transaction was executed the actual fee can be calculated. - /// This function should refund any overpaid fees and optionally deposit - /// the corrected amount. - /// - /// Note: The `fee` already includes the `tip`. - fn correct_and_deposit_fee( - who: &T::AccountId, - dispatch_info: &DispatchInfoOf, - post_info: &PostDispatchInfoOf, - corrected_fee: Self::Balance, - tip: Self::Balance, - already_withdrawn: Self::LiquidityInfo, - ) -> Result<(), TransactionValidityError>; - - /// Polymesh: Used to charge protocal fees. - fn charge_fee(who: &T::AccountId, fee: Self::Balance) -> Result<(), TransactionValidityError>; -} - -/// Implements the transaction payment for a pallet implementing the `Currency` -/// trait (eg. the pallet_balances) using an unbalance handler (implementing -/// `OnUnbalanced`). -/// -/// The unbalance handler is given 2 unbalanceds in [`OnUnbalanced::on_unbalanceds`]: fee and -/// then tip. -pub struct CurrencyAdapter(PhantomData<(C, OU)>); - -/// Default implementation for a Currency and an OnUnbalanced handler. -/// -/// The unbalance handler is given 2 unbalanceds in [`OnUnbalanced::on_unbalanceds`]: fee and -/// then tip. -impl OnChargeTransaction for CurrencyAdapter -where - T: Config, - C: Currency<::AccountId>, - C::PositiveImbalance: Imbalance< - ::AccountId>>::Balance, - Opposite = C::NegativeImbalance, - >, - C::NegativeImbalance: Imbalance< - ::AccountId>>::Balance, - Opposite = C::PositiveImbalance, - >, - OU: OnUnbalanced>, -{ - type LiquidityInfo = Option>; - type Balance = ::AccountId>>::Balance; - - /// Withdraw the predicted fee from the transaction origin. - /// - /// Note: The `fee` already includes the `tip`. - fn withdraw_fee( - who: &T::AccountId, - _call: &T::RuntimeCall, - _info: &DispatchInfoOf, - fee: Self::Balance, - tip: Self::Balance, - ) -> Result { - if fee.is_zero() { - return Ok(None); - } - - let withdraw_reason = if tip.is_zero() { - WithdrawReasons::TRANSACTION_PAYMENT - } else { - WithdrawReasons::TRANSACTION_PAYMENT | WithdrawReasons::TIP - }; - - match C::withdraw(who, fee, withdraw_reason, ExistenceRequirement::KeepAlive) { - Ok(imbalance) => Ok(Some(imbalance)), - Err(_) => Err(InvalidTransaction::Payment.into()), - } - } - - /// Hand the fee and the tip over to the `[OnUnbalanced]` implementation. - /// Since the predicted fee might have been too high, parts of the fee may - /// be refunded. - /// - /// Note: The `corrected_fee` already includes the `tip`. - fn correct_and_deposit_fee( - who: &T::AccountId, - _dispatch_info: &DispatchInfoOf, - _post_info: &PostDispatchInfoOf, - corrected_fee: Self::Balance, - tip: Self::Balance, - already_withdrawn: Self::LiquidityInfo, - ) -> Result<(), TransactionValidityError> { - if let Some(paid) = already_withdrawn { - // Calculate how much refund we should return - let refund_amount = paid.peek().saturating_sub(corrected_fee); - // refund to the the account that paid the fees. If this fails, the - // account might have dropped below the existential balance. In - // that case we don't refund anything. - let refund_imbalance = C::deposit_into_existing(who, refund_amount) - .unwrap_or_else(|_| C::PositiveImbalance::zero()); - // merge the imbalance caused by paying the fees and refunding parts of it again. - let adjusted_paid = paid - .offset(refund_imbalance) - .same() - .map_err(|_| TransactionValidityError::Invalid(InvalidTransaction::Payment))?; - // Call someone else to handle the imbalance (fee and tip separately) - let (tip, fee) = adjusted_paid.split(tip); - OU::on_unbalanceds(Some(fee).into_iter().chain(Some(tip))); - } - Ok(()) - } - - /// Polymesh: Used to charge protocal fees. - fn charge_fee(who: &T::AccountId, fee: Self::Balance) -> Result<(), TransactionValidityError> { - if fee.is_zero() { - return Ok(()); - } - - match C::withdraw( - who, - fee, - WithdrawReasons::TRANSACTION_PAYMENT, - ExistenceRequirement::KeepAlive, - ) { - Ok(imbalance) => { - OU::on_unbalanced(imbalance); - Ok(()) - } - Err(_) => Err(InvalidTransaction::Payment.into()), - } - } -} diff --git a/pallets/transaction-payment/src/types.rs b/pallets/transaction-payment/src/types.rs deleted file mode 100644 index a9dab61535..0000000000 --- a/pallets/transaction-payment/src/types.rs +++ /dev/null @@ -1,183 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2021-2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Types for transaction-payment RPC. - -use codec::{Decode, Encode}; -#[cfg(feature = "std")] -use serde::{Deserialize, Serialize}; - -use sp_runtime::traits::{AtLeast32BitUnsigned, Zero}; -use sp_std::prelude::*; - -use frame_support::dispatch::DispatchClass; - -/// The base fee and adjusted weight and length fees constitute the _inclusion fee_. -#[derive(Encode, Decode, Clone, Eq, PartialEq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -pub struct InclusionFee { - /// This is the minimum amount a user pays for a transaction. It is declared - /// as a base _weight_ in the runtime and converted to a fee using `WeightToFee`. - pub base_fee: Balance, - /// The length fee, the amount paid for the encoded length (in bytes) of the transaction. - pub len_fee: Balance, - /// - /// - `targeted_fee_adjustment`: This is a multiplier that can tune the final fee based on the - /// congestion of the network. - /// - `weight_fee`: This amount is computed based on the weight of the transaction. Weight - /// accounts for the execution time of a transaction. - /// - /// adjusted_weight_fee = targeted_fee_adjustment * weight_fee - pub adjusted_weight_fee: Balance, -} - -impl InclusionFee { - /// Returns the total of inclusion fee. - /// - /// ```ignore - /// inclusion_fee = base_fee + len_fee + adjusted_weight_fee - /// ``` - pub fn inclusion_fee(&self) -> Balance { - self.base_fee - .saturating_add(self.len_fee) - .saturating_add(self.adjusted_weight_fee) - } -} - -/// The `FeeDetails` is composed of: -/// - (Optional) `inclusion_fee`: Only the `Pays::Yes` transaction can have the inclusion fee. -/// - `tip`: If included in the transaction, the tip will be added on top. Only signed -/// transactions can have a tip. -#[derive(Encode, Decode, Clone, Eq, PartialEq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -pub struct FeeDetails { - /// The minimum fee for a transaction to be included in a block. - pub inclusion_fee: Option>, - // Do not serialize and deserialize `tip` as we actually can not pass any tip to the RPC. - #[cfg_attr(feature = "std", serde(skip))] - pub tip: Balance, -} - -impl FeeDetails { - /// Returns the final fee. - /// - /// ```ignore - /// final_fee = inclusion_fee + tip; - /// ``` - pub fn final_fee(&self) -> Balance { - self.inclusion_fee - .as_ref() - .map(|i| i.inclusion_fee()) - .unwrap_or_else(|| Zero::zero()) - .saturating_add(self.tip) - } -} - -/// Information related to a dispatchable's class, weight, and fee that can be queried from the -/// runtime. -#[derive(Eq, PartialEq, Encode, Decode, Default)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -#[cfg_attr( - feature = "std", - serde(bound(serialize = "Balance: std::fmt::Display, Weight: Serialize")) -)] -#[cfg_attr( - feature = "std", - serde(bound(deserialize = "Balance: std::str::FromStr, Weight: Deserialize<'de>")) -)] -pub struct RuntimeDispatchInfo { - /// Weight of this dispatch. - pub weight: Weight, - /// Class of this dispatch. - pub class: DispatchClass, - /// The inclusion fee of this dispatch. - /// - /// This does not include a tip or anything else that - /// depends on the signature (i.e. depends on a `SignedExtension`). - #[cfg_attr(feature = "std", serde(with = "serde_balance"))] - pub partial_fee: Balance, -} - -#[cfg(feature = "std")] -mod serde_balance { - use serde::{Deserialize, Deserializer, Serializer}; - - pub fn serialize( - t: &T, - serializer: S, - ) -> Result { - serializer.serialize_str(&t.to_string()) - } - - pub fn deserialize<'de, D: Deserializer<'de>, T: std::str::FromStr>( - deserializer: D, - ) -> Result { - let s = String::deserialize(deserializer)?; - s.parse::() - .map_err(|_| serde::de::Error::custom("Parse from string failed")) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use frame_support::weights::Weight; - - #[test] - fn should_serialize_and_deserialize_properly_with_string() { - let info = RuntimeDispatchInfo { - weight: Weight::from_ref_time(5), - class: DispatchClass::Normal, - partial_fee: 1_000_000_u64, - }; - - let json_str = - r#"{"weight":{"ref_time":5,"proof_size":0},"class":"normal","partialFee":"1000000"}"#; - - assert_eq!(serde_json::to_string(&info).unwrap(), json_str); - assert_eq!( - serde_json::from_str::>(json_str).unwrap(), - info - ); - - // should not panic - serde_json::to_value(&info).unwrap(); - } - - #[test] - fn should_serialize_and_deserialize_properly_large_value() { - let info = RuntimeDispatchInfo { - weight: Weight::from_ref_time(5), - class: DispatchClass::Normal, - partial_fee: u128::max_value(), - }; - - let json_str = r#"{"weight":{"ref_time":5,"proof_size":0},"class":"normal","partialFee":"340282366920938463463374607431768211455"}"#; - - assert_eq!(serde_json::to_string(&info).unwrap(), json_str); - assert_eq!( - serde_json::from_str::>(json_str).unwrap(), - info - ); - - // should not panic - serde_json::to_value(&info).unwrap(); - } -} diff --git a/pallets/treasury/Cargo.toml b/pallets/treasury/Cargo.toml index 5312526a2d..3fbaee5298 100644 --- a/pallets/treasury/Cargo.toml +++ b/pallets/treasury/Cargo.toml @@ -16,19 +16,19 @@ serde_derive = { version = "1.0.104", optional = true, default-features = false # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.0", default-features = false, features = ["derive"] } -sp-core = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } -sp-api = { version = "4.0.0-dev", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } +sp-api = { workspace = true, default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } +frame-system = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } # Benchmarking -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } +frame-benchmarking = { workspace = true, default-features = false, optional = true } [features] equalize = [] @@ -54,5 +54,9 @@ std = [ runtime-benchmarks = [ "frame-benchmarking", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-permissions/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/treasury/src/benchmarking.rs b/pallets/treasury/src/benchmarking.rs index bca5050e13..b2864d5333 100644 --- a/pallets/treasury/src/benchmarking.rs +++ b/pallets/treasury/src/benchmarking.rs @@ -28,14 +28,14 @@ benchmarks! { let b in 1..MAX_BENEFICIARIES; let initial_balance = Pallet::::balance(); // Refill treasury - let refiller = UserBuilder::::default().balance(200u32 + REWARD * b).generate_did().build("refiller"); - Pallet::::reimbursement( refiller.origin().into(), (100 + (REWARD * b)).into()) + let refiller = UserBuilder::::default().balance(5_000 + REWARD * b).generate_did().build("refiller"); + Pallet::::reimbursement( refiller.origin().into(), (5_000 + (REWARD * b)).into()) .expect("Tresury cannot be refill"); // Create beneficiaries let beneficiaries = (0..b).map( |idx| { let user = UserBuilder::::default() - .balance(100u32) + .balance(1_000u32) .seed(idx) .generate_did() .build("beneficiary") @@ -46,12 +46,12 @@ benchmarks! { }: _(RawOrigin::Root, beneficiaries) verify { - assert_eq!(Pallet::::balance(), (initial_balance + 100u32.into())); + assert_eq!(Pallet::::balance(), (initial_balance + 5_000u32.into())); } reimbursement { let initial_balance = Pallet::::balance(); - let caller = UserBuilder::::default().balance(1_000u32).generate_did().build("caller"); + let caller = UserBuilder::::default().balance(2_000u32).generate_did().build("caller"); let amount = 500u32.into(); }: _(caller.origin(), amount) verify { diff --git a/pallets/treasury/src/lib.rs b/pallets/treasury/src/lib.rs index 8a7c6ae7b6..e7a9fbcb1b 100644 --- a/pallets/treasury/src/lib.rs +++ b/pallets/treasury/src/lib.rs @@ -36,43 +36,38 @@ #[cfg(feature = "runtime-benchmarks")] pub mod benchmarking; -use frame_support::{ - dispatch::{DispatchError, DispatchResult}, - ensure, - traits::{Currency, ExistenceRequirement, Imbalance, OnUnbalanced}, - weights::Weight, -}; +use frame_support::dispatch::DispatchResult; +use frame_support::ensure; +use frame_support::pallet_prelude::DispatchError; +use frame_support::traits::{fungible::Credit, Currency, ExistenceRequirement, OnUnbalanced}; +use frame_support::weights::Weight; use frame_system::ensure_root; -use pallet_balances::Config as BalancesConfig; -use pallet_identity as identity; -use polymesh_primitives::{constants::TREASURY_PALLET_ID, Beneficiary, IdentityId, GC_DID}; use sp_runtime::traits::{AccountIdConversion, Saturating}; use sp_std::prelude::*; +use pallet_identity as identity; +use polymesh_primitives::{constants::TREASURY_PALLET_ID, Beneficiary, IdentityId, GC_DID}; + pub type ProposalIndex = u32; type Identity = identity::Pallet; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; -type NegativeImbalanceOf = <::Currency as Currency< - ::AccountId, ->>::NegativeImbalance; pub use pallet::*; #[frame_support::pallet] pub mod pallet { use super::*; - use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; #[pallet::pallet] pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config + BalancesConfig { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; + pub trait Config: + frame_system::Config + pallet_identity::Config + pallet_balances::Config + { /// The native currency. type Currency: Currency; /// Weight information for extrinsics in the identity pallet. @@ -230,12 +225,15 @@ impl Pallet { } } -/// That trait implementation is needed to receive a portion of the fees from transactions. -impl OnUnbalanced> for Pallet { - fn on_nonzero_unbalanced(amount: NegativeImbalanceOf) { - let numeric_amount = amount.peek(); +pub type NegativeImbalanceOf = + Credit<::AccountId, ::Currency>; - let _ = T::Currency::resolve_creating(&Self::account_id(), amount); - Self::deposit_event(Event::TreasuryReimbursement(GC_DID, numeric_amount)); - } +/// That trait implementation is needed to receive a portion of the fees from transactions. +impl OnUnbalanced> for Pallet +where + T: frame_system::Config + Config, + ::Currency: + frame_support::traits::fungible::Balanced<::AccountId>, +{ + fn on_nonzero_unbalanced(_amount: NegativeImbalanceOf) {} } diff --git a/pallets/utility/Cargo.toml b/pallets/utility/Cargo.toml index 16479fe24c..fd61f01b6f 100644 --- a/pallets/utility/Cargo.toml +++ b/pallets/utility/Cargo.toml @@ -14,14 +14,14 @@ polymesh-primitives = { workspace = true, default-features = false } # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -sp-core = { version = "7.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +frame-benchmarking = { workspace = true, default-features = false, optional = true } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +sp-core = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } [features] default = ["std"] @@ -42,8 +42,9 @@ std = [ ] runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime"] diff --git a/pallets/utility/src/benchmarking.rs b/pallets/utility/src/benchmarking.rs index 8929087d48..14d5657862 100644 --- a/pallets/utility/src/benchmarking.rs +++ b/pallets/utility/src/benchmarking.rs @@ -30,7 +30,7 @@ use super::*; const SEED: u32 = 0; -fn assert_last_event(generic_event: ::RuntimeEvent) { +fn assert_last_event(generic_event: ::RuntimeEvent) { frame_system::Pallet::::assert_last_event(generic_event.into()); } diff --git a/pallets/utility/src/lib.rs b/pallets/utility/src/lib.rs index 1cad7bde13..6e9da763b2 100644 --- a/pallets/utility/src/lib.rs +++ b/pallets/utility/src/lib.rs @@ -68,13 +68,13 @@ mod benchmarking; -use codec::{Decode, Encode}; +use codec::{Decode, DecodeWithMemTracking, Encode}; use frame_support::dispatch::DispatchClass; use frame_support::dispatch::{extract_actual_weight, GetDispatchInfo, PostDispatchInfo}; -use frame_support::dispatch::{DispatchErrorWithPostInfo, DispatchResultWithPostInfo, Weight}; +use frame_support::dispatch::{DispatchErrorWithPostInfo, DispatchResultWithPostInfo}; use frame_support::ensure; -use frame_support::traits::GetCallMetadata; -use frame_support::traits::{IsSubType, OriginTrait, UnfilteredDispatchable}; +use frame_support::traits::{GetCallMetadata, IsSubType, OriginTrait, UnfilteredDispatchable}; +use frame_support::weights::Weight; use frame_system::{ensure_root, ensure_signed, RawOrigin}; use scale_info::TypeInfo; use sp_core::Get; @@ -105,7 +105,7 @@ pub trait WeightInfo { } // POLYMESH: -pub const MIN_WEIGHT: Weight = Weight::from_ref_time(1_000_000); +pub const MIN_WEIGHT: Weight = Weight::from_parts(1_000_000, 0); // POLYMESH: Used for permission checks. type CallPermissions = pallet_permissions::Pallet; @@ -117,7 +117,8 @@ pub type ErrorAt = (u32, DispatchError); /// Wraps a `Call` and provides uniqueness through a nonce /// POLYMESH: used for `relay_tx` -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] +#[derive(Clone, Eq, PartialEq, RuntimeDebug, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode)] pub struct UniqueCall { nonce: AuthorizationNonce, call: Box, @@ -148,9 +149,6 @@ pub mod pallet { /// POLYMESH: Add `IdentityConfig` and `BalancesConfig`. #[pallet::config] pub trait Config: frame_system::Config + IdentityConfig + BalancesConfig { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// The overarching call type. type RuntimeCall: Parameter + Dispatchable @@ -340,7 +338,7 @@ pub mod pallet { let dispatch_info = call.call.get_dispatch_info(); ( ::WeightInfo::relay_tx() - .saturating_add(dispatch_info.weight), + .saturating_add(dispatch_info.call_weight), dispatch_info.class, ) })] @@ -463,7 +461,7 @@ pub mod pallet { let dispatch_info = call.get_dispatch_info(); ( ::WeightInfo::dispatch_as() - .saturating_add(dispatch_info.weight), + .saturating_add(dispatch_info.call_weight), dispatch_info.class, ) })] @@ -543,13 +541,16 @@ pub mod pallet { /// /// The dispatch origin for this call must be _Root_. #[pallet::call_index(5)] - #[pallet::weight((*_weight, call.get_dispatch_info().class))] + #[pallet::weight((*weight, call.get_dispatch_info().class))] pub fn with_weight( origin: OriginFor, call: Box<::RuntimeCall>, - _weight: Weight, + weight: Weight, ) -> DispatchResultWithPostInfo { Self::ensure_root(origin)?; + + let _ = weight; // We don't check the weight witness since it is a root call. + call.dispatch_bypass_filter(frame_system::RawOrigin::Root.into()) .map_err(|e| e.error)?; Ok(().into()) @@ -567,7 +568,7 @@ pub mod pallet { ( ::WeightInfo::as_derivative() .saturating_add(T::DbWeight::get().reads_writes(1, 1)) - .saturating_add(dispatch_info.weight), + .saturating_add(dispatch_info.call_weight), dispatch_info.class, ) })] @@ -589,7 +590,7 @@ impl Pallet { (Weight::zero(), DispatchClass::Operational), |(total_weight, dispatch_class): (Weight, DispatchClass), di| { ( - total_weight.saturating_add(di.weight), + total_weight.saturating_add(di.call_weight), // If not all are `Operational`, we want to use `DispatchClass::Normal`. if di.class == DispatchClass::Normal { di.class diff --git a/pallets/validators/Cargo.toml b/pallets/validators/Cargo.toml new file mode 100644 index 0000000000..b6557ebc4f --- /dev/null +++ b/pallets/validators/Cargo.toml @@ -0,0 +1,94 @@ +[package] +name = "pallet-validators" +version = "0.1.0" +authors = ["PolymeshAssociation"] +edition = "2021" + +[dependencies] +polymesh-primitives = { workspace = true, default-features = false } +pallet-identity = { workspace = true, default-features = false } + +# Substrate staking +pallet-staking = { workspace = true, default-features = false } + +# General +static_assertions = "1.1.0" +serde = { version = "1.0.104", default-features = false, features = ["alloc", "derive"] } +log = "0.4.8" + +# Substrate +codec = { workspace = true, default-features = false, features = ["derive"] } +scale-info = { workspace = true, default-features = false, features = ["derive"] } +sp-core = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false} +sp-runtime = { workspace = true, default-features = false } +sp-arithmetic = { workspace = true, default-features = false } +sp-staking = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +frame-election-provider-support = { workspace = true, default-features = false } +sp-npos-elections = { workspace = true, default-features = false} + +pallet-session = { features = ["historical"], workspace = true, default-features = false } +pallet-authorship = { workspace = true, default-features = false } +pallet-babe = { workspace = true, default-features = false } + +# Optional imports for benchmarking +frame-benchmarking = { workspace = true, default-features = false, optional = true } +rand_chacha = { version = "0.2", default-features = false, optional = true } + +[dev-dependencies] +frame-benchmarking = { workspace = true, default-features = true } +frame-election-provider-support = { workspace = true, default-features = true } +frame-support = { features = ["experimental"], workspace = true, default-features = true } +pallet-balances = { workspace = true, default-features = true } +pallet-staking = { features = ["testing"], workspace = true, default-features = true } +pallet-staking-reward-curve = { workspace = true, default-features = true } +pallet-timestamp = { workspace = true, default-features = true } +rand_chacha = { workspace = true, default-features = true } +sp-core = { workspace = true, default-features = true } +sp-npos-elections = { workspace = true, default-features = true } +sp-tracing = { workspace = true, default-features = true } +substrate-test-utils = { workspace = true } + +[features] +default = ["std"] +no_std = [] +std = [ + "frame-benchmarking?/std", + "polymesh-primitives/std", + "serde/std", + "codec/std", + "sp-std/std", + "sp-npos-elections/std", + "sp-io/std", + "frame-support/std", + "frame-election-provider-support/std", + "sp-runtime/std", + "sp-staking/std", + "pallet-session/std", + "frame-system/std", + "pallet-authorship/std", + "pallet-identity/std", + "pallet-staking/std", + "pallet-babe/std", + "sp-arithmetic/std", + "rand_chacha", + "sp-core/std", +] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-election-provider-support/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-staking/runtime-benchmarks", + "polymesh-primitives/runtime-benchmarks", + "rand_chacha", + "sp-staking/runtime-benchmarks", +] +try-runtime = [] +testing = [ + "frame-benchmarking", + "pallet-staking/testing", + "rand_chacha", +] diff --git a/pallets/validators/src/benchmarking.rs b/pallets/validators/src/benchmarking.rs new file mode 100644 index 0000000000..76183ba2b5 --- /dev/null +++ b/pallets/validators/src/benchmarking.rs @@ -0,0 +1,242 @@ +// This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). +// Copyright (c) 2020 Polymesh Association + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3. + +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use super::*; +use testing_utils::*; + +pub use frame_benchmarking::v1::{account, benchmarks, impl_benchmark_test_suite}; +pub use frame_benchmarking::v1::{whitelist_account, whitelisted_caller}; +use frame_support::traits::fungible::Balanced; +use frame_system::RawOrigin; +use sp_runtime::traits::{One, StaticLookup}; +use sp_runtime::{Perbill, Saturating}; +use sp_staking::SessionIndex; +use sp_std::prelude::*; + +use pallet_identity::benchmarking::UserBuilder; +use pallet_staking::{CurrentEra, EraRewardPoints, ErasRewardPoints}; +use pallet_staking::{ErasValidatorReward, Nominators, RewardDestination}; +use polymesh_primitives::IdentityId; +use polymesh_primitives::Permissions; + +use crate::types::SlashingSwitch; + +pub fn get_did(who: &T::AccountId) -> IdentityId { + pallet_identity::Pallet::::get_identity(who).expect("Failed to get identity id") +} + +// This function clears all existing validators and nominators from the set, and generates one new +// validator being nominated by n nominators, and returns the validator stash account and the +// nominators' stash and controller. It also starts an era and creates pending payouts. +pub fn create_validator_with_nominators( + n: u32, + upper_bound: u32, + dead_controller: bool, + unique_controller: bool, + destination: RewardDestination, +) -> Result<(T::AccountId, Vec<(T::AccountId, T::AccountId)>), &'static str> { + // Clean up any existing state. + clear_validators_and_nominators::(); + let mut points_total = 0; + let mut points_individual = Vec::new(); + + let (v_stash, v_controller) = if unique_controller { + create_unique_stash_controller::(0, 100, destination.clone(), false)? + } else { + create_stash_controller::(0, 100, destination.clone())? + }; + + let validator_prefs = ValidatorPrefs { + commission: Perbill::from_percent(50), + ..Default::default() + }; + add_permissioned_validator_::(&v_stash); + StakingPallet::::validate(RawOrigin::Signed(v_controller).into(), validator_prefs)?; + let stash_lookup = T::Lookup::unlookup(v_stash.clone()); + + points_total += 10; + points_individual.push((v_stash.clone(), 10)); + + let original_nominator_count = Nominators::::count(); + let mut nominators = Vec::new(); + + // Give the validator n nominators, but keep total users in the system the same. + for i in 0..upper_bound { + let (n_stash, n_controller) = if !dead_controller { + create_stash_controller::(u32::MAX - i, 100, destination.clone())? + } else { + create_unique_stash_controller::(u32::MAX - i, 100, destination.clone(), true)? + }; + if i < n { + StakingPallet::::nominate( + RawOrigin::Signed(n_controller.clone()).into(), + vec![stash_lookup.clone()], + )?; + nominators.push((n_stash, n_controller)); + } + } + + ValidatorCount::::put(1); + + // Start a new Era + let new_validators = + StakingPallet::::try_trigger_new_era(SessionIndex::one(), true).unwrap(); + + assert_eq!(new_validators.len(), 1); + assert_eq!( + new_validators[0], v_stash, + "Our validator was not selected!" + ); + assert_ne!(Validators::::count(), 0); + assert_eq!( + Nominators::::count(), + original_nominator_count + nominators.len() as u32 + ); + + // Give Era Points + let reward = EraRewardPoints:: { + total: points_total, + individual: points_individual.into_iter().collect(), + }; + + let current_era = CurrentEra::::get().unwrap(); + ErasRewardPoints::::insert(current_era, reward); + + // Create reward pool + let total_payout = minimum_balance::() + .saturating_mul(upper_bound.into()) + .saturating_mul(1000u32.into()); + >::insert(current_era, total_payout); + + Ok((v_stash, nominators)) +} + +const USER_SEED: u32 = 999666; + +benchmarks! { + add_permissioned_validator { + clear_validators_and_nominators::(); + let (stash, controller) = + create_stash_controller::(1, 1, RewardDestination::Staked)?; + StakingPallet::::set_validator_count(RawOrigin::Root.into(), 10).unwrap(); + let did = get_did::(&stash); + }: _(RawOrigin::Root, did, Some(1)) + verify { + let identity_preferences = Pallet::::permissioned_identity(did); + assert!(identity_preferences.is_some()); + assert_eq!(identity_preferences.unwrap().intended_count, 1); + } + + remove_permissioned_validator { + clear_validators_and_nominators::(); + let (stash, controller) = + create_stash_controller::(1, 1, RewardDestination::Staked)?; + add_permissioned_validator_::(&stash); + let did = get_did::(&stash); + }: _(RawOrigin::Root, did) + verify { + let identity_preferences = Pallet::::permissioned_identity(did); + assert!(identity_preferences.is_none()); + } + + change_slashing_allowed_for {}: _(RawOrigin::Root, SlashingSwitch::ValidatorAndNominator) + verify { + assert_eq!(Pallet::::slashing_allowed_for(), SlashingSwitch::ValidatorAndNominator); + } + + update_permissioned_validator_intended_count { + clear_validators_and_nominators::(); + let (stash, controller) = + create_stash_controller::(1, 1, RewardDestination::Staked)?; + add_permissioned_validator_::(&stash); + let did = get_did::(&stash); + }: _(RawOrigin::Root, did, 2) + verify { + assert_eq!(Pallet::::permissioned_identity(did).unwrap().intended_count, 2); + } + + chill_from_governance { + let s in 1..100; + + let validator = create_funded_user::("validator", USER_SEED, 10_000); + + StakingPallet::::set_validator_count(RawOrigin::Root.into(), 1_000).unwrap(); + assert_eq!(StakingPallet::::validator_count(), 1_000); + + let did = get_did::(&validator); + Pallet::::add_permissioned_validator( + RawOrigin::Root.into(), + did, + Some(100) + ).unwrap(); + + whitelist_account!(validator); + + let mut signatories = Vec::new(); + for x in 0 .. s { + let key = UserBuilder::::default().seed(x).balance(10_000u32).build("key").account(); + let _ = T::Currency::issue(10_000u32.into()); + + let did = get_did::(&validator); + pallet_identity::Pallet::::unsafe_join_identity( + did, + Permissions::default(), + key.clone() + ); + StakingPallet::::bond( + RawOrigin::Signed(key.clone()).into(), + 2_000_000u32.into(), + RewardDestination::Staked + ) + .unwrap(); + whitelist_account!(key); + + StakingPallet::::validate(RawOrigin::Signed(key.clone()).into(), ValidatorPrefs::default())?; + assert_eq!(>::contains_key(&key), true); + signatories.push(key.clone()); + } + let did = get_did::(&validator); + }: _(RawOrigin::Root, did, signatories.clone()) + verify { + for key in signatories { + assert!(!>::contains_key(&key)); + } + } + + set_commission_cap { + let m in 0 .. 150; + + let mut stashes = Vec::with_capacity(m as usize); + for i in 0 .. m { + let stash = create_funded_user::("stash", i, 1000); + stashes.push(stash.clone()); + Validators::::insert( + stash, + ValidatorPrefs { + commission: Perbill::from_percent(70), + ..Default::default() + } + ); + } + }: _(RawOrigin::Root, Perbill::from_percent(50)) + verify { + stashes.iter().for_each(|s| { + assert_eq!( + StakingPallet::::validators(s), + ValidatorPrefs { commission: Perbill::from_percent(50), ..Default::default() } + ); + }); + } +} diff --git a/pallets/staking/src/inflation.rs b/pallets/validators/src/inflation.rs similarity index 100% rename from pallets/staking/src/inflation.rs rename to pallets/validators/src/inflation.rs diff --git a/pallets/validators/src/lib.rs b/pallets/validators/src/lib.rs new file mode 100644 index 0000000000..c8f89e6760 --- /dev/null +++ b/pallets/validators/src/lib.rs @@ -0,0 +1,383 @@ +// This file is part of the Polymesh distribution (https://github.com/PolymeshAssociation/Polymesh). +// Copyright (c) 2020 Polymesh Association + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3. + +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! # Permissioned Validtors Module +//! + +#![cfg_attr(not(feature = "std"), no_std)] + +extern crate alloc; + +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarking; +#[cfg(feature = "runtime-benchmarks")] +pub use pallet_staking::testing_utils; + +#[cfg(test)] +pub(crate) mod mock; +#[cfg(test)] +mod tests; + +pub mod inflation; + +pub mod permissioned; +pub use permissioned::PolymeshConvertCurve; + +pub mod types; +pub use pallet_staking::permissioned_staking::PermissionedStaking; + +use frame_support::pallet_prelude::*; +use frame_support::traits::schedule::v3::Anon as ScheduleAnon; +use frame_support::traits::{Get, IsSubType, QueryPreimage, StorePreimage}; +use frame_support::weights::Weight; +use frame_system::pallet_prelude::*; +use sp_runtime::traits::Dispatchable; +use sp_runtime::{curve::PiecewiseLinear, traits::AtLeast32BitUnsigned, Perbill, Permill}; +use sp_staking::EraIndex; +use sp_std::prelude::*; +use sp_std::vec; + +use polymesh_primitives::{IdentityId, GC_DID}; + +pub(crate) use pallet_staking::{ + ActiveEraInfo, BalanceOf, Bonded, Config as StakingConfig, EraPayout, Error as StakingError, + Ledger, MinValidatorBond, Pallet as StakingPallet, SessionInterface as _, ValidatorCount, + ValidatorPrefs, Validators, WeightInfo as _, +}; + +use types::{PermissionedIdentityPrefs, SlashingSwitch}; + +pub(crate) const LOG_TARGET: &str = "runtime::permissioned_validators"; + +// syntactic sugar for logging. +#[macro_export] +macro_rules! log { + ($level:tt, $patter:expr $(, $values:expr)* $(,)?) => { + log::$level!( + target: crate::LOG_TARGET, + concat!("[{:?}] 💸 ", $patter), >::block_number() $(, $values)* + ) + }; +} + +/// Weight functions needed for pallet_staking. +pub trait WeightInfo { + fn add_permissioned_validator() -> Weight; + fn remove_permissioned_validator() -> Weight; + fn change_slashing_allowed_for() -> Weight; + fn update_permissioned_validator_intended_count() -> Weight; + fn chill_from_governance(n: u32) -> Weight; + fn set_commission_cap(n: u32) -> Weight; +} + +mod migrations { + use super::*; + use frame_support::traits::{Get, GetStorageVersion}; + + pub fn migrate_v1() -> Weight { + let in_code = Pallet::::in_code_storage_version(); + let on_chain = Pallet::::on_chain_storage_version(); + + if on_chain == 1 && in_code == 1 { + let old_pallet = b"Staking"; + let new_pallet = Pallet::::name().as_bytes(); + // Move: PermissionedIdentity + frame_support::storage::migration::move_storage_from_pallet( + b"PermissionedIdentity", + old_pallet, + new_pallet, + ); + // Move: SlashingAllowedFor + frame_support::storage::migration::move_storage_from_pallet( + b"SlashingAllowedFor", + old_pallet, + new_pallet, + ); + // Move: ValidatorCommissionCap + frame_support::storage::migration::move_storage_from_pallet( + b"ValidatorCommissionCap", + old_pallet, + new_pallet, + ); + in_code.put::>(); + + log::info!( + target: crate::LOG_TARGET, + "Moved some storage from pallet Staking to pallet Validators", + ); + return T::DbWeight::get().reads_writes(3, 3); + } + Weight::zero() + } +} + +pub use pallet::*; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + + const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); + + #[pallet::pallet] + #[pallet::storage_version(STORAGE_VERSION)] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: + frame_system::Config + + pallet_identity::Config + + pallet_staking::Config + + pallet_babe::Config + { + /// pallet weights. + type WeightInfo: WeightInfo; + + /// Maximum amount of validators that can run by an identity. + /// It will be MaxValidatorPerIdentity * Self::validator_count(). + #[pallet::constant] + type MaxValidatorPerIdentity: Get; + + /// Maximum amount of total issuance after which fixed rewards kicks in. + #[pallet::constant] + type MaxVariableInflationTotalIssuance: Get>; + + /// Yearly total reward amount that gets distributed when fixed rewards kicks in. + #[pallet::constant] + type FixedYearlyReward: Get>; + + /// The overarching call type. + type SchedulerCall: Dispatchable + From> + IsSubType> + Clone + Encode; + + /// Overarching type of all pallets origins. + type PalletsOrigin: From>; + + /// To schedule the rewards for the stakers after the end of era. + type RewardScheduler: ScheduleAnon< + BlockNumberFor, + Self::SchedulerCall, + Self::PalletsOrigin, + Hasher = Self::Hashing, + >; + + /// Preimage provider for the scheduler. + type SchedulerPreimage: QueryPreimage + StorePreimage; + } + + /// Entities that are allowed to run operator/validator nodes. + #[pallet::storage] + #[pallet::getter(fn permissioned_identity)] + pub type PermissionedIdentity = + StorageMap<_, Twox64Concat, IdentityId, PermissionedIdentityPrefs, OptionQuery>; + + /// Slashing switch for validators & Nominators. + #[pallet::storage] + #[pallet::getter(fn slashing_allowed_for)] + pub type SlashingAllowedFor = StorageValue<_, SlashingSwitch, ValueQuery>; + + /// Allows flexibility in commission. Every validator has commission that should be in the range [0, Cap]. + #[pallet::storage] + #[pallet::getter(fn validator_commission_cap)] + pub type ValidatorCommissionCap = StorageValue<_, Perbill, ValueQuery>; + + #[pallet::genesis_config] + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + pub validators: Vec, + pub slashing_allowed_for: SlashingSwitch, + pub validator_commission_cap: Perbill, + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } + + #[pallet::genesis_build] + impl BuildGenesisConfig for GenesisConfig { + fn build(&self) { + SlashingAllowedFor::::put(self.slashing_allowed_for); + ValidatorCommissionCap::::put(self.validator_commission_cap); + + for &did in &self.validators { + crate::log!(trace, "inserting genesis permissioned validator: {:?}", did,); + if >::permissioned_identity(&did).is_none() { + // Adding identity directly in the storage by assuming it is CDD'ed + PermissionedIdentity::::insert(&did, PermissionedIdentityPrefs::new(3)); + >::deposit_event(Event::::PermissionedIdentityAdded { + governance_councill_did: GC_DID, + validators_identity: did, + }); + } + } + } + } + + #[pallet::event] + #[pallet::generate_deposit(pub(crate) fn deposit_event)] + pub enum Event { + /// User has updated their nominations. + Nominated { + nominator_identity: IdentityId, + stash: T::AccountId, + targets: Vec, + }, + /// An identity has issued a candidacy for becoming a validator. + PermissionedIdentityAdded { + governance_councill_did: IdentityId, + validators_identity: IdentityId, + }, + /// An identity has been removed from the permissioned identities pool. + PermissionedIdentityRemoved { + governance_councill_did: IdentityId, + validators_identity: IdentityId, + }, + /// Remove the nominators from the valid nominators when there CDD expired. + InvalidatedNominators { + governance_councill_did: IdentityId, + governance_councill_account: IdentityId, + expired_nominators: Vec, + }, + /// Slashing allowed has been updated. + SlashingAllowedForChanged { slashing_switch: SlashingSwitch }, + /// Reward scheduling interrupted. + RewardPaymentSchedulingInterrupted { + account_id: T::AccountId, + era: EraIndex, + error: DispatchError, + }, + /// Commission cap has been updated. + CommissionCapUpdated { + governance_councill_did: IdentityId, + old_commission_cap: Perbill, + new_commission_cap: Perbill, + }, + } + + #[pallet::error] + pub enum Error { + /// Validator or nominator stash identity does not exist. + StashIdentityDoesNotExist, + /// Validator's stash identity is not permissioned. + StashIdentityNotPermissioned, + /// Permissioned validator already exists. + IdentityIsAlreadyPermissioned, + /// Identity has not gone throught CDD. + IdentityIsMissingCDD, + /// When the intended number of validators to run is >= 2/3 of `validator_count`. + IntendedCountIsExceedingConsensusLimit, + /// Identity was not found in the permissioned identity pool. + IdentityNotFound, + /// No validator was found for the given key. + ValidatorNotFound, + /// Validator commiission is above maximum. + CommissionTooHigh, + /// New commission must be different from previous commission. + CommissionUnchanged, + } + + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + migrations::migrate_v1::() + } + } + + #[pallet::call] + impl Pallet { + /// Adds a permissioned identity and sets its preferences. + /// + /// The dispatch origin must be Root. + #[pallet::call_index(0)] + #[pallet::weight(::WeightInfo::add_permissioned_validator())] + pub fn add_permissioned_validator( + origin: OriginFor, + identity: IdentityId, + intended_count: Option, + ) -> DispatchResult { + Self::base_add_permissioned_validator(origin, identity, intended_count) + } + + /// Remove an identity from the pool of (wannabe) validator identities. Effects are known in the next session. + /// + /// The dispatch origin must be Root. + /// + /// # Arguments + /// * origin Required origin for removing a potential validator. + /// * identity Validator's IdentityId. + #[pallet::call_index(1)] + #[pallet::weight(::WeightInfo::remove_permissioned_validator())] + pub fn remove_permissioned_validator( + origin: OriginFor, + identity: IdentityId, + ) -> DispatchResult { + Self::base_remove_permissioned_validator(origin, identity) + } + + #[pallet::call_index(2)] + #[pallet::weight(::WeightInfo::payout_stakers_alive_staked(T::MaxExposurePageSize::get()))] + pub fn payout_stakers_by_system( + origin: OriginFor, + validator_stash: T::AccountId, + era: EraIndex, + ) -> DispatchResultWithPostInfo { + Self::base_payout_stakers_by_system(origin, validator_stash, era) + } + + /// Switch slashing status on the basis of given `slashing_switch`. Can only be called by root. + #[pallet::call_index(3)] + #[pallet::weight(::WeightInfo::change_slashing_allowed_for())] + pub fn change_slashing_allowed_for( + origin: OriginFor, + slashing_switch: SlashingSwitch, + ) -> DispatchResult { + Self::base_change_slashing_allowed_for(origin, slashing_switch) + } + + /// Sets the intended count to `new_intended_count` for the given `identity`. + #[pallet::call_index(4)] + #[pallet::weight(::WeightInfo::update_permissioned_validator_intended_count())] + pub fn update_permissioned_validator_intended_count( + origin: OriginFor, + identity: IdentityId, + new_intended_count: u32, + ) -> DispatchResult { + Self::base_update_permissioned_validator_intended_count( + origin, + identity, + new_intended_count, + ) + } + + /// Governance council forcefully chills a validator. Effects will be felt at the beginning of the next era. + #[pallet::call_index(5)] + #[pallet::weight(::WeightInfo::chill_from_governance(stash_keys.len() as u32))] + pub fn chill_from_governance( + origin: OriginFor, + identity: IdentityId, + stash_keys: Vec, + ) -> DispatchResult { + Self::base_chill_from_governance(origin, identity, stash_keys) + } + + /// Changes commission rate which applies to all validators. Only Governance + /// committee is allowed to change this value. + /// + /// # Arguments + /// * `new_cap` the new commission cap. + #[pallet::call_index(6)] + #[pallet::weight(::WeightInfo::set_commission_cap(150))] + pub fn set_commission_cap(origin: OriginFor, new_cap: Perbill) -> DispatchResult { + Self::base_set_commission_cap(origin, new_cap) + } + } +} diff --git a/pallets/validators/src/mock.rs b/pallets/validators/src/mock.rs new file mode 100644 index 0000000000..8a98ab73b3 --- /dev/null +++ b/pallets/validators/src/mock.rs @@ -0,0 +1,985 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Test utilities +#![cfg_attr(rustfmt, rustfmt_skip)] + +pub use pallet_staking::{self, *}; +pub use pallet_staking::weights::WeightInfo; +pub use sp_staking::{ + Exposure, IndividualExposure, StakerStatus, + EraIndex, ExposurePage, PagedExposureMetadata, SessionIndex, +}; +pub use frame_election_provider_support::ElectionProvider; +pub use sp_runtime::{Perbill}; +pub use alloc::{collections::btree_map::BTreeMap, vec, vec::Vec}; +pub use frame_support::traits::Contains; + +//use crate::{self as pallet_staking, *}; +use frame_election_provider_support::{ + bounds::{ElectionBounds, ElectionBoundsBuilder}, + onchain, BoundedSupports, SequentialPhragmen, Support, +}; +use frame_support::{ + assert_ok, derive_impl, ord_parameter_types, parameter_types, + traits::{ + ConstU64, EitherOfDiverse, FindAuthor, Get, Imbalance, OnUnbalanced, OneSessionHandler, + RewardsReporter, + }, + weights::constants::RocksDbWeight, +}; +use frame_system::{EnsureRoot, EnsureSignedBy}; +use sp_core::ConstBool; +use sp_io; +use sp_runtime::{curve::PiecewiseLinear, testing::UintAuthorityId, traits::Zero, BuildStorage}; +use sp_staking::{ + offence::{OffenceDetails, OnOffenceHandler}, + OnStakingUpdate, StakingAccount, +}; + +pub const INIT_TIMESTAMP: u64 = 30_000; +pub const BLOCK_TIME: u64 = 1000; +pub(crate) const SINGLE_PAGE: u32 = 0; + +/// The AccountId alias in this test module. +pub(crate) type AccountId = u64; +pub(crate) type BlockNumber = u64; +pub(crate) type Balance = u128; + +/// Another session handler struct to test on_disabled. +pub struct OtherSessionHandler; +impl OneSessionHandler for OtherSessionHandler { + type Key = UintAuthorityId; + + fn on_genesis_session<'a, I: 'a>(_: I) + where + I: Iterator, + AccountId: 'a, + { + } + + fn on_new_session<'a, I: 'a>(_: bool, _: I, _: I) + where + I: Iterator, + AccountId: 'a, + { + } + + fn on_disabled(_validator_index: u32) {} +} + +impl sp_runtime::BoundToRuntimeAppPublic for OtherSessionHandler { + type Public = UintAuthorityId; +} + +pub fn is_disabled(controller: AccountId) -> bool { + let stash = Ledger::::get(&controller).unwrap().stash; + let validator_index = match Session::validators().iter().position(|v| *v == stash) { + Some(index) => index as u32, + None => return false, + }; + + Session::disabled_validators().contains(&validator_index) +} + +type Block = frame_system::mocking::MockBlock; + +frame_support::construct_runtime!( + pub enum Test + { + System: frame_system, + Authorship: pallet_authorship, + Timestamp: pallet_timestamp, + Balances: pallet_balances, + Staking: pallet_staking, + Session: pallet_session, + Historical: pallet_session::historical, + } +); + +/// Author of block is always 11 +pub struct Author11; +impl FindAuthor for Author11 { + fn find_author<'a, I>(_digests: I) -> Option + where + I: 'a + IntoIterator, + { + Some(11) + } +} + +parameter_types! { + pub static SessionsPerEra: SessionIndex = 3; + pub static ExistentialDeposit: Balance = 1; + pub static SlashDeferDuration: EraIndex = 0; + pub static Period: BlockNumber = 5; + pub static Offset: BlockNumber = 0; + pub static MaxControllersInDeprecationBatch: u32 = 5900; +} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] +impl frame_system::Config for Test { + type DbWeight = RocksDbWeight; + type Block = Block; + type AccountData = pallet_balances::AccountData; +} +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] +impl pallet_balances::Config for Test { + type MaxLocks = frame_support::traits::ConstU32<1024>; + type Balance = Balance; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; +} + +sp_runtime::impl_opaque_keys! { + pub struct SessionKeys { + pub other: OtherSessionHandler, + } +} +impl pallet_session::Config for Test { + type SessionManager = pallet_session::historical::NoteHistoricalRoot; + type Keys = SessionKeys; + type ShouldEndSession = pallet_session::PeriodicSessions; + type SessionHandler = (OtherSessionHandler,); + type RuntimeEvent = RuntimeEvent; + type ValidatorId = AccountId; + type ValidatorIdOf = sp_runtime::traits::ConvertInto; + type NextSessionRotation = pallet_session::PeriodicSessions; + type DisablingStrategy = + pallet_session::disabling::UpToLimitWithReEnablingDisablingStrategy; + type WeightInfo = (); + type Currency = Balances; + type KeyDeposit = (); +} + +impl pallet_session::historical::Config for Test { + type RuntimeEvent = RuntimeEvent; + type FullIdentification = (); + type FullIdentificationOf = pallet_staking::UnitIdentificationOf; +} +impl pallet_authorship::Config for Test { + type FindAuthor = Author11; + type EventHandler = (); +} + +impl pallet_timestamp::Config for Test { + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = ConstU64<5>; + type WeightInfo = (); +} + +pallet_staking_reward_curve::build! { + const I_NPOS: PiecewiseLinear<'static> = curve!( + min_inflation: 0_025_000, + max_inflation: 0_100_000, + ideal_stake: 0_500_000, + falloff: 0_050_000, + max_piece_count: 40, + test_precision: 0_005_000, + ); +} +parameter_types! { + pub const BondingDuration: EraIndex = 3; + pub const RewardCurve: &'static PiecewiseLinear<'static> = &I_NPOS; +} + +parameter_types! { + pub static RewardRemainderUnbalanced: u128 = 0; +} + +pub struct RewardRemainderMock; + +impl OnUnbalanced> for RewardRemainderMock { + fn on_nonzero_unbalanced(amount: NegativeImbalanceOf) { + RewardRemainderUnbalanced::mutate(|v| { + *v += amount.peek(); + }); + drop(amount); + } +} + +const THRESHOLDS: [sp_npos_elections::VoteWeight; 9] = + [10, 20, 30, 40, 50, 60, 1_000, 2_000, 10_000]; + +parameter_types! { + pub static BagThresholds: &'static [sp_npos_elections::VoteWeight] = &THRESHOLDS; + pub static HistoryDepth: u32 = 80; + pub static MaxExposurePageSize: u32 = 64; + pub static MaxUnlockingChunks: u32 = 32; + pub static RewardOnUnbalanceWasCalled: bool = false; + pub static MaxValidatorSet: u32 = 100; + pub static ElectionsBounds: ElectionBounds = ElectionBoundsBuilder::default().build(); + pub static AbsoluteMaxNominations: u32 = 16; +} + +parameter_types! { + pub static MaxBackersPerWinner: u32 = 256; + pub static MaxWinnersPerPage: u32 = MaxValidatorSet::get(); +} +pub struct OnChainSeqPhragmen; +impl onchain::Config for OnChainSeqPhragmen { + type System = Test; + type Solver = SequentialPhragmen; + type DataProvider = Staking; + type WeightInfo = (); + type MaxBackersPerWinner = MaxBackersPerWinner; + type MaxWinnersPerPage = MaxWinnersPerPage; + type Bounds = ElectionsBounds; + type Sort = ConstBool; +} + +pub struct MockReward {} +impl OnUnbalanced> for MockReward { + fn on_unbalanced(_: PositiveImbalanceOf) { + RewardOnUnbalanceWasCalled::set(true); + } +} + +parameter_types! { + pub static LedgerSlashPerEra: + (BalanceOf, BTreeMap>) = + (Zero::zero(), BTreeMap::new()); + pub static SlashObserver: BTreeMap> = BTreeMap::new(); + pub static RestrictedAccounts: Vec = Vec::new(); +} + +pub struct EventListenerMock; +impl OnStakingUpdate for EventListenerMock { + fn on_slash( + pool_account: &AccountId, + slashed_bonded: Balance, + slashed_chunks: &BTreeMap, + total_slashed: Balance, + ) { + LedgerSlashPerEra::set((slashed_bonded, slashed_chunks.clone())); + SlashObserver::mutate(|map| { + map.insert(*pool_account, map.get(pool_account).unwrap_or(&0) + total_slashed) + }); + } +} + +pub struct MockedRestrictList; +impl Contains for MockedRestrictList { + fn contains(who: &AccountId) -> bool { + RestrictedAccounts::get().contains(who) + } +} + +// Disabling threshold for `UpToLimitDisablingStrategy` and +// `UpToLimitWithReEnablingDisablingStrategy`` +pub(crate) const DISABLING_LIMIT_FACTOR: usize = 3; + +#[derive_impl(pallet_staking::config_preludes::TestDefaultConfig)] +impl pallet_staking::pallet::pallet::Config for Test { + type OldCurrency = Balances; + type Currency = Balances; + type UnixTime = Timestamp; + type RewardRemainder = RewardRemainderMock; + type Reward = MockReward; + type SessionsPerEra = SessionsPerEra; + type SlashDeferDuration = SlashDeferDuration; + type AdminOrigin = EnsureOneOrRoot; + type SessionInterface = Self; + type EraPayout = ConvertCurve; + type NextNewSession = Session; + type MaxExposurePageSize = MaxExposurePageSize; + type MaxValidatorSet = MaxValidatorSet; + type ElectionProvider = onchain::OnChainExecution; + type GenesisElectionProvider = Self::ElectionProvider; + // NOTE: consider a macro and use `UseNominatorsAndValidatorsMap` as well. + type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; + type TargetList = UseValidatorsMap; + type NominationsQuota = WeightedNominationsQuota<16>; + type MaxUnlockingChunks = MaxUnlockingChunks; + type HistoryDepth = HistoryDepth; + type MaxControllersInDeprecationBatch = MaxControllersInDeprecationBatch; + type EventListeners = EventListenerMock; + type Filter = MockedRestrictList; +} + +pub struct WeightedNominationsQuota; +impl NominationsQuota for WeightedNominationsQuota +where + u128: From, +{ + type MaxNominations = AbsoluteMaxNominations; + + fn curve(balance: Balance) -> u32 { + match balance.into() { + // random curve for testing. + 0..=110 => MAX, + 111 => 0, + 222 => 2, + 333 => MAX + 10, + _ => MAX, + } + } +} + +pub(crate) type StakingCall = pallet_staking::Call; +pub(crate) type TestCall = ::RuntimeCall; + +parameter_types! { + // if true, skips the try-state for the test running. + pub static SkipTryStateCheck: bool = false; +} + +pub struct ExtBuilder { + nominate: bool, + validator_count: u32, + minimum_validator_count: u32, + invulnerables: Vec, + has_stakers: bool, + initialize_first_session: bool, + pub min_nominator_bond: Balance, + min_validator_bond: Balance, + balance_factor: Balance, + status: BTreeMap>, + stakes: BTreeMap, + stakers: Vec<(AccountId, AccountId, Balance, StakerStatus)>, +} + +impl Default for ExtBuilder { + fn default() -> Self { + Self { + nominate: true, + validator_count: 2, + minimum_validator_count: 0, + balance_factor: 1, + invulnerables: vec![], + has_stakers: true, + initialize_first_session: true, + min_nominator_bond: ExistentialDeposit::get(), + min_validator_bond: ExistentialDeposit::get(), + status: Default::default(), + stakes: Default::default(), + stakers: Default::default(), + } + } +} + +impl ExtBuilder { + pub fn existential_deposit(self, existential_deposit: Balance) -> Self { + EXISTENTIAL_DEPOSIT.with(|v| *v.borrow_mut() = existential_deposit); + self + } + pub fn nominate(mut self, nominate: bool) -> Self { + self.nominate = nominate; + self + } + pub fn validator_count(mut self, count: u32) -> Self { + self.validator_count = count; + self + } + pub fn minimum_validator_count(mut self, count: u32) -> Self { + self.minimum_validator_count = count; + self + } + pub fn slash_defer_duration(self, eras: EraIndex) -> Self { + SLASH_DEFER_DURATION.with(|v| *v.borrow_mut() = eras); + self + } + pub fn invulnerables(mut self, invulnerables: Vec) -> Self { + self.invulnerables = invulnerables; + self + } + pub fn session_per_era(self, length: SessionIndex) -> Self { + SESSIONS_PER_ERA.with(|v| *v.borrow_mut() = length); + self + } + pub fn period(self, length: BlockNumber) -> Self { + PERIOD.with(|v| *v.borrow_mut() = length); + self + } + pub fn has_stakers(mut self, has: bool) -> Self { + self.has_stakers = has; + self + } + pub fn initialize_first_session(mut self, init: bool) -> Self { + self.initialize_first_session = init; + self + } + pub fn offset(self, offset: BlockNumber) -> Self { + OFFSET.with(|v| *v.borrow_mut() = offset); + self + } + pub fn min_nominator_bond(mut self, amount: Balance) -> Self { + self.min_nominator_bond = amount; + self + } + pub fn min_validator_bond(mut self, amount: Balance) -> Self { + self.min_validator_bond = amount; + self + } + pub fn set_status(mut self, who: AccountId, status: StakerStatus) -> Self { + self.status.insert(who, status); + self + } + pub fn set_stake(mut self, who: AccountId, stake: Balance) -> Self { + self.stakes.insert(who, stake); + self + } + pub fn add_staker( + mut self, + stash: AccountId, + ctrl: AccountId, + stake: Balance, + status: StakerStatus, + ) -> Self { + self.stakers.push((stash, ctrl, stake, status)); + self + } + pub fn balance_factor(mut self, factor: Balance) -> Self { + self.balance_factor = factor; + self + } + pub fn try_state(self, enable: bool) -> Self { + SkipTryStateCheck::set(!enable); + self + } + fn build(self) -> sp_io::TestExternalities { + sp_tracing::try_init_simple(); + let mut storage = frame_system::GenesisConfig::::default().build_storage().unwrap(); + let ed = ExistentialDeposit::get(); + + let _ = pallet_balances::GenesisConfig:: { + balances: vec![ + (1, 10 * self.balance_factor), + (2, 20 * self.balance_factor), + (3, 300 * self.balance_factor), + (4, 400 * self.balance_factor), + // controllers (still used in some tests. Soon to be deprecated). + (10, self.balance_factor), + (20, self.balance_factor), + (30, self.balance_factor), + (40, self.balance_factor), + (50, self.balance_factor), + // stashes + // Note: Previously this pallet used locks and stakers could stake all their + // balance including ED. Now with holds, stakers are required to maintain + // (non-staked) ED in their accounts. Therefore, we drop an additional existential + // deposit to genesis stakers. + (11, self.balance_factor * 1000 + ed), + (21, self.balance_factor * 2000 + ed), + (31, self.balance_factor * 2000 + ed), + (41, self.balance_factor * 2000 + ed), + (51, self.balance_factor * 2000 + ed), + (201, self.balance_factor * 2000 + ed), + (202, self.balance_factor * 2000 + ed), + // optional nominator + (100, self.balance_factor * 2000 + ed), + (101, self.balance_factor * 2000 + ed), + // aux accounts + (60, self.balance_factor), + (61, self.balance_factor * 2000 + ed), + (70, self.balance_factor), + (71, self.balance_factor * 2000), + (80, self.balance_factor), + (81, self.balance_factor * 2000), + // This allows us to have a total_payout different from 0. + (999, 1_000_000_000_000), + ], + ..Default::default() + } + .assimilate_storage(&mut storage); + + let mut stakers = vec![]; + if self.has_stakers { + stakers = vec![ + // (stash, ctrl, stake, status) + // these two will be elected in the default test where we elect 2. + (11, 11, self.balance_factor * 1000, StakerStatus::::Validator), + (21, 21, self.balance_factor * 1000, StakerStatus::::Validator), + // a loser validator + (31, 31, self.balance_factor * 500, StakerStatus::::Validator), + // an idle validator + (41, 41, self.balance_factor * 1000, StakerStatus::::Idle), + (51, 51, self.balance_factor * 1000, StakerStatus::::Idle), + (201, 201, self.balance_factor * 1000, StakerStatus::::Idle), + (202, 202, self.balance_factor * 1000, StakerStatus::::Idle), + ]; // optionally add a nominator + if self.nominate { + stakers.push(( + 101, + 101, + self.balance_factor * 500, + StakerStatus::::Nominator(vec![11, 21]), + )) + } + // replace any of the status if needed. + self.status.into_iter().for_each(|(stash, status)| { + let (_, _, _, ref mut prev_status) = stakers + .iter_mut() + .find(|s| s.0 == stash) + .expect("set_status staker should exist; qed"); + *prev_status = status; + }); + // replaced any of the stakes if needed. + self.stakes.into_iter().for_each(|(stash, stake)| { + let (_, _, ref mut prev_stake, _) = stakers + .iter_mut() + .find(|s| s.0 == stash) + .expect("set_stake staker should exits; qed."); + *prev_stake = stake; + }); + // extend stakers if needed. + stakers.extend(self.stakers) + } + + let _ = pallet_staking::GenesisConfig:: { + stakers: stakers.clone(), + validator_count: self.validator_count, + minimum_validator_count: self.minimum_validator_count, + invulnerables: self.invulnerables, + slash_reward_fraction: Perbill::from_percent(10), + min_nominator_bond: self.min_nominator_bond, + min_validator_bond: self.min_validator_bond, + ..Default::default() + } + .assimilate_storage(&mut storage); + + let _ = pallet_session::GenesisConfig:: { + keys: if self.has_stakers { + // set the keys for the first session. + stakers + .into_iter() + .map(|(id, ..)| (id, id, SessionKeys { other: id.into() })) + .collect() + } else { + // set some dummy validators in genesis. + (0..self.validator_count as u64) + .map(|id| (id, id, SessionKeys { other: id.into() })) + .collect() + }, + ..Default::default() + } + .assimilate_storage(&mut storage); + + let mut ext = sp_io::TestExternalities::from(storage); + + if self.initialize_first_session { + ext.execute_with(|| { + run_to_block(1); + + // Force reset the timestamp to the initial timestamp for easy testing. + Timestamp::set_timestamp(INIT_TIMESTAMP); + }); + } + + ext + } + pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + sp_tracing::try_init_simple(); + let mut ext = self.build(); + ext.execute_with(test); + ext.execute_with(|| { + if !SkipTryStateCheck::get() { + Staking::do_try_state(System::block_number()).unwrap(); + } + }); + } +} + +pub(crate) fn active_era() -> EraIndex { + pallet_staking::ActiveEra::::get().unwrap().index +} + +pub(crate) fn current_era() -> EraIndex { + pallet_staking::CurrentEra::::get().unwrap() +} + +pub(crate) fn bond(who: AccountId, val: Balance) { + let _ = asset::set_stakeable_balance::(&who, val); + assert_ok!(Staking::bond(RuntimeOrigin::signed(who), val, RewardDestination::Stash)); +} + +pub(crate) fn bond_validator(who: AccountId, val: Balance) { + bond(who, val); + assert_ok!(Staking::validate(RuntimeOrigin::signed(who), ValidatorPrefs::default())); + assert_ok!(Session::set_keys( + RuntimeOrigin::signed(who), + SessionKeys { other: who.into() }, + vec![] + )); +} + +pub(crate) fn bond_nominator(who: AccountId, val: Balance, target: Vec) { + bond(who, val); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(who), target)); +} + +pub(crate) fn bond_virtual_nominator( + who: AccountId, + payee: AccountId, + val: Balance, + target: Vec, +) { + // Bond who virtually. + assert_ok!(::virtual_bond(&who, val, &payee)); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(who), target)); +} + +/// Progress to the given block, triggering session and era changes as we progress. +/// +/// This will finalize the previous block, initialize up to the given block, essentially simulating +/// a block import/propose process where we first initialize the block, then execute some stuff (not +/// in the function), and then finalize the block. +pub(crate) fn run_to_block(n: BlockNumber) { + System::run_to_block_with::( + n, + frame_system::RunToBlockHooks::default().after_initialize(|bn| { + Timestamp::set_timestamp(bn * BLOCK_TIME + INIT_TIMESTAMP); + }), + ); +} + +/// Progresses from the current block number (whatever that may be) to the `P * session_index + 1`. +pub(crate) fn start_session(end_session_idx: SessionIndex) { + let period = Period::get(); + let end: u64 = if Offset::get().is_zero() { + (end_session_idx as u64) * period + } else { + Offset::get() + (end_session_idx.saturating_sub(1) as u64) * period + }; + + run_to_block(end); + + let curr_session_idx = Session::current_index(); + + // session must have progressed properly. + assert_eq!( + curr_session_idx, end_session_idx, + "current session index = {curr_session_idx}, expected = {end_session_idx}", + ); +} + +/// Go one session forward. +pub(crate) fn advance_session() { + let current_index = Session::current_index(); + start_session(current_index + 1); +} + +/// Progress until the given era. +pub(crate) fn start_active_era(era_index: EraIndex) { + start_session((era_index * >::get()).into()); + assert_eq!(active_era(), era_index); + // One way or another, current_era must have changed before the active era, so they must match + // at this point. + assert_eq!(current_era(), active_era()); +} + +pub(crate) fn current_total_payout_for_duration(duration: u64) -> Balance { + let (payout, _rest) = ::EraPayout::era_payout( + pallet_staking::ErasTotalStake::::get(active_era()), + pallet_balances::TotalIssuance::::get(), + duration, + ); + assert!(payout > 0); + payout +} + +pub(crate) fn maximum_payout_for_duration(duration: u64) -> Balance { + let (payout, rest) = ::EraPayout::era_payout( + pallet_staking::ErasTotalStake::::get(active_era()), + pallet_balances::TotalIssuance::::get(), + duration, + ); + payout + rest +} + +/// Time it takes to finish a session. +/// +/// Note, if you see `time_per_session() - BLOCK_TIME`, it is fine. This is because we set the +/// timestamp after on_initialize, so the timestamp is always one block old. +pub(crate) fn time_per_session() -> u64 { + Period::get() * BLOCK_TIME +} + +/// Time it takes to finish an era. +/// +/// Note, if you see `time_per_era() - BLOCK_TIME`, it is fine. This is because we set the +/// timestamp after on_initialize, so the timestamp is always one block old. +pub(crate) fn time_per_era() -> u64 { + time_per_session() * SessionsPerEra::get() as u64 +} + +/// Time that will be calculated for the reward per era. +pub(crate) fn reward_time_per_era() -> u64 { + time_per_era() - BLOCK_TIME +} + +pub(crate) fn reward_all_elected() { + let rewards = ::SessionInterface::validators().into_iter().map(|v| (v, 1)); + + >::reward_by_ids(rewards) +} + +pub(crate) fn validator_controllers() -> Vec { + Session::validators() + .into_iter() + .map(|s| Staking::bonded(&s).expect("no controller for validator")) + .collect() +} + +pub(crate) fn on_offence_in_era( + offenders: &[OffenceDetails< + AccountId, + pallet_session::historical::IdentificationTuple, + >], + slash_fraction: &[Perbill], + era: EraIndex, +) { + let bonded_eras = pallet_staking::BondedEras::::get(); + for &(bonded_era, start_session) in bonded_eras.iter() { + if bonded_era == era { + let _ = >::on_offence( + offenders, + slash_fraction, + start_session, + ); + return + } else if bonded_era > era { + break + } + } + + if pallet_staking::ActiveEra::::get().unwrap().index == era { + let _ = >::on_offence( + offenders, + slash_fraction, + pallet_staking::ErasStartSessionIndex::::get(era).unwrap(), + ); + } else { + panic!("cannot slash in era {}", era); + } +} + +pub(crate) fn on_offence_now( + offenders: &[OffenceDetails< + AccountId, + pallet_session::historical::IdentificationTuple, + >], + slash_fraction: &[Perbill], +) { + let now = pallet_staking::ActiveEra::::get().unwrap().index; + on_offence_in_era(offenders, slash_fraction, now) +} + +pub(crate) fn offence_from( + offender: AccountId, + reporter: Option>, +) -> OffenceDetails> { + OffenceDetails { offender: (offender, ()), reporters: reporter.unwrap_or_default() } +} + +pub(crate) fn add_slash(who: &AccountId) { + on_offence_now(&[offence_from(*who, None)], &[Perbill::from_percent(10)]); +} + +/// Make all validator and nominator request their payment +pub(crate) fn make_all_reward_payment(era: EraIndex) { + let validators_with_reward = ErasRewardPoints::::get(era) + .individual + .keys() + .cloned() + .collect::>(); + + // reward validators + for validator_controller in validators_with_reward.iter().filter_map(Staking::bonded) { + let ledger = >::get(&validator_controller).unwrap(); + for page in 0..EraInfo::::get_page_count(era, &ledger.stash) { + assert_ok!(Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + ledger.stash, + era, + page + )); + } + } +} + +pub(crate) fn bond_controller_stash(controller: AccountId, stash: AccountId) -> Result<(), String> { + >::get(&stash).map_or(Ok(()), |_| Err("stash already bonded"))?; + >::get(&controller).map_or(Ok(()), |_| Err("controller already bonded"))?; + + >::insert(stash, controller); + >::insert(controller, StakingLedger::::default_from(stash)); + + Ok(()) +} + +// simulates `set_controller` without corrupted ledger checks for testing purposes. +pub(crate) fn set_controller_no_checks(stash: &AccountId) { + let controller = Bonded::::get(stash).expect("testing stash should be bonded"); + let ledger = Ledger::::get(&controller).expect("testing ledger should exist"); + + Ledger::::remove(&controller); + Ledger::::insert(stash, ledger); + Bonded::::insert(stash, stash); +} + +// simulates `bond_extra` without corrupted ledger checks for testing purposes. +pub(crate) fn bond_extra_no_checks(stash: &AccountId, amount: Balance) { + let controller = Bonded::::get(stash).expect("bond must exist to bond_extra"); + let mut ledger = Ledger::::get(&controller).expect("ledger must exist to bond_extra"); + + let new_total = ledger.total + amount; + let _ = asset::update_stake::(stash, new_total); + ledger.total = new_total; + ledger.active = new_total; + Ledger::::insert(controller, ledger); +} + +pub(crate) fn setup_double_bonded_ledgers() { + let init_ledgers = Ledger::::iter().count(); + + let _ = asset::set_stakeable_balance::(&333, 2000); + let _ = asset::set_stakeable_balance::(&444, 2000); + let _ = asset::set_stakeable_balance::(&555, 2000); + let _ = asset::set_stakeable_balance::(&777, 2000); + + assert_ok!(Staking::bond(RuntimeOrigin::signed(333), 10, RewardDestination::Staked)); + assert_ok!(Staking::bond(RuntimeOrigin::signed(444), 20, RewardDestination::Staked)); + assert_ok!(Staking::bond(RuntimeOrigin::signed(555), 20, RewardDestination::Staked)); + // not relevant to the test case, but ensures try-runtime checks pass. + [333, 444, 555] + .iter() + .for_each(|s| Payee::::insert(s, RewardDestination::Staked)); + + // we want to test the case where a controller can also be a stash of another ledger. + // for that, we change the controller/stash bonding so that: + // * 444 becomes controller of 333. + // * 555 becomes controller of 444. + // * 777 becomes controller of 555. + let ledger_333 = Ledger::::get(333).unwrap(); + let ledger_444 = Ledger::::get(444).unwrap(); + let ledger_555 = Ledger::::get(555).unwrap(); + + // 777 becomes controller of 555. + Bonded::::mutate(555, |controller| *controller = Some(777)); + Ledger::::insert(777, ledger_555); + + // 555 becomes controller of 444. + Bonded::::mutate(444, |controller| *controller = Some(555)); + Ledger::::insert(555, ledger_444); + + // 444 becomes controller of 333. + Bonded::::mutate(333, |controller| *controller = Some(444)); + Ledger::::insert(444, ledger_333); + + // 333 is not controller anymore. + Ledger::::remove(333); + + // checks. now we have: + // * +3 ledgers + assert_eq!(Ledger::::iter().count(), 3 + init_ledgers); + + // * stash 333 has controller 444. + assert_eq!(Bonded::::get(333), Some(444)); + assert_eq!(StakingLedger::::paired_account(StakingAccount::Stash(333)), Some(444)); + assert_eq!(Ledger::::get(444).unwrap().stash, 333); + + // * stash 444 has controller 555. + assert_eq!(Bonded::::get(444), Some(555)); + assert_eq!(StakingLedger::::paired_account(StakingAccount::Stash(444)), Some(555)); + assert_eq!(Ledger::::get(555).unwrap().stash, 444); + + // * stash 555 has controller 777. + assert_eq!(Bonded::::get(555), Some(777)); + assert_eq!(StakingLedger::::paired_account(StakingAccount::Stash(555)), Some(777)); + assert_eq!(Ledger::::get(777).unwrap().stash, 555); +} + +#[macro_export] +macro_rules! assert_session_era { + ($session:expr, $era:expr) => { + assert_eq!( + Session::current_index(), + $session, + "wrong session {} != {}", + Session::current_index(), + $session, + ); + assert_eq!( + CurrentEra::::get().unwrap(), + $era, + "wrong current era {} != {}", + CurrentEra::::get().unwrap(), + $era, + ); + }; +} + +pub(crate) fn staking_events() -> Vec> { + System::events() + .into_iter() + .map(|r| r.event) + .filter_map(|e| if let RuntimeEvent::Staking(inner) = e { Some(inner) } else { None }) + .collect() +} + +pub(crate) fn session_events() -> Vec> { + System::events() + .into_iter() + .map(|r| r.event) + .filter_map(|e| if let RuntimeEvent::Session(inner) = e { Some(inner) } else { None }) + .collect() +} + +parameter_types! { + static StakingEventsIndex: usize = 0; +} +ord_parameter_types! { + pub const One: u64 = 1; +} + +type EnsureOneOrRoot = EitherOfDiverse, EnsureSignedBy>; + +pub(crate) fn staking_events_since_last_call() -> Vec> { + let all: Vec<_> = System::events() + .into_iter() + .filter_map(|r| if let RuntimeEvent::Staking(inner) = r.event { Some(inner) } else { None }) + .collect(); + let seen = StakingEventsIndex::get(); + StakingEventsIndex::set(all.len()); + all.into_iter().skip(seen).collect() +} + +pub(crate) fn balances(who: &AccountId) -> (Balance, Balance) { + (asset::stakeable_balance::(who), Balances::reserved_balance(who)) +} + +pub(crate) fn restrict(who: &AccountId) { + if !RestrictedAccounts::get().contains(who) { + RestrictedAccounts::mutate(|l| l.push(*who)); + } +} + +pub(crate) fn remove_from_restrict_list(who: &AccountId) { + RestrictedAccounts::mutate(|l| l.retain(|x| x != who)); +} + +pub(crate) fn to_bounded_supports( + supports: Vec<(AccountId, Support)>, +) -> BoundedSupports< + AccountId, + <::ElectionProvider as ElectionProvider>::MaxWinnersPerPage, + <::ElectionProvider as ElectionProvider>::MaxBackersPerWinner, +> { + supports.try_into().unwrap() +} diff --git a/pallets/validators/src/permissioned.rs b/pallets/validators/src/permissioned.rs new file mode 100644 index 0000000000..6bacaeab5b --- /dev/null +++ b/pallets/validators/src/permissioned.rs @@ -0,0 +1,395 @@ +use frame_support::traits::fungible::Inspect; +use frame_support::traits::schedule::v3::Anon as ScheduleAnon; +use frame_support::traits::schedule::{DispatchTime, HIGHEST_PRIORITY}; +use frame_support::{pallet_prelude::*, traits::Get}; +use frame_system::RawOrigin; +use frame_system::{ensure_root, pallet_prelude::*}; +use sp_runtime::traits::SaturatedConversion; +use sp_std::prelude::*; + +use polymesh_primitives::IdentityId; +use polymesh_primitives::GC_DID; +#[cfg(feature = "runtime-benchmarks")] +use polymesh_primitives::{traits::IdentityFnTrait, AuthorizationData, Permissions, Signatory}; + +use pallet_staking::permissioned_staking::{PermissionedStaking, WhoToSlash}; + +use crate::types::{PermissionedIdentityPrefs, SlashingSwitch}; +use crate::*; + +/// Adaptor to turn a `PiecewiseLinear` curve definition into an `EraPayout` impl, used for +/// backwards compatibility. +pub struct PolymeshConvertCurve(sp_std::marker::PhantomData<(T, C)>); + +impl< + Balance: AtLeast32BitUnsigned + Clone, + T: Config, + C: Get<&'static PiecewiseLinear<'static>>, + > EraPayout for PolymeshConvertCurve +{ + fn era_payout( + total_staked: Balance, + total_issuance: Balance, + era_duration_millis: u64, + ) -> (Balance, Balance) { + let (validator_payout, max_payout) = inflation::compute_total_payout( + C::get(), + total_staked, + total_issuance, + // Duration of era; more than u64::MAX is rewarded as u64::MAX. + era_duration_millis, + T::MaxVariableInflationTotalIssuance::get(), + T::FixedYearlyReward::get(), + ); + let rest = max_payout.saturating_sub(validator_payout.clone()); + (validator_payout, rest) + } +} + +impl PermissionedStaking for Pallet { + /// Onboard an account. + #[cfg(feature = "runtime-benchmarks")] + fn onboard_account(who: &T::AccountId) { + let _ = T::IdentityFn::testing_cdd_register_did(who.clone(), vec![]); + } + + /// Permission a validator. + #[cfg(feature = "runtime-benchmarks")] + fn permission_validator(stash: &T::AccountId) { + let _ = Pallet::::set_commission_cap(RawOrigin::Root.into(), Perbill::from_percent(99)); + let did = + pallet_identity::Pallet::::get_identity(stash).expect("Failed to get identity"); + Pallet::::add_permissioned_validator(RawOrigin::Root.into(), did, Some(2)) + .expect("Failed to add permissioned validator"); + } + + /// Setup stash and controller. + #[cfg(feature = "runtime-benchmarks")] + fn setup_stash_and_controller(stash: &T::AccountId, controller: &T::AccountId) { + let did = + pallet_identity::Pallet::::get_identity(stash).expect("Failed to get identity"); + let auth_id = pallet_identity::Pallet::::add_auth( + did, + Signatory::Account(controller.clone()), + AuthorizationData::JoinIdentity(Permissions::default()), + None, + ) + .expect("Failed to add auth"); + pallet_identity::Pallet::::join_identity_as_key( + RawOrigin::Signed(controller.clone()).into(), + auth_id, + ) + .expect("Failed to join identity as key"); + } + + #[cfg(feature = "runtime-benchmarks")] + fn setup_who_to_slash(who_to_slash: Option) { + match who_to_slash { + Some(WhoToSlash::ValidatorAndNominator) => { + SlashingAllowedFor::::put(SlashingSwitch::ValidatorAndNominator) + } + Some(WhoToSlash::Validator) => SlashingAllowedFor::::put(SlashingSwitch::Validator), + None => SlashingAllowedFor::::put(SlashingSwitch::None), + } + } + + /// Check if amount is under the existential deposit. + fn reapable(amount: BalanceOf) -> bool { + amount <= T::Currency::minimum_balance() + } + + fn on_validate(stash: &T::AccountId, commission: Perbill) -> DispatchResult { + // ensure their commission is correct. + ensure!( + commission <= ValidatorCommissionCap::::get(), + Error::::CommissionTooHigh + ); + + let stash_did = pallet_identity::Pallet::::get_identity(stash) + .ok_or(Error::::StashIdentityDoesNotExist)?; + let mut stash_did_prefs = PermissionedIdentity::::get(stash_did) + .ok_or(Error::::StashIdentityNotPermissioned)?; + + // Ensure the identity doesn't run more validators than the intended count + ensure!( + stash_did_prefs.running_count < stash_did_prefs.intended_count, + StakingError::::TooManyValidators + ); + stash_did_prefs.running_count += 1; + pallet_identity::Pallet::::add_account_key_ref_count(&stash); + PermissionedIdentity::::insert(stash_did, stash_did_prefs); + + Ok(()) + } + + /// On chill hook. + fn on_chill(stash: &T::AccountId) { + Self::release_running_validator(stash); + } + + /// On nominate hook. + fn on_nominate(stash: &T::AccountId) -> DispatchResult { + Self::release_running_validator(stash); + Ok(()) + } + + /// Returns `true` if `stash` has a valid cdd claim and is permissioned. Otherwise, returns `false`. + fn is_validator_compliant(stash: &T::AccountId) -> bool { + pallet_identity::Pallet::::get_identity(stash).map_or(false, |id| { + pallet_identity::Pallet::::has_valid_cdd(id) + && PermissionedIdentity::::get(id).is_some() + && Self::is_validator_active_balance_valid(stash) + }) + } + + /// Returns `true` if `who` has a valid cdd claim. Otherwise, returns `false`. + fn is_nominator_compliant(_who: &T::AccountId) -> bool { + true + } + + /// Schedule reward payouts. + fn schedule_payouts(active_era: &ActiveEraInfo) -> DispatchResult { + let next_block_number = >::block_number() + 1u32.into(); + for (index, validator_id) in ::SessionInterface::validators() + .into_iter() + .enumerate() + { + let schedule_block_number = + next_block_number + index.saturated_into::>(); + + let scheduler_call = + ::SchedulerCall::from(Call::::payout_stakers_by_system { + validator_stash: validator_id.clone(), + era: active_era.index, + }); + + let payout_call = ::SchedulerPreimage::bound(scheduler_call)?; + + match T::RewardScheduler::schedule( + DispatchTime::At(schedule_block_number), + None, + HIGHEST_PRIORITY, + RawOrigin::Root.into(), + payout_call + ) { + Ok(_) => log!( + info, + "💸 Rewards are successfully scheduled for validator id: {:?} at block number: {:?}", + &validator_id, + schedule_block_number, + ), + Err(error) => { + log!( + error, + "⛔ Detected error in scheduling the reward payment: {:?}", + error + ); + Pallet::::deposit_event(Event::::RewardPaymentSchedulingInterrupted { + account_id: validator_id, + era: active_era.index, + error + }); + } + } + } + + Ok(()) + } + + /// Who should be slashed? + /// Returns `None` if no one should be slashed. + fn who_to_slash() -> Option { + SlashingAllowedFor::::get().into() + } +} + +impl Pallet { + /// Returns `true` if active balance is above [`MinValidatorBond`]. Otherwise, returns `false`. + pub(crate) fn is_validator_active_balance_valid(who: &T::AccountId) -> bool { + if let Some(controller) = Bonded::::get(&who) { + if let Some(ledger) = Ledger::::get(&controller) { + return ledger.active >= MinValidatorBond::::get(); + } + } + false + } + + /// Decrease the running count of validators by 1 for the stash identity. + pub(crate) fn release_running_validator(stash: &T::AccountId) { + if !>::contains_key(stash) { + return; + } + + if let Some(did) = pallet_identity::Pallet::::get_identity(stash) { + PermissionedIdentity::::mutate(&did, |preferences| { + if let Some(p) = preferences { + if p.running_count > 0 { + p.running_count -= 1; + } + } + }); + pallet_identity::Pallet::::remove_account_key_ref_count(&stash); + } + } + + /// Returns the maximum number of validators per identiy + pub fn maximum_number_of_validators_per_identity() -> u32 { + (T::MaxValidatorPerIdentity::get() * ValidatorCount::::get()).max(1) + } + + pub(crate) fn base_add_permissioned_validator( + origin: OriginFor, + identity: IdentityId, + intended_count: Option, + ) -> DispatchResult { + T::AdminOrigin::ensure_origin(origin)?; + + ensure!( + Self::permissioned_identity(&identity).is_none(), + Error::::IdentityIsAlreadyPermissioned + ); + + ensure!( + pallet_identity::Pallet::::has_valid_cdd(identity), + Error::::IdentityIsMissingCDD + ); + + match intended_count { + Some(intended_count) => { + ensure!( + intended_count < Self::maximum_number_of_validators_per_identity(), + Error::::IntendedCountIsExceedingConsensusLimit + ); + PermissionedIdentity::::insert( + &identity, + PermissionedIdentityPrefs::new(intended_count), + ); + } + None => { + PermissionedIdentity::::insert(&identity, PermissionedIdentityPrefs::default()); + } + } + + Pallet::::deposit_event(Event::::PermissionedIdentityAdded { + governance_councill_did: GC_DID, + validators_identity: identity, + }); + Ok(()) + } + + pub(crate) fn base_remove_permissioned_validator( + origin: OriginFor, + identity: IdentityId, + ) -> DispatchResult { + T::AdminOrigin::ensure_origin(origin)?; + + ensure!( + Self::permissioned_identity(&identity).is_some(), + Error::::IdentityNotFound + ); + + PermissionedIdentity::::remove(&identity); + + Pallet::::deposit_event(Event::::PermissionedIdentityRemoved { + governance_councill_did: GC_DID, + validators_identity: identity, + }); + Ok(()) + } + + pub(crate) fn base_payout_stakers_by_system( + origin: OriginFor, + validator_stash: T::AccountId, + era: EraIndex, + ) -> DispatchResultWithPostInfo { + ensure_root(origin)?; + StakingPallet::::do_payout_stakers(validator_stash, era) + } + + pub(crate) fn base_change_slashing_allowed_for( + origin: OriginFor, + slashing_switch: SlashingSwitch, + ) -> DispatchResult { + ensure_root(origin)?; + SlashingAllowedFor::::put(slashing_switch); + Pallet::::deposit_event(Event::::SlashingAllowedForChanged { slashing_switch }); + Ok(()) + } + + pub(crate) fn base_update_permissioned_validator_intended_count( + origin: OriginFor, + identity: IdentityId, + new_intended_count: u32, + ) -> DispatchResult { + T::AdminOrigin::ensure_origin(origin)?; + + ensure!( + Self::maximum_number_of_validators_per_identity() > new_intended_count, + Error::::IntendedCountIsExceedingConsensusLimit + ); + + PermissionedIdentity::::try_mutate(&identity, |pref| { + pref.as_mut() + .ok_or_else(|| Error::::IdentityNotFound.into()) + .map(|p| p.intended_count = new_intended_count) + }) + } + + pub(crate) fn base_set_commission_cap( + origin: OriginFor, + new_cap: Perbill, + ) -> DispatchResult { + T::AdminOrigin::ensure_origin(origin.clone())?; + + // Update the cap, assuming it changed, or error. + let old_cap = ValidatorCommissionCap::::try_mutate(|cap| -> Result<_, DispatchError> { + ensure!(*cap != new_cap, Error::::CommissionUnchanged); + Ok(core::mem::replace(cap, new_cap)) + })?; + + // Update `commission` in each validator prefs to `min(comission, new_cap)`. + >::translate(|_, mut prefs: ValidatorPrefs| { + prefs.commission = prefs.commission.min(new_cap); + Some(prefs) + }); + + Pallet::::deposit_event(Event::::CommissionCapUpdated { + governance_councill_did: GC_DID, + old_commission_cap: old_cap, + new_commission_cap: new_cap, + }); + + Ok(()) + } + pub(crate) fn base_chill_from_governance( + origin: T::RuntimeOrigin, + identity: IdentityId, + stash_keys: Vec, + ) -> DispatchResult { + T::AdminOrigin::ensure_origin(origin)?; + + for key in &stash_keys { + let key_did = pallet_identity::Pallet::::get_identity(&key); + // Checks if the stash key identity is the same as the identity given. + ensure!(key_did == Some(identity), StakingError::::NotStash); + // Checks if the key is a validator if not returns an error. + ensure!( + >::contains_key(&key), + Error::::ValidatorNotFound + ); + } + + for key in stash_keys { + StakingPallet::::chill_stash(&key); + } + + // Change identity status to be Non-Permissioned + PermissionedIdentity::::remove(&identity); + + Pallet::::deposit_event(Event::::PermissionedIdentityRemoved { + governance_councill_did: GC_DID, + validators_identity: identity, + }); + Ok(()) + } +} diff --git a/pallets/validators/src/tests.rs b/pallets/validators/src/tests.rs new file mode 100644 index 0000000000..cf92c77626 --- /dev/null +++ b/pallets/validators/src/tests.rs @@ -0,0 +1,9411 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Tests for the module. +#![cfg_attr(rustfmt, rustfmt_skip)] + +use crate::mock::{self, *}; + +use pallet_staking::{ConfigOp, Event}; +use pallet_staking::{asset, ledger::StakingLedgerInspect}; +use frame_election_provider_support::{ + bounds::{DataProviderBounds, ElectionBoundsBuilder}, + ElectionProvider, SortedListProvider, Support, +}; +use frame_support::{ + assert_noop, assert_ok, assert_storage_noop, + dispatch::{extract_actual_weight, GetDispatchInfo, WithPostDispatchInfo}, + hypothetically, + pallet_prelude::*, + traits::{ + fungible::Inspect, Currency, Get, InspectLockableCurrency, LockableCurrency, + ReservableCurrency, RewardsReporter, WithdrawReasons, + }, +}; +use pallet_balances::Error as BalancesError; +use pallet_session::{disabling::UpToLimitWithReEnablingDisablingStrategy, Event as SessionEvent}; +use sp_runtime::{ + assert_eq_error_rate, bounded_vec, + traits::{BadOrigin, Dispatchable}, + Perbill, Percent, Perquintill, Rounding, TokenError, +}; +use sp_staking::{ + offence::{OffenceDetails, OnOffenceHandler}, + SessionIndex, StakingAccount, +}; +use substrate_test_utils::assert_eq_uvec; + +#[test] +fn set_staking_configs_works() { + ExtBuilder::default().build_and_execute(|| { + // setting works + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Set(1_500), + ConfigOp::Set(2_000), + ConfigOp::Set(10), + ConfigOp::Set(20), + ConfigOp::Set(Percent::from_percent(75)), + ConfigOp::Set(Zero::zero()), + ConfigOp::Set(Zero::zero()) + )); + assert_eq!(MinNominatorBond::::get(), 1_500); + assert_eq!(MinValidatorBond::::get(), 2_000); + assert_eq!(MaxNominatorsCount::::get(), Some(10)); + assert_eq!(MaxValidatorsCount::::get(), Some(20)); + assert_eq!(ChillThreshold::::get(), Some(Percent::from_percent(75))); + assert_eq!(MinCommission::::get(), Perbill::from_percent(0)); + assert_eq!(MaxStakedRewards::::get(), Some(Percent::from_percent(0))); + + // noop does nothing + assert_storage_noop!(assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop + ))); + + // removing works + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove + )); + assert_eq!(MinNominatorBond::::get(), 0); + assert_eq!(MinValidatorBond::::get(), 0); + assert_eq!(MaxNominatorsCount::::get(), None); + assert_eq!(MaxValidatorsCount::::get(), None); + assert_eq!(ChillThreshold::::get(), None); + assert_eq!(MinCommission::::get(), Perbill::from_percent(0)); + assert_eq!(MaxStakedRewards::::get(), None); + }); +} + +#[test] +fn force_unstake_works() { + ExtBuilder::default().build_and_execute(|| { + // Account 11 (also controller) is stashed and locked + assert_eq!(Staking::bonded(&11), Some(11)); + // Adds 2 slashing spans + add_slash(&11); + // Cant transfer + assert_noop!( + Balances::transfer_allow_death(RuntimeOrigin::signed(11), 1, 10), + TokenError::FundsUnavailable, + ); + // Force unstake requires root. + assert_noop!(Staking::force_unstake(RuntimeOrigin::signed(11), 11, 2), BadOrigin); + // Force unstake needs correct number of slashing spans (for weight calculation) + assert_noop!( + Staking::force_unstake(RuntimeOrigin::root(), 11, 0), + Error::::IncorrectSlashingSpans + ); + // We now force them to unstake + assert_ok!(Staking::force_unstake(RuntimeOrigin::root(), 11, 2)); + // No longer bonded. + assert_eq!(Staking::bonded(&11), None); + // Transfer works. + assert_ok!(Balances::transfer_allow_death(RuntimeOrigin::signed(11), 1, 10)); + }); +} + +#[test] +fn kill_stash_works() { + ExtBuilder::default().build_and_execute(|| { + // Account 11 (also controller) is stashed and locked + assert_eq!(Staking::bonded(&11), Some(11)); + // Adds 2 slashing spans + add_slash(&11); + // Only can kill a stash account + assert_noop!(Staking::kill_stash(&12, 0), Error::::NotStash); + // Respects slashing span count + assert_noop!(Staking::kill_stash(&11, 0), Error::::IncorrectSlashingSpans); + // Correct inputs, everything works + assert_ok!(Staking::kill_stash(&11, 2)); + // No longer bonded. + assert_eq!(Staking::bonded(&11), None); + }); +} + +#[test] +fn basic_setup_works() { + // Verifies initial conditions of mock + ExtBuilder::default().build_and_execute(|| { + // Account 11 is stashed and locked, and is the controller + assert_eq!(Staking::bonded(&11), Some(11)); + // Account 21 is stashed and locked and is the controller + assert_eq!(Staking::bonded(&21), Some(21)); + // Account 1 is not a stashed + assert_eq!(Staking::bonded(&1), None); + + // Account 11 controls its own stash, which is 100 * balance_factor units + assert_eq!( + Ledger::get(&11).unwrap(), + StakingLedgerInspect:: { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + // Account 21 controls its own stash, which is 200 * balance_factor units + assert_eq!( + Ledger::get(&21).unwrap(), + StakingLedgerInspect:: { + stash: 21, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + // Account 1 does not control any stash + assert!(Staking::ledger(1.into()).is_err()); + + // ValidatorPrefs are default + assert_eq_uvec!( + >::iter().collect::>(), + vec![ + (31, ValidatorPrefs::default()), + (21, ValidatorPrefs::default()), + (11, ValidatorPrefs::default()) + ] + ); + + assert_eq!( + Staking::ledger(101.into()).unwrap(), + StakingLedgerInspect { + stash: 101, + total: 500, + active: 500, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + assert_eq!(Nominators::::get(101).unwrap().targets, vec![11, 21]); + + assert_eq!( + Staking::eras_stakers(active_era(), &11), + Exposure { + total: 1125, + own: 1000, + others: vec![IndividualExposure { who: 101, value: 125 }] + }, + ); + assert_eq!( + Staking::eras_stakers(active_era(), &21), + Exposure { + total: 1375, + own: 1000, + others: vec![IndividualExposure { who: 101, value: 375 }] + }, + ); + + // initial total stake = 1125 + 1375 + assert_eq!(ErasTotalStake::::get(active_era()), 2500); + + // The number of validators required. + assert_eq!(ValidatorCount::::get(), 2); + + // Initial Era and session + assert_eq!(active_era(), 0); + + // Account 10 has `balance_factor` free balance + assert_eq!(Balances::balance(&10), 1); + + // New era is not being forced + assert_eq!(ForceEra::::get(), Forcing::NotForcing); + }); +} + +#[test] +fn change_controller_works() { + ExtBuilder::default().build_and_execute(|| { + let (stash, controller) = testing_utils::create_unique_stash_controller::( + 0, + 100, + RewardDestination::Staked, + false, + ) + .unwrap(); + + // ensure `stash` and `controller` are bonded as stash controller pair. + assert_eq!(Staking::bonded(&stash), Some(controller)); + + // `controller` can control `stash` who is initially a validator. + assert_ok!(Staking::chill(RuntimeOrigin::signed(controller))); + + // sets controller back to `stash`. + assert_ok!(Staking::set_controller(RuntimeOrigin::signed(stash))); + assert_eq!(Staking::bonded(&stash), Some(stash)); + mock::start_active_era(1); + + // fetch the ledger from storage and check if the controller is correct. + let ledger = Staking::ledger(StakingAccount::Stash(stash)).unwrap(); + assert_eq!(ledger.controller(), Some(stash)); + + // same if we fetch the ledger by controller. + let ledger = Staking::ledger(StakingAccount::Controller(stash)).unwrap(); + assert_eq!(ledger.controller, Some(stash)); + assert_eq!(ledger.controller(), Some(stash)); + + // the raw storage ledger's controller is always `None`. however, we can still fetch the + // correct controller with `ledger.controller()`. + let raw_ledger = >::get(&stash).unwrap(); + assert_eq!(raw_ledger.controller, None); + + // `controller` is no longer in control. `stash` is now controller. + assert_noop!( + Staking::validate(RuntimeOrigin::signed(controller), ValidatorPrefs::default()), + Error::::NotController, + ); + assert_ok!(Staking::validate(RuntimeOrigin::signed(stash), ValidatorPrefs::default())); + }) +} + +#[test] +fn change_controller_already_paired_once_stash() { + ExtBuilder::default().build_and_execute(|| { + // 11 and 11 are bonded as controller and stash respectively. + assert_eq!(Staking::bonded(&11), Some(11)); + + // 11 is initially a validator. + assert_ok!(Staking::chill(RuntimeOrigin::signed(11))); + + // Controller cannot change once matching with stash. + assert_noop!( + Staking::set_controller(RuntimeOrigin::signed(11)), + Error::::AlreadyPaired + ); + assert_eq!(Staking::bonded(&11), Some(11)); + mock::start_active_era(1); + + // 10 is no longer in control. + assert_noop!( + Staking::validate(RuntimeOrigin::signed(10), ValidatorPrefs::default()), + Error::::NotController, + ); + assert_ok!(Staking::validate(RuntimeOrigin::signed(11), ValidatorPrefs::default())); + }) +} + +#[test] +fn rewards_should_work() { + ExtBuilder::default().nominate(true).session_per_era(3).build_and_execute(|| { + let init_balance_11 = asset::total_balance::(&11); + let init_balance_21 = asset::total_balance::(&21); + let init_balance_101 = asset::total_balance::(&101); + + // Set payees + Payee::::insert(11, RewardDestination::Account(11)); + Payee::::insert(21, RewardDestination::Account(21)); + Payee::::insert(101, RewardDestination::Account(101)); + + Pallet::::reward_by_ids(vec![(11, 50)]); + Pallet::::reward_by_ids(vec![(11, 50)]); + // This is the second validator of the current elected set. + Pallet::::reward_by_ids(vec![(21, 50)]); + + // Compute total payout now for whole duration of the session. + let total_payout_0 = current_total_payout_for_duration(reward_time_per_era()); + let maximum_payout = maximum_payout_for_duration(reward_time_per_era()); + + start_session(1); + assert_eq_uvec!(Session::validators(), vec![11, 21]); + + assert_eq!(asset::total_balance::(&11), init_balance_11); + assert_eq!(asset::total_balance::(&21), init_balance_21); + assert_eq!(asset::total_balance::(&101), init_balance_101); + assert_eq!( + ErasRewardPoints::::get(active_era()), + EraRewardPoints { + total: 50 * 3, + individual: vec![(11, 100), (21, 50)].into_iter().collect(), + } + ); + let part_for_11 = Perbill::from_rational::(1000, 1125); + let part_for_21 = Perbill::from_rational::(1000, 1375); + let part_for_101_from_11 = Perbill::from_rational::(125, 1125); + let part_for_101_from_21 = Perbill::from_rational::(375, 1375); + + start_session(2); + start_session(3); + + assert_eq!(active_era(), 1); + assert_eq!(mock::RewardRemainderUnbalanced::get(), maximum_payout - total_payout_0,); + assert_eq!( + *mock::staking_events().last().unwrap(), + Event::EraPaid { + era_index: 0, + validator_payout: total_payout_0, + remainder: maximum_payout - total_payout_0 + } + ); + + // make note of total issuance before rewards. + let total_issuance_0 = asset::total_issuance::(); + + mock::make_all_reward_payment(0); + + // total issuance should have increased + let total_issuance_1 = asset::total_issuance::(); + assert_eq!(total_issuance_1, total_issuance_0 + total_payout_0); + + assert_eq_error_rate!( + asset::total_balance::(&11), + init_balance_11 + part_for_11 * total_payout_0 * 2 / 3, + 2, + ); + assert_eq_error_rate!( + asset::total_balance::(&21), + init_balance_21 + part_for_21 * total_payout_0 * 1 / 3, + 2, + ); + assert_eq_error_rate!( + asset::total_balance::(&101), + init_balance_101 + + part_for_101_from_11 * total_payout_0 * 2 / 3 + + part_for_101_from_21 * total_payout_0 * 1 / 3, + 2 + ); + + assert_eq_uvec!(Session::validators(), vec![11, 21]); + Pallet::::reward_by_ids(vec![(11, 1)]); + + // Compute total payout now for whole duration as other parameter won't change + let total_payout_1 = current_total_payout_for_duration(reward_time_per_era()); + + mock::start_active_era(2); + assert_eq!( + mock::RewardRemainderUnbalanced::get(), + maximum_payout * 2 - total_payout_0 - total_payout_1, + ); + assert_eq!( + *mock::staking_events().last().unwrap(), + Event::EraPaid { + era_index: 1, + validator_payout: total_payout_1, + remainder: maximum_payout - total_payout_1 + } + ); + mock::make_all_reward_payment(1); + + assert_eq!(asset::total_issuance::(), total_issuance_1 + total_payout_1); + assert_eq_error_rate!( + asset::total_balance::(&11), + init_balance_11 + part_for_11 * (total_payout_0 * 2 / 3 + total_payout_1), + 2, + ); + assert_eq_error_rate!( + asset::total_balance::(&21), + init_balance_21 + part_for_21 * total_payout_0 * 1 / 3, + 2, + ); + assert_eq_error_rate!( + asset::total_balance::(&101), + init_balance_101 + + part_for_101_from_11 * (total_payout_0 * 2 / 3 + total_payout_1) + + part_for_101_from_21 * total_payout_0 * 1 / 3, + 2 + ); + }); +} + +#[test] +fn staking_should_work() { + ExtBuilder::default().nominate(false).build_and_execute(|| { + // remember + compare this along with the test. + assert_eq_uvec!(validator_controllers(), vec![21, 11]); + + // put some money in account that we'll use. + for i in 1..5 { + let _ = asset::set_stakeable_balance::(&i, 2000); + } + + // --- Block 2: + start_session(2); + // add a new candidate for being a validator. account 3 controlled by 4. + assert_ok!(Staking::bond(RuntimeOrigin::signed(3), 1500, RewardDestination::Account(3))); + assert_ok!(Staking::validate(RuntimeOrigin::signed(3), ValidatorPrefs::default())); + assert_ok!(Session::set_keys( + RuntimeOrigin::signed(3), + SessionKeys { other: 4.into() }, + vec![] + )); + + // No effects will be seen so far. + assert_eq_uvec!(validator_controllers(), vec![21, 11]); + + // --- Block 3: + start_session(3); + + // No effects will be seen so far. Era has not been yet triggered. + assert_eq_uvec!(validator_controllers(), vec![21, 11]); + + // --- Block 4: the validators will now be queued. + start_session(4); + assert_eq!(active_era(), 1); + + // --- Block 5: the validators are still in queue. + start_session(5); + + // --- Block 6: the validators will now be changed. + start_session(6); + + assert_eq_uvec!(validator_controllers(), vec![21, 3]); + // --- Block 6: Unstake 4 as a validator, freeing up the balance stashed in 3 + // 4 will chill + Staking::chill(RuntimeOrigin::signed(3)).unwrap(); + + // --- Block 7: nothing. 3 is still there. + start_session(7); + assert_eq_uvec!(validator_controllers(), vec![21, 3]); + + // --- Block 8: + start_session(8); + + // --- Block 9: 4 will not be a validator. + start_session(9); + assert_eq_uvec!(validator_controllers(), vec![21, 11]); + + // Note: the stashed value of 4 is still lock + assert_eq!( + Staking::ledger(3.into()).unwrap(), + StakingLedgerInspect { + stash: 3, + total: 1500, + active: 1500, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + // e.g. it cannot reserve more than 500 that it has free from the total 2000 + assert_noop!(Balances::reserve(&3, 501), DispatchError::ConsumerRemaining); + assert_ok!(Balances::reserve(&3, 409)); + }); +} + +#[test] +fn blocking_and_kicking_works() { + ExtBuilder::default() + .minimum_validator_count(1) + .validator_count(4) + .nominate(true) + .build_and_execute(|| { + // block validator 10/11 + assert_ok!(Staking::validate( + RuntimeOrigin::signed(11), + ValidatorPrefs { blocked: true, ..Default::default() } + )); + // attempt to nominate from 100/101... + assert_ok!(Staking::nominate(RuntimeOrigin::signed(101), vec![11])); + // should have worked since we're already nominated them + assert_eq!(Nominators::::get(&101).unwrap().targets, vec![11]); + // kick the nominator + assert_ok!(Staking::kick(RuntimeOrigin::signed(11), vec![101])); + // should have been kicked now + assert!(Nominators::::get(&101).unwrap().targets.is_empty()); + // attempt to nominate from 100/101... + assert_noop!( + Staking::nominate(RuntimeOrigin::signed(101), vec![11]), + Error::::BadTarget + ); + }); +} + +#[test] +fn less_than_needed_candidates_works() { + ExtBuilder::default() + .minimum_validator_count(1) + .validator_count(4) + .nominate(false) + .build_and_execute(|| { + assert_eq!(ValidatorCount::::get(), 4); + assert_eq!(MinimumValidatorCount::::get(), 1); + assert_eq_uvec!(validator_controllers(), vec![31, 21, 11]); + + mock::start_active_era(1); + + // Previous set is selected. NO election algorithm is even executed. + assert_eq_uvec!(validator_controllers(), vec![31, 21, 11]); + + // But the exposure is updated in a simple way. No external votes exists. + // This is purely self-vote. + assert!(ErasStakersPaged::::iter_prefix_values((active_era(),)) + .all(|exposure| exposure.others.is_empty())); + }); +} + +#[test] +fn no_candidate_emergency_condition() { + ExtBuilder::default() + .minimum_validator_count(1) + .validator_count(15) + .set_status(41, StakerStatus::Validator) + .nominate(false) + .build_and_execute(|| { + // initial validators + assert_eq_uvec!(validator_controllers(), vec![11, 21, 31, 41]); + let prefs = ValidatorPrefs { commission: Perbill::one(), ..Default::default() }; + Validators::::insert(11, prefs.clone()); + + // set the minimum validator count. + MinimumValidatorCount::::put(11); + + // try to chill + let res = Staking::chill(RuntimeOrigin::signed(11)); + assert_ok!(res); + + let current_era = CurrentEra::::get(); + + // try trigger new era + mock::run_to_block(21); + assert_eq!(*staking_events().last().unwrap(), Event::StakingElectionFailed); + // No new era is created + assert_eq!(current_era, CurrentEra::::get()); + + // Go to far further session to see if validator have changed + mock::run_to_block(100); + + // Previous ones are elected. chill is not effective in active era (as era hasn't + // changed) + assert_eq_uvec!(validator_controllers(), vec![11, 21, 31, 41]); + // The chill is still pending. + assert!(!Validators::::contains_key(11)); + // No new era is created. + assert_eq!(current_era, CurrentEra::::get()); + }); +} + +#[test] +fn nominating_and_rewards_should_work() { + ExtBuilder::default() + .nominate(false) + .set_status(41, StakerStatus::Validator) + .set_status(11, StakerStatus::Idle) + .set_status(31, StakerStatus::Idle) + .build_and_execute(|| { + // initial validators. + assert_eq_uvec!(validator_controllers(), vec![41, 21]); + + // re-validate with 11 and 31. + assert_ok!(Staking::validate(RuntimeOrigin::signed(11), Default::default())); + assert_ok!(Staking::validate(RuntimeOrigin::signed(31), Default::default())); + + // Set payee to controller. + assert_ok!(Staking::set_payee(RuntimeOrigin::signed(11), RewardDestination::Stash)); + assert_ok!(Staking::set_payee(RuntimeOrigin::signed(21), RewardDestination::Stash)); + assert_ok!(Staking::set_payee(RuntimeOrigin::signed(31), RewardDestination::Stash)); + assert_ok!(Staking::set_payee(RuntimeOrigin::signed(41), RewardDestination::Stash)); + + // give the man some money + let initial_balance = 1000; + for i in [1, 3, 5, 11, 21].iter() { + let _ = asset::set_stakeable_balance::(&i, initial_balance); + } + + // bond two account pairs and state interest in nomination. + assert_ok!(Staking::bond( + RuntimeOrigin::signed(1), + 1000, + RewardDestination::Account(1) + )); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(1), vec![11, 21, 31])); + + // the second nominator is virtual. + bond_virtual_nominator(3, 333, 1000, vec![11, 21, 41]); + + // the total reward for era 0 + let total_payout_0 = current_total_payout_for_duration(reward_time_per_era()); + Pallet::::reward_by_ids(vec![(41, 1)]); + Pallet::::reward_by_ids(vec![(21, 1)]); + + mock::start_active_era(1); + + // 10 and 20 have more votes, they will be chosen. + assert_eq_uvec!(validator_controllers(), vec![21, 11]); + + // old validators must have already received some rewards. + let initial_balance_41 = asset::total_balance::(&41); + let mut initial_balance_21 = asset::total_balance::(&21); + mock::make_all_reward_payment(0); + assert_eq!(asset::total_balance::(&41), initial_balance_41 + total_payout_0 / 2); + assert_eq!(asset::total_balance::(&21), initial_balance_21 + total_payout_0 / 2); + initial_balance_21 = asset::total_balance::(&21); + + assert_eq!(ErasStakersPaged::::iter_prefix_values((active_era(),)).count(), 2); + assert_eq!( + Staking::eras_stakers(active_era(), &11), + Exposure { + total: 1000 + 800, + own: 1000, + others: vec![ + IndividualExposure { who: 3, value: 400 }, + IndividualExposure { who: 1, value: 400 }, + ] + }, + ); + assert_eq!( + Staking::eras_stakers(active_era(), &21), + Exposure { + total: 1000 + 1200, + own: 1000, + others: vec![ + IndividualExposure { who: 3, value: 600 }, + IndividualExposure { who: 1, value: 600 }, + ] + }, + ); + + // the total reward for era 1 + let total_payout_1 = current_total_payout_for_duration(reward_time_per_era()); + Pallet::::reward_by_ids(vec![(21, 2)]); + Pallet::::reward_by_ids(vec![(11, 1)]); + + mock::start_active_era(2); + + // nothing else will happen, era ends and rewards are paid again, it is expected that + // nominators will also be paid. See below + + mock::make_all_reward_payment(1); + let payout_for_11 = total_payout_1 / 3; + let payout_for_21 = 2 * total_payout_1 / 3; + // Nominator 2: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 21]'s reward. ==> + // 2/9 + 3/11 + assert_eq_error_rate!( + asset::total_balance::(&1), + initial_balance + (2 * payout_for_11 / 9 + 3 * payout_for_21 / 11), + 2, + ); + // Nominator 3: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 21]'s reward. ==> + // 2/9 + 3/11 + assert_eq!(asset::stakeable_balance::(&3), initial_balance); + // 333 is the reward destination for 3. + assert_eq_error_rate!( + asset::total_balance::(&333), + 2 * payout_for_11 / 9 + 3 * payout_for_21 / 11, + 2 + ); + + // Validator 11: got 800 / 1800 external stake => 8/18 =? 4/9 => Validator's share = 5/9 + assert_eq_error_rate!( + asset::total_balance::(&11), + initial_balance + 5 * payout_for_11 / 9, + 2, + ); + // Validator 21: got 1200 / 2200 external stake => 12/22 =? 6/11 => Validator's share = + // 5/11 + assert_eq_error_rate!( + asset::total_balance::(&21), + initial_balance_21 + 5 * payout_for_21 / 11, + 2, + ); + }); +} + +#[test] +fn nominators_also_get_slashed_pro_rata() { + ExtBuilder::default() + .validator_count(4) + .set_status(41, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + let slash_percent = Perbill::from_percent(5); + let initial_exposure = Staking::eras_stakers(active_era(), &11); + // 101 is a nominator for 11 + assert_eq!(initial_exposure.others.first().unwrap().who, 101); + + // staked values; + let nominator_stake = Staking::ledger(101.into()).unwrap().active; + let nominator_balance = balances(&101).0; + let validator_stake = Staking::ledger(11.into()).unwrap().active; + let validator_balance = balances(&11).0; + let exposed_stake = initial_exposure.total; + let exposed_validator = initial_exposure.own; + let exposed_nominator = initial_exposure.others.first().unwrap().value; + + // 11 goes offline + on_offence_now(&[offence_from(11, None)], &[slash_percent]); + + // both stakes must have been decreased. + assert!(Staking::ledger(101.into()).unwrap().active < nominator_stake); + assert!(Staking::ledger(11.into()).unwrap().active < validator_stake); + + let slash_amount = slash_percent * exposed_stake; + let validator_share = + Perbill::from_rational(exposed_validator, exposed_stake) * slash_amount; + let nominator_share = + Perbill::from_rational(exposed_nominator, exposed_stake) * slash_amount; + + // both slash amounts need to be positive for the test to make sense. + assert!(validator_share > 0); + assert!(nominator_share > 0); + + // both stakes must have been decreased pro-rata. + assert_eq!( + Staking::ledger(101.into()).unwrap().active, + nominator_stake - nominator_share + ); + assert_eq!( + Staking::ledger(11.into()).unwrap().active, + validator_stake - validator_share + ); + assert_eq!( + balances(&101).0, // free balance + nominator_balance - nominator_share, + ); + assert_eq!( + balances(&11).0, // free balance + validator_balance - validator_share, + ); + }); +} + +#[test] +fn double_staking_should_fail() { + // should test (in the same order): + // * an account already bonded as stash cannot be stashed again. + // * an account already bonded as stash cannot nominate. + // * an account already bonded as controller can nominate. + ExtBuilder::default().try_state(false).build_and_execute(|| { + let arbitrary_value = 5; + let (stash, controller) = testing_utils::create_unique_stash_controller::( + 0, + arbitrary_value, + RewardDestination::Staked, + false, + ) + .unwrap(); + + // 4 = not used so far, stash => not allowed. + assert_noop!( + Staking::bond( + RuntimeOrigin::signed(stash), + arbitrary_value.into(), + RewardDestination::Staked, + ), + Error::::AlreadyBonded, + ); + // stash => attempting to nominate should fail. + assert_noop!( + Staking::nominate(RuntimeOrigin::signed(stash), vec![1]), + Error::::NotController + ); + // controller => nominating should work. + assert_ok!(Staking::nominate(RuntimeOrigin::signed(controller), vec![1])); + }); +} + +#[test] +fn double_controlling_attempt_should_fail() { + // should test (in the same order): + // * an account already bonded as controller CANNOT be reused as the controller of another + // account. + ExtBuilder::default().try_state(false).build_and_execute(|| { + let arbitrary_value = 5; + let (stash, _) = testing_utils::create_unique_stash_controller::( + 0, + arbitrary_value, + RewardDestination::Staked, + false, + ) + .unwrap(); + + // Note that controller (same as stash) is reused => no-op. + assert_noop!( + Staking::bond( + RuntimeOrigin::signed(stash), + arbitrary_value.into(), + RewardDestination::Staked, + ), + Error::::AlreadyBonded, + ); + }); +} + +#[test] +fn session_and_eras_work_simple() { + ExtBuilder::default().period(1).build_and_execute(|| { + assert_eq!(active_era(), 0); + assert_eq!(current_era(), 0); + assert_eq!(Session::current_index(), 1); + assert_eq!(System::block_number(), 1); + + // Session 1: this is basically a noop. This has already been started. + start_session(1); + assert_eq!(Session::current_index(), 1); + assert_eq!(active_era(), 0); + assert_eq!(System::block_number(), 1); + + // Session 2: No change. + start_session(2); + assert_eq!(Session::current_index(), 2); + assert_eq!(active_era(), 0); + assert_eq!(System::block_number(), 2); + + // Session 3: Era increment. + start_session(3); + assert_eq!(Session::current_index(), 3); + assert_eq!(active_era(), 1); + assert_eq!(System::block_number(), 3); + + // Session 4: No change. + start_session(4); + assert_eq!(Session::current_index(), 4); + assert_eq!(active_era(), 1); + assert_eq!(System::block_number(), 4); + + // Session 5: No change. + start_session(5); + assert_eq!(Session::current_index(), 5); + assert_eq!(active_era(), 1); + assert_eq!(System::block_number(), 5); + + // Session 6: Era increment. + start_session(6); + assert_eq!(Session::current_index(), 6); + assert_eq!(active_era(), 2); + assert_eq!(System::block_number(), 6); + }); +} + +#[test] +fn session_and_eras_work_complex() { + ExtBuilder::default().period(5).build_and_execute(|| { + assert_eq!(active_era(), 0); + assert_eq!(Session::current_index(), 0); + assert_eq!(System::block_number(), 1); + + start_session(1); + assert_eq!(Session::current_index(), 1); + assert_eq!(active_era(), 0); + assert_eq!(System::block_number(), 5); + + start_session(2); + assert_eq!(Session::current_index(), 2); + assert_eq!(active_era(), 0); + assert_eq!(System::block_number(), 10); + + start_session(3); + assert_eq!(Session::current_index(), 3); + assert_eq!(active_era(), 1); + assert_eq!(System::block_number(), 15); + + start_session(4); + assert_eq!(Session::current_index(), 4); + assert_eq!(active_era(), 1); + assert_eq!(System::block_number(), 20); + + start_session(5); + assert_eq!(Session::current_index(), 5); + assert_eq!(active_era(), 1); + assert_eq!(System::block_number(), 25); + + start_session(6); + assert_eq!(Session::current_index(), 6); + assert_eq!(active_era(), 2); + assert_eq!(System::block_number(), 30); + }); +} + +#[test] +fn forcing_new_era_works() { + ExtBuilder::default().build_and_execute(|| { + // normal flow of session. + start_session(1); + assert_eq!(active_era(), 0); + + start_session(2); + assert_eq!(active_era(), 0); + + start_session(3); + assert_eq!(active_era(), 1); + + // no era change. + Staking::set_force_era(Forcing::ForceNone); + + start_session(4); + assert_eq!(active_era(), 1); + + start_session(5); + assert_eq!(active_era(), 1); + + start_session(6); + assert_eq!(active_era(), 1); + + start_session(7); + assert_eq!(active_era(), 1); + + // back to normal. + // this immediately starts a new session. + Staking::set_force_era(Forcing::NotForcing); + + start_session(8); + assert_eq!(active_era(), 1); + + start_session(9); + assert_eq!(active_era(), 2); + // forceful change + Staking::set_force_era(Forcing::ForceAlways); + + start_session(10); + assert_eq!(active_era(), 2); + + start_session(11); + assert_eq!(active_era(), 3); + + start_session(12); + assert_eq!(active_era(), 4); + + // just one forceful change + Staking::set_force_era(Forcing::ForceNew); + start_session(13); + assert_eq!(active_era(), 5); + assert_eq!(ForceEra::::get(), Forcing::NotForcing); + + start_session(14); + assert_eq!(active_era(), 6); + + start_session(15); + assert_eq!(active_era(), 6); + }); +} + +#[test] +fn cannot_transfer_staked_balance() { + // Tests that a stash account cannot transfer funds + ExtBuilder::default().nominate(false).build_and_execute(|| { + // Confirm account 11 is stashed + assert_eq!(Staking::bonded(&11), Some(11)); + // Confirm account 11 has some stakeable balance + assert_eq!(asset::stakeable_balance::(&11), 1000); + // Confirm account 11 is totally staked + assert_eq!(Staking::eras_stakers(active_era(), &11).total, 1000); + // Confirm account 11 cannot transfer as a result + assert_noop!( + Balances::transfer_allow_death(RuntimeOrigin::signed(11), 21, 1), + TokenError::Frozen, + ); + + // Give account 11 extra free balance + let _ = asset::set_stakeable_balance::(&11, 10000); + // Confirm that account 11 can now transfer some balance + assert_ok!(Balances::transfer_allow_death(RuntimeOrigin::signed(11), 21, 1)); + }); +} + +#[test] +fn cannot_transfer_staked_balance_2() { + // Tests that a stash account cannot transfer funds + // Same test as above but with 20, and more accurate. + // 21 has 2000 free balance but 1000 at stake + ExtBuilder::default().nominate(false).build_and_execute(|| { + // Confirm account 21 is stashed + assert_eq!(Staking::bonded(&21), Some(21)); + // Confirm account 21 has some free balance + assert_eq!(asset::stakeable_balance::(&21), 2000); + // Confirm account 21 (via controller) is totally staked + assert_eq!(Staking::eras_stakers(active_era(), &21).total, 1000); + // Confirm account 21 cannot transfer more than 1000 + assert_noop!( + Balances::transfer_allow_death(RuntimeOrigin::signed(21), 21, 1001), + TokenError::Frozen, + ); + // Confirm account 21 needs to leave at least ED in free balance to be able to transfer + assert_ok!(Balances::transfer_allow_death(RuntimeOrigin::signed(21), 21, 1000)); + }); +} + +#[test] +fn cannot_reserve_staked_balance() { + // Checks that a bonded account cannot reserve balance from free balance + ExtBuilder::default().build_and_execute(|| { + // Confirm account 11 is stashed + assert_eq!(Staking::bonded(&11), Some(11)); + // Confirm account 11 is totally staked + assert_eq!(asset::staked::(&11), 1000); + + // Confirm account 11 cannot reserve as a result + assert_noop!(Balances::reserve(&11, 2), BalancesError::::InsufficientBalance); + assert_noop!(Balances::reserve(&11, 1), DispatchError::ConsumerRemaining); + + // Give account 11 extra free balance + let _ = asset::set_stakeable_balance::(&11, 1000 + 1000); + assert_eq!(asset::free_to_stake::(&11), 1000); + + // Confirm account 11 can now reserve balance + assert_ok!(Balances::reserve(&11, 500)); + + // free to stake balance has reduced + assert_eq!(asset::free_to_stake::(&11), 500); + }); +} + +#[test] +fn locked_balance_can_be_staked() { + // Checks that a bonded account cannot reserve balance from free balance + ExtBuilder::default().build_and_execute(|| { + // Confirm account 11 is stashed + assert_eq!(Staking::bonded(&11), Some(11)); + assert_eq!(asset::staked::(&11), 1000); + assert_eq!(asset::free_to_stake::(&11), 0); + + // add some staking balance to 11 + let _ = asset::set_stakeable_balance::(&11, 1000 + 1000); + // free to stake is 1000 + assert_eq!(asset::free_to_stake::(&11), 1000); + + // lock some balance + Balances::set_lock(*b"somelock", &11, 500, WithdrawReasons::all()); + + // locked balance still available for staking + assert_eq!(asset::free_to_stake::(&11), 1000); + + // can stake free balance + assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(11), 500)); + assert_eq!(asset::staked::(&11), 1500); + + // Can stake the locked balance + assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(11), 500)); + assert_eq!(asset::staked::(&11), 2000); + // no balance left to stake + assert_eq!(asset::free_to_stake::(&11), 0); + + // this does not fail if someone tries to stake more than free balance but just stakes + // whatever is available. (not sure if that is the best way, but we keep it backward + // compatible) + assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(11), 10)); + // no extra balance staked. + assert_eq!(asset::staked::(&11), 2000); + }); +} + +#[test] +fn reward_destination_works() { + // Rewards go to the correct destination as determined in Payee + ExtBuilder::default().nominate(false).build_and_execute(|| { + // Check that account 11 is a validator + assert!(Session::validators().contains(&11)); + // Check the balance of the validator account + assert_eq!(asset::total_balance::(&10), 1); + // Check the balance of the stash account + assert_eq!(asset::total_balance::(&11), 1001); + // Check how much is at stake + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + // Compute total payout now for whole duration as other parameter won't change + let total_payout_0 = current_total_payout_for_duration(reward_time_per_era()); + Pallet::::reward_by_ids(vec![(11, 1)]); + + mock::start_active_era(1); + mock::make_all_reward_payment(0); + + // Check that RewardDestination is Staked + assert_eq!(Staking::payee(11.into()), Some(RewardDestination::Staked)); + // Check that reward went to the stash account of validator + assert_eq!(asset::stakeable_balance::(&11), 1000 + total_payout_0); + // Check that amount at stake increased accordingly + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000 + total_payout_0, + active: 1000 + total_payout_0, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + // (era 0, page 0) is claimed + assert_eq!(ClaimedRewards::::get(0, &11), vec![0]); + + // Change RewardDestination to Stash + >::insert(&11, RewardDestination::Stash); + + // Compute total payout now for whole duration as other parameter won't change + let total_payout_1 = current_total_payout_for_duration(reward_time_per_era()); + Pallet::::reward_by_ids(vec![(11, 1)]); + + mock::start_active_era(2); + mock::make_all_reward_payment(1); + + // Check that RewardDestination is Stash + assert_eq!(Staking::payee(11.into()), Some(RewardDestination::Stash)); + // Check that reward went to the stash account + assert_eq!(asset::stakeable_balance::(&11), 1000 + total_payout_0 + total_payout_1); + // Record this value + let recorded_stash_balance = 1000 + total_payout_0 + total_payout_1; + // Check that amount at stake is NOT increased + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000 + total_payout_0, + active: 1000 + total_payout_0, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + // (era 1, page 0) is claimed + assert_eq!(ClaimedRewards::::get(1, &11), vec![0]); + + // Change RewardDestination to Account + >::insert(&11, RewardDestination::Account(11)); + + // Check controller balance + assert_eq!(asset::stakeable_balance::(&11), 23150); + + // Compute total payout now for whole duration as other parameter won't change + let total_payout_2 = current_total_payout_for_duration(reward_time_per_era()); + Pallet::::reward_by_ids(vec![(11, 1)]); + + mock::start_active_era(3); + mock::make_all_reward_payment(2); + + // Check that RewardDestination is Account(11) + assert_eq!(Staking::payee(11.into()), Some(RewardDestination::Account(11))); + // Check that reward went to the controller account + assert_eq!(asset::stakeable_balance::(&11), recorded_stash_balance + total_payout_2); + // Check that amount at stake is NOT increased + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000 + total_payout_0, + active: 1000 + total_payout_0, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + // (era 2, page 0) is claimed + assert_eq!(ClaimedRewards::::get(2, &11), vec![0]); + }); +} + +#[test] +fn validator_payment_prefs_work() { + // Test that validator preferences are correctly honored + // Note: unstake threshold is being directly tested in slashing tests. + // This test will focus on validator payment. + ExtBuilder::default().build_and_execute(|| { + let commission = Perbill::from_percent(40); + >::insert(&11, ValidatorPrefs { commission, ..Default::default() }); + + // Reward stash so staked ratio doesn't change. + >::insert(&11, RewardDestination::Stash); + >::insert(&101, RewardDestination::Stash); + + mock::start_active_era(1); + mock::make_all_reward_payment(0); + + let balance_era_1_11 = asset::total_balance::(&11); + let balance_era_1_101 = asset::total_balance::(&101); + + // Compute total payout now for whole duration as other parameter won't change + let total_payout_1 = current_total_payout_for_duration(reward_time_per_era()); + let exposure_1 = Staking::eras_stakers(active_era(), &11); + Pallet::::reward_by_ids(vec![(11, 1)]); + + mock::start_active_era(2); + mock::make_all_reward_payment(1); + + let taken_cut = commission * total_payout_1; + let shared_cut = total_payout_1 - taken_cut; + let reward_of_10 = shared_cut * exposure_1.own / exposure_1.total + taken_cut; + let reward_of_100 = shared_cut * exposure_1.others[0].value / exposure_1.total; + assert_eq_error_rate!( + asset::total_balance::(&11), + balance_era_1_11 + reward_of_10, + 2 + ); + assert_eq_error_rate!( + asset::total_balance::(&101), + balance_era_1_101 + reward_of_100, + 2 + ); + }); +} + +#[test] +fn bond_extra_works() { + // Tests that extra `free_balance` in the stash can be added to stake + // NOTE: this tests only verifies `StakingLedger` for correct updates + // See `bond_extra_and_withdraw_unbonded_works` for more details and updates on `Exposure`. + ExtBuilder::default().build_and_execute(|| { + // Check that account 10 is a validator + assert!(>::contains_key(11)); + // Check that account 10 is bonded to account 11 + assert_eq!(Staking::bonded(&11), Some(11)); + // Check how much is at stake + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + // Give account 11 some large free balance greater than total + let _ = asset::set_stakeable_balance::(&11, 1000000); + + // Call the bond_extra function from controller, add only 100 + assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(11), 100)); + // There should be 100 more `total` and `active` in the ledger + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000 + 100, + active: 1000 + 100, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + // Call the bond_extra function with a large number, should handle it + assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(11), Balance::max_value())); + // The full amount of the funds should now be in the total and active + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000000, + active: 1000000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + }); +} + +#[test] +fn bond_extra_controller_bad_state_works() { + ExtBuilder::default().try_state(false).build_and_execute(|| { + assert_eq!(StakingLedger::::get(StakingAccount::Stash(31)).unwrap().stash, 31); + + // simulate ledger in bad state: the controller 41 is associated to the stash 31 and 41. + Bonded::::insert(31, 41); + + // we confirm that the ledger is in bad state: 31 has 41 as controller and when fetching + // the ledger associated with the controller 41, its stash is 41 (and not 31). + assert_eq!(Ledger::::get(41).unwrap().stash, 41); + + // if the ledger is in this bad state, the `bond_extra` should fail. + assert_noop!(Staking::bond_extra(RuntimeOrigin::signed(31), 10), Error::::BadState); + }) +} + +#[test] +fn bond_extra_and_withdraw_unbonded_works() { + // + // * Should test + // * Given an account being bonded [and chosen as a validator](not mandatory) + // * It can add extra funds to the bonded account. + // * it can unbond a portion of its funds from the stash account. + // * Once the unbonding period is done, it can actually take the funds out of the stash. + ExtBuilder::default().nominate(false).build_and_execute(|| { + // Set payee to stash. + assert_ok!(Staking::set_payee(RuntimeOrigin::signed(11), RewardDestination::Stash)); + + // Give account 11 some large free balance greater than total + let _ = asset::set_stakeable_balance::(&11, 1000000); + + // ensure it has the correct balance. + assert_eq!(asset::stakeable_balance::(&11), 1000000); + + // Initial config should be correct + assert_eq!(active_era(), 0); + + // confirm that 10 is a normal validator and gets paid at the end of the era. + mock::start_active_era(1); + + // Initial state of 11 + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + assert_eq!( + Staking::eras_stakers(active_era(), &11), + Exposure { total: 1000, own: 1000, others: vec![] } + ); + + // deposit the extra 100 units + Staking::bond_extra(RuntimeOrigin::signed(11), 100).unwrap(); + + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000 + 100, + active: 1000 + 100, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + // Exposure is a snapshot! only updated after the next era update. + assert_ne!( + Staking::eras_stakers(active_era(), &11), + Exposure { total: 1000 + 100, own: 1000 + 100, others: vec![] } + ); + + // trigger next era. + mock::start_active_era(2); + assert_eq!(active_era(), 2); + + // ledger should be the same. + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000 + 100, + active: 1000 + 100, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + // Exposure is now updated. + assert_eq!( + Staking::eras_stakers(active_era(), &11), + Exposure { total: 1000 + 100, own: 1000 + 100, others: vec![] } + ); + + // Unbond almost all of the funds in stash. + Staking::unbond(RuntimeOrigin::signed(11), 1000).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000 + 100, + active: 100, + unlocking: bounded_vec![UnlockChunk { value: 1000, era: 2 + 3 }], + legacy_claimed_rewards: bounded_vec![], + }, + ); + + // Attempting to free the balances now will fail. 2 eras need to pass. + assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(11), 0)); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000 + 100, + active: 100, + unlocking: bounded_vec![UnlockChunk { value: 1000, era: 2 + 3 }], + legacy_claimed_rewards: bounded_vec![], + }, + ); + + // trigger next era. + mock::start_active_era(3); + + // nothing yet + assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(11), 0)); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000 + 100, + active: 100, + unlocking: bounded_vec![UnlockChunk { value: 1000, era: 2 + 3 }], + legacy_claimed_rewards: bounded_vec![], + }, + ); + + // trigger next era. + mock::start_active_era(5); + + assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(11), 0)); + // Now the value is free and the staking ledger is updated. + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 100, + active: 100, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + }, + ); + }) +} + +#[test] +fn many_unbond_calls_should_work() { + ExtBuilder::default().build_and_execute(|| { + let mut current_era = 0; + // locked at era MaxUnlockingChunks - 1 until 3 + + let max_unlocking_chunks = <::MaxUnlockingChunks as Get>::get(); + + for i in 0..max_unlocking_chunks - 1 { + // There is only 1 chunk per era, so we need to be in a new era to create a chunk. + current_era = i as u32; + mock::start_active_era(current_era); + assert_ok!(Staking::unbond(RuntimeOrigin::signed(11), 1)); + } + + current_era += 1; + mock::start_active_era(current_era); + + // This chunk is locked at `current_era` through `current_era + 2` (because + // `BondingDuration` == 3). + assert_ok!(Staking::unbond(RuntimeOrigin::signed(11), 1)); + assert_eq!( + Staking::ledger(11.into()).map(|l| l.unlocking.len()).unwrap(), + <::MaxUnlockingChunks as Get>::get() as usize + ); + + // even though the number of unlocked chunks is the same as `MaxUnlockingChunks`, + // unbonding works as expected. + for i in current_era..(current_era + max_unlocking_chunks) - 1 { + // There is only 1 chunk per era, so we need to be in a new era to create a chunk. + current_era = i as u32; + mock::start_active_era(current_era); + assert_ok!(Staking::unbond(RuntimeOrigin::signed(11), 1)); + } + + // only slots within last `BondingDuration` are filled. + assert_eq!( + Staking::ledger(11.into()).map(|l| l.unlocking.len()).unwrap(), + <::BondingDuration>::get() as usize + ); + }) +} + +#[test] +fn auto_withdraw_may_not_unlock_all_chunks() { + ExtBuilder::default().build_and_execute(|| { + // set `MaxUnlockingChunks` to a low number to test case when the unbonding period + // is larger than the number of unlocking chunks available, which may result on a + // `Error::NoMoreChunks`, even when the auto-withdraw tries to release locked chunks. + MaxUnlockingChunks::set(1); + + let mut current_era = 0; + + // fills the chunking slots for account + mock::start_active_era(current_era); + assert_ok!(Staking::unbond(RuntimeOrigin::signed(11), 1)); + + current_era += 1; + mock::start_active_era(current_era); + + // unbonding will fail because i) there are no remaining chunks and ii) no filled chunks + // can be released because current chunk hasn't stay in the queue for at least + // `BondingDuration` + assert_noop!(Staking::unbond(RuntimeOrigin::signed(11), 1), Error::::NoMoreChunks); + + // fast-forward a few eras for unbond to be successful with implicit withdraw + current_era += 10; + mock::start_active_era(current_era); + assert_ok!(Staking::unbond(RuntimeOrigin::signed(11), 1)); + }) +} + +#[test] +fn rebond_works() { + // + // * Should test + // * Given an account being bonded [and chosen as a validator](not mandatory) + // * it can unbond a portion of its funds from the stash account. + // * it can re-bond a portion of the funds scheduled to unlock. + ExtBuilder::default().nominate(false).build_and_execute(|| { + // Set payee to stash. + assert_ok!(Staking::set_payee(RuntimeOrigin::signed(11), RewardDestination::Stash)); + + // Give account 11 some large free balance greater than total + let _ = asset::set_stakeable_balance::(&11, 1000000); + + // confirm that 10 is a normal validator and gets paid at the end of the era. + mock::start_active_era(1); + + // Initial state of 11 + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + mock::start_active_era(2); + assert_eq!(active_era(), 2); + + // Try to rebond some funds. We get an error since no fund is unbonded. + assert_noop!(Staking::rebond(RuntimeOrigin::signed(11), 500), Error::::NoUnlockChunk); + + // Unbond almost all of the funds in stash. + Staking::unbond(RuntimeOrigin::signed(11), 900).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 100, + unlocking: bounded_vec![UnlockChunk { value: 900, era: 2 + 3 }], + legacy_claimed_rewards: bounded_vec![], + } + ); + + // Re-bond all the funds unbonded. + Staking::rebond(RuntimeOrigin::signed(11), 900).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + // Unbond almost all of the funds in stash. + Staking::unbond(RuntimeOrigin::signed(11), 900).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 100, + unlocking: bounded_vec![UnlockChunk { value: 900, era: 5 }], + legacy_claimed_rewards: bounded_vec![], + } + ); + + // Re-bond part of the funds unbonded. + Staking::rebond(RuntimeOrigin::signed(11), 500).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 600, + unlocking: bounded_vec![UnlockChunk { value: 400, era: 5 }], + legacy_claimed_rewards: bounded_vec![], + } + ); + + // Re-bond the remainder of the funds unbonded. + Staking::rebond(RuntimeOrigin::signed(11), 500).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + // Unbond parts of the funds in stash. + Staking::unbond(RuntimeOrigin::signed(11), 300).unwrap(); + Staking::unbond(RuntimeOrigin::signed(11), 300).unwrap(); + Staking::unbond(RuntimeOrigin::signed(11), 300).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 100, + unlocking: bounded_vec![UnlockChunk { value: 900, era: 5 }], + legacy_claimed_rewards: bounded_vec![], + } + ); + + // Re-bond part of the funds unbonded. + Staking::rebond(RuntimeOrigin::signed(11), 500).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 600, + unlocking: bounded_vec![UnlockChunk { value: 400, era: 5 }], + legacy_claimed_rewards: bounded_vec![], + } + ); + }) +} + +#[test] +fn rebond_is_fifo() { + // Rebond should proceed by reversing the most recent bond operations. + ExtBuilder::default().nominate(false).build_and_execute(|| { + // Set payee to stash. + assert_ok!(Staking::set_payee(RuntimeOrigin::signed(11), RewardDestination::Stash)); + + // Give account 11 some large free balance greater than total + let _ = asset::set_stakeable_balance::(&11, 1000000); + + // confirm that 10 is a normal validator and gets paid at the end of the era. + mock::start_active_era(1); + + // Initial state of 10 + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + mock::start_active_era(2); + + // Unbond some of the funds in stash. + Staking::unbond(RuntimeOrigin::signed(11), 400).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 600, + unlocking: bounded_vec![UnlockChunk { value: 400, era: 2 + 3 }], + legacy_claimed_rewards: bounded_vec![], + } + ); + + mock::start_active_era(3); + + // Unbond more of the funds in stash. + Staking::unbond(RuntimeOrigin::signed(11), 300).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 300, + unlocking: bounded_vec![ + UnlockChunk { value: 400, era: 2 + 3 }, + UnlockChunk { value: 300, era: 3 + 3 }, + ], + legacy_claimed_rewards: bounded_vec![], + } + ); + + mock::start_active_era(4); + + // Unbond yet more of the funds in stash. + Staking::unbond(RuntimeOrigin::signed(11), 200).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 100, + unlocking: bounded_vec![ + UnlockChunk { value: 400, era: 2 + 3 }, + UnlockChunk { value: 300, era: 3 + 3 }, + UnlockChunk { value: 200, era: 4 + 3 }, + ], + legacy_claimed_rewards: bounded_vec![], + } + ); + + // Re-bond half of the unbonding funds. + Staking::rebond(RuntimeOrigin::signed(11), 400).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 500, + unlocking: bounded_vec![ + UnlockChunk { value: 400, era: 2 + 3 }, + UnlockChunk { value: 100, era: 3 + 3 }, + ], + legacy_claimed_rewards: bounded_vec![], + } + ); + }) +} + +#[test] +fn rebond_emits_right_value_in_event() { + // When a user calls rebond with more than can be rebonded, things succeed, + // and the rebond event emits the actual value rebonded. + ExtBuilder::default().nominate(false).build_and_execute(|| { + // Set payee to stash. + assert_ok!(Staking::set_payee(RuntimeOrigin::signed(11), RewardDestination::Stash)); + + // Give account 11 some large free balance greater than total + let _ = asset::set_stakeable_balance::(&11, 1000000); + + // confirm that 10 is a normal validator and gets paid at the end of the era. + mock::start_active_era(1); + + // Unbond almost all of the funds in stash. + Staking::unbond(RuntimeOrigin::signed(11), 900).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 100, + unlocking: bounded_vec![UnlockChunk { value: 900, era: 1 + 3 }], + legacy_claimed_rewards: bounded_vec![], + } + ); + + // Re-bond less than the total + Staking::rebond(RuntimeOrigin::signed(11), 100).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 200, + unlocking: bounded_vec![UnlockChunk { value: 800, era: 1 + 3 }], + legacy_claimed_rewards: bounded_vec![], + } + ); + // Event emitted should be correct + assert_eq!(*staking_events().last().unwrap(), Event::Bonded { stash: 11, amount: 100 }); + + // Re-bond way more than available + Staking::rebond(RuntimeOrigin::signed(11), 100_000).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + // Event emitted should be correct, only 800 + assert_eq!(*staking_events().last().unwrap(), Event::Bonded { stash: 11, amount: 800 }); + }); +} + +#[test] +fn max_staked_rewards_default_works() { + ExtBuilder::default().build_and_execute(|| { + assert_eq!(>::get(), None); + + let default_stakers_payout = current_total_payout_for_duration(reward_time_per_era()); + assert!(default_stakers_payout > 0); + start_active_era(1); + + // the final stakers reward is the same as the reward before applied the cap. + assert_eq!(ErasValidatorReward::::get(0).unwrap(), default_stakers_payout); + + // which is the same behaviour if the `MaxStakedRewards` is set to 100%. + >::set(Some(Percent::from_parts(100))); + + let default_stakers_payout = current_total_payout_for_duration(reward_time_per_era()); + assert_eq!(ErasValidatorReward::::get(0).unwrap(), default_stakers_payout); + }) +} + +#[test] +fn max_staked_rewards_works() { + ExtBuilder::default().nominate(true).build_and_execute(|| { + let max_staked_rewards = 10; + + // sets new max staked rewards through set_staking_configs. + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Set(Percent::from_percent(max_staked_rewards)), + )); + + assert_eq!(>::get(), Some(Percent::from_percent(10))); + + // check validators account state. + assert_eq!(Session::validators().len(), 2); + assert!(Session::validators().contains(&11) & Session::validators().contains(&21)); + // balance of the mock treasury account is 0 + assert_eq!(RewardRemainderUnbalanced::get(), 0); + + let max_stakers_payout = current_total_payout_for_duration(reward_time_per_era()); + + start_active_era(1); + + let treasury_payout = RewardRemainderUnbalanced::get(); + let validators_payout = ErasValidatorReward::::get(0).unwrap(); + let total_payout = treasury_payout + validators_payout; + + // max stakers payout (without max staked rewards cap applied) is larger than the final + // validator rewards. The final payment and remainder should be adjusted by redistributing + // the era inflation to apply the cap... + assert!(max_stakers_payout > validators_payout); + + // .. which means that the final validator payout is 10% of the total payout.. + assert_eq!(validators_payout, Percent::from_percent(max_staked_rewards) * total_payout); + // .. and the remainder 90% goes to the treasury. + assert_eq!( + treasury_payout, + Percent::from_percent(100 - max_staked_rewards) * (treasury_payout + validators_payout) + ); + }) +} + +#[test] +fn reward_to_stake_works() { + ExtBuilder::default() + .nominate(false) + .set_status(31, StakerStatus::Idle) + .set_status(41, StakerStatus::Idle) + .set_stake(21, 2000) + .try_state(false) + .build_and_execute(|| { + assert_eq!(ValidatorCount::::get(), 2); + // Confirm account 10 and 20 are validators + assert!(>::contains_key(&11) && >::contains_key(&21)); + + assert_eq!(Staking::eras_stakers(active_era(), &11).total, 1000); + assert_eq!(Staking::eras_stakers(active_era(), &21).total, 2000); + + // Give the man some money. + let _ = asset::set_stakeable_balance::(&10, 1000); + let _ = asset::set_stakeable_balance::(&20, 1000); + + // Bypass logic and change current exposure + EraInfo::::set_exposure(0, &21, Exposure { total: 69, own: 69, others: vec![] }); + >::insert( + &20, + StakingLedgerInspect { + stash: 21, + total: 69, + active: 69, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + }, + ); + + // Compute total payout now for whole duration as other parameter won't change + let total_payout_0 = current_total_payout_for_duration(reward_time_per_era()); + Pallet::::reward_by_ids(vec![(11, 1)]); + Pallet::::reward_by_ids(vec![(21, 1)]); + + // New era --> rewards are paid --> stakes are changed + mock::start_active_era(1); + mock::make_all_reward_payment(0); + + assert_eq!(Staking::eras_stakers(active_era(), &11).total, 1000); + assert_eq!(Staking::eras_stakers(active_era(), &21).total, 2000); + + let _11_balance = asset::stakeable_balance::(&11); + assert_eq!(_11_balance, 1000 + total_payout_0 / 2); + + // Trigger another new era as the info are frozen before the era start. + mock::start_active_era(2); + + // -- new infos + assert_eq!(Staking::eras_stakers(active_era(), &11).total, 1000 + total_payout_0 / 2); + assert_eq!(Staking::eras_stakers(active_era(), &21).total, 2000 + total_payout_0 / 2); + }); +} + +#[test] +fn reap_stash_works() { + ExtBuilder::default() + .existential_deposit(10) + .balance_factor(10) + .build_and_execute(|| { + // given + assert_eq!(asset::staked::(&11), 10 * 1000); + assert_eq!(Staking::bonded(&11), Some(11)); + + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); + + // stash is not reapable + assert_noop!( + Staking::reap_stash(RuntimeOrigin::signed(20), 11, 0), + Error::::FundedTarget + ); + + // no easy way to cause an account to go below ED, we tweak their staking ledger + // instead. + Ledger::::insert(11, StakingLedger::::new(11, 5)); + + // reap-able + assert_ok!(Staking::reap_stash(RuntimeOrigin::signed(20), 11, 0)); + + // then + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + // lock is removed. + assert_eq!(asset::staked::(&11), 0); + }); +} + +#[test] +fn reap_stash_works_with_existential_deposit_zero() { + ExtBuilder::default() + .existential_deposit(0) + .balance_factor(10) + .build_and_execute(|| { + // given + assert_eq!(asset::staked::(&11), 10 * 1000); + assert_eq!(Staking::bonded(&11), Some(11)); + + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); + assert!(>::contains_key(&11)); + + // stash is not reapable + assert_noop!( + Staking::reap_stash(RuntimeOrigin::signed(20), 11, 0), + Error::::FundedTarget + ); + + // no easy way to cause an account to go below ED, we tweak their staking ledger + // instead. + Ledger::::insert(11, StakingLedger::::new(11, 0)); + + // reap-able + assert_ok!(Staking::reap_stash(RuntimeOrigin::signed(20), 11, 0)); + + // then + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + // lock is removed. + assert_eq!(asset::staked::(&11), 0); + }); +} + +#[test] +fn switching_roles() { + // Test that it should be possible to switch between roles (nominator, validator, idle) with + // minimal overhead. + ExtBuilder::default().nominate(false).build_and_execute(|| { + // Reset reward destination + for i in &[11, 21] { + assert_ok!(Staking::set_payee(RuntimeOrigin::signed(*i), RewardDestination::Stash)); + } + + assert_eq_uvec!(validator_controllers(), vec![21, 11]); + + // put some money in account that we'll use. + for i in 1..7 { + let _ = Balances::deposit_creating(&i, 5000); + } + + // add 2 nominators + assert_ok!(Staking::bond(RuntimeOrigin::signed(1), 2000, RewardDestination::Account(1))); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(1), vec![11, 5])); + + assert_ok!(Staking::bond(RuntimeOrigin::signed(3), 500, RewardDestination::Account(3))); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(3), vec![21, 1])); + + // add a new validator candidate + assert_ok!(Staking::bond(RuntimeOrigin::signed(5), 1000, RewardDestination::Account(5))); + assert_ok!(Staking::validate(RuntimeOrigin::signed(5), ValidatorPrefs::default())); + assert_ok!(Session::set_keys( + RuntimeOrigin::signed(5), + SessionKeys { other: 6.into() }, + vec![] + )); + + mock::start_active_era(1); + + // with current nominators 11 and 5 have the most stake + assert_eq_uvec!(validator_controllers(), vec![5, 11]); + + // 2 decides to be a validator. Consequences: + assert_ok!(Staking::validate(RuntimeOrigin::signed(1), ValidatorPrefs::default())); + assert_ok!(Session::set_keys( + RuntimeOrigin::signed(1), + SessionKeys { other: 2.into() }, + vec![] + )); + // new stakes: + // 11: 1000 self vote + // 21: 1000 self vote + 250 vote + // 5 : 1000 self vote + // 1 : 2000 self vote + 250 vote. + // Winners: 21 and 1 + + mock::start_active_era(2); + + assert_eq_uvec!(validator_controllers(), vec![1, 21]); + }); +} + +#[test] +fn wrong_vote_is_moot() { + ExtBuilder::default() + .add_staker( + 61, + 61, + 500, + StakerStatus::Nominator(vec![ + 11, 21, // good votes + 1, 2, 15, 1000, 25, // crap votes. No effect. + ]), + ) + .build_and_execute(|| { + // the genesis validators already reflect the above vote, nonetheless start a new era. + mock::start_active_era(1); + + // new validators + assert_eq_uvec!(validator_controllers(), vec![21, 11]); + + // our new voter is taken into account + assert!(Staking::eras_stakers(active_era(), &11).others.iter().any(|i| i.who == 61)); + assert!(Staking::eras_stakers(active_era(), &21).others.iter().any(|i| i.who == 61)); + }); +} + +#[test] +fn bond_with_no_staked_value() { + // Behavior when someone bonds with no staked value. + // Particularly when they votes and the candidate is elected. + ExtBuilder::default() + .validator_count(3) + .existential_deposit(5) + .balance_factor(5) + .nominate(false) + .minimum_validator_count(1) + .build_and_execute(|| { + // Can't bond with 1 + assert_noop!( + Staking::bond(RuntimeOrigin::signed(1), 1, RewardDestination::Account(1)), + Error::::InsufficientBond, + ); + // bonded with absolute minimum value possible. + assert_ok!(Staking::bond(RuntimeOrigin::signed(1), 5, RewardDestination::Account(1))); + assert_eq!(pallet_balances::Holds::::get(&1)[0].amount, 5); + + // unbonding even 1 will cause all to be unbonded. + assert_ok!(Staking::unbond(RuntimeOrigin::signed(1), 1)); + assert_eq!( + Staking::ledger(1.into()).unwrap(), + StakingLedgerInspect { + stash: 1, + active: 0, + total: 5, + unlocking: bounded_vec![UnlockChunk { value: 5, era: 3 }], + legacy_claimed_rewards: bounded_vec![], + } + ); + + mock::start_active_era(1); + mock::start_active_era(2); + + // not yet removed. + assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(1), 0)); + assert!(Staking::ledger(1.into()).is_ok()); + assert_eq!(pallet_balances::Holds::::get(&1)[0].amount, 5); + + mock::start_active_era(3); + + // poof. Account 1 is removed from the staking system. + assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(1), 0)); + assert!(Staking::ledger(1.into()).is_err()); + assert_eq!(pallet_balances::Holds::::get(&1).len(), 0); + }); +} + +#[test] +fn bond_with_little_staked_value_bounded() { + ExtBuilder::default() + .validator_count(3) + .nominate(false) + .minimum_validator_count(1) + .build_and_execute(|| { + // setup + assert_ok!(Staking::chill(RuntimeOrigin::signed(31))); + assert_ok!(Staking::set_payee(RuntimeOrigin::signed(11), RewardDestination::Stash)); + let init_balance_1 = asset::stakeable_balance::(&1); + let init_balance_11 = asset::stakeable_balance::(&11); + + // Stingy validator. + assert_ok!(Staking::bond(RuntimeOrigin::signed(1), 1, RewardDestination::Account(1))); + assert_ok!(Staking::validate(RuntimeOrigin::signed(1), ValidatorPrefs::default())); + assert_ok!(Session::set_keys( + RuntimeOrigin::signed(1), + SessionKeys { other: 1.into() }, + vec![] + )); + + // 1 era worth of reward. BUT, we set the timestamp after on_initialize, so outdated by + // one block. + let total_payout_0 = current_total_payout_for_duration(reward_time_per_era()); + + reward_all_elected(); + mock::start_active_era(1); + mock::make_all_reward_payment(0); + + // 1 is elected. + assert_eq_uvec!(validator_controllers(), vec![21, 11, 1]); + assert_eq!(Staking::eras_stakers(active_era(), &2).total, 0); + + // Old ones are rewarded. + assert_eq_error_rate!( + asset::stakeable_balance::(&11), + init_balance_11 + total_payout_0 / 3, + 1 + ); + // no rewards paid to 2. This was initial election. + assert_eq!(asset::stakeable_balance::(&1), init_balance_1); + + // reward era 2 + let total_payout_1 = current_total_payout_for_duration(reward_time_per_era()); + reward_all_elected(); + mock::start_active_era(2); + mock::make_all_reward_payment(1); + + assert_eq_uvec!(validator_controllers(), vec![21, 11, 1]); + assert_eq!(Staking::eras_stakers(active_era(), &2).total, 0); + + // 2 is now rewarded. + assert_eq_error_rate!( + asset::stakeable_balance::(&1), + init_balance_1 + total_payout_1 / 3, + 1 + ); + assert_eq_error_rate!( + asset::stakeable_balance::(&11), + init_balance_11 + total_payout_0 / 3 + total_payout_1 / 3, + 2, + ); + }); +} + +#[test] +fn bond_with_duplicate_vote_should_be_ignored_by_election_provider() { + ExtBuilder::default() + .validator_count(2) + .nominate(false) + .minimum_validator_count(1) + .set_stake(31, 1000) + .build_and_execute(|| { + // ensure all have equal stake. + assert_eq!( + >::iter() + .map(|(v, _)| (v, Staking::ledger(v.into()).unwrap().total)) + .collect::>(), + vec![(31, 1000), (21, 1000), (11, 1000)], + ); + // no nominators shall exist. + assert!(>::iter().map(|(n, _)| n).collect::>().is_empty()); + + // give the man some money. + let initial_balance = 1000; + for i in [1, 2, 3, 4].iter() { + let _ = asset::set_stakeable_balance::(&i, initial_balance); + } + + assert_ok!(Staking::bond( + RuntimeOrigin::signed(1), + 1000, + RewardDestination::Account(1) + )); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(1), vec![11, 11, 11, 21, 31])); + + assert_ok!(Staking::bond( + RuntimeOrigin::signed(3), + 1000, + RewardDestination::Account(3) + )); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(3), vec![21, 31])); + + // winners should be 21 and 31. Otherwise this election is taking duplicates into + // account. + let supports = ::ElectionProvider::elect(SINGLE_PAGE).unwrap(); + // POLYMESH NOTE: Changed the order. + let expected_supports = vec![ + (21, Support { total: 1800, voters: vec![(21, 1000), (3, 400), (1, 400)] }), + (31, Support { total: 2200, voters: vec![(31, 1000), (3, 600), (1, 600)] }), + ]; + assert_eq!(supports, to_bounded_supports(expected_supports)); + }); +} + +#[test] +fn bond_with_duplicate_vote_should_be_ignored_by_election_provider_elected() { + // same as above but ensures that even when the dupe is being elected, everything is sane. + ExtBuilder::default() + .validator_count(2) + .nominate(false) + .set_stake(31, 1000) + .minimum_validator_count(1) + .build_and_execute(|| { + // ensure all have equal stake. + assert_eq!( + >::iter() + .map(|(v, _)| (v, Staking::ledger(v.into()).unwrap().total)) + .collect::>(), + vec![(31, 1000), (21, 1000), (11, 1000)], + ); + + // no nominators shall exist. + assert!(>::iter().collect::>().is_empty()); + + // give the man some money. + let initial_balance = 1000; + for i in [1, 2, 3, 4].iter() { + let _ = asset::set_stakeable_balance::(&i, initial_balance); + } + + assert_ok!(Staking::bond( + RuntimeOrigin::signed(1), + 1000, + RewardDestination::Account(1) + )); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(1), vec![11, 11, 11, 21])); + + assert_ok!(Staking::bond( + RuntimeOrigin::signed(3), + 1000, + RewardDestination::Account(3) + )); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(3), vec![21])); + + // winners should be 21 and 11. + let supports = ::ElectionProvider::elect(SINGLE_PAGE).unwrap(); + // POLYMESH NOTE: Changed the order. + let expected_supports = vec![ + (11, Support { total: 1500, voters: vec![(11, 1000), (1, 500)] }), + (21, Support { total: 2500, voters: vec![(21, 1000), (3, 1000), (1, 500)] }), + ]; + + assert_eq!(supports, to_bounded_supports(expected_supports)); + }); +} + +#[test] +fn new_era_elects_correct_number_of_validators() { + ExtBuilder::default().nominate(true).validator_count(1).build_and_execute(|| { + assert_eq!(ValidatorCount::::get(), 1); + assert_eq!(validator_controllers().len(), 1); + + Session::on_initialize(System::block_number()); + + assert_eq!(validator_controllers().len(), 1); + }) +} + +#[test] +fn phragmen_should_not_overflow() { + ExtBuilder::default().nominate(false).build_and_execute(|| { + // This is the maximum value that we can have as the outcome of CurrencyToVote. + type Votes = u64; + + let _ = Staking::chill(RuntimeOrigin::signed(10)); + let _ = Staking::chill(RuntimeOrigin::signed(20)); + + bond_validator(3, Votes::max_value() as Balance); + bond_validator(5, Votes::max_value() as Balance); + + bond_nominator(7, Votes::max_value() as Balance, vec![3, 5]); + bond_nominator(9, Votes::max_value() as Balance, vec![3, 5]); + + mock::start_active_era(1); + + assert_eq_uvec!(validator_controllers(), vec![3, 5]); + + // We can safely convert back to values within [u64, u128]. + assert!(Staking::eras_stakers(active_era(), &3).total > Votes::max_value() as Balance); + assert!(Staking::eras_stakers(active_era(), &5).total > Votes::max_value() as Balance); + }) +} + +#[test] +fn reward_validator_slashing_validator_does_not_overflow() { + ExtBuilder::default().build_and_execute(|| { + let stake = u64::MAX as Balance * 2; + let reward_slash = u64::MAX as Balance * 2; + + // Assert multiplication overflows in balance arithmetic. + assert!(stake.checked_mul(reward_slash).is_none()); + + // Set staker + let _ = asset::set_stakeable_balance::(&11, stake); + + let exposure = Exposure:: { total: stake, own: stake, others: vec![] }; + let reward = EraRewardPoints:: { + total: 1, + individual: vec![(11, 1)].into_iter().collect(), + }; + + // Check reward + ErasRewardPoints::::insert(0, reward); + EraInfo::::set_exposure(0, &11, exposure); + ErasValidatorReward::::insert(0, stake); + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 0, 0)); + assert_eq!(asset::stakeable_balance::(&11), stake * 2); + + // ensure ledger has `stake` and no more. + Ledger::::insert( + 11, + StakingLedgerInspect { + stash: 11, + total: stake, + active: stake, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![1], + }, + ); + // Set staker (unsafe, can reduce balance below actual stake) + let _ = asset::set_stakeable_balance::(&11, stake); + let _ = asset::set_stakeable_balance::(&2, stake); + + // only slashes out of bonded stake are applied. without this line, it is 0. + Staking::bond(RuntimeOrigin::signed(2), stake - 1, RewardDestination::Staked).unwrap(); + // Override exposure of 11 + EraInfo::::set_exposure( + 0, + &11, + Exposure { + total: stake, + own: 1, + others: vec![IndividualExposure { who: 2, value: stake - 1 }], + }, + ); + + // Check slashing + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(100)]); + + assert_eq!(asset::stakeable_balance::(&11), stake - 1); + assert_eq!(asset::stakeable_balance::(&2), 1); + }) +} + +#[test] +fn reward_from_authorship_event_handler_works() { + ExtBuilder::default().build_and_execute(|| { + use pallet_authorship::EventHandler; + + assert_eq!(>::author(), Some(11)); + + Pallet::::note_author(11); + Pallet::::note_author(11); + + // Not mandatory but must be coherent with rewards + assert_eq_uvec!(Session::validators(), vec![11, 21]); + + // 21 is rewarded as an uncle producer + // 11 is rewarded as a block producer and uncle referencer and uncle producer + assert_eq!( + ErasRewardPoints::::get(active_era()), + EraRewardPoints { individual: vec![(11, 20 * 2)].into_iter().collect(), total: 40 }, + ); + }) +} + +#[test] +fn add_reward_points_fns_works() { + ExtBuilder::default().build_and_execute(|| { + // Not mandatory but must be coherent with rewards + assert_eq_uvec!(Session::validators(), vec![21, 11]); + + Pallet::::reward_by_ids(vec![(21, 1), (11, 1), (11, 1)]); + + Pallet::::reward_by_ids(vec![(21, 1), (11, 1), (11, 1)]); + + assert_eq!( + ErasRewardPoints::::get(active_era()), + EraRewardPoints { individual: vec![(11, 4), (21, 2)].into_iter().collect(), total: 6 }, + ); + }) +} + +#[test] +fn unbonded_balance_is_not_slashable() { + ExtBuilder::default().build_and_execute(|| { + // total amount staked is slashable. + assert_eq!(Staking::slashable_balance_of(&11), 1000); + + assert_ok!(Staking::unbond(RuntimeOrigin::signed(11), 800)); + + // only the active portion. + assert_eq!(Staking::slashable_balance_of(&11), 200); + }) +} + +#[test] +fn era_is_always_same_length() { + // This ensures that the sessions is always of the same length if there is no forcing no + // session changes. + ExtBuilder::default().build_and_execute(|| { + let session_per_era = >::get(); + + mock::start_active_era(1); + assert_eq!(ErasStartSessionIndex::::get(current_era()).unwrap(), session_per_era); + + mock::start_active_era(2); + assert_eq!( + ErasStartSessionIndex::::get(current_era()).unwrap(), + session_per_era * 2u32 + ); + + let session = Session::current_index(); + Staking::set_force_era(Forcing::ForceNew); + advance_session(); + advance_session(); + assert_eq!(current_era(), 3); + assert_eq!(ErasStartSessionIndex::::get(current_era()).unwrap(), session + 2); + + mock::start_active_era(4); + assert_eq!( + ErasStartSessionIndex::::get(current_era()).unwrap(), + session + 2u32 + session_per_era + ); + }); +} + +#[test] +fn offence_doesnt_force_new_era() { + ExtBuilder::default().build_and_execute(|| { + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(5)]); + + assert_eq!(ForceEra::::get(), Forcing::NotForcing); + }); +} + +#[test] +fn offence_ensures_new_era_without_clobbering() { + ExtBuilder::default().build_and_execute(|| { + assert_ok!(Staking::force_new_era_always(RuntimeOrigin::root())); + assert_eq!(ForceEra::::get(), Forcing::ForceAlways); + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(5)]); + + assert_eq!(ForceEra::::get(), Forcing::ForceAlways); + }); +} + +#[test] +fn slashing_performed_according_exposure() { + // This test checks that slashing is performed according the exposure (or more precisely, + // historical exposure), not the current balance. + ExtBuilder::default().build_and_execute(|| { + assert_eq!(Staking::eras_stakers(active_era(), &11).own, 1000); + + // Handle an offence with a historical exposure. + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(50)]); + + // The stash account should be slashed for 500 (50% of 1000). + assert_eq!(asset::stakeable_balance::(&11), 500); + }); +} + +#[test] +fn reporters_receive_their_slice() { + // This test verifies that the reporters of the offence receive their slice from the slashed + // amount. + ExtBuilder::default().build_and_execute(|| { + // The reporters' reward is calculated from the total exposure. + let initial_balance = 1125; + + assert_eq!(Staking::eras_stakers(active_era(), &11).total, initial_balance); + + on_offence_now(&[offence_from(11, Some(vec![1, 2]))], &[Perbill::from_percent(50)]); + + // F1 * (reward_proportion * slash - 0) + // 50% * (10% * initial_balance / 2) + let reward = (initial_balance / 20) / 2; + let reward_each = reward / 2; // split into two pieces. + assert_eq!(asset::total_balance::(&1), 10 + reward_each); + assert_eq!(asset::total_balance::(&2), 20 + reward_each); + }); +} + +#[test] +fn subsequent_reports_in_same_span_pay_out_less() { + // This test verifies that the reporters of the offence receive their slice from the slashed + // amount, but less and less if they submit multiple reports in one span. + ExtBuilder::default().build_and_execute(|| { + // The reporters' reward is calculated from the total exposure. + let initial_balance = 1125; + + assert_eq!(Staking::eras_stakers(active_era(), &11).total, initial_balance); + + on_offence_now(&[offence_from(11, Some(vec![1]))], &[Perbill::from_percent(20)]); + + // F1 * (reward_proportion * slash - 0) + // 50% * (10% * initial_balance * 20%) + let reward = (initial_balance / 5) / 20; + assert_eq!(asset::total_balance::(&1), 10 + reward); + + on_offence_now(&[offence_from(11, Some(vec![1]))], &[Perbill::from_percent(50)]); + + let prior_payout = reward; + + // F1 * (reward_proportion * slash - prior_payout) + // 50% * (10% * (initial_balance / 2) - prior_payout) + let reward = ((initial_balance / 20) - prior_payout) / 2; + assert_eq!(asset::total_balance::(&1), 10 + prior_payout + reward); + }); +} + +#[test] +fn invulnerables_are_not_slashed() { + // For invulnerable validators no slashing is performed. + ExtBuilder::default().invulnerables(vec![11]).build_and_execute(|| { + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&21), 2000); + + let exposure = Staking::eras_stakers(active_era(), &21); + let initial_balance = Staking::slashable_balance_of(&21); + + let nominator_balances: Vec<_> = exposure + .others + .iter() + .map(|o| asset::stakeable_balance::(&o.who)) + .collect(); + + on_offence_now( + &[offence_from(11, None), offence_from(21, None)], + &[Perbill::from_percent(50), Perbill::from_percent(20)], + ); + + // The validator 11 hasn't been slashed, but 21 has been. + assert_eq!(asset::stakeable_balance::(&11), 1000); + // 2000 - (0.2 * initial_balance) + assert_eq!(asset::stakeable_balance::(&21), 2000 - (2 * initial_balance / 10)); + + // ensure that nominators were slashed as well. + for (initial_balance, other) in nominator_balances.into_iter().zip(exposure.others) { + assert_eq!( + asset::stakeable_balance::(&other.who), + initial_balance - (2 * other.value / 10), + ); + } + }); +} + +#[test] +fn dont_slash_if_fraction_is_zero() { + // Don't slash if the fraction is zero. + ExtBuilder::default().build_and_execute(|| { + assert_eq!(asset::stakeable_balance::(&11), 1000); + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(0)]); + + // The validator hasn't been slashed. The new era is not forced. + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(ForceEra::::get(), Forcing::NotForcing); + }); +} + +#[test] +fn only_slash_for_max_in_era() { + // multiple slashes within one era are only applied if it is more than any previous slash in the + // same era. + ExtBuilder::default().build_and_execute(|| { + assert_eq!(asset::stakeable_balance::(&11), 1000); + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(50)]); + + // The validator has been slashed and has been force-chilled. + assert_eq!(asset::stakeable_balance::(&11), 500); + assert_eq!(ForceEra::::get(), Forcing::NotForcing); + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(25)]); + + // The validator has not been slashed additionally. + assert_eq!(asset::stakeable_balance::(&11), 500); + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(60)]); + + // The validator got slashed 10% more. + assert_eq!(asset::stakeable_balance::(&11), 400); + }) +} + +#[test] +fn garbage_collection_after_slashing() { + // ensures that `SlashingSpans` and `SpanSlash` of an account is removed after reaping. + ExtBuilder::default() + .existential_deposit(2) + .balance_factor(2) + .build_and_execute(|| { + assert_eq!(asset::stakeable_balance::(&11), 2000); + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(10)]); + + assert_eq!(asset::stakeable_balance::(&11), 2000 - 200); + assert!(SlashingSpans::::get(&11).is_some()); + assert_eq!(SpanSlash::::get(&(11, 0)).amount(), &200); + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(100)]); + + // validator and nominator slash in era are garbage-collected by era change, + // so we don't test those here. + + assert_eq!(asset::stakeable_balance::(&11), 0); + // Non staked balance is not touched. + assert_eq!(asset::total_balance::(&11), ExistentialDeposit::get()); + + let slashing_spans = SlashingSpans::::get(&11).unwrap(); + assert_eq!(slashing_spans.iter().count(), 2); + + // reap_stash respects num_slashing_spans so that weight is accurate + assert_noop!( + Staking::reap_stash(RuntimeOrigin::signed(20), 11, 0), + Error::::IncorrectSlashingSpans + ); + assert_ok!(Staking::reap_stash(RuntimeOrigin::signed(20), 11, 2)); + + assert!(SlashingSpans::::get(&11).is_none()); + assert_eq!(SpanSlash::::get(&(11, 0)).amount(), &0); + }) +} + +#[test] +fn garbage_collection_on_window_pruning() { + // ensures that `ValidatorSlashInEra` and `NominatorSlashInEra` are cleared after + // `BondingDuration`. + ExtBuilder::default().build_and_execute(|| { + mock::start_active_era(1); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + let now = active_era(); + + let exposure = Staking::eras_stakers(now, &11); + assert_eq!(asset::stakeable_balance::(&101), 2000); + let nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().value; + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(10)]); + + assert_eq!(asset::stakeable_balance::(&11), 900); + assert_eq!(asset::stakeable_balance::(&101), 2000 - (nominated_value / 10)); + + assert!(ValidatorSlashInEra::::get(&now, &11).is_some()); + assert!(NominatorSlashInEra::::get(&now, &101).is_some()); + + // + 1 because we have to exit the bonding window. + for era in (0..(BondingDuration::get() + 1)).map(|offset| offset + now + 1) { + assert!(ValidatorSlashInEra::::get(&now, &11).is_some()); + assert!(NominatorSlashInEra::::get(&now, &101).is_some()); + + mock::start_active_era(era); + } + + assert!(ValidatorSlashInEra::::get(&now, &11).is_none()); + assert!(NominatorSlashInEra::::get(&now, &101).is_none()); + }) +} + +#[test] +fn slashing_nominators_by_span_max() { + ExtBuilder::default().build_and_execute(|| { + mock::start_active_era(1); + mock::start_active_era(2); + mock::start_active_era(3); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&21), 2000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + assert_eq!(Staking::slashable_balance_of(&21), 1000); + + let exposure_11 = Staking::eras_stakers(active_era(), &11); + let exposure_21 = Staking::eras_stakers(active_era(), &21); + let nominated_value_11 = exposure_11.others.iter().find(|o| o.who == 101).unwrap().value; + let nominated_value_21 = exposure_21.others.iter().find(|o| o.who == 101).unwrap().value; + + on_offence_in_era(&[offence_from(11, None)], &[Perbill::from_percent(10)], 2); + + assert_eq!(asset::stakeable_balance::(&11), 900); + + let slash_1_amount = Perbill::from_percent(10) * nominated_value_11; + assert_eq!(asset::stakeable_balance::(&101), 2000 - slash_1_amount); + + let expected_spans = vec![ + slashing::SlashingSpan { index: 1, start: 4, length: None }, + slashing::SlashingSpan { index: 0, start: 0, length: Some(4) }, + ]; + + let get_span = |account| SlashingSpans::::get(&account).unwrap(); + + assert_eq!(get_span(11).iter().collect::>(), expected_spans); + + assert_eq!(get_span(101).iter().collect::>(), expected_spans); + + // second slash: higher era, higher value, same span. + on_offence_in_era(&[offence_from(21, None)], &[Perbill::from_percent(30)], 3); + + // 11 was not further slashed, but 21 and 101 were. + assert_eq!(asset::stakeable_balance::(&11), 900); + assert_eq!(asset::stakeable_balance::(&21), 1700); + + let slash_2_amount = Perbill::from_percent(30) * nominated_value_21; + assert!(slash_2_amount > slash_1_amount); + + // only the maximum slash in a single span is taken. + assert_eq!(asset::stakeable_balance::(&101), 2000 - slash_2_amount); + + // third slash: in same era and on same validator as first, higher + // in-era value, but lower slash value than slash 2. + on_offence_in_era(&[offence_from(11, None)], &[Perbill::from_percent(20)], 2); + + // 11 was further slashed, but 21 and 101 were not. + assert_eq!(asset::stakeable_balance::(&11), 800); + assert_eq!(asset::stakeable_balance::(&21), 1700); + + let slash_3_amount = Perbill::from_percent(20) * nominated_value_21; + assert!(slash_3_amount < slash_2_amount); + assert!(slash_3_amount > slash_1_amount); + + // only the maximum slash in a single span is taken. + assert_eq!(asset::stakeable_balance::(&101), 2000 - slash_2_amount); + }); +} + +#[test] +fn slashes_are_summed_across_spans() { + ExtBuilder::default().build_and_execute(|| { + mock::start_active_era(1); + mock::start_active_era(2); + mock::start_active_era(3); + + assert_eq!(asset::stakeable_balance::(&21), 2000); + assert_eq!(Staking::slashable_balance_of(&21), 1000); + + let get_span = |account| SlashingSpans::::get(&account).unwrap(); + + on_offence_now(&[offence_from(21, None)], &[Perbill::from_percent(10)]); + + let expected_spans = vec![ + slashing::SlashingSpan { index: 1, start: 4, length: None }, + slashing::SlashingSpan { index: 0, start: 0, length: Some(4) }, + ]; + + assert_eq!(get_span(21).iter().collect::>(), expected_spans); + assert_eq!(asset::stakeable_balance::(&21), 1900); + + // 21 has been force-chilled. re-signal intent to validate. + Staking::validate(RuntimeOrigin::signed(21), Default::default()).unwrap(); + + mock::start_active_era(4); + + assert_eq!(Staking::slashable_balance_of(&21), 900); + + on_offence_now(&[offence_from(21, None)], &[Perbill::from_percent(10)]); + + let expected_spans = vec![ + slashing::SlashingSpan { index: 2, start: 5, length: None }, + slashing::SlashingSpan { index: 1, start: 4, length: Some(1) }, + slashing::SlashingSpan { index: 0, start: 0, length: Some(4) }, + ]; + + assert_eq!(get_span(21).iter().collect::>(), expected_spans); + assert_eq!(asset::stakeable_balance::(&21), 1810); + }); +} + +#[test] +fn deferred_slashes_are_deferred() { + ExtBuilder::default().slash_defer_duration(2).build_and_execute(|| { + mock::start_active_era(1); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + + let exposure = Staking::eras_stakers(active_era(), &11); + assert_eq!(asset::stakeable_balance::(&101), 2000); + let nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().value; + + System::reset_events(); + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(10)]); + + // nominations are not removed regardless of the deferring. + assert_eq!(Nominators::::get(101).unwrap().targets, vec![11, 21]); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + + mock::start_active_era(2); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + + mock::start_active_era(3); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + + // at the start of era 4, slashes from era 1 are processed, + // after being deferred for at least 2 full eras. + mock::start_active_era(4); + + assert_eq!(asset::stakeable_balance::(&11), 900); + assert_eq!(asset::stakeable_balance::(&101), 2000 - (nominated_value / 10)); + + assert!(matches!( + staking_events_since_last_call().as_slice(), + &[ + Event::SlashReported { validator: 11, slash_era: 1, .. }, + Event::StakersElected, + .., + Event::Slashed { staker: 11, amount: 100 }, + Event::Slashed { staker: 101, amount: 12 } + ] + )); + }) +} + +#[test] +fn retroactive_deferred_slashes_two_eras_before() { + ExtBuilder::default().slash_defer_duration(2).build_and_execute(|| { + assert_eq!(BondingDuration::get(), 3); + + mock::start_active_era(3); + + assert_eq!(Nominators::::get(101).unwrap().targets, vec![11, 21]); + + System::reset_events(); + on_offence_in_era( + &[offence_from(11, None)], + &[Perbill::from_percent(10)], + 1, // should be deferred for two full eras, and applied at the beginning of era 4. + ); + + mock::start_active_era(4); + + assert!(matches!( + staking_events_since_last_call().as_slice(), + &[ + Event::SlashReported { validator: 11, slash_era: 1, .. }, + .., + Event::Slashed { staker: 11, amount: 100 }, + Event::Slashed { staker: 101, amount: 12 } + ] + )); + }) +} + +#[test] +fn retroactive_deferred_slashes_one_before() { + ExtBuilder::default().slash_defer_duration(2).build_and_execute(|| { + assert_eq!(BondingDuration::get(), 3); + + // unbond at slash era. + mock::start_active_era(2); + assert_ok!(Staking::chill(RuntimeOrigin::signed(11))); + assert_ok!(Staking::unbond(RuntimeOrigin::signed(11), 100)); + + mock::start_active_era(3); + System::reset_events(); + on_offence_in_era( + &[offence_from(11, None)], + &[Perbill::from_percent(10)], + 2, // should be deferred for two full eras, and applied at the beginning of era 5. + ); + + mock::start_active_era(4); + + assert_eq!(Staking::ledger(11.into()).unwrap().total, 1000); + // slash happens after the next line. + + mock::start_active_era(5); + assert!(matches!( + staking_events_since_last_call().as_slice(), + &[ + Event::SlashReported { validator: 11, slash_era: 2, .. }, + .., + Event::Slashed { staker: 11, amount: 100 }, + Event::Slashed { staker: 101, amount: 12 } + ] + )); + + // their ledger has already been slashed. + assert_eq!(Staking::ledger(11.into()).unwrap().total, 900); + assert_ok!(Staking::unbond(RuntimeOrigin::signed(11), 1000)); + assert_eq!(Staking::ledger(11.into()).unwrap().total, 900); + }) +} + +#[test] +fn staker_cannot_bail_deferred_slash() { + // as long as SlashDeferDuration is less than BondingDuration, this should not be possible. + ExtBuilder::default().slash_defer_duration(2).build_and_execute(|| { + mock::start_active_era(1); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + + let exposure = Staking::eras_stakers(active_era(), &11); + let nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().value; + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(10)]); + + // now we chill + assert_ok!(Staking::chill(RuntimeOrigin::signed(101))); + assert_ok!(Staking::unbond(RuntimeOrigin::signed(101), 500)); + + assert_eq!(CurrentEra::::get().unwrap(), 1); + assert_eq!(active_era(), 1); + + assert_eq!( + Ledger::::get(101).unwrap(), + StakingLedgerInspect { + active: 0, + total: 500, + stash: 101, + legacy_claimed_rewards: bounded_vec![], + unlocking: bounded_vec![UnlockChunk { era: 4u32, value: 500 }], + } + ); + + // no slash yet. + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + + // no slash yet. + mock::start_active_era(2); + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + assert_eq!(CurrentEra::::get().unwrap(), 2); + assert_eq!(active_era(), 2); + + // no slash yet. + mock::start_active_era(3); + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + assert_eq!(CurrentEra::::get().unwrap(), 3); + assert_eq!(active_era(), 3); + + // and cannot yet unbond: + assert_storage_noop!(assert!( + Staking::withdraw_unbonded(RuntimeOrigin::signed(101), 0).is_ok() + )); + assert_eq!( + Ledger::::get(101).unwrap().unlocking.into_inner(), + vec![UnlockChunk { era: 4u32, value: 500 as Balance }], + ); + + // at the start of era 4, slashes from era 1 are processed, + // after being deferred for at least 2 full eras. + mock::start_active_era(4); + + assert_eq!(asset::stakeable_balance::(&11), 900); + assert_eq!(asset::stakeable_balance::(&101), 2000 - (nominated_value / 10)); + + // and the leftover of the funds can now be unbonded. + }) +} + +#[test] +fn remove_deferred() { + ExtBuilder::default().slash_defer_duration(2).build_and_execute(|| { + mock::start_active_era(1); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + + let exposure = Staking::eras_stakers(active_era(), &11); + assert_eq!(asset::stakeable_balance::(&101), 2000); + let nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().value; + + // deferred to start of era 4. + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(10)]); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + + mock::start_active_era(2); + + // reported later, but deferred to start of era 4 as well. + System::reset_events(); + on_offence_in_era(&[offence_from(11, None)], &[Perbill::from_percent(15)], 1); + + // fails if empty + assert_noop!( + Staking::cancel_deferred_slash(RuntimeOrigin::root(), 1, vec![]), + Error::::EmptyTargets + ); + + // cancel one of them. + assert_ok!(Staking::cancel_deferred_slash(RuntimeOrigin::root(), 4, vec![0])); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + + mock::start_active_era(3); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + + // at the start of era 4, slashes from era 1 are processed, + // after being deferred for at least 2 full eras. + mock::start_active_era(4); + + // the first slash for 10% was cancelled, but the 15% one not. + assert!(matches!( + staking_events_since_last_call().as_slice(), + &[ + Event::SlashReported { validator: 11, slash_era: 1, .. }, + .., + Event::Slashed { staker: 11, amount: 50 }, + Event::Slashed { staker: 101, amount: 7 } + ] + )); + + let slash_10 = Perbill::from_percent(10); + let slash_15 = Perbill::from_percent(15); + let initial_slash = slash_10 * nominated_value; + + let total_slash = slash_15 * nominated_value; + let actual_slash = total_slash - initial_slash; + + // 5% slash (15 - 10) processed now. + assert_eq!(asset::stakeable_balance::(&11), 950); + assert_eq!(asset::stakeable_balance::(&101), 2000 - actual_slash); + }) +} + +#[test] +fn remove_multi_deferred() { + ExtBuilder::default() + .slash_defer_duration(2) + .validator_count(4) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(10)]); + + on_offence_now(&[offence_from(21, None)], &[Perbill::from_percent(10)]); + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(25)]); + + on_offence_now(&[offence_from(41, None)], &[Perbill::from_percent(25)]); + + on_offence_now(&[offence_from(51, None)], &[Perbill::from_percent(25)]); + + assert_eq!(UnappliedSlashes::::get(&4).len(), 5); + + // fails if list is not sorted + assert_noop!( + Staking::cancel_deferred_slash(RuntimeOrigin::root(), 1, vec![2, 0, 4]), + Error::::NotSortedAndUnique + ); + // fails if list is not unique + assert_noop!( + Staking::cancel_deferred_slash(RuntimeOrigin::root(), 1, vec![0, 2, 2]), + Error::::NotSortedAndUnique + ); + // fails if bad index + assert_noop!( + Staking::cancel_deferred_slash(RuntimeOrigin::root(), 1, vec![1, 2, 3, 4, 5]), + Error::::InvalidSlashIndex + ); + + assert_ok!(Staking::cancel_deferred_slash(RuntimeOrigin::root(), 4, vec![0, 2, 4])); + + let slashes = UnappliedSlashes::::get(&4); + assert_eq!(slashes.len(), 2); + assert_eq!(slashes[0].validator, 21); + assert_eq!(slashes[1].validator, 41); + }) +} + +#[test] +fn claim_reward_at_the_last_era_and_no_double_claim_and_invalid_claim() { + // should check that: + // * rewards get paid until history_depth for both validators and nominators + // * an invalid era to claim doesn't update last_reward + // * double claim of one era fails + ExtBuilder::default().nominate(true).build_and_execute(|| { + // Consumed weight for all payout_stakers dispatches that fail + let err_weight = ::WeightInfo::payout_stakers_alive_staked(0); + + let init_balance_11 = asset::total_balance::(&11); + let init_balance_101 = asset::total_balance::(&101); + + let part_for_11 = Perbill::from_rational::(1000, 1125); + let part_for_101 = Perbill::from_rational::(125, 1125); + + // Check state + Payee::::insert(11, RewardDestination::Account(11)); + Payee::::insert(101, RewardDestination::Account(101)); + + Pallet::::reward_by_ids(vec![(11, 1)]); + // Compute total payout now for whole duration as other parameter won't change + let total_payout_0 = current_total_payout_for_duration(reward_time_per_era()); + + mock::start_active_era(1); + + Pallet::::reward_by_ids(vec![(11, 1)]); + // Increase total token issuance to affect the total payout. + let _ = Balances::deposit_creating(&999, 1_000_000_000); + + // Compute total payout now for whole duration as other parameter won't change + let total_payout_1 = current_total_payout_for_duration(reward_time_per_era()); + assert!(total_payout_1 != total_payout_0); + + mock::start_active_era(2); + + Pallet::::reward_by_ids(vec![(11, 1)]); + // Increase total token issuance to affect the total payout. + let _ = Balances::deposit_creating(&999, 1_000_000_000); + // Compute total payout now for whole duration as other parameter won't change + let total_payout_2 = current_total_payout_for_duration(reward_time_per_era()); + assert!(total_payout_2 != total_payout_0); + assert!(total_payout_2 != total_payout_1); + + mock::start_active_era(HistoryDepth::get() + 1); + + let active_era = active_era(); + + // This is the latest planned era in staking, not the active era + let current_era = CurrentEra::::get().unwrap(); + + // Last kept is 1: + assert!(current_era - HistoryDepth::get() == 1); + assert_noop!( + Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 0, 0), + // Fail: Era out of history + Error::::InvalidEraToReward.with_weight(err_weight) + ); + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 1, 0)); + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 2, 0)); + assert_noop!( + Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 2, 0), + // Fail: Double claim + Error::::AlreadyClaimed.with_weight(err_weight) + ); + assert_noop!( + Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, active_era, 0), + // Fail: Era not finished yet + Error::::InvalidEraToReward.with_weight(err_weight) + ); + + // Era 0 can't be rewarded anymore and current era can't be rewarded yet + // only era 1 and 2 can be rewarded. + + assert_eq!( + asset::total_balance::(&11), + init_balance_11 + part_for_11 * (total_payout_1 + total_payout_2), + ); + assert_eq!( + asset::total_balance::(&101), + init_balance_101 + part_for_101 * (total_payout_1 + total_payout_2), + ); + }); +} + +#[test] +fn zero_slash_keeps_nominators() { + ExtBuilder::default() + .validator_count(7) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(0)]); + + assert_eq!(asset::stakeable_balance::(&11), 1000); + assert_eq!(asset::stakeable_balance::(&101), 2000); + + // 11 is not removed + assert!(Validators::::iter().any(|(stash, _)| stash == 11)); + // and their nominations are kept. + assert_eq!(Nominators::::get(101).unwrap().targets, vec![11, 21]); + }); +} + +#[test] +fn six_session_delay() { + ExtBuilder::default().initialize_first_session(false).build_and_execute(|| { + use pallet_session::SessionManager; + + let val_set = Session::validators(); + let init_session = Session::current_index(); + let init_active_era = active_era(); + + // pallet-session is delaying session by one, thus the next session to plan is +2. + assert_eq!(>::new_session(init_session + 2), None); + assert_eq!( + >::new_session(init_session + 3), + Some(val_set.clone()) + ); + assert_eq!(>::new_session(init_session + 4), None); + assert_eq!(>::new_session(init_session + 5), None); + assert_eq!( + >::new_session(init_session + 6), + Some(val_set.clone()) + ); + + >::end_session(init_session); + >::start_session(init_session + 1); + assert_eq!(active_era(), init_active_era); + + >::end_session(init_session + 1); + >::start_session(init_session + 2); + assert_eq!(active_era(), init_active_era); + + // Reward current era + Staking::reward_by_ids(vec![(11, 1)]); + + // New active era is triggered here. + >::end_session(init_session + 2); + >::start_session(init_session + 3); + assert_eq!(active_era(), init_active_era + 1); + + >::end_session(init_session + 3); + >::start_session(init_session + 4); + assert_eq!(active_era(), init_active_era + 1); + + >::end_session(init_session + 4); + >::start_session(init_session + 5); + assert_eq!(active_era(), init_active_era + 1); + + // Reward current era + Staking::reward_by_ids(vec![(21, 2)]); + + // New active era is triggered here. + >::end_session(init_session + 5); + >::start_session(init_session + 6); + assert_eq!(active_era(), init_active_era + 2); + + // That reward are correct + assert_eq!(ErasRewardPoints::::get(init_active_era).total, 1); + assert_eq!(ErasRewardPoints::::get(init_active_era + 1).total, 2); + }); +} + +#[test] +fn test_nominators_over_max_exposure_page_size_are_rewarded() { + ExtBuilder::default().build_and_execute(|| { + // bond one nominator more than the max exposure page size to validator 11. + for i in 0..=MaxExposurePageSize::get() { + let stash = 10_000 + i as AccountId; + let balance = 10_000 + i as Balance; + asset::set_stakeable_balance::(&stash, balance); + assert_ok!(Staking::bond( + RuntimeOrigin::signed(stash), + balance, + RewardDestination::Stash + )); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(stash), vec![11])); + } + mock::start_active_era(1); + + Pallet::::reward_by_ids(vec![(11, 1)]); + // compute and ensure the reward amount is greater than zero. + let _ = current_total_payout_for_duration(reward_time_per_era()); + + mock::start_active_era(2); + mock::make_all_reward_payment(1); + + // Assert nominators from 1 to Max are rewarded + let mut i: u32 = 0; + while i < MaxExposurePageSize::get() { + let stash = 10_000 + i as AccountId; + let balance = 10_000 + i as Balance; + assert!(asset::stakeable_balance::(&stash) > balance); + i += 1; + } + + // Assert overflowing nominators from page 1 are also rewarded + let stash = 10_000 + i as AccountId; + assert!(asset::stakeable_balance::(&stash) > (10_000 + i) as Balance); + }); +} + +#[test] +fn test_nominators_are_rewarded_for_all_exposure_page() { + ExtBuilder::default().build_and_execute(|| { + // 3 pages of exposure + let nominator_count = 2 * MaxExposurePageSize::get() + 1; + + for i in 0..nominator_count { + let stash = 10_000 + i as AccountId; + let balance = 10_000 + i as Balance; + asset::set_stakeable_balance::(&stash, balance); + assert_ok!(Staking::bond( + RuntimeOrigin::signed(stash), + balance, + RewardDestination::Stash + )); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(stash), vec![11])); + } + mock::start_active_era(1); + + Pallet::::reward_by_ids(vec![(11, 1)]); + // compute and ensure the reward amount is greater than zero. + let _ = current_total_payout_for_duration(reward_time_per_era()); + + mock::start_active_era(2); + mock::make_all_reward_payment(1); + + assert_eq!(EraInfo::::get_page_count(1, &11), 3); + + // Assert all nominators are rewarded according to their stake + for i in 0..nominator_count { + // balance of the nominator after the reward payout. + let current_balance = asset::stakeable_balance::(&((10000 + i) as AccountId)); + // balance of the nominator in the previous iteration. + let previous_balance = + asset::stakeable_balance::(&((10000 + i - 1) as AccountId)); + // balance before the reward. + let original_balance = 10_000 + i as Balance; + + assert!(current_balance > original_balance); + // since the stake of the nominator is increasing for each iteration, the final balance + // after the reward should also be higher than the previous iteration. + assert!(current_balance > previous_balance); + } + }); +} + +#[test] +fn test_multi_page_payout_stakers_by_page() { + // Test that payout_stakers work in general and that it pays the correct amount of reward. + ExtBuilder::default().has_stakers(false).build_and_execute(|| { + let balance = 1000; + // Track the exposure of the validator and all nominators. + let mut total_exposure = balance; + // Create a validator: + bond_validator(11, balance); // Default(64) + assert_eq!(Validators::::count(), 1); + + // Create nominators, targeting stash of validators + for i in 0..100 { + let bond_amount = balance + i as Balance; + bond_nominator(1000 + i, bond_amount, vec![11]); + // with multi page reward payout, payout exposure is same as total exposure. + total_exposure += bond_amount; + } + + mock::start_active_era(1); + Staking::reward_by_ids(vec![(11, 1)]); + + // Since `MaxExposurePageSize = 64`, there are two pages of validator exposure. + assert_eq!(EraInfo::::get_page_count(1, &11), 2); + + // compute and ensure the reward amount is greater than zero. + let payout = current_total_payout_for_duration(reward_time_per_era()); + mock::start_active_era(2); + + // verify the exposures are calculated correctly. + let actual_exposure_0 = EraInfo::::get_paged_exposure(1, &11, 0).unwrap(); + assert_eq!(actual_exposure_0.total(), total_exposure); + assert_eq!(actual_exposure_0.own(), 1000); + assert_eq!(actual_exposure_0.others().len(), 64); + let actual_exposure_1 = EraInfo::::get_paged_exposure(1, &11, 1).unwrap(); + assert_eq!(actual_exposure_1.total(), total_exposure); + // own stake is only included once in the first page + assert_eq!(actual_exposure_1.own(), 0); + assert_eq!(actual_exposure_1.others().len(), 100 - 64); + + let pre_payout_total_issuance = pallet_balances::TotalIssuance::::get(); + RewardOnUnbalanceWasCalled::set(false); + System::reset_events(); + + let controller_balance_before_p0_payout = asset::stakeable_balance::(&11); + // Payout rewards for first exposure page + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 1, 0)); + + // verify `Rewarded` events are being executed + // POLYMESH NOTE: Changed order. + assert!(matches!( + staking_events_since_last_call().as_slice(), + &[ + Event::PayoutStarted { era_index: 1, validator_stash: 11, page: 0, next: Some(1) }, + .., + Event::Rewarded { stash: 1082, dest: RewardDestination::Stash, amount: 113 }, + Event::Rewarded { stash: 1053, dest: RewardDestination::Stash, amount: 110 }, + ] + )); + + let controller_balance_after_p0_payout = asset::stakeable_balance::(&11); + + // verify rewards have been paid out but still some left + assert!(pallet_balances::TotalIssuance::::get() > pre_payout_total_issuance); + assert!(pallet_balances::TotalIssuance::::get() < pre_payout_total_issuance + payout); + + // verify the validator has been rewarded + assert!(controller_balance_after_p0_payout > controller_balance_before_p0_payout); + + // Payout the second and last page of nominators + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 1, 1)); + + // verify `Rewarded` events are being executed for the second page. + let events = staking_events_since_last_call(); + // POLYMESH NOTE: Changed order. + assert!(matches!( + events.as_slice(), + &[ + Event::PayoutStarted { era_index: 1, validator_stash: 11, page: 1, next: None }, + Event::Rewarded { stash: 1059, dest: RewardDestination::Stash, amount: 111 }, + Event::Rewarded { stash: 1087, dest: RewardDestination::Stash, amount: 114 }, + .. + ] + )); + // verify the validator was not rewarded the second time + assert_eq!(asset::stakeable_balance::(&11), controller_balance_after_p0_payout); + + // verify all rewards have been paid out + assert_eq_error_rate!( + pallet_balances::TotalIssuance::::get(), + pre_payout_total_issuance + payout, + 2 + ); + assert!(RewardOnUnbalanceWasCalled::get()); + + // Top 64 nominators of validator 11 automatically paid out, including the validator + assert!(asset::stakeable_balance::(&11) > balance); + for i in 0..100 { + assert!(asset::stakeable_balance::(&(1000 + i)) > balance + i as Balance); + } + + // verify we no longer track rewards in `legacy_claimed_rewards` vec + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![] + } + ); + + // verify rewards are tracked to prevent double claims + let ledger = Staking::ledger(11.into()); + for page in 0..EraInfo::::get_page_count(1, &11) { + assert_eq!( + EraInfo::::is_rewards_claimed_with_legacy_fallback( + 1, + ledger.as_ref().unwrap(), + &11, + page + ), + true + ); + } + + for i in 3..16 { + Staking::reward_by_ids(vec![(11, 1)]); + + // compute and ensure the reward amount is greater than zero. + let payout = current_total_payout_for_duration(reward_time_per_era()); + let pre_payout_total_issuance = pallet_balances::TotalIssuance::::get(); + + mock::start_active_era(i); + RewardOnUnbalanceWasCalled::set(false); + mock::make_all_reward_payment(i - 1); + assert_eq_error_rate!( + pallet_balances::TotalIssuance::::get(), + pre_payout_total_issuance + payout, + 2 + ); + assert!(RewardOnUnbalanceWasCalled::get()); + + // verify we track rewards for each era and page + for page in 0..EraInfo::::get_page_count(i - 1, &11) { + assert_eq!( + EraInfo::::is_rewards_claimed_with_legacy_fallback( + i - 1, + Staking::ledger(11.into()).as_ref().unwrap(), + &11, + page + ), + true + ); + } + } + + assert_eq!(ClaimedRewards::::get(14, &11), vec![0, 1]); + + let last_era = 99; + let history_depth = HistoryDepth::get(); + let last_reward_era = last_era - 1; + let first_claimable_reward_era = last_era - history_depth; + for i in 16..=last_era { + Staking::reward_by_ids(vec![(11, 1)]); + // compute and ensure the reward amount is greater than zero. + let _ = current_total_payout_for_duration(reward_time_per_era()); + mock::start_active_era(i); + } + + // verify we clean up history as we go + for era in 0..15 { + assert_eq!(ClaimedRewards::::get(era, &11), Vec::::new()); + } + + // verify only page 0 is marked as claimed + assert_ok!(Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + first_claimable_reward_era, + 0 + )); + assert_eq!(ClaimedRewards::::get(first_claimable_reward_era, &11), vec![0]); + + // verify page 0 and 1 are marked as claimed + assert_ok!(Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + first_claimable_reward_era, + 1 + )); + assert_eq!(ClaimedRewards::::get(first_claimable_reward_era, &11), vec![0, 1]); + + // verify only page 0 is marked as claimed + assert_ok!(Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + last_reward_era, + 0 + )); + assert_eq!(ClaimedRewards::::get(last_reward_era, &11), vec![0]); + + // verify page 0 and 1 are marked as claimed + assert_ok!(Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + last_reward_era, + 1 + )); + assert_eq!(ClaimedRewards::::get(last_reward_era, &11), vec![0, 1]); + + // Out of order claims works. + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 69, 0)); + assert_eq!(ClaimedRewards::::get(69, &11), vec![0]); + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 23, 1)); + assert_eq!(ClaimedRewards::::get(23, &11), vec![1]); + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 42, 0)); + assert_eq!(ClaimedRewards::::get(42, &11), vec![0]); + }); +} + +#[test] +fn unbond_with_chill_works() { + // Should test: + // * Given a bunded account + // * it can full unbond all portion of its funds from the stash account. + ExtBuilder::default().nominate(false).build_and_execute(|| { + // Set payee to stash. + assert_ok!(Staking::set_payee(RuntimeOrigin::signed(11), RewardDestination::Stash)); + + // Give account 11 some large free balance greater than total + let _ = Balances::make_free_balance_be(&11, 1000000); + + // confirm that 10 is a normal validator and gets paid at the end of the era. + mock::start_active_era(1); + + // Initial state of 11 + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + assert!(Validators::::contains_key(11)); + + mock::start_active_era(2); + assert_eq!(active_era(), 2); + + assert_eq!(Validators::::count(), 3); + + // Unbond all amount by ensuring chilling + assert_ok!(Staking::unbond(RuntimeOrigin::signed(11), 1000)); + + assert!(matches!( + staking_events_since_last_call().as_slice(), + &[ + Event::StakersElected, + Event::EraPaid { era_index: 0, validator_payout: 11075, remainder: 33225 }, + Event::StakersElected, + Event::EraPaid { era_index: 1, validator_payout: 11075, remainder: 33225 }, + Event::Chilled { stash: 11 }, + Event::Unbonded { stash: 11, amount: 1000 } + ] + )); + assert!(!Validators::::contains_key(11)); + + assert!(Nominators::::get(11).is_none()); + assert_eq!(Validators::::count(), 2); + }) +} + +#[test] +fn test_multi_page_payout_stakers_backward_compatible() { + // Test that payout_stakers work in general and that it pays the correct amount of reward. + ExtBuilder::default().has_stakers(false).build_and_execute(|| { + let balance = 1000; + // Track the exposure of the validator and all nominators. + let mut total_exposure = balance; + // Create a validator: + bond_validator(11, balance); // Default(64) + assert_eq!(Validators::::count(), 1); + + let err_weight = ::WeightInfo::payout_stakers_alive_staked(0); + + // Create nominators, targeting stash of validators + for i in 0..100 { + let bond_amount = balance + i as Balance; + bond_nominator(1000 + i, bond_amount, vec![11]); + // with multi page reward payout, payout exposure is same as total exposure. + total_exposure += bond_amount; + } + + mock::start_active_era(1); + Staking::reward_by_ids(vec![(11, 1)]); + + // Since `MaxExposurePageSize = 64`, there are two pages of validator exposure. + assert_eq!(EraInfo::::get_page_count(1, &11), 2); + + // compute and ensure the reward amount is greater than zero. + let payout = current_total_payout_for_duration(reward_time_per_era()); + mock::start_active_era(2); + + // verify the exposures are calculated correctly. + let actual_exposure_0 = EraInfo::::get_paged_exposure(1, &11, 0).unwrap(); + assert_eq!(actual_exposure_0.total(), total_exposure); + assert_eq!(actual_exposure_0.own(), 1000); + assert_eq!(actual_exposure_0.others().len(), 64); + let actual_exposure_1 = EraInfo::::get_paged_exposure(1, &11, 1).unwrap(); + assert_eq!(actual_exposure_1.total(), total_exposure); + // own stake is only included once in the first page + assert_eq!(actual_exposure_1.own(), 0); + assert_eq!(actual_exposure_1.others().len(), 100 - 64); + + let pre_payout_total_issuance = pallet_balances::TotalIssuance::::get(); + RewardOnUnbalanceWasCalled::set(false); + + let controller_balance_before_p0_payout = asset::stakeable_balance::(&11); + // Payout rewards for first exposure page + assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 1)); + // page 0 is claimed + assert_noop!( + Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 1, 0), + Error::::AlreadyClaimed.with_weight(err_weight) + ); + + let controller_balance_after_p0_payout = asset::stakeable_balance::(&11); + + // verify rewards have been paid out but still some left + assert!(pallet_balances::TotalIssuance::::get() > pre_payout_total_issuance); + assert!(pallet_balances::TotalIssuance::::get() < pre_payout_total_issuance + payout); + + // verify the validator has been rewarded + assert!(controller_balance_after_p0_payout > controller_balance_before_p0_payout); + + // This should payout the second and last page of nominators + assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 1)); + + // cannot claim any more pages + assert_noop!( + Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 1), + Error::::AlreadyClaimed.with_weight(err_weight) + ); + + // verify the validator was not rewarded the second time + assert_eq!(asset::stakeable_balance::(&11), controller_balance_after_p0_payout); + + // verify all rewards have been paid out + assert_eq_error_rate!( + pallet_balances::TotalIssuance::::get(), + pre_payout_total_issuance + payout, + 2 + ); + assert!(RewardOnUnbalanceWasCalled::get()); + + // verify all nominators of validator 11 are paid out, including the validator + // Validator payout goes to controller. + assert!(asset::stakeable_balance::(&11) > balance); + for i in 0..100 { + assert!(asset::stakeable_balance::(&(1000 + i)) > balance + i as Balance); + } + + // verify we no longer track rewards in `legacy_claimed_rewards` vec + let ledger = Staking::ledger(11.into()); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![] + } + ); + + // verify rewards are tracked to prevent double claims + for page in 0..EraInfo::::get_page_count(1, &11) { + assert_eq!( + EraInfo::::is_rewards_claimed_with_legacy_fallback( + 1, + ledger.as_ref().unwrap(), + &11, + page + ), + true + ); + } + + for i in 3..16 { + Staking::reward_by_ids(vec![(11, 1)]); + + // compute and ensure the reward amount is greater than zero. + let payout = current_total_payout_for_duration(reward_time_per_era()); + let pre_payout_total_issuance = pallet_balances::TotalIssuance::::get(); + + mock::start_active_era(i); + RewardOnUnbalanceWasCalled::set(false); + mock::make_all_reward_payment(i - 1); + assert_eq_error_rate!( + pallet_balances::TotalIssuance::::get(), + pre_payout_total_issuance + payout, + 2 + ); + assert!(RewardOnUnbalanceWasCalled::get()); + + // verify we track rewards for each era and page + for page in 0..EraInfo::::get_page_count(i - 1, &11) { + assert_eq!( + EraInfo::::is_rewards_claimed_with_legacy_fallback( + i - 1, + Staking::ledger(11.into()).as_ref().unwrap(), + &11, + page + ), + true + ); + } + } + + assert_eq!(ClaimedRewards::::get(14, &11), vec![0, 1]); + + let last_era = 99; + let history_depth = HistoryDepth::get(); + let last_reward_era = last_era - 1; + let first_claimable_reward_era = last_era - history_depth; + for i in 16..=last_era { + Staking::reward_by_ids(vec![(11, 1)]); + // compute and ensure the reward amount is greater than zero. + let _ = current_total_payout_for_duration(reward_time_per_era()); + mock::start_active_era(i); + } + + // verify we clean up history as we go + for era in 0..15 { + assert_eq!(ClaimedRewards::::get(era, &11), Vec::::new()); + } + + // verify only page 0 is marked as claimed + assert_ok!(Staking::payout_stakers( + RuntimeOrigin::signed(1337), + 11, + first_claimable_reward_era + )); + assert_eq!(ClaimedRewards::::get(first_claimable_reward_era, &11), vec![0]); + + // verify page 0 and 1 are marked as claimed + assert_ok!(Staking::payout_stakers( + RuntimeOrigin::signed(1337), + 11, + first_claimable_reward_era, + )); + assert_eq!(ClaimedRewards::::get(first_claimable_reward_era, &11), vec![0, 1]); + + // change order and verify only page 1 is marked as claimed + assert_ok!(Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + last_reward_era, + 1 + )); + assert_eq!(ClaimedRewards::::get(last_reward_era, &11), vec![1]); + + // verify page 0 is claimed even when explicit page is not passed + assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, last_reward_era,)); + + assert_eq!(ClaimedRewards::::get(last_reward_era, &11), vec![1, 0]); + + // cannot claim any more pages + assert_noop!( + Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, last_reward_era), + Error::::AlreadyClaimed.with_weight(err_weight) + ); + + // Create 4 nominator pages + for i in 100..200 { + let bond_amount = balance + i as Balance; + bond_nominator(1000 + i, bond_amount, vec![11]); + } + + let test_era = last_era + 1; + mock::start_active_era(test_era); + + Staking::reward_by_ids(vec![(11, 1)]); + // compute and ensure the reward amount is greater than zero. + let _ = current_total_payout_for_duration(reward_time_per_era()); + mock::start_active_era(test_era + 1); + + // Out of order claims works. + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, test_era, 2)); + assert_eq!(ClaimedRewards::::get(test_era, &11), vec![2]); + + assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, test_era)); + assert_eq!(ClaimedRewards::::get(test_era, &11), vec![2, 0]); + + // cannot claim page 2 again + assert_noop!( + Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, test_era, 2), + Error::::AlreadyClaimed.with_weight(err_weight) + ); + + assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, test_era)); + assert_eq!(ClaimedRewards::::get(test_era, &11), vec![2, 0, 1]); + + assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, test_era)); + assert_eq!(ClaimedRewards::::get(test_era, &11), vec![2, 0, 1, 3]); + }); +} + +#[test] +fn test_page_count_and_size() { + // Test that payout_stakers work in general and that it pays the correct amount of reward. + ExtBuilder::default().has_stakers(false).build_and_execute(|| { + let balance = 1000; + // Track the exposure of the validator and all nominators. + // Create a validator: + bond_validator(11, balance); // Default(64) + assert_eq!(Validators::::count(), 1); + + // Create nominators, targeting stash of validators + for i in 0..100 { + let bond_amount = balance + i as Balance; + bond_nominator(1000 + i, bond_amount, vec![11]); + } + + mock::start_active_era(1); + + // Since max exposure page size is 64, 2 pages of nominators are created. + assert_eq!(EraInfo::::get_page_count(1, &11), 2); + + // first page has 64 nominators + assert_eq!(EraInfo::::get_paged_exposure(1, &11, 0).unwrap().others().len(), 64); + // second page has 36 nominators + assert_eq!(EraInfo::::get_paged_exposure(1, &11, 1).unwrap().others().len(), 36); + + // now lets decrease page size + MaxExposurePageSize::set(32); + mock::start_active_era(2); + // now we expect 4 pages. + assert_eq!(EraInfo::::get_page_count(2, &11), 4); + // first 3 pages have 32 nominators each + assert_eq!(EraInfo::::get_paged_exposure(2, &11, 0).unwrap().others().len(), 32); + assert_eq!(EraInfo::::get_paged_exposure(2, &11, 1).unwrap().others().len(), 32); + assert_eq!(EraInfo::::get_paged_exposure(2, &11, 2).unwrap().others().len(), 32); + assert_eq!(EraInfo::::get_paged_exposure(2, &11, 3).unwrap().others().len(), 4); + + // now lets decrease page size even more + MaxExposurePageSize::set(5); + mock::start_active_era(3); + + // now we expect the max 20 pages (100/5). + assert_eq!(EraInfo::::get_page_count(3, &11), 20); + }); +} + +#[test] +fn payout_stakers_handles_basic_errors() { + // Here we will test payouts handle all errors. + ExtBuilder::default().has_stakers(false).build_and_execute(|| { + // Consumed weight for all payout_stakers dispatches that fail + let err_weight = ::WeightInfo::payout_stakers_alive_staked(0); + + // Same setup as the test above + let balance = 1000; + bond_validator(11, balance); // Default(64) + + // Create nominators, targeting stash + for i in 0..100 { + bond_nominator(1000 + i, balance + i as Balance, vec![11]); + } + + mock::start_active_era(1); + Staking::reward_by_ids(vec![(11, 1)]); + + // compute and ensure the reward amount is greater than zero. + let _ = current_total_payout_for_duration(reward_time_per_era()); + + mock::start_active_era(2); + + // Wrong Era, too big + assert_noop!( + Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 2, 0), + Error::::InvalidEraToReward.with_weight(err_weight) + ); + // Wrong Staker + assert_noop!( + Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 10, 1, 0), + Error::::NotStash.with_weight(err_weight) + ); + + let last_era = 99; + for i in 3..=last_era { + Staking::reward_by_ids(vec![(11, 1)]); + // compute and ensure the reward amount is greater than zero. + let _ = current_total_payout_for_duration(reward_time_per_era()); + mock::start_active_era(i); + } + + let history_depth = HistoryDepth::get(); + let expected_last_reward_era = last_era - 1; + let expected_start_reward_era = last_era - history_depth; + + // We are at era last_era=99. Given history_depth=80, we should be able + // to payout era starting from expected_start_reward_era=19 through + // expected_last_reward_era=98 (80 total eras), but not 18 or 99. + assert_noop!( + Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + expected_start_reward_era - 1, + 0 + ), + Error::::InvalidEraToReward.with_weight(err_weight) + ); + assert_noop!( + Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + expected_last_reward_era + 1, + 0 + ), + Error::::InvalidEraToReward.with_weight(err_weight) + ); + assert_ok!(Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + expected_start_reward_era, + 0 + )); + assert_ok!(Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + expected_last_reward_era, + 0 + )); + + // can call page 1 + assert_ok!(Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + expected_last_reward_era, + 1 + )); + + // Can't claim again + assert_noop!( + Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + expected_start_reward_era, + 0 + ), + Error::::AlreadyClaimed.with_weight(err_weight) + ); + + assert_noop!( + Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + expected_last_reward_era, + 0 + ), + Error::::AlreadyClaimed.with_weight(err_weight) + ); + + assert_noop!( + Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + expected_last_reward_era, + 1 + ), + Error::::AlreadyClaimed.with_weight(err_weight) + ); + + // invalid page + assert_noop!( + Staking::payout_stakers_by_page( + RuntimeOrigin::signed(1337), + 11, + expected_last_reward_era, + 2 + ), + Error::::InvalidPage.with_weight(err_weight) + ); + }); +} + +#[test] +fn test_commission_paid_across_pages() { + ExtBuilder::default().has_stakers(false).build_and_execute(|| { + let balance = 1; + let commission = 50; + // Create a validator: + bond_validator(11, balance); + assert_ok!(Staking::validate( + RuntimeOrigin::signed(11), + ValidatorPrefs { commission: Perbill::from_percent(commission), blocked: false } + )); + assert_eq!(Validators::::count(), 1); + + // Create nominators, targeting stash of validators + for i in 0..200 { + let bond_amount = balance + i as Balance; + bond_nominator(1000 + i, bond_amount, vec![11]); + } + + mock::start_active_era(1); + Staking::reward_by_ids(vec![(11, 1)]); + + // Since `MaxExposurePageSize = 64`, there are four pages of validator + // exposure. + assert_eq!(EraInfo::::get_page_count(1, &11), 4); + + // compute and ensure the reward amount is greater than zero. + let payout = current_total_payout_for_duration(reward_time_per_era()); + mock::start_active_era(2); + + let initial_balance = asset::stakeable_balance::(&11); + // Payout rewards for first exposure page + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 1, 0)); + + let controller_balance_after_p0_payout = asset::stakeable_balance::(&11); + + // some commission is paid + assert!(initial_balance < controller_balance_after_p0_payout); + + // payout all pages + for i in 1..4 { + let before_balance = asset::stakeable_balance::(&11); + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 1, i)); + let after_balance = asset::stakeable_balance::(&11); + // some commission is paid for every page + assert!(before_balance < after_balance); + } + + assert_eq_error_rate!( + asset::stakeable_balance::(&11), + initial_balance + payout / 2, + 1, + ); + }); +} + +#[test] +fn payout_stakers_handles_weight_refund() { + // Note: this test relies on the assumption that `payout_stakers_alive_staked` is solely used by + // `payout_stakers` to calculate the weight of each payout op. + ExtBuilder::default().has_stakers(false).build_and_execute(|| { + let max_nom_rewarded = MaxExposurePageSize::get(); + // Make sure the configured value is meaningful for our use. + assert!(max_nom_rewarded >= 4); + let half_max_nom_rewarded = max_nom_rewarded / 2; + // Sanity check our max and half max nominator quantities. + assert!(half_max_nom_rewarded > 0); + assert!(max_nom_rewarded > half_max_nom_rewarded); + + let max_nom_rewarded_weight = + ::WeightInfo::payout_stakers_alive_staked(max_nom_rewarded); + let half_max_nom_rewarded_weight = + ::WeightInfo::payout_stakers_alive_staked(half_max_nom_rewarded); + let zero_nom_payouts_weight = ::WeightInfo::payout_stakers_alive_staked(0); + assert!(zero_nom_payouts_weight.any_gt(Weight::zero())); + assert!(half_max_nom_rewarded_weight.any_gt(zero_nom_payouts_weight)); + assert!(max_nom_rewarded_weight.any_gt(half_max_nom_rewarded_weight)); + + let balance = 1000; + bond_validator(11, balance); + + // Era 1 + start_active_era(1); + + // Reward just the validator. + Staking::reward_by_ids(vec![(11, 1)]); + + // Add some `half_max_nom_rewarded` nominators who will start backing the validator in the + // next era. + for i in 0..half_max_nom_rewarded { + bond_nominator((1000 + i).into(), balance + i as Balance, vec![11]); + } + + // Era 2 + start_active_era(2); + + // Collect payouts when there are no nominators + let call = TestCall::Staking(StakingCall::payout_stakers_by_page { + validator_stash: 11, + era: 1, + page: 0, + }); + let info = call.get_dispatch_info(); + let result = call.dispatch(RuntimeOrigin::signed(20)); + assert_ok!(result); + assert_eq!(extract_actual_weight(&result, &info), zero_nom_payouts_weight); + + // The validator is not rewarded in this era; so there will be zero payouts to claim for + // this era. + + // Era 3 + start_active_era(3); + + // Collect payouts for an era where the validator did not receive any points. + let call = TestCall::Staking(StakingCall::payout_stakers_by_page { + validator_stash: 11, + era: 2, + page: 0, + }); + let info = call.get_dispatch_info(); + let result = call.dispatch(RuntimeOrigin::signed(20)); + assert_ok!(result); + assert_eq!(extract_actual_weight(&result, &info), zero_nom_payouts_weight); + + // Reward the validator and its nominators. + Staking::reward_by_ids(vec![(11, 1)]); + + // Era 4 + start_active_era(4); + + // Collect payouts when the validator has `half_max_nom_rewarded` nominators. + let call = TestCall::Staking(StakingCall::payout_stakers_by_page { + validator_stash: 11, + era: 3, + page: 0, + }); + let info = call.get_dispatch_info(); + let result = call.dispatch(RuntimeOrigin::signed(20)); + assert_ok!(result); + assert_eq!(extract_actual_weight(&result, &info), half_max_nom_rewarded_weight); + + // Add enough nominators so that we are at the limit. They will be active nominators + // in the next era. + for i in half_max_nom_rewarded..max_nom_rewarded { + bond_nominator((1000 + i).into(), balance + i as Balance, vec![11]); + } + + // Era 5 + start_active_era(5); + // We now have `max_nom_rewarded` nominators actively nominating our validator. + + // Reward the validator so we can collect for everyone in the next era. + Staking::reward_by_ids(vec![(11, 1)]); + + // Era 6 + start_active_era(6); + + // Collect payouts when the validator had `half_max_nom_rewarded` nominators. + let call = TestCall::Staking(StakingCall::payout_stakers_by_page { + validator_stash: 11, + era: 5, + page: 0, + }); + let info = call.get_dispatch_info(); + let result = call.dispatch(RuntimeOrigin::signed(20)); + assert_ok!(result); + assert_eq!(extract_actual_weight(&result, &info), max_nom_rewarded_weight); + + // Try and collect payouts for an era that has already been collected. + let call = TestCall::Staking(StakingCall::payout_stakers_by_page { + validator_stash: 11, + era: 5, + page: 0, + }); + let info = call.get_dispatch_info(); + let result = call.dispatch(RuntimeOrigin::signed(20)); + assert!(result.is_err()); + // When there is an error the consumed weight == weight when there are 0 nominator payouts. + assert_eq!(extract_actual_weight(&result, &info), zero_nom_payouts_weight); + }); +} + +#[test] +fn bond_during_era_does_not_populate_legacy_claimed_rewards() { + ExtBuilder::default().has_stakers(false).build_and_execute(|| { + // Era = None + bond_validator(9, 1000); + assert_eq!( + Staking::ledger(9.into()).unwrap(), + StakingLedgerInspect { + stash: 9, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + mock::start_active_era(5); + bond_validator(11, 1000); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + // make sure only era up to history depth is stored + let current_era = 99; + mock::start_active_era(current_era); + bond_validator(13, 1000); + assert_eq!( + Staking::ledger(13.into()).unwrap(), + StakingLedgerInspect { + stash: 13, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: Default::default(), + } + ); + }); +} + +#[test] +fn offences_weight_calculated_correctly() { + ExtBuilder::default().nominate(true).build_and_execute(|| { + // On offence with zero offenders: 4 Reads, 1 Write + let zero_offence_weight = + ::DbWeight::get().reads_writes(4, 1); + assert_eq!( + >::on_offence(&[], &[Perbill::from_percent(50)], 0), + zero_offence_weight + ); + + // On Offence with N offenders, Unapplied: 4 Reads, 1 Write + 4 Reads, 5 Writes, 2 Reads + 2 + // Writes for `SessionInterface::report_offence` call. + let n_offence_unapplied_weight = ::DbWeight::get() + .reads_writes(4, 1) + + ::DbWeight::get().reads_writes(4, 5) + + ::DbWeight::get().reads_writes(2, 2); + + let offenders: Vec< + OffenceDetails< + ::AccountId, + pallet_session::historical::IdentificationTuple, + >, + > = (1..10) + .map(|i| OffenceDetails { + offender: (i, ()), + reporters: vec![], + }) + .collect(); + assert_eq!( + >::on_offence( + &offenders, + &[Perbill::from_percent(50)], + 0, + ), + n_offence_unapplied_weight + ); + + // On Offence with one offenders, Applied + let one_offender = [offence_from(11, Some(vec![1]))]; + + let n = 1; // Number of offenders + let rw = 3 + 3 * n; // rw reads and writes + let one_offence_unapplied_weight = + ::DbWeight::get().reads_writes(4, 1) + + + ::DbWeight::get().reads_writes(rw, rw) + // One `slash_cost` + + ::DbWeight::get().reads_writes(6, 5) + // `slash_cost` * nominators (1) + + ::DbWeight::get().reads_writes(6, 5) + // `reward_cost` * reporters (1) + + ::DbWeight::get().reads_writes(2, 2) + // `SessionInterface::report_offence` + + ::DbWeight::get().reads_writes(2, 2); + + assert_eq!( + >::on_offence( + &one_offender, + &[Perbill::from_percent(50)], + 0, + ), + one_offence_unapplied_weight + ); + }); +} + +#[test] +fn payout_to_any_account_works() { + ExtBuilder::default().has_stakers(false).build_and_execute(|| { + let balance = 1000; + // Create a validator: + bond_validator(11, balance); // Default(64) + + // Create a stash/controller pair + bond_nominator(1234, 100, vec![11]); + + // Update payout location + assert_ok!(Staking::set_payee(RuntimeOrigin::signed(1234), RewardDestination::Account(42))); + + // Reward Destination account doesn't exist + assert_eq!(asset::stakeable_balance::(&42), 0); + + mock::start_active_era(1); + Staking::reward_by_ids(vec![(11, 1)]); + // compute and ensure the reward amount is greater than zero. + let _ = current_total_payout_for_duration(reward_time_per_era()); + mock::start_active_era(2); + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 1, 0)); + + // Payment is successful + assert!(asset::stakeable_balance::(&42) > 0); + }) +} + +#[test] +fn session_buffering_with_offset() { + // similar to live-chains, have some offset for the first session + ExtBuilder::default() + .offset(2) + .period(5) + .session_per_era(5) + .build_and_execute(|| { + assert_eq!(current_era(), 0); + assert_eq!(active_era(), 0); + assert_eq!(Session::current_index(), 0); + + start_session(1); + assert_eq!(current_era(), 0); + assert_eq!(active_era(), 0); + assert_eq!(Session::current_index(), 1); + assert_eq!(System::block_number(), 2); + + start_session(2); + assert_eq!(current_era(), 0); + assert_eq!(active_era(), 0); + assert_eq!(Session::current_index(), 2); + assert_eq!(System::block_number(), 7); + + start_session(3); + assert_eq!(current_era(), 0); + assert_eq!(active_era(), 0); + assert_eq!(Session::current_index(), 3); + assert_eq!(System::block_number(), 12); + + // active era is lagging behind by one session, because of how session module works. + start_session(4); + assert_eq!(current_era(), 1); + assert_eq!(active_era(), 0); + assert_eq!(Session::current_index(), 4); + assert_eq!(System::block_number(), 17); + + start_session(5); + assert_eq!(current_era(), 1); + assert_eq!(active_era(), 1); + assert_eq!(Session::current_index(), 5); + assert_eq!(System::block_number(), 22); + + // go all the way to active 2. + start_active_era(2); + assert_eq!(current_era(), 2); + assert_eq!(active_era(), 2); + assert_eq!(Session::current_index(), 10); + }); +} + +#[test] +fn session_buffering_no_offset() { + // no offset, first session starts immediately + ExtBuilder::default() + .offset(0) + .period(5) + .session_per_era(5) + .build_and_execute(|| { + assert_eq!(current_era(), 0); + assert_eq!(active_era(), 0); + assert_eq!(Session::current_index(), 0); + + start_session(1); + assert_eq!(current_era(), 0); + assert_eq!(active_era(), 0); + assert_eq!(Session::current_index(), 1); + assert_eq!(System::block_number(), 5); + + start_session(2); + assert_eq!(current_era(), 0); + assert_eq!(active_era(), 0); + assert_eq!(Session::current_index(), 2); + assert_eq!(System::block_number(), 10); + + start_session(3); + assert_eq!(current_era(), 0); + assert_eq!(active_era(), 0); + assert_eq!(Session::current_index(), 3); + assert_eq!(System::block_number(), 15); + + // active era is lagging behind by one session, because of how session module works. + start_session(4); + assert_eq!(current_era(), 1); + assert_eq!(active_era(), 0); + assert_eq!(Session::current_index(), 4); + assert_eq!(System::block_number(), 20); + + start_session(5); + assert_eq!(current_era(), 1); + assert_eq!(active_era(), 1); + assert_eq!(Session::current_index(), 5); + assert_eq!(System::block_number(), 25); + + // go all the way to active 2. + start_active_era(2); + assert_eq!(current_era(), 2); + assert_eq!(active_era(), 2); + assert_eq!(Session::current_index(), 10); + }); +} + +#[test] +fn cannot_rebond_to_lower_than_ed() { + ExtBuilder::default() + .existential_deposit(11) + .balance_factor(11) + .build_and_execute(|| { + // initial stuff. + assert_eq!( + Staking::ledger(21.into()).unwrap(), + StakingLedgerInspect { + stash: 21, + total: 11 * 1000, + active: 11 * 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + // unbond all of it. must be chilled first. + assert_ok!(Staking::chill(RuntimeOrigin::signed(21))); + assert_ok!(Staking::unbond(RuntimeOrigin::signed(21), 11 * 1000)); + assert_eq!( + Staking::ledger(21.into()).unwrap(), + StakingLedgerInspect { + stash: 21, + total: 11 * 1000, + active: 0, + unlocking: bounded_vec![UnlockChunk { value: 11 * 1000, era: 3 }], + legacy_claimed_rewards: bounded_vec![], + } + ); + + // now bond a wee bit more + assert_noop!( + Staking::rebond(RuntimeOrigin::signed(21), 5), + Error::::InsufficientBond + ); + }) +} + +#[test] +fn cannot_bond_extra_to_lower_than_ed() { + ExtBuilder::default() + .existential_deposit(11) + .balance_factor(11) + .build_and_execute(|| { + // initial stuff. + assert_eq!( + Staking::ledger(21.into()).unwrap(), + StakingLedgerInspect { + stash: 21, + total: 11 * 1000, + active: 11 * 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + // unbond all of it. must be chilled first. + assert_ok!(Staking::chill(RuntimeOrigin::signed(21))); + assert_ok!(Staking::unbond(RuntimeOrigin::signed(21), 11 * 1000)); + assert_eq!( + Staking::ledger(21.into()).unwrap(), + StakingLedgerInspect { + stash: 21, + total: 11 * 1000, + active: 0, + unlocking: bounded_vec![UnlockChunk { value: 11 * 1000, era: 3 }], + legacy_claimed_rewards: bounded_vec![], + } + ); + + // now bond a wee bit more + assert_noop!( + Staking::bond_extra(RuntimeOrigin::signed(21), 5), + Error::::InsufficientBond, + ); + }) +} + +#[test] +fn do_not_die_when_active_is_ed() { + let ed = 10; + ExtBuilder::default() + .existential_deposit(ed) + .balance_factor(ed) + .build_and_execute(|| { + // given + assert_eq!( + Staking::ledger(21.into()).unwrap(), + StakingLedgerInspect { + stash: 21, + total: 1000 * ed, + active: 1000 * ed, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + + // when unbond all of it except ed. + assert_ok!(Staking::unbond(RuntimeOrigin::signed(21), 999 * ed)); + start_active_era(3); + assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(21), 100)); + + // then + assert_eq!( + Staking::ledger(21.into()).unwrap(), + StakingLedgerInspect { + stash: 21, + total: ed, + active: ed, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + }) +} + +#[test] +fn on_finalize_weight_is_nonzero() { + ExtBuilder::default().build_and_execute(|| { + let on_finalize_weight = ::DbWeight::get().reads(1); + assert!(>::on_initialize(1).all_gte(on_finalize_weight)); + }) +} + +#[test] +fn restricted_accounts_can_only_withdraw() { + ExtBuilder::default().build_and_execute(|| { + start_active_era(1); + // alice is a non blacklisted account. + let alice = 301; + let _ = Balances::make_free_balance_be(&alice, 500); + // alice can bond + assert_ok!(Staking::bond(RuntimeOrigin::signed(alice), 100, RewardDestination::Staked)); + // and bob is a blacklisted account + let bob = 302; + let _ = Balances::make_free_balance_be(&bob, 500); + restrict(&bob); + + // Bob cannot bond + assert_noop!( + Staking::bond(RuntimeOrigin::signed(bob), 100, RewardDestination::Staked,), + Error::::Restricted + ); + + // alice is blacklisted now and cannot bond anymore + restrict(&alice); + assert_noop!( + Staking::bond_extra(RuntimeOrigin::signed(alice), 100), + Error::::Restricted + ); + // but she can unbond her existing bond + assert_ok!(Staking::unbond(RuntimeOrigin::signed(alice), 100)); + + // she cannot rebond the unbonded amount + start_active_era(2); + assert_noop!(Staking::rebond(RuntimeOrigin::signed(alice), 50), Error::::Restricted); + + // move to era when alice fund can be withdrawn + start_active_era(4); + // alice can withdraw now + assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(alice), 0)); + // she still cannot bond + assert_noop!( + Staking::bond(RuntimeOrigin::signed(alice), 100, RewardDestination::Staked,), + Error::::Restricted + ); + + // bob is removed from restrict list + remove_from_restrict_list(&bob); + // bob can bond now + assert_ok!(Staking::bond(RuntimeOrigin::signed(bob), 100, RewardDestination::Staked)); + // and bond extra + assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(bob), 100)); + + start_active_era(6); + // unbond also works. + assert_ok!(Staking::unbond(RuntimeOrigin::signed(bob), 100)); + // bob can withdraw as well. + start_active_era(9); + assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(bob), 0)); + }) +} + +mod election_data_provider { + use super::*; + use frame_election_provider_support::ElectionDataProvider; + + #[test] + fn targets_2sec_block() { + let mut validators = 1000; + while ::WeightInfo::get_npos_targets(validators).all_lt(Weight::from_parts( + 2u64 * frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND, + u64::MAX, + )) { + validators += 1; + } + + println!("Can create a snapshot of {} validators in 2sec block", validators); + } + + #[test] + fn voters_2sec_block() { + // we assume a network only wants up to 1000 validators in most cases, thus having 2000 + // candidates is as high as it gets. + let validators = 2000; + let mut nominators = 1000; + + while ::WeightInfo::get_npos_voters(validators, nominators).all_lt( + Weight::from_parts( + 2u64 * frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND, + u64::MAX, + ), + ) { + nominators += 1; + } + + println!( + "Can create a snapshot of {} nominators [{} validators, each 1 slashing] in 2sec block", + nominators, validators + ); + } + + #[test] + fn set_minimum_active_stake_is_correct() { + ExtBuilder::default() + .nominate(false) + .add_staker(61, 61, 2_000, StakerStatus::::Nominator(vec![21])) + .add_staker(71, 71, 10, StakerStatus::::Nominator(vec![21])) + .add_staker(81, 81, 50, StakerStatus::::Nominator(vec![21])) + .build_and_execute(|| { + // default bounds are unbounded. + assert_ok!(::electing_voters( + DataProviderBounds::default(), + SINGLE_PAGE, + )); + assert_eq!(MinimumActiveStake::::get(), 10); + + // remove staker with lower bond by limiting the number of voters and check + // `MinimumActiveStake` again after electing voters. + let bounds = ElectionBoundsBuilder::default().voters_count(5.into()).build(); + assert_ok!(::electing_voters( + bounds.voters, + SINGLE_PAGE + )); + // POLYMESH: We don't use bags. + //assert_eq!(MinimumActiveStake::::get(), 50); + }); + } + + #[test] + fn set_minimum_active_stake_lower_bond_works() { + // if there are no voters, minimum active stake is zero (should not happen). + ExtBuilder::default().has_stakers(false).build_and_execute(|| { + // default bounds are unbounded. + assert_ok!(::electing_voters( + DataProviderBounds::default(), + SINGLE_PAGE, + )); + assert_eq!(::VoterList::count(), 0); + assert_eq!(MinimumActiveStake::::get(), 0); + }); + + // lower non-zero active stake below `MinNominatorBond` is the minimum active stake if + // it is selected as part of the npos voters. + ExtBuilder::default().has_stakers(true).nominate(true).build_and_execute(|| { + assert_eq!(MinNominatorBond::::get(), 1); + assert_eq!(::VoterList::count(), 4); + + assert_ok!(Staking::bond(RuntimeOrigin::signed(4), 5, RewardDestination::Staked,)); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(4), vec![1])); + assert_eq!(::VoterList::count(), 5); + + let voters_before = ::electing_voters( + DataProviderBounds::default(), + SINGLE_PAGE, + ) + .unwrap(); + assert_eq!(MinimumActiveStake::::get(), 5); + + // update minimum nominator bond. + MinNominatorBond::::set(10); + assert_eq!(MinNominatorBond::::get(), 10); + // voter list still considers nominator 4 for voting, even though its active stake is + // lower than `MinNominatorBond`. + assert_eq!(::VoterList::count(), 5); + + let voters = ::electing_voters( + DataProviderBounds::default(), + SINGLE_PAGE, + ) + .unwrap(); + assert_eq!(voters_before, voters); + + // minimum active stake is lower than `MinNominatorBond`. + assert_eq!(MinimumActiveStake::::get(), 5); + }); + } + + #[test] + fn set_minimum_active_bond_corrupt_state() { + ExtBuilder::default() + .has_stakers(true) + .nominate(true) + .add_staker(61, 61, 2_000, StakerStatus::::Nominator(vec![21])) + .build_and_execute(|| { + assert_eq!(Staking::weight_of(&101), 500); + let voters = ::electing_voters( + DataProviderBounds::default(), + SINGLE_PAGE, + ) + .unwrap(); + assert_eq!(voters.len(), 5); + assert_eq!(MinimumActiveStake::::get(), 500); + + assert_ok!(Staking::unbond(RuntimeOrigin::signed(101), 200)); + start_active_era(10); + assert_ok!(Staking::unbond(RuntimeOrigin::signed(101), 100)); + start_active_era(20); + + // corrupt ledger state by lowering max unlocking chunks bounds. + MaxUnlockingChunks::set(1); + + let voters = ::electing_voters( + DataProviderBounds::default(), + SINGLE_PAGE, + ) + .unwrap(); + // number of returned voters decreases since ledger entry of stash 101 is now + // corrupt. + assert_eq!(voters.len(), 4); + // minimum active stake does not take into consideration the corrupt entry. + assert_eq!(MinimumActiveStake::::get(), 2_000); + + // voter weight of corrupted ledger entry is 0. + assert_eq!(Staking::weight_of(&101), 0); + + // reset max unlocking chunks for try_state to pass. + MaxUnlockingChunks::set(32); + }) + } + + #[test] + fn voters_include_self_vote() { + ExtBuilder::default().nominate(false).build_and_execute(|| { + // default bounds are unbounded. + assert!(>::iter().map(|(x, _)| x).all(|v| Staking::electing_voters( + DataProviderBounds::default(), + SINGLE_PAGE, + ) + .unwrap() + .into_iter() + .any(|(w, _, t)| { v == w && t[0] == w }))) + }) + } + + // Tests the criteria that in `ElectionDataProvider::voters` function, we try to get at most + // `maybe_max_len` voters, and if some of them end up being skipped, we iterate at most `2 * + // maybe_max_len`. + #[test] + #[should_panic] + #[cfg(debug_assertions)] + fn only_iterates_max_2_times_max_allowed_len() { + ExtBuilder::default() + .nominate(false) + // the best way to invalidate a bunch of nominators is to have them nominate a lot of + // ppl, but then lower the MaxNomination limit. + .add_staker( + 61, + 61, + 2_000, + StakerStatus::::Nominator(vec![21, 22, 23, 24, 25]), + ) + .add_staker( + 71, + 71, + 2_000, + StakerStatus::::Nominator(vec![21, 22, 23, 24, 25]), + ) + .add_staker( + 81, + 81, + 2_000, + StakerStatus::::Nominator(vec![21, 22, 23, 24, 25]), + ) + .build_and_execute(|| { + let bounds_builder = ElectionBoundsBuilder::default(); + // all voters ordered by stake, + assert_eq!( + ::VoterList::iter().collect::>(), + vec![61, 71, 81, 11, 21, 31] + ); + + AbsoluteMaxNominations::set(2); + + // we want 2 voters now, and in maximum we allow 4 iterations. This is what happens: + // 61 is pruned; + // 71 is pruned; + // 81 is pruned; + // 11 is taken; + // we finish since the 2x limit is reached. + assert_eq!( + Staking::electing_voters( + bounds_builder.voters_count(2.into()).build().voters, + SINGLE_PAGE, + ) + .unwrap() + .iter() + .map(|(stash, _, _)| stash) + .copied() + .collect::>(), + vec![11], + ); + }); + } + + #[test] + fn respects_snapshot_count_limits() { + ExtBuilder::default() + .set_status(41, StakerStatus::Validator) + .build_and_execute(|| { + // sum of all nominators who'd be voters (1), plus the self-votes (4). + assert_eq!(::VoterList::count(), 5); + + let bounds_builder = ElectionBoundsBuilder::default(); + + // if voter count limit is less.. + assert_eq!( + Staking::electing_voters( + bounds_builder.voters_count(1.into()).build().voters, + SINGLE_PAGE, + ) + .unwrap() + .len(), + 1 + ); + + // if voter count limit is equal.. + assert_eq!( + Staking::electing_voters( + bounds_builder.voters_count(5.into()).build().voters, + SINGLE_PAGE, + ) + .unwrap() + .len(), + 5 + ); + + // if voter count limit is more. + assert_eq!( + Staking::electing_voters( + bounds_builder.voters_count(55.into()).build().voters, + SINGLE_PAGE, + ) + .unwrap() + .len(), + 5 + ); + + // if target count limit is more.. + assert_eq!( + Staking::electable_targets( + bounds_builder.targets_count(6.into()).build().targets, + SINGLE_PAGE, + ) + .unwrap() + .len(), + 4 + ); + + // if target count limit is equal.. + assert_eq!( + Staking::electable_targets( + bounds_builder.targets_count(4.into()).build().targets, + SINGLE_PAGE, + ) + .unwrap() + .len(), + 4 + ); + + // if target limit count is less, then we return an error. + assert_eq!( + Staking::electable_targets( + bounds_builder.targets_count(1.into()).build().targets, + SINGLE_PAGE, + ) + .unwrap_err(), + "Target snapshot too big" + ); + }); + } + + #[test] + fn respects_snapshot_size_limits() { + ExtBuilder::default().build_and_execute(|| { + // voters: set size bounds that allows only for 1 voter. + let bounds = ElectionBoundsBuilder::default().voters_size(26.into()).build(); + let elected = Staking::electing_voters(bounds.voters, SINGLE_PAGE).unwrap(); + assert!(elected.encoded_size() == 26 as usize); + let prev_len = elected.len(); + + // larger size bounds means more quota for voters. + let bounds = ElectionBoundsBuilder::default().voters_size(100.into()).build(); + let elected = Staking::electing_voters(bounds.voters, SINGLE_PAGE).unwrap(); + assert!(elected.encoded_size() <= 100 as usize); + assert!(elected.len() > 1 && elected.len() > prev_len); + + // targets: set size bounds that allows for only one target to fit in the snapshot. + let bounds = ElectionBoundsBuilder::default().targets_size(10.into()).build(); + let elected = Staking::electable_targets(bounds.targets, SINGLE_PAGE).unwrap(); + assert!(elected.encoded_size() == 9 as usize); + let prev_len = elected.len(); + + // larger size bounds means more space for targets. + let bounds = ElectionBoundsBuilder::default().targets_size(100.into()).build(); + let elected = Staking::electable_targets(bounds.targets, SINGLE_PAGE).unwrap(); + assert!(elected.encoded_size() <= 100 as usize); + assert!(elected.len() > 1 && elected.len() > prev_len); + }); + } + + #[test] + fn nomination_quota_checks_at_nominate_works() { + ExtBuilder::default().nominate(false).build_and_execute(|| { + // stash bond of 222 has a nomination quota of 2 targets. + bond(61, 222); + assert_eq!(Staking::api_nominations_quota(222), 2); + + // nominating with targets below the nomination quota works. + assert_ok!(Staking::nominate(RuntimeOrigin::signed(61), vec![11])); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(61), vec![11, 12])); + + // nominating with targets above the nomination quota returns error. + assert_noop!( + Staking::nominate(RuntimeOrigin::signed(61), vec![11, 12, 13]), + Error::::TooManyTargets + ); + }); + } + + #[test] + fn lazy_quota_npos_voters_works_above_quota() { + ExtBuilder::default() + .nominate(false) + .add_staker( + 61, + 60, + 300, // 300 bond has 16 nomination quota. + StakerStatus::::Nominator(vec![21, 22, 23, 24, 25]), + ) + .build_and_execute(|| { + // unbond 78 from stash 60 so that it's bonded balance is 222, which has a lower + // nomination quota than at nomination time (max 2 targets). + assert_ok!(Staking::unbond(RuntimeOrigin::signed(61), 78)); + assert_eq!(Staking::api_nominations_quota(300 - 78), 2); + + // even through 61 has nomination quota of 2 at the time of the election, all the + // nominations (5) will be used. + // POLYMESH NOTE: Changed the order. + assert_eq!( + Staking::electing_voters(DataProviderBounds::default(), SINGLE_PAGE) + .unwrap() + .iter() + .map(|(stash, _, targets)| (*stash, targets.len())) + .collect::>(), + vec![(31, 1), (21, 1), (11, 1), (61, 5)], + ); + }); + } + + #[test] + fn nominations_quota_limits_size_work() { + ExtBuilder::default() + .nominate(false) + .add_staker( + 71, + 70, + 333, + StakerStatus::::Nominator(vec![16, 15, 14, 13, 12, 11, 10]), + ) + .build_and_execute(|| { + // nominations of controller 70 won't be added due to voter size limit exceeded. + let bounds = ElectionBoundsBuilder::default().voters_size(100.into()).build(); + // POLYMESH NOTE: Changed the order. + assert_eq!( + Staking::electing_voters(bounds.voters, SINGLE_PAGE) + .unwrap() + .iter() + .map(|(stash, _, targets)| (*stash, targets.len())) + .collect::>(), + vec![(31, 1), (21, 1), (11, 1)], + ); + + assert_eq!( + *staking_events().last().unwrap(), + Event::SnapshotVotersSizeExceeded { size: 75 } + ); + + // however, if the election voter size bounds were larger, the snapshot would + // include the electing voters of 70. + let bounds = ElectionBoundsBuilder::default().voters_size(1_000.into()).build(); + // POLYMESH NOTE: Changed the order. + assert_eq!( + Staking::electing_voters(bounds.voters, SINGLE_PAGE) + .unwrap() + .iter() + .map(|(stash, _, targets)| (*stash, targets.len())) + .collect::>(), + vec![(31, 1), (21, 1), (11, 1), (71, 7)], + ); + }); + } + + #[test] + fn estimate_next_election_works() { + ExtBuilder::default().session_per_era(5).period(5).build_and_execute(|| { + // first session is always length 0. + for b in 1..20 { + run_to_block(b); + assert_eq!(Staking::next_election_prediction(System::block_number()), 20); + } + + // election + run_to_block(20); + assert_eq!(Staking::next_election_prediction(System::block_number()), 45); + assert_eq!(staking_events().len(), 1); + assert_eq!(*staking_events().last().unwrap(), Event::StakersElected); + + for b in 21..45 { + run_to_block(b); + assert_eq!(Staking::next_election_prediction(System::block_number()), 45); + } + + // election + run_to_block(45); + assert_eq!(Staking::next_election_prediction(System::block_number()), 70); + assert_eq!(staking_events().len(), 3); + assert_eq!(*staking_events().last().unwrap(), Event::StakersElected); + + Staking::force_no_eras(RuntimeOrigin::root()).unwrap(); + assert_eq!(Staking::next_election_prediction(System::block_number()), u64::MAX); + + Staking::force_new_era_always(RuntimeOrigin::root()).unwrap(); + assert_eq!(Staking::next_election_prediction(System::block_number()), 45 + 5); + + Staking::force_new_era(RuntimeOrigin::root()).unwrap(); + assert_eq!(Staking::next_election_prediction(System::block_number()), 45 + 5); + + // Do a fail election + MinimumValidatorCount::::put(1000); + run_to_block(50); + // Election: failed, next session is a new election + assert_eq!(Staking::next_election_prediction(System::block_number()), 50 + 5); + // The new era is still forced until a new era is planned. + assert_eq!(ForceEra::::get(), Forcing::ForceNew); + + MinimumValidatorCount::::put(2); + run_to_block(55); + assert_eq!(Staking::next_election_prediction(System::block_number()), 55 + 25); + assert_eq!(staking_events().len(), 10); + assert_eq!( + *staking_events().last().unwrap(), + Event::ForceEra { mode: Forcing::NotForcing } + ); + assert_eq!( + *staking_events().get(staking_events().len() - 2).unwrap(), + Event::StakersElected + ); + // The new era has been planned, forcing is changed from `ForceNew` to `NotForcing`. + assert_eq!(ForceEra::::get(), Forcing::NotForcing); + }) + } +} + +// POLYMESH NOTE: This is not panicing for us. +#[ignore] +#[test] +#[should_panic] +fn count_check_works() { + ExtBuilder::default().build_and_execute(|| { + // We should never insert into the validators or nominators map directly as this will + // not keep track of the count. This test should panic as we verify the count is accurate + // after every test using the `post_checks` in `mock`. + Validators::::insert(987654321, ValidatorPrefs::default()); + Nominators::::insert( + 987654321, + Nominations { + targets: Default::default(), + submitted_in: Default::default(), + suppressed: false, + }, + ); + }) +} + +#[test] +#[should_panic = "called `Result::unwrap()` on an `Err` value: Other(\"number of entries in payee storage items does not match the number of bonded ledgers\")"] +fn check_payee_invariant1_works() { + // A bonded ledger should always have an assigned `Payee` This test should panic as we verify + // that a bad state will panic due to the `try_state` checks in the `post_checks` in `mock`. + ExtBuilder::default().build_and_execute(|| { + let rogue_ledger = StakingLedger::::new(123456, 20); + Ledger::::insert(123456, rogue_ledger); + }) +} + +#[test] +#[should_panic = "called `Result::unwrap()` on an `Err` value: Other(\"number of entries in payee storage items does not match the number of bonded ledgers\")"] +fn check_payee_invariant2_works() { + // The number of entries in both `Payee` and of bonded staking ledgers should match. This test + // should panic as we verify that a bad state will panic due to the `try_state` checks in the + // `post_checks` in `mock`. + ExtBuilder::default().build_and_execute(|| { + Payee::::insert(1111, RewardDestination::Staked); + }) +} + +#[test] +fn min_bond_checks_work() { + ExtBuilder::default() + .existential_deposit(100) + .balance_factor(100) + .min_nominator_bond(1_000) + .min_validator_bond(1_500) + .build_and_execute(|| { + // 500 is not enough for any role + assert_ok!(Staking::bond(RuntimeOrigin::signed(3), 500, RewardDestination::Stash)); + assert_noop!( + Staking::nominate(RuntimeOrigin::signed(3), vec![1]), + Error::::InsufficientBond + ); + assert_noop!( + Staking::validate(RuntimeOrigin::signed(3), ValidatorPrefs::default()), + Error::::InsufficientBond, + ); + + // 1000 is enough for nominator + assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(3), 500)); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(3), vec![1])); + assert_noop!( + Staking::validate(RuntimeOrigin::signed(3), ValidatorPrefs::default()), + Error::::InsufficientBond, + ); + + // 1500 is enough for validator + assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(3), 500)); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(3), vec![1])); + assert_ok!(Staking::validate(RuntimeOrigin::signed(3), ValidatorPrefs::default())); + + // Can't unbond anything as validator + assert_noop!( + Staking::unbond(RuntimeOrigin::signed(3), 500), + Error::::InsufficientBond + ); + + // Once they are a nominator, they can unbond 500 + assert_ok!(Staking::nominate(RuntimeOrigin::signed(3), vec![1])); + assert_ok!(Staking::unbond(RuntimeOrigin::signed(3), 500)); + assert_noop!( + Staking::unbond(RuntimeOrigin::signed(3), 500), + Error::::InsufficientBond + ); + + // Once they are chilled they can unbond everything + assert_ok!(Staking::chill(RuntimeOrigin::signed(3))); + assert_ok!(Staking::unbond(RuntimeOrigin::signed(3), 1000)); + }) +} + +#[test] +fn chill_other_works() { + ExtBuilder::default() + .existential_deposit(100) + .balance_factor(100) + .min_nominator_bond(1_000) + .min_validator_bond(1_500) + .build_and_execute(|| { + // Valid messing with existing validators and nominators. + let base = 400; + let initial_validators = Validators::::count(); + let initial_nominators = Nominators::::count(); + for i in 0..15 { + let a = base + 4 * i; + let b = base + 4 * i + 2; + let c = base + 4 * i + 3; + asset::set_stakeable_balance::(&a, 100_000); + asset::set_stakeable_balance::(&b, 100_000); + asset::set_stakeable_balance::(&c, 100_000); + + // Nominator + assert_ok!(Staking::bond(RuntimeOrigin::signed(a), 1000, RewardDestination::Stash)); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(a), vec![1])); + + // Validator + assert_ok!(Staking::bond(RuntimeOrigin::signed(b), 1500, RewardDestination::Stash)); + assert_ok!(Staking::validate(RuntimeOrigin::signed(b), ValidatorPrefs::default())); + } + + // To chill other users, we need to: + // * Set a minimum bond amount + // * Set a limit + // * Set a threshold + // + // If any of these are missing, we do not have enough information to allow the + // `chill_other` to succeed from one user to another. + // + // Out of 8 possible cases, only one will allow the use of `chill_other`, which is + // when all 3 conditions are met. + + // 1. No limits whatsoever + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove, + )); + + // Can't chill these users + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 0), + Error::::CannotChillOther + ); + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 2), + Error::::CannotChillOther + ); + + // 2. Change only the minimum bonds. + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Set(1_500), + ConfigOp::Set(2_000), + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + )); + + // Still can't chill these users + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 0), + Error::::CannotChillOther + ); + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 2), + Error::::CannotChillOther + ); + + // 3. Add nominator/validator count limits, but no other threshold. + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Set(10), + ConfigOp::Set(10), + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + )); + + // Still can't chill these users + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 0), + Error::::CannotChillOther + ); + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 2), + Error::::CannotChillOther + ); + + // 4. Add chil threshold, but no other limits + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Set(Percent::from_percent(75)), + ConfigOp::Noop, + ConfigOp::Noop, + )); + + // Still can't chill these users + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 0), + Error::::CannotChillOther + ); + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 2), + Error::::CannotChillOther + ); + + // 5. Add bond and count limits, but no threshold + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Set(1_500), + ConfigOp::Set(2_000), + ConfigOp::Set(10), + ConfigOp::Set(10), + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove, + )); + + // Still can't chill these users + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 0), + Error::::CannotChillOther + ); + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 2), + Error::::CannotChillOther + ); + + // 6. Add bond and threshold limits, but no count limits + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Set(Percent::from_percent(75)), + ConfigOp::Noop, + ConfigOp::Noop, + )); + + // Still can't chill these users + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 0), + Error::::CannotChillOther + ); + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 2), + Error::::CannotChillOther + ); + + // 7. Add count limits and a chill threshold, but no bond limits + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Set(10), + ConfigOp::Set(10), + ConfigOp::Set(Percent::from_percent(75)), + ConfigOp::Noop, + ConfigOp::Noop, + )); + + // Still can't chill these users + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 0), + Error::::CannotChillOther + ); + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 2), + Error::::CannotChillOther + ); + + // 8. Add all limits + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Set(1_500), + ConfigOp::Set(2_000), + ConfigOp::Set(10), + ConfigOp::Set(10), + ConfigOp::Set(Percent::from_percent(75)), + ConfigOp::Noop, + ConfigOp::Noop, + )); + + // 16 people total because tests start with 2 active one + assert_eq!(Nominators::::count(), 15 + initial_nominators); + assert_eq!(Validators::::count(), 15 + initial_validators); + + // Users can now be chilled down to 7 people, so we try to remove 9 of them (starting + // with 16) + for i in 6..15 { + let b = base + 4 * i; + let d = base + 4 * i + 2; + assert_ok!(Staking::chill_other(RuntimeOrigin::signed(1337), b)); + assert_eq!(*staking_events().last().unwrap(), Event::Chilled { stash: b }); + assert_ok!(Staking::chill_other(RuntimeOrigin::signed(1337), d)); + assert_eq!(*staking_events().last().unwrap(), Event::Chilled { stash: d }); + } + + // chill a nominator. Limit is not reached, not chill-able + assert_eq!(Nominators::::count(), 7); + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1337), base + 0), + Error::::CannotChillOther + ); + // chill a validator. Limit is reached, chill-able. + assert_eq!(Validators::::count(), 9); + assert_ok!(Staking::chill_other(RuntimeOrigin::signed(1337), base + 2)); + }) +} + +#[test] +fn capped_stakers_works() { + ExtBuilder::default().build_and_execute(|| { + let validator_count = Validators::::count(); + assert_eq!(validator_count, 3); + let nominator_count = Nominators::::count(); + assert_eq!(nominator_count, 1); + + // Change the maximums + let max = 10; + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Set(10), + ConfigOp::Set(10), + ConfigOp::Set(max), + ConfigOp::Set(max), + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Noop, + )); + + // can create `max - validator_count` validators + let mut some_existing_validator = AccountId::default(); + for i in 0..max - validator_count { + let (_, controller) = testing_utils::create_stash_controller::( + i + 10_000_000, + 100, + RewardDestination::Stash, + ) + .unwrap(); + assert_ok!(Staking::validate( + RuntimeOrigin::signed(controller), + ValidatorPrefs::default() + )); + some_existing_validator = controller; + } + + // but no more + let (_, last_validator) = + testing_utils::create_stash_controller::(1337, 100, RewardDestination::Stash) + .unwrap(); + + assert_noop!( + Staking::validate(RuntimeOrigin::signed(last_validator), ValidatorPrefs::default()), + Error::::TooManyValidators, + ); + + // same with nominators + let mut some_existing_nominator = AccountId::default(); + for i in 0..max - nominator_count { + let (_, controller) = testing_utils::create_stash_controller::( + i + 20_000_000, + 100, + RewardDestination::Stash, + ) + .unwrap(); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(controller), vec![1])); + some_existing_nominator = controller; + } + + // one more is too many. + let (_, last_nominator) = testing_utils::create_stash_controller::( + 30_000_000, + 100, + RewardDestination::Stash, + ) + .unwrap(); + assert_noop!( + Staking::nominate(RuntimeOrigin::signed(last_nominator), vec![1]), + Error::::TooManyNominators + ); + + // Re-nominate works fine + assert_ok!(Staking::nominate(RuntimeOrigin::signed(some_existing_nominator), vec![1])); + // Re-validate works fine + assert_ok!(Staking::validate( + RuntimeOrigin::signed(some_existing_validator), + ValidatorPrefs::default() + )); + + // No problem when we set to `None` again + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + )); + assert_ok!(Staking::nominate(RuntimeOrigin::signed(last_nominator), vec![1])); + assert_ok!(Staking::validate( + RuntimeOrigin::signed(last_validator), + ValidatorPrefs::default() + )); + }) +} + +#[test] +fn min_commission_works() { + ExtBuilder::default().build_and_execute(|| { + // account 11 controls the stash of itself. + assert_ok!(Staking::validate( + RuntimeOrigin::signed(11), + ValidatorPrefs { commission: Perbill::from_percent(5), blocked: false } + )); + + // event emitted should be correct + assert_eq!( + *staking_events().last().unwrap(), + Event::ValidatorPrefsSet { + stash: 11, + prefs: ValidatorPrefs { commission: Perbill::from_percent(5), blocked: false } + } + ); + + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Remove, + ConfigOp::Set(Perbill::from_percent(10)), + ConfigOp::Noop, + )); + + // can't make it less than 10 now + assert_noop!( + Staking::validate( + RuntimeOrigin::signed(11), + ValidatorPrefs { commission: Perbill::from_percent(5), blocked: false } + ), + Error::::CommissionTooLow + ); + + // can only change to higher. + assert_ok!(Staking::validate( + RuntimeOrigin::signed(11), + ValidatorPrefs { commission: Perbill::from_percent(10), blocked: false } + )); + + assert_ok!(Staking::validate( + RuntimeOrigin::signed(11), + ValidatorPrefs { commission: Perbill::from_percent(15), blocked: false } + )); + }) +} + +// POLYMESH NOTE: This is not panicing for us, since our voter list is not sorted. +#[ignore] +#[test] +#[should_panic] +#[cfg(debug_assertions)] +fn change_of_absolute_max_nominations() { + use frame_election_provider_support::ElectionDataProvider; + ExtBuilder::default() + .add_staker(61, 61, 10, StakerStatus::Nominator(vec![1])) + .add_staker(71, 71, 10, StakerStatus::Nominator(vec![1, 2, 3])) + .balance_factor(10) + .build_and_execute(|| { + // pre-condition + assert_eq!(AbsoluteMaxNominations::get(), 16); + + assert_eq!( + Nominators::::iter() + .map(|(k, n)| (k, n.targets.len())) + .collect::>(), + vec![(101, 2), (71, 3), (61, 1)] + ); + + // default bounds are unbounded. + let bounds = DataProviderBounds::default(); + + // 3 validators and 3 nominators + assert_eq!(Staking::electing_voters(bounds, SINGLE_PAGE).unwrap().len(), 3 + 3); + + // abrupt change from 16 to 4, everyone should be fine. + AbsoluteMaxNominations::set(4); + + assert_eq!( + Nominators::::iter() + .map(|(k, n)| (k, n.targets.len())) + .collect::>(), + vec![(101, 2), (71, 3), (61, 1)] + ); + assert_eq!(Staking::electing_voters(bounds, SINGLE_PAGE,).unwrap().len(), 3 + 3); + + // No one can be chilled on account of non-decodable keys. + for k in Nominators::::iter_keys() { + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1), k), + Error::::CannotChillOther + ); + } + + // abrupt change from 4 to 3, everyone should be fine. + AbsoluteMaxNominations::set(3); + + assert_eq!( + Nominators::::iter() + .map(|(k, n)| (k, n.targets.len())) + .collect::>(), + vec![(101, 2), (71, 3), (61, 1)] + ); + assert_eq!(Staking::electing_voters(bounds, SINGLE_PAGE,).unwrap().len(), 3 + 3); + + // As before, no one can be chilled on account of non-decodable keys. + for k in Nominators::::iter_keys() { + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1), k), + Error::::CannotChillOther + ); + } + + // abrupt change from 3 to 2, this should cause some nominators to be non-decodable, and + // thus non-existent unless they update. + AbsoluteMaxNominations::set(2); + + assert_eq!( + Nominators::::iter() + .map(|(k, n)| (k, n.targets.len())) + .collect::>(), + vec![(101, 2), (61, 1)] + ); + + // 101 and 61 still cannot be chilled by someone else. + for k in [101, 61].iter() { + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1), *k), + Error::::CannotChillOther + ); + } + + // 71 is still in storage.. + assert!(Nominators::::contains_key(71)); + // but its value cannot be decoded and default is returned. + assert!(Nominators::::get(71).is_none()); + + assert_eq!(Staking::electing_voters(bounds, SINGLE_PAGE,).unwrap().len(), 3 + 2); + assert!(Nominators::::contains_key(101)); + + // abrupt change from 2 to 1, this should cause some nominators to be non-decodable, and + // thus non-existent unless they update. + AbsoluteMaxNominations::set(1); + + assert_eq!( + Nominators::::iter() + .map(|(k, n)| (k, n.targets.len())) + .collect::>(), + vec![(61, 1)] + ); + + // 61 *still* cannot be chilled by someone else. + assert_noop!( + Staking::chill_other(RuntimeOrigin::signed(1), 61), + Error::::CannotChillOther + ); + + assert!(Nominators::::contains_key(71)); + assert!(Nominators::::contains_key(61)); + assert!(Nominators::::get(71).is_none()); + assert!(Nominators::::get(61).is_some()); + assert_eq!(Staking::electing_voters(bounds, SINGLE_PAGE,).unwrap().len(), 3 + 1); + + // now one of them can revive themselves by re-nominating to a proper value. + assert_ok!(Staking::nominate(RuntimeOrigin::signed(71), vec![1])); + assert_eq!( + Nominators::::iter() + .map(|(k, n)| (k, n.targets.len())) + .collect::>(), + vec![(71, 1), (61, 1)] + ); + + // or they can be chilled by any account. + assert!(Nominators::::contains_key(101)); + assert!(Nominators::::get(101).is_none()); + assert_ok!(Staking::chill_other(RuntimeOrigin::signed(71), 101)); + assert_eq!(*staking_events().last().unwrap(), Event::Chilled { stash: 101 }); + assert!(!Nominators::::contains_key(101)); + assert!(Nominators::::get(101).is_none()); + }) +} + +#[test] +fn nomination_quota_max_changes_decoding() { + use frame_election_provider_support::ElectionDataProvider; + ExtBuilder::default() + .add_staker(60, 61, 10, StakerStatus::Nominator(vec![1])) + .add_staker(70, 71, 10, StakerStatus::Nominator(vec![1, 2, 3])) + .add_staker(30, 330, 10, StakerStatus::Nominator(vec![1, 2, 3, 4])) + .add_staker(50, 550, 10, StakerStatus::Nominator(vec![1, 2, 3, 4])) + .balance_factor(11) + .build_and_execute(|| { + // pre-condition. + assert_eq!(MaxNominationsOf::::get(), 16); + + let unbonded_election = DataProviderBounds::default(); + + assert_eq!( + Nominators::::iter() + .map(|(k, n)| (k, n.targets.len())) + .collect::>(), + vec![(70, 3), (101, 2), (50, 4), (30, 4), (60, 1)] + ); + // 4 validators and 4 nominators + assert_eq!( + Staking::electing_voters(unbonded_election, SINGLE_PAGE,).unwrap().len(), + 4 + 4 + ); + }); +} + +#[test] +fn api_nominations_quota_works() { + ExtBuilder::default().build_and_execute(|| { + assert_eq!(Staking::api_nominations_quota(10), MaxNominationsOf::::get()); + assert_eq!(Staking::api_nominations_quota(333), MaxNominationsOf::::get()); + assert_eq!(Staking::api_nominations_quota(222), 2); + assert_eq!(Staking::api_nominations_quota(111), 1); + }) +} + +mod sorted_list_provider { + use super::*; + use frame_election_provider_support::SortedListProvider; + + #[test] + fn re_nominate_does_not_change_counters_or_list() { + ExtBuilder::default().nominate(true).build_and_execute(|| { + // given + let pre_insert_voter_count = + (Nominators::::count() + Validators::::count()) as u32; + assert_eq!(::VoterList::count(), pre_insert_voter_count); + + // POLYMESH NOTE: Changed the order. + assert_eq!( + ::VoterList::iter().collect::>(), + vec![31, 21, 11, 101] + ); + + // when account 101 renominates + assert_ok!(Staking::nominate(RuntimeOrigin::signed(101), vec![41])); + + // then counts don't change + assert_eq!(::VoterList::count(), pre_insert_voter_count); + // and the list is the same + // POLYMESH NOTE: Changed the order. + assert_eq!( + ::VoterList::iter().collect::>(), + vec![31, 21, 11, 101] + ); + }); + } + + #[test] + fn re_validate_does_not_change_counters_or_list() { + ExtBuilder::default().nominate(false).build_and_execute(|| { + // given + let pre_insert_voter_count = + (Nominators::::count() + Validators::::count()) as u32; + assert_eq!(::VoterList::count(), pre_insert_voter_count); + + // POLYMESH NOTE: Changed the order. + assert_eq!(::VoterList::iter().collect::>(), vec![31, 21, 11]); + + // when account 11 re-validates + assert_ok!(Staking::validate(RuntimeOrigin::signed(11), Default::default())); + + // then counts don't change + assert_eq!(::VoterList::count(), pre_insert_voter_count); + // and the list is the same + // POLYMESH NOTE: Changed the order. + assert_eq!(::VoterList::iter().collect::>(), vec![31, 21, 11]); + }); + } +} + +#[test] +fn force_apply_min_commission_works() { + let prefs = |c| ValidatorPrefs { commission: Perbill::from_percent(c), blocked: false }; + let validators = || Validators::::iter().collect::>(); + ExtBuilder::default().build_and_execute(|| { + assert_ok!(Staking::validate(RuntimeOrigin::signed(31), prefs(10))); + assert_ok!(Staking::validate(RuntimeOrigin::signed(21), prefs(5))); + + // Given + assert_eq!(validators(), vec![(31, prefs(10)), (21, prefs(5)), (11, prefs(0))]); + MinCommission::::set(Perbill::from_percent(5)); + + // When applying to a commission greater than min + assert_ok!(Staking::force_apply_min_commission(RuntimeOrigin::signed(1), 31)); + // Then the commission is not changed + assert_eq!(validators(), vec![(31, prefs(10)), (21, prefs(5)), (11, prefs(0))]); + + // When applying to a commission that is equal to min + assert_ok!(Staking::force_apply_min_commission(RuntimeOrigin::signed(1), 21)); + // Then the commission is not changed + assert_eq!(validators(), vec![(31, prefs(10)), (21, prefs(5)), (11, prefs(0))]); + + // When applying to a commission that is less than the min + assert_ok!(Staking::force_apply_min_commission(RuntimeOrigin::signed(1), 11)); + // Then the commission is bumped to the min + assert_eq!(validators(), vec![(31, prefs(10)), (21, prefs(5)), (11, prefs(5))]); + + // When applying commission to a validator that doesn't exist then storage is not altered + assert_noop!( + Staking::force_apply_min_commission(RuntimeOrigin::signed(1), 420), + Error::::NotStash + ); + }); +} + +#[test] +fn proportional_slash_stop_slashing_if_remaining_zero() { + ExtBuilder::default().nominate(true).build_and_execute(|| { + let c = |era, value| UnlockChunk:: { era, value }; + + // we have some chunks, but they are not affected. + let unlocking = bounded_vec![c(1, 10), c(2, 10)]; + + // Given + let mut ledger = StakingLedger::::new(123, 20); + ledger.total = 40; + ledger.unlocking = unlocking; + + assert_eq!(BondingDuration::get(), 3); + + // should not slash more than the amount requested, by accidentally slashing the first + // chunk. + assert_eq!(ledger.slash(18, 1, 0), 18); + }); +} + +#[test] +fn proportional_ledger_slash_works() { + ExtBuilder::default().nominate(true).build_and_execute(|| { + let c = |era, value| UnlockChunk:: { era, value }; + // Given + let mut ledger = StakingLedger::::new(123, 10); + assert_eq!(BondingDuration::get(), 3); + + // When we slash a ledger with no unlocking chunks + assert_eq!(ledger.slash(5, 1, 0), 5); + // Then + assert_eq!(ledger.total, 5); + assert_eq!(ledger.active, 5); + assert_eq!(LedgerSlashPerEra::get().0, 5); + assert_eq!(LedgerSlashPerEra::get().1, Default::default()); + + // When we slash a ledger with no unlocking chunks and the slash amount is greater then the + // total + assert_eq!(ledger.slash(11, 1, 0), 5); + // Then + assert_eq!(ledger.total, 0); + assert_eq!(ledger.active, 0); + assert_eq!(LedgerSlashPerEra::get().0, 0); + assert_eq!(LedgerSlashPerEra::get().1, Default::default()); + + // Given + ledger.unlocking = bounded_vec![c(4, 10), c(5, 10)]; + ledger.total = 2 * 10; + ledger.active = 0; + // When all the chunks overlap with the slash eras + assert_eq!(ledger.slash(20, 0, 0), 20); + // Then + assert_eq!(ledger.unlocking, vec![]); + assert_eq!(ledger.total, 0); + assert_eq!(LedgerSlashPerEra::get().0, 0); + assert_eq!(LedgerSlashPerEra::get().1, BTreeMap::from([(4, 0), (5, 0)])); + + // Given + ledger.unlocking = bounded_vec![c(4, 100), c(5, 100), c(6, 100), c(7, 100)]; + ledger.total = 4 * 100; + ledger.active = 0; + // When the first 2 chunks don't overlap with the affected range of unlock eras. + assert_eq!(ledger.slash(140, 0, 3), 140); + // Then + assert_eq!(ledger.unlocking, vec![c(4, 100), c(5, 100), c(6, 30), c(7, 30)]); + assert_eq!(ledger.total, 4 * 100 - 140); + assert_eq!(LedgerSlashPerEra::get().0, 0); + assert_eq!(LedgerSlashPerEra::get().1, BTreeMap::from([(6, 30), (7, 30)])); + + // Given + ledger.unlocking = bounded_vec![c(4, 100), c(5, 100), c(6, 100), c(7, 100)]; + ledger.total = 4 * 100; + ledger.active = 0; + // When the first 2 chunks don't overlap with the affected range of unlock eras. + assert_eq!(ledger.slash(15, 0, 3), 15); + // Then + assert_eq!(ledger.unlocking, vec![c(4, 100), c(5, 100), c(6, 100 - 8), c(7, 100 - 7)]); + assert_eq!(ledger.total, 4 * 100 - 15); + assert_eq!(LedgerSlashPerEra::get().0, 0); + assert_eq!(LedgerSlashPerEra::get().1, BTreeMap::from([(6, 92), (7, 93)])); + + // Given + ledger.unlocking = bounded_vec![c(4, 40), c(5, 100), c(6, 10), c(7, 250)]; + ledger.active = 500; + // 900 + ledger.total = 40 + 10 + 100 + 250 + 500; + // When we have a partial slash that touches all chunks + assert_eq!(ledger.slash(900 / 2, 0, 0), 450); + // Then + assert_eq!(ledger.active, 500 / 2); + assert_eq!( + ledger.unlocking, + vec![c(4, 40 / 2), c(5, 100 / 2), c(6, 10 / 2), c(7, 250 / 2)] + ); + assert_eq!(ledger.total, 900 / 2); + assert_eq!(LedgerSlashPerEra::get().0, 500 / 2); + assert_eq!( + LedgerSlashPerEra::get().1, + BTreeMap::from([(4, 40 / 2), (5, 100 / 2), (6, 10 / 2), (7, 250 / 2)]) + ); + + // slash 1/4th with not chunk. + ledger.unlocking = bounded_vec![]; + ledger.active = 500; + ledger.total = 500; + // When we have a partial slash that touches all chunks + assert_eq!(ledger.slash(500 / 4, 0, 0), 500 / 4); + // Then + assert_eq!(ledger.active, 3 * 500 / 4); + assert_eq!(ledger.unlocking, vec![]); + assert_eq!(ledger.total, ledger.active); + assert_eq!(LedgerSlashPerEra::get().0, 3 * 500 / 4); + assert_eq!(LedgerSlashPerEra::get().1, Default::default()); + + // Given we have the same as above, + ledger.unlocking = bounded_vec![c(4, 40), c(5, 100), c(6, 10), c(7, 250)]; + ledger.active = 500; + ledger.total = 40 + 10 + 100 + 250 + 500; // 900 + assert_eq!(ledger.total, 900); + // When we have a higher min balance + assert_eq!( + ledger.slash( + 900 / 2, + 25, /* min balance - chunks with era 0 & 2 will be slashed to <=25, causing it + * to get swept */ + 0 + ), + 450 + ); + assert_eq!(ledger.active, 500 / 2); + // the last chunk was not slashed 50% like all the rest, because some other earlier chunks + // got dusted. + assert_eq!(ledger.unlocking, vec![c(5, 100 / 2), c(7, 150)]); + assert_eq!(ledger.total, 900 / 2); + assert_eq!(LedgerSlashPerEra::get().0, 500 / 2); + assert_eq!( + LedgerSlashPerEra::get().1, + BTreeMap::from([(4, 0), (5, 100 / 2), (6, 0), (7, 150)]) + ); + + // Given + // slash order --------------------NA--------2----------0----------1---- + ledger.unlocking = bounded_vec![c(4, 40), c(5, 100), c(6, 10), c(7, 250)]; + ledger.active = 500; + ledger.total = 40 + 10 + 100 + 250 + 500; // 900 + assert_eq!( + ledger.slash( + 500 + 10 + 250 + 100 / 2, // active + era 6 + era 7 + era 5 / 2 + 0, + 3 /* slash era 6 first, so the affected parts are era 6, era 7 and + * ledge.active. This will cause the affected to go to zero, and then we will + * start slashing older chunks */ + ), + 500 + 250 + 10 + 100 / 2 + ); + // Then + assert_eq!(ledger.active, 0); + assert_eq!(ledger.unlocking, vec![c(4, 40), c(5, 100 / 2)]); + assert_eq!(ledger.total, 90); + assert_eq!(LedgerSlashPerEra::get().0, 0); + assert_eq!(LedgerSlashPerEra::get().1, BTreeMap::from([(5, 100 / 2), (6, 0), (7, 0)])); + + // Given + // iteration order------------------NA---------2----------0----------1---- + ledger.unlocking = bounded_vec![c(4, 100), c(5, 100), c(6, 100), c(7, 100)]; + ledger.active = 100; + ledger.total = 5 * 100; + // When + assert_eq!( + ledger.slash( + 351, // active + era 6 + era 7 + era 5 / 2 + 1 + 50, // min balance - everything slashed below 50 will get dusted + 3 /* slash era 3+3 first, so the affected parts are era 6, era 7 and + * ledge.active. This will cause the affected to go to zero, and then we + * will start slashing older chunks */ + ), + 400 + ); + // Then + assert_eq!(ledger.active, 0); + assert_eq!(ledger.unlocking, vec![c(4, 100)]); + assert_eq!(ledger.total, 100); + assert_eq!(LedgerSlashPerEra::get().0, 0); + assert_eq!(LedgerSlashPerEra::get().1, BTreeMap::from([(5, 0), (6, 0), (7, 0)])); + + // Tests for saturating arithmetic + + // Given + let slash = u64::MAX as Balance * 2; + // The value of the other parts of ledger that will get slashed + let value = slash - (10 * 4); + + ledger.active = 10; + ledger.unlocking = bounded_vec![c(4, 10), c(5, 10), c(6, 10), c(7, value)]; + ledger.total = value + 40; + // When + let slash_amount = ledger.slash(slash, 0, 0); + assert_eq_error_rate!(slash_amount, slash, 5); + // Then + assert_eq!(ledger.active, 0); // slash of 9 + assert_eq!(ledger.unlocking, vec![]); + assert_eq!(ledger.total, 0); + assert_eq!(LedgerSlashPerEra::get().0, 0); + assert_eq!(LedgerSlashPerEra::get().1, BTreeMap::from([(4, 0), (5, 0), (6, 0), (7, 0)])); + + // Given + use sp_runtime::PerThing as _; + let slash = u64::MAX as Balance * 2; + let value = u64::MAX as Balance * 2; + let unit = 100; + // slash * value that will saturate + assert!(slash.checked_mul(value).is_none()); + // but slash * unit won't. + assert!(slash.checked_mul(unit).is_some()); + ledger.unlocking = bounded_vec![c(4, unit), c(5, value), c(6, unit), c(7, unit)]; + //--------------------------------------note value^^^ + ledger.active = unit; + ledger.total = unit * 4 + value; + // When + assert_eq!(ledger.slash(slash, 0, 0), slash); + // Then + // The amount slashed out of `unit` + let affected_balance = value + unit * 4; + let ratio = Perquintill::from_rational_with_rounding(slash, affected_balance, Rounding::Up) + .unwrap(); + // `unit` after the slash is applied + let unit_slashed = { + let unit_slash = ratio.mul_ceil(unit); + unit - unit_slash + }; + let value_slashed = { + let value_slash = ratio.mul_ceil(value); + value - value_slash + }; + assert_eq!(ledger.active, unit_slashed); + assert_eq!(ledger.unlocking, vec![c(5, value_slashed), c(7, 32)]); + assert_eq!(ledger.total, value_slashed + 32); + assert_eq!(LedgerSlashPerEra::get().0, 0); + assert_eq!( + LedgerSlashPerEra::get().1, + BTreeMap::from([(4, 0), (5, value_slashed), (6, 0), (7, 32)]) + ); + }); +} + +#[test] +fn reducing_max_unlocking_chunks_abrupt() { + // Concern is on validators only + // By Default 11, 10 are stash and ctlr and 21,20 + ExtBuilder::default().build_and_execute(|| { + // given a staker at era=10 and MaxUnlockChunks set to 2 + MaxUnlockingChunks::set(2); + start_active_era(10); + assert_ok!(Staking::bond(RuntimeOrigin::signed(3), 300, RewardDestination::Staked)); + assert!(matches!(Staking::ledger(3.into()), Ok(_))); + + // when staker unbonds + assert_ok!(Staking::unbond(RuntimeOrigin::signed(3), 20)); + + // then an unlocking chunk is added at `current_era + bonding_duration` + // => 10 + 3 = 13 + let expected_unlocking: BoundedVec, MaxUnlockingChunks> = + bounded_vec![UnlockChunk { value: 20 as Balance, era: 13 as EraIndex }]; + assert!(matches!(Staking::ledger(3.into()), + Ok(StakingLedger { + unlocking, + .. + }) if unlocking==expected_unlocking)); + + // when staker unbonds at next era + start_active_era(11); + assert_ok!(Staking::unbond(RuntimeOrigin::signed(3), 50)); + // then another unlock chunk is added + let expected_unlocking: BoundedVec, MaxUnlockingChunks> = + bounded_vec![UnlockChunk { value: 20, era: 13 }, UnlockChunk { value: 50, era: 14 }]; + assert!(matches!(Staking::ledger(3.into()), + Ok(StakingLedger { + unlocking, + .. + }) if unlocking==expected_unlocking)); + + // when staker unbonds further + start_active_era(12); + // then further unbonding not possible + assert_noop!(Staking::unbond(RuntimeOrigin::signed(3), 20), Error::::NoMoreChunks); + + // when max unlocking chunks is reduced abruptly to a low value + MaxUnlockingChunks::set(1); + // then unbond, rebond ops are blocked with ledger in corrupt state + assert_noop!(Staking::unbond(RuntimeOrigin::signed(3), 20), Error::::NotController); + assert_noop!(Staking::rebond(RuntimeOrigin::signed(3), 100), Error::::NotController); + + // reset the ledger corruption + MaxUnlockingChunks::set(2); + }) +} + +#[test] +fn cannot_set_unsupported_validator_count() { + ExtBuilder::default().build_and_execute(|| { + MaxValidatorSet::set(50); + MaxWinnersPerPage::set(50); + // set validator count works + assert_ok!(Staking::set_validator_count(RuntimeOrigin::root(), 30)); + assert_ok!(Staking::set_validator_count(RuntimeOrigin::root(), 50)); + // setting validator count above 100 does not work + assert_noop!( + Staking::set_validator_count(RuntimeOrigin::root(), 51), + Error::::TooManyValidators, + ); + }) +} + +#[test] +fn increase_validator_count_errors() { + ExtBuilder::default().build_and_execute(|| { + MaxValidatorSet::set(50); + MaxWinnersPerPage::set(50); + assert_ok!(Staking::set_validator_count(RuntimeOrigin::root(), 40)); + + // increase works + assert_ok!(Staking::increase_validator_count(RuntimeOrigin::root(), 6)); + assert_eq!(ValidatorCount::::get(), 46); + + // errors + assert_noop!( + Staking::increase_validator_count(RuntimeOrigin::root(), 5), + Error::::TooManyValidators, + ); + }) +} + +#[test] +fn scale_validator_count_errors() { + ExtBuilder::default().build_and_execute(|| { + MaxValidatorSet::set(50); + MaxWinnersPerPage::set(50); + assert_ok!(Staking::set_validator_count(RuntimeOrigin::root(), 20)); + + // scale value works + assert_ok!(Staking::scale_validator_count( + RuntimeOrigin::root(), + Percent::from_percent(200) + )); + assert_eq!(ValidatorCount::::get(), 40); + + // errors + assert_noop!( + Staking::scale_validator_count(RuntimeOrigin::root(), Percent::from_percent(126)), + Error::::TooManyValidators, + ); + }) +} + +#[test] +fn set_min_commission_works_with_admin_origin() { + ExtBuilder::default().build_and_execute(|| { + // no minimum commission set initially + assert_eq!(MinCommission::::get(), Zero::zero()); + + // root can set min commission + assert_ok!(Staking::set_min_commission(RuntimeOrigin::root(), Perbill::from_percent(10))); + + assert_eq!(MinCommission::::get(), Perbill::from_percent(10)); + + // Non privileged origin can not set min_commission + assert_noop!( + Staking::set_min_commission(RuntimeOrigin::signed(2), Perbill::from_percent(15)), + BadOrigin + ); + + // Admin Origin can set min commission + assert_ok!(Staking::set_min_commission( + RuntimeOrigin::signed(1), + Perbill::from_percent(15), + )); + + // setting commission below min_commission fails + assert_noop!( + Staking::validate( + RuntimeOrigin::signed(11), + ValidatorPrefs { commission: Perbill::from_percent(14), blocked: false } + ), + Error::::CommissionTooLow + ); + + // setting commission >= min_commission works + assert_ok!(Staking::validate( + RuntimeOrigin::signed(11), + ValidatorPrefs { commission: Perbill::from_percent(15), blocked: false } + )); + }) +} + +#[test] +fn can_page_exposure() { + let mut others: Vec> = vec![]; + let mut total_stake: Balance = 0; + // 19 nominators + for i in 1..20 { + let individual_stake: Balance = 100 * i as Balance; + others.push(IndividualExposure { who: i, value: individual_stake }); + total_stake += individual_stake; + } + let own_stake: Balance = 500; + total_stake += own_stake; + assert_eq!(total_stake, 19_500); + // build full exposure set + let exposure: Exposure = + Exposure { total: total_stake, own: own_stake, others }; + + // when + let (exposure_metadata, exposure_page): ( + PagedExposureMetadata, + Vec>, + ) = exposure.clone().into_pages(3); + + // then + // 7 pages of nominators. + assert_eq!(exposure_page.len(), 7); + assert_eq!(exposure_metadata.page_count, 7); + // first page stake = 100 + 200 + 300 + assert!(matches!(exposure_page[0], ExposurePage { page_total: 600, .. })); + // second page stake = 0 + 400 + 500 + 600 + assert!(matches!(exposure_page[1], ExposurePage { page_total: 1500, .. })); + // verify overview has the total + assert_eq!(exposure_metadata.total, 19_500); + // verify total stake is same as in the original exposure. + assert_eq!( + exposure_page.iter().map(|a| a.page_total).reduce(|a, b| a + b).unwrap(), + 19_500 - exposure_metadata.own + ); + // verify own stake is correct + assert_eq!(exposure_metadata.own, 500); + // verify number of nominators are same as in the original exposure. + assert_eq!(exposure_page.iter().map(|a| a.others.len()).reduce(|a, b| a + b).unwrap(), 19); + assert_eq!(exposure_metadata.nominator_count, 19); +} + +#[test] +fn should_retain_era_info_only_upto_history_depth() { + ExtBuilder::default().build_and_execute(|| { + // remove existing exposure + Pallet::::clear_era_information(0); + let validator_stash = 10; + + for era in 0..4 { + ClaimedRewards::::insert(era, &validator_stash, vec![0, 1, 2]); + for page in 0..3 { + ErasStakersPaged::::insert( + (era, &validator_stash, page), + ExposurePage { page_total: 100, others: vec![] }, + ); + } + } + + for i in 0..4 { + // Count of entries remaining in ClaimedRewards = total - cleared_count + assert_eq!(ClaimedRewards::::iter().count(), (4 - i)); + // 1 claimed_rewards entry for each era + assert_eq!(ClaimedRewards::::iter_prefix(i as EraIndex).count(), 1); + // 3 entries (pages) for each era + assert_eq!(ErasStakersPaged::::iter_prefix((i as EraIndex,)).count(), 3); + + // when clear era info + Pallet::::clear_era_information(i as EraIndex); + + // then all era entries are cleared + assert_eq!(ClaimedRewards::::iter_prefix(i as EraIndex).count(), 0); + assert_eq!(ErasStakersPaged::::iter_prefix((i as EraIndex,)).count(), 0); + } + }); +} + +#[test] +fn test_legacy_claimed_rewards_is_checked_at_reward_payout() { + ExtBuilder::default().has_stakers(false).build_and_execute(|| { + // Create a validator: + bond_validator(11, 1000); + + // reward validator for next 2 eras + mock::start_active_era(1); + Pallet::::reward_by_ids(vec![(11, 1)]); + mock::start_active_era(2); + Pallet::::reward_by_ids(vec![(11, 1)]); + mock::start_active_era(3); + + //verify rewards are not claimed + assert_eq!( + EraInfo::::is_rewards_claimed_with_legacy_fallback( + 1, + Staking::ledger(11.into()).as_ref().unwrap(), + &11, + 0 + ), + false + ); + assert_eq!( + EraInfo::::is_rewards_claimed_with_legacy_fallback( + 2, + Staking::ledger(11.into()).as_ref().unwrap(), + &11, + 0 + ), + false + ); + + // assume reward claim for era 1 was stored in legacy storage + Ledger::::insert( + 11, + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![1], + }, + ); + + // verify rewards for era 1 cannot be claimed + assert_noop!( + Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 1, 0), + Error::::AlreadyClaimed + .with_weight(::WeightInfo::payout_stakers_alive_staked(0)), + ); + assert_eq!( + EraInfo::::is_rewards_claimed_with_legacy_fallback( + 1, + Staking::ledger(11.into()).as_ref().unwrap(), + &11, + 0 + ), + true + ); + + // verify rewards for era 2 can be claimed + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 2, 0)); + assert_eq!( + EraInfo::::is_rewards_claimed_with_legacy_fallback( + 2, + Staking::ledger(11.into()).as_ref().unwrap(), + &11, + 0 + ), + true + ); + // but the new claimed rewards for era 2 is not stored in legacy storage + assert_eq!( + Ledger::::get(11).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![1], + }, + ); + // instead it is kept in `ClaimedRewards` + assert_eq!(ClaimedRewards::::get(2, 11), vec![0]); + }); +} + +#[test] +fn test_validator_exposure_is_backward_compatible_with_non_paged_rewards_payout() { + ExtBuilder::default().has_stakers(false).build_and_execute(|| { + // case 1: exposure exist in clipped. + // set page cap to 10 + MaxExposurePageSize::set(10); + bond_validator(11, 1000); + let mut expected_individual_exposures: Vec> = vec![]; + let mut total_exposure: Balance = 0; + // 1st exposure page + for i in 0..10 { + let who = 1000 + i; + let value = 1000 + i as Balance; + bond_nominator(who, value, vec![11]); + expected_individual_exposures.push(IndividualExposure { who, value }); + total_exposure += value; + } + + for i in 10..15 { + let who = 1000 + i; + let value = 1000 + i as Balance; + bond_nominator(who, value, vec![11]); + expected_individual_exposures.push(IndividualExposure { who, value }); + total_exposure += value; + } + + mock::start_active_era(1); + // reward validator for current era + Pallet::::reward_by_ids(vec![(11, 1)]); + + // start new era + mock::start_active_era(2); + // verify exposure for era 1 is stored in paged storage, that each exposure is stored in + // one and only one page, and no exposure is repeated. + let actual_exposure_page_0 = ErasStakersPaged::::get((1, 11, 0)).unwrap(); + let actual_exposure_page_1 = ErasStakersPaged::::get((1, 11, 1)).unwrap(); + expected_individual_exposures.iter().for_each(|exposure| { + assert!( + actual_exposure_page_0.others.contains(exposure) || + actual_exposure_page_1.others.contains(exposure) + ); + }); + assert_eq!( + expected_individual_exposures.len(), + actual_exposure_page_0.others.len() + actual_exposure_page_1.others.len() + ); + // verify `EraInfo` returns page from paged storage + assert_eq!( + EraInfo::::get_paged_exposure(1, &11, 0).unwrap().others(), + &actual_exposure_page_0.others + ); + assert_eq!( + EraInfo::::get_paged_exposure(1, &11, 1).unwrap().others(), + &actual_exposure_page_1.others + ); + assert_eq!(EraInfo::::get_page_count(1, &11), 2); + + // validator is exposed + assert!(::is_exposed_in_era(&11, &1)); + // nominators are exposed + for i in 10..15 { + let who: AccountId = 1000 + i; + assert!(::is_exposed_in_era(&who, &1)); + } + + // case 2: exposure exist in ErasStakers and ErasStakersClipped (legacy). + // delete paged storage and add exposure to clipped storage + >::remove((1, 11, 0)); + >::remove((1, 11, 1)); + >::remove(1, 11); + + >::insert( + 1, + 11, + Exposure { + total: total_exposure, + own: 1000, + others: expected_individual_exposures.clone(), + }, + ); + let mut clipped_exposure = expected_individual_exposures.clone(); + clipped_exposure.sort_by(|a, b| b.who.cmp(&a.who)); + clipped_exposure.truncate(10); + >::insert( + 1, + 11, + Exposure { total: total_exposure, own: 1000, others: clipped_exposure.clone() }, + ); + + // verify `EraInfo` returns exposure from clipped storage + let actual_exposure_paged = EraInfo::::get_paged_exposure(1, &11, 0).unwrap(); + assert_eq!(actual_exposure_paged.others(), &clipped_exposure); + assert_eq!(actual_exposure_paged.own(), 1000); + assert_eq!(actual_exposure_paged.page_count(), 1); + + let actual_exposure_full = EraInfo::::get_full_exposure(1, &11); + assert_eq!(actual_exposure_full.others, expected_individual_exposures); + assert_eq!(actual_exposure_full.own, 1000); + assert_eq!(actual_exposure_full.total, total_exposure); + + // validator is exposed + assert!(::is_exposed_in_era(&11, &1)); + // nominators are exposed + for i in 10..15 { + let who: AccountId = 1000 + i; + assert!(::is_exposed_in_era(&who, &1)); + } + + // for pages other than 0, clipped storage returns empty exposure + assert_eq!(EraInfo::::get_paged_exposure(1, &11, 1), None); + // page size is 1 for clipped storage + assert_eq!(EraInfo::::get_page_count(1, &11), 1); + + // payout for page 0 works + assert_ok!(Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 0, 0)); + // payout for page 1 fails + assert_noop!( + Staking::payout_stakers_by_page(RuntimeOrigin::signed(1337), 11, 0, 1), + Error::::InvalidPage + .with_weight(::WeightInfo::payout_stakers_alive_staked(0)) + ); + }); +} + +#[test] +fn test_runtime_api_pending_rewards() { + ExtBuilder::default().build_and_execute(|| { + // GIVEN + let err_weight = ::WeightInfo::payout_stakers_alive_staked(0); + let stake = 100; + + // validator with non-paged exposure, rewards marked in legacy claimed rewards. + let validator_one = 301; + // validator with non-paged exposure, rewards marked in paged claimed rewards. + let validator_two = 302; + // validator with paged exposure. + let validator_three = 303; + + // Set staker + for v in validator_one..=validator_three { + let _ = asset::set_stakeable_balance::(&v, stake); + assert_ok!(Staking::bond(RuntimeOrigin::signed(v), stake, RewardDestination::Staked)); + } + + // Add reward points + let reward = EraRewardPoints:: { + total: 1, + individual: vec![(validator_one, 1), (validator_two, 1), (validator_three, 1)] + .into_iter() + .collect(), + }; + ErasRewardPoints::::insert(0, reward); + + // build exposure + let mut individual_exposures: Vec> = vec![]; + for i in 0..=MaxExposurePageSize::get() { + individual_exposures.push(IndividualExposure { who: i.into(), value: stake }); + } + let exposure = Exposure:: { + total: stake * (MaxExposurePageSize::get() as Balance + 2), + own: stake, + others: individual_exposures, + }; + + // add non-paged exposure for one and two. + >::insert(0, validator_one, exposure.clone()); + >::insert(0, validator_two, exposure.clone()); + // add paged exposure for third validator + EraInfo::::set_exposure(0, &validator_three, exposure); + + // add some reward to be distributed + ErasValidatorReward::::insert(0, 1000); + + // mark rewards claimed for validator_one in legacy claimed rewards + >::insert( + validator_one, + StakingLedgerInspect { + stash: validator_one, + total: stake, + active: stake, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![0], + }, + ); + + // SCENARIO ONE: rewards already marked claimed in legacy storage. + // runtime api should return false for pending rewards for validator_one. + assert!(!EraInfo::::pending_rewards(0, &validator_one)); + // and if we try to pay, we get an error. + assert_noop!( + Staking::payout_stakers(RuntimeOrigin::signed(1337), validator_one, 0), + Error::::AlreadyClaimed.with_weight(err_weight) + ); + + // SCENARIO TWO: non-paged exposure + // validator two has not claimed rewards, so pending rewards is true. + assert!(EraInfo::::pending_rewards(0, &validator_two)); + // and payout works + assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), validator_two, 0)); + // now pending rewards is false. + assert!(!EraInfo::::pending_rewards(0, &validator_two)); + // and payout fails + assert_noop!( + Staking::payout_stakers(RuntimeOrigin::signed(1337), validator_two, 0), + Error::::AlreadyClaimed.with_weight(err_weight) + ); + + // SCENARIO THREE: validator with paged exposure (two pages). + // validator three has not claimed rewards, so pending rewards is true. + assert!(EraInfo::::pending_rewards(0, &validator_three)); + // and payout works + assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), validator_three, 0)); + // validator three has two pages of exposure, so pending rewards is still true. + assert!(EraInfo::::pending_rewards(0, &validator_three)); + // payout again + assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), validator_three, 0)); + // now pending rewards is false. + assert!(!EraInfo::::pending_rewards(0, &validator_three)); + // and payout fails + assert_noop!( + Staking::payout_stakers(RuntimeOrigin::signed(1337), validator_three, 0), + Error::::AlreadyClaimed.with_weight(err_weight) + ); + + // for eras with no exposure, pending rewards is false. + assert!(!EraInfo::::pending_rewards(0, &validator_one)); + assert!(!EraInfo::::pending_rewards(0, &validator_two)); + assert!(!EraInfo::::pending_rewards(0, &validator_three)); + }); +} + +mod staking_interface { + use frame_support::storage::with_storage_layer; + use sp_staking::StakingInterface; + + use super::*; + + #[test] + fn force_unstake_with_slash_works() { + ExtBuilder::default().build_and_execute(|| { + // without slash + let _ = with_storage_layer::<(), _, _>(|| { + // bond an account, can unstake + assert_eq!(Staking::bonded(&11), Some(11)); + assert_ok!(::force_unstake(11)); + Err(DispatchError::from("revert")) + }); + + // bond again and add a slash, still can unstake. + assert_eq!(Staking::bonded(&11), Some(11)); + add_slash(&11); + assert_ok!(::force_unstake(11)); + }); + } + + #[test] + fn do_withdraw_unbonded_with_wrong_slash_spans_works_as_expected() { + ExtBuilder::default().build_and_execute(|| { + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(100)]); + + assert_eq!(Staking::bonded(&11), Some(11)); + + assert_noop!( + Staking::withdraw_unbonded(RuntimeOrigin::signed(11), 0), + Error::::IncorrectSlashingSpans + ); + + let num_slashing_spans = + SlashingSpans::::get(&11).map_or(0, |s| s.iter().count()); + assert_ok!(Staking::withdraw_unbonded( + RuntimeOrigin::signed(11), + num_slashing_spans as u32 + )); + }); + } + + #[test] + fn do_withdraw_unbonded_can_kill_stash_with_existential_deposit_zero() { + ExtBuilder::default() + .existential_deposit(0) + .nominate(false) + .build_and_execute(|| { + // Initial state of 11 + assert_eq!(Staking::bonded(&11), Some(11)); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 1000, + unlocking: Default::default(), + legacy_claimed_rewards: bounded_vec![], + } + ); + assert_eq!( + Staking::eras_stakers(active_era(), &11), + Exposure { total: 1000, own: 1000, others: vec![] } + ); + + // Unbond all of the funds in stash. + Staking::chill(RuntimeOrigin::signed(11)).unwrap(); + Staking::unbond(RuntimeOrigin::signed(11), 1000).unwrap(); + assert_eq!( + Staking::ledger(11.into()).unwrap(), + StakingLedgerInspect { + stash: 11, + total: 1000, + active: 0, + unlocking: bounded_vec![UnlockChunk { value: 1000, era: 3 }], + legacy_claimed_rewards: bounded_vec![], + }, + ); + + // trigger future era. + mock::start_active_era(3); + + // withdraw unbonded + assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(11), 0)); + + // empty stash has been reaped + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + assert!(!>::contains_key(&11)); + // lock is removed. + assert_eq!(asset::staked::(&11), 0); + }); + } + + #[test] + fn status() { + ExtBuilder::default().build_and_execute(|| { + // stash of a validator is identified as a validator + assert_eq!(Staking::status(&11).unwrap(), StakerStatus::Validator); + // .. but not the controller. + assert!(Staking::status(&10).is_err()); + + // stash of nominator is identified as a nominator + assert_eq!(Staking::status(&101).unwrap(), StakerStatus::Nominator(vec![11, 21])); + // .. but not the controller. + assert!(Staking::status(&100).is_err()); + + // stash of chilled is identified as a chilled + assert_eq!(Staking::status(&41).unwrap(), StakerStatus::Idle); + // .. but not the controller. + assert!(Staking::status(&40).is_err()); + + // random other account. + assert!(Staking::status(&42).is_err()); + }) + } +} + +mod staking_unchecked { + use sp_staking::{Stake, StakingInterface, StakingUnchecked}; + + use super::*; + + #[test] + fn virtual_bond_does_not_lock() { + ExtBuilder::default().build_and_execute(|| { + mock::start_active_era(1); + assert_eq!(asset::total_balance::(&10), 1); + // 10 can bond more than its balance amount since we do not require lock for virtual + // bonding. + assert_ok!(::virtual_bond(&10, 100, &15)); + // nothing is locked on 10. + assert_eq!(asset::staked::(&10), 0); + // adding more balance does not lock anything as well. + assert_ok!(::bond_extra(&10, 1000)); + // but ledger is updated correctly. + assert_eq!( + ::stake(&10), + Ok(Stake { total: 1100, active: 1100 }) + ); + + // lets try unbonding some amount. + assert_ok!(::unbond(&10, 200)); + assert_eq!( + Staking::ledger(10.into()).unwrap(), + StakingLedgerInspect { + stash: 10, + total: 1100, + active: 1100 - 200, + unlocking: bounded_vec![UnlockChunk { value: 200, era: 1 + 3 }], + legacy_claimed_rewards: bounded_vec![], + } + ); + + assert_eq!( + ::stake(&10), + Ok(Stake { total: 1100, active: 900 }) + ); + // still no locks. + assert_eq!(asset::staked::(&10), 0); + + mock::start_active_era(2); + // cannot withdraw without waiting for unbonding period. + assert_ok!(::withdraw_unbonded(10, 0)); + assert_eq!( + ::stake(&10), + Ok(Stake { total: 1100, active: 900 }) + ); + + // in era 4, 10 can withdraw unlocking amount. + mock::start_active_era(4); + assert_ok!(::withdraw_unbonded(10, 0)); + assert_eq!( + ::stake(&10), + Ok(Stake { total: 900, active: 900 }) + ); + + // unbond all. + assert_ok!(::unbond(&10, 900)); + assert_eq!( + ::stake(&10), + Ok(Stake { total: 900, active: 0 }) + ); + mock::start_active_era(7); + assert_ok!(::withdraw_unbonded(10, 0)); + + // ensure withdrawing all amount cleans up storage. + assert_eq!(Staking::ledger(10.into()), Err(Error::::NotStash)); + assert_eq!(VirtualStakers::::contains_key(10), false); + }) + } + + #[test] + fn virtual_staker_cannot_pay_reward_to_self_account() { + ExtBuilder::default().build_and_execute(|| { + // cannot set payee to self + assert_noop!( + ::virtual_bond(&10, 100, &10), + Error::::RewardDestinationRestricted + ); + + // to another account works + assert_ok!(::virtual_bond(&10, 100, &11)); + + // cannot set via set_payee as well. + assert_noop!( + ::set_payee(&10, &10), + Error::::RewardDestinationRestricted + ); + }); + } + + #[test] + fn virtual_staker_cannot_bond_again() { + ExtBuilder::default().build_and_execute(|| { + // 200 virtual bonds + bond_virtual_nominator(200, 201, 500, vec![11, 21]); + + // Tries bonding again + assert_noop!( + ::virtual_bond(&200, 200, &201), + Error::::AlreadyBonded + ); + + // And again with a different reward destination. + assert_noop!( + ::virtual_bond(&200, 200, &202), + Error::::AlreadyBonded + ); + + // Direct bond is not allowed as well. + assert_noop!( + ::bond(&200, 200, &202), + Error::::AlreadyBonded + ); + }); + } + + #[test] + fn normal_staker_cannot_virtual_bond() { + ExtBuilder::default().build_and_execute(|| { + // 101 is a nominator trying to virtual bond + assert_noop!( + ::virtual_bond(&101, 200, &102), + Error::::AlreadyBonded + ); + + // validator 21 tries to virtual bond + assert_noop!( + ::virtual_bond(&21, 200, &22), + Error::::AlreadyBonded + ); + }); + } + + #[test] + fn migrate_virtual_staker() { + ExtBuilder::default().build_and_execute(|| { + // give some balance to 200 + asset::set_stakeable_balance::(&200, 2000); + + // stake + assert_ok!(Staking::bond(RuntimeOrigin::signed(200), 1000, RewardDestination::Staked)); + assert_eq!(asset::staked::(&200), 1000); + + // migrate them to virtual staker + assert_ok!(::migrate_to_virtual_staker(&200)); + // payee needs to be updated to a non-stash account. + assert_ok!(::set_payee(&200, &201)); + + // ensure the balance is not locked anymore + assert_eq!(asset::staked::(&200), 0); + + // and they are marked as virtual stakers + assert_eq!(Pallet::::is_virtual_staker(&200), true); + }); + } + + #[test] + fn virtual_nominators_are_lazily_slashed() { + ExtBuilder::default() + .validator_count(7) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + let slash_percent = Perbill::from_percent(5); + let initial_exposure = Staking::eras_stakers(active_era(), &11); + // 101 is a nominator for 11 + assert_eq!(initial_exposure.others.first().unwrap().who, 101); + // make 101 a virtual nominator + assert_ok!(::migrate_to_virtual_staker(&101)); + // set payee different to self. + assert_ok!(::set_payee(&101, &102)); + + // cache values + let nominator_stake = Staking::ledger(101.into()).unwrap().active; + let nominator_balance = balances(&101).0; + let validator_stake = Staking::ledger(11.into()).unwrap().active; + let validator_balance = balances(&11).0; + let exposed_stake = initial_exposure.total; + let exposed_validator = initial_exposure.own; + let exposed_nominator = initial_exposure.others.first().unwrap().value; + + // 11 goes offline + on_offence_now(&[offence_from(11, None)], &[slash_percent]); + + let slash_amount = slash_percent * exposed_stake; + let validator_share = + Perbill::from_rational(exposed_validator, exposed_stake) * slash_amount; + let nominator_share = + Perbill::from_rational(exposed_nominator, exposed_stake) * slash_amount; + + // both slash amounts need to be positive for the test to make sense. + assert!(validator_share > 0); + assert!(nominator_share > 0); + + // both stakes must have been decreased pro-rata. + assert_eq!( + Staking::ledger(101.into()).unwrap().active, + nominator_stake - nominator_share + ); + assert_eq!( + Staking::ledger(11.into()).unwrap().active, + validator_stake - validator_share + ); + + // validator balance is slashed as usual + assert_eq!(balances(&11).0, validator_balance - validator_share); + // Because slashing happened. + assert!(is_disabled(11)); + + // but virtual nominator's balance is not slashed. + assert_eq!(asset::stakeable_balance::(&101), nominator_balance); + // but slash is broadcasted to slash observers. + assert_eq!(SlashObserver::get().get(&101).unwrap(), &nominator_share); + }) + } + + #[test] + fn virtual_stakers_cannot_be_reaped() { + ExtBuilder::default() + // we need enough validators such that disables are allowed. + .validator_count(7) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) + .build_and_execute(|| { + // make 101 only nominate 11. + assert_ok!(Staking::nominate(RuntimeOrigin::signed(101), vec![11])); + + mock::start_active_era(1); + + // slash all stake. + let slash_percent = Perbill::from_percent(100); + let initial_exposure = Staking::eras_stakers(active_era(), &11); + // 101 is a nominator for 11 + assert_eq!(initial_exposure.others.first().unwrap().who, 101); + // make 101 a virtual nominator + assert_ok!(::migrate_to_virtual_staker(&101)); + // set payee different to self. + assert_ok!(::set_payee(&101, &102)); + + // cache values + let validator_balance = asset::stakeable_balance::(&11); + let validator_stake = Staking::ledger(11.into()).unwrap().total; + let nominator_balance = asset::stakeable_balance::(&101); + let nominator_stake = Staking::ledger(101.into()).unwrap().total; + + // 11 goes offline + on_offence_now(&[offence_from(11, None)], &[slash_percent]); + + // both stakes must have been decreased to 0. + assert_eq!(Staking::ledger(101.into()).unwrap().active, 0); + assert_eq!(Staking::ledger(11.into()).unwrap().active, 0); + + // all validator stake is slashed + assert_eq_error_rate!( + validator_balance - validator_stake, + asset::stakeable_balance::(&11), + 1 + ); + // Because slashing happened. + assert!(is_disabled(11)); + + // Virtual nominator's balance is not slashed. + assert_eq!(asset::stakeable_balance::(&101), nominator_balance); + // Slash is broadcasted to slash observers. + assert_eq!(SlashObserver::get().get(&101).unwrap(), &nominator_stake); + + // validator can be reaped. + assert_ok!(Staking::reap_stash(RuntimeOrigin::signed(10), 11, u32::MAX)); + // nominator is a virtual staker and cannot be reaped. + assert_noop!( + Staking::reap_stash(RuntimeOrigin::signed(10), 101, u32::MAX), + Error::::VirtualStakerNotAllowed + ); + }) + } + + #[test] + fn restore_ledger_not_allowed_for_virtual_stakers() { + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + setup_double_bonded_ledgers(); + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + // 333 is corrupted + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Corrupted); + // migrate to virtual staker. + assert_ok!(::migrate_to_virtual_staker(&333)); + + // recover the ledger won't work for virtual staker + assert_noop!( + Staking::restore_ledger(RuntimeOrigin::root(), 333, None, None, None), + Error::::VirtualStakerNotAllowed + ); + + // migrate 333 back to normal staker + >::remove(333); + + // try restore again + assert_ok!(Staking::restore_ledger(RuntimeOrigin::root(), 333, None, None, None)); + }) + } +} +mod ledger { + use super::*; + use sp_staking::StakingAccount; + + #[test] + fn paired_account_works() { + ExtBuilder::default().try_state(false).build_and_execute(|| { + assert_ok!(Staking::bond( + RuntimeOrigin::signed(10), + 100, + RewardDestination::Account(10) + )); + + assert_eq!(>::get(&10), Some(10)); + assert_eq!( + StakingLedger::::paired_account(StakingAccount::Controller(10)), + Some(10) + ); + assert_eq!(StakingLedger::::paired_account(StakingAccount::Stash(10)), Some(10)); + + assert_eq!(>::get(&42), None); + assert_eq!(StakingLedger::::paired_account(StakingAccount::Controller(42)), None); + assert_eq!(StakingLedger::::paired_account(StakingAccount::Stash(42)), None); + + // bond manually stash with different controller. This is deprecated but the migration + // has not been complete yet (controller: 100, stash: 200) + assert_ok!(bond_controller_stash(100, 200)); + assert_eq!(>::get(&200), Some(100)); + assert_eq!( + StakingLedger::::paired_account(StakingAccount::Controller(100)), + Some(200) + ); + assert_eq!( + StakingLedger::::paired_account(StakingAccount::Stash(200)), + Some(100) + ); + }) + } + + #[test] + fn get_ledger_works() { + ExtBuilder::default().try_state(false).build_and_execute(|| { + // stash does not exist + assert!(StakingLedger::::get(StakingAccount::Stash(42)).is_err()); + + // bonded and paired + assert_eq!(>::get(&11), Some(11)); + + match StakingLedger::::get(StakingAccount::Stash(11)) { + Ok(ledger) => { + assert_eq!(ledger.controller(), Some(11)); + assert_eq!(ledger.stash, 11); + }, + Err(_) => panic!("staking ledger must exist"), + }; + + // bond manually stash with different controller. This is deprecated but the migration + // has not been complete yet (controller: 100, stash: 200) + assert_ok!(bond_controller_stash(100, 200)); + assert_eq!(>::get(&200), Some(100)); + + match StakingLedger::::get(StakingAccount::Stash(200)) { + Ok(ledger) => { + assert_eq!(ledger.controller(), Some(100)); + assert_eq!(ledger.stash, 200); + }, + Err(_) => panic!("staking ledger must exist"), + }; + + match StakingLedger::::get(StakingAccount::Controller(100)) { + Ok(ledger) => { + assert_eq!(ledger.controller(), Some(100)); + assert_eq!(ledger.stash, 200); + }, + Err(_) => panic!("staking ledger must exist"), + }; + }) + } + + #[test] + fn get_ledger_bad_state_fails() { + ExtBuilder::default().has_stakers(false).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // Case 1: double bonded but not corrupted: + // stash 444 has controller 555: + assert_eq!(Bonded::::get(444), Some(555)); + assert_eq!(Ledger::::get(555).unwrap().stash, 444); + + // stash 444 is also a controller of 333: + assert_eq!(Bonded::::get(333), Some(444)); + assert_eq!( + StakingLedger::::paired_account(StakingAccount::Stash(333)), + Some(444) + ); + assert_eq!(Ledger::::get(444).unwrap().stash, 333); + + // although 444 is double bonded (it is a controller and a stash of different ledgers), + // we can safely retrieve the ledger and mutate it since the correct ledger is + // returned. + let ledger_result = StakingLedger::::get(StakingAccount::Stash(444)); + assert_eq!(ledger_result.unwrap().stash, 444); // correct ledger. + + let ledger_result = StakingLedger::::get(StakingAccount::Controller(444)); + assert_eq!(ledger_result.unwrap().stash, 333); // correct ledger. + + // fetching ledger 333 by its stash works. + let ledger_result = StakingLedger::::get(StakingAccount::Stash(333)); + assert_eq!(ledger_result.unwrap().stash, 333); + + // Case 2: corrupted ledger bonding. + // in this case, we simulate what happens when fetching a ledger by stash returns a + // ledger with a different stash. when this happens, we return an error instead of the + // ledger to prevent ledger mutations. + let mut ledger = Ledger::::get(444).unwrap(); + assert_eq!(ledger.stash, 333); + ledger.stash = 444; + Ledger::::insert(444, ledger); + + // now, we are prevented from fetching the ledger by stash from 1. It's associated + // controller (2) is now bonding a ledger with a different stash (2, not 1). + assert!(StakingLedger::::get(StakingAccount::Stash(333)).is_err()); + }) + } + + #[test] + fn bond_works() { + ExtBuilder::default().build_and_execute(|| { + assert!(!StakingLedger::::is_bonded(StakingAccount::Stash(42))); + assert!(>::get(&42).is_none()); + + let mut ledger: StakingLedger = StakingLedger::default_from(42); + let reward_dest = RewardDestination::Account(10); + + assert_ok!(ledger.clone().bond(reward_dest)); + assert!(StakingLedger::::is_bonded(StakingAccount::Stash(42))); + assert!(>::get(&42).is_some()); + assert_eq!(>::get(&42), Some(reward_dest)); + + // cannot bond again. + assert!(ledger.clone().bond(reward_dest).is_err()); + + // once bonded, update works as expected. + ledger.legacy_claimed_rewards = bounded_vec![1]; + assert_ok!(ledger.update()); + }) + } + + #[test] + fn bond_controller_cannot_be_stash_works() { + ExtBuilder::default().build_and_execute(|| { + let (stash, controller) = testing_utils::create_unique_stash_controller::( + 0, + 10, + RewardDestination::Staked, + false, + ) + .unwrap(); + + assert_eq!(Bonded::::get(stash), Some(controller)); + assert_eq!(Ledger::::get(controller).map(|l| l.stash), Some(stash)); + + // existing controller should not be able become a stash. + assert_noop!( + Staking::bond(RuntimeOrigin::signed(controller), 10, RewardDestination::Staked), + Error::::AlreadyPaired, + ); + }) + } + + #[test] + fn is_bonded_works() { + ExtBuilder::default().build_and_execute(|| { + assert!(!StakingLedger::::is_bonded(StakingAccount::Stash(42))); + assert!(!StakingLedger::::is_bonded(StakingAccount::Controller(42))); + + // adds entry to Bonded without Ledger pair (should not happen). + >::insert(42, 42); + assert!(!StakingLedger::::is_bonded(StakingAccount::Controller(42))); + + assert_eq!(>::get(&11), Some(11)); + assert!(StakingLedger::::is_bonded(StakingAccount::Stash(11))); + assert!(StakingLedger::::is_bonded(StakingAccount::Controller(11))); + + >::remove(42); // ensures try-state checks pass. + }) + } + + #[test] + #[allow(deprecated)] + fn set_payee_errors_on_controller_destination() { + ExtBuilder::default().build_and_execute(|| { + Payee::::insert(11, RewardDestination::Staked); + assert_noop!( + Staking::set_payee(RuntimeOrigin::signed(11), RewardDestination::Controller), + Error::::ControllerDeprecated + ); + assert_eq!(Payee::::get(&11), Some(RewardDestination::Staked)); + }) + } + + #[test] + #[allow(deprecated)] + fn update_payee_migration_works() { + ExtBuilder::default().build_and_execute(|| { + // migrate a `Controller` variant to `Account` variant. + Payee::::insert(11, RewardDestination::Controller); + assert_eq!(Payee::::get(&11), Some(RewardDestination::Controller)); + assert_ok!(Staking::update_payee(RuntimeOrigin::signed(11), 11)); + assert_eq!(Payee::::get(&11), Some(RewardDestination::Account(11))); + + // Do not migrate a variant if not `Controller`. + Payee::::insert(21, RewardDestination::Stash); + assert_eq!(Payee::::get(&21), Some(RewardDestination::Stash)); + assert_noop!( + Staking::update_payee(RuntimeOrigin::signed(11), 21), + Error::::NotController + ); + assert_eq!(Payee::::get(&21), Some(RewardDestination::Stash)); + }) + } + + #[test] + fn deprecate_controller_batch_works_full_weight() { + ExtBuilder::default().try_state(false).build_and_execute(|| { + // Given: + + let start = 1001; + let mut controllers: Vec<_> = vec![]; + for n in start..(start + MaxControllersInDeprecationBatch::get()).into() { + let ctlr: u64 = n.into(); + let stash: u64 = (n + 10000).into(); + + Ledger::::insert( + ctlr, + StakingLedger { + controller: None, + total: (10 + ctlr).into(), + active: (10 + ctlr).into(), + ..StakingLedger::default_from(stash) + }, + ); + Bonded::::insert(stash, ctlr); + Payee::::insert(stash, RewardDestination::Staked); + + controllers.push(ctlr); + } + + // When: + + let bounded_controllers: BoundedVec< + _, + ::MaxControllersInDeprecationBatch, + > = BoundedVec::try_from(controllers).unwrap(); + + // Only `AdminOrigin` can sign. + assert_noop!( + Staking::deprecate_controller_batch( + RuntimeOrigin::signed(2), + bounded_controllers.clone() + ), + BadOrigin + ); + + let result = + Staking::deprecate_controller_batch(RuntimeOrigin::root(), bounded_controllers); + assert_ok!(result); + assert_eq!( + result.unwrap().actual_weight.unwrap(), + ::WeightInfo::deprecate_controller_batch( + ::MaxControllersInDeprecationBatch::get() + ) + ); + + // Then: + + for n in start..(start + MaxControllersInDeprecationBatch::get()).into() { + let ctlr: u64 = n.into(); + let stash: u64 = (n + 10000).into(); + + // Ledger no longer keyed by controller. + assert_eq!(Ledger::::get(ctlr), None); + // Bonded now maps to the stash. + assert_eq!(Bonded::::get(stash), Some(stash)); + + // Ledger is now keyed by stash. + let ledger_updated = Ledger::::get(stash).unwrap(); + assert_eq!(ledger_updated.stash, stash); + + // Check `active` and `total` values match the original ledger set by controller. + assert_eq!(ledger_updated.active, (10 + ctlr) as Balance); + assert_eq!(ledger_updated.total, (10 + ctlr) as Balance); + } + }) + } + + #[test] + fn deprecate_controller_batch_works_half_weight() { + ExtBuilder::default().build_and_execute(|| { + // Given: + + let start = 1001; + let mut controllers: Vec<_> = vec![]; + for n in start..(start + MaxControllersInDeprecationBatch::get()).into() { + let ctlr: u64 = n.into(); + + // Only half of entries are unique pairs. + let stash: u64 = if n % 2 == 0 { (n + 10000).into() } else { ctlr }; + + Ledger::::insert( + ctlr, + StakingLedger { controller: None, ..StakingLedger::default_from(stash) }, + ); + Bonded::::insert(stash, ctlr); + Payee::::insert(stash, RewardDestination::Staked); + + controllers.push(ctlr); + } + + // When: + let bounded_controllers: BoundedVec< + _, + ::MaxControllersInDeprecationBatch, + > = BoundedVec::try_from(controllers.clone()).unwrap(); + + let result = + Staking::deprecate_controller_batch(RuntimeOrigin::root(), bounded_controllers); + assert_ok!(result); + assert_eq!( + result.unwrap().actual_weight.unwrap(), + ::WeightInfo::deprecate_controller_batch(controllers.len() as u32) + ); + + // Then: + + for n in start..(start + MaxControllersInDeprecationBatch::get()).into() { + let unique_pair = n % 2 == 0; + let ctlr: u64 = n.into(); + let stash: u64 = if unique_pair { (n + 10000).into() } else { ctlr }; + + // Side effect of migration for unique pair. + if unique_pair { + assert_eq!(Ledger::::get(ctlr), None); + } + // Bonded maps to the stash. + assert_eq!(Bonded::::get(stash), Some(stash)); + + // Ledger is keyed by stash. + let ledger_updated = Ledger::::get(stash).unwrap(); + assert_eq!(ledger_updated.stash, stash); + } + }) + } + + #[test] + fn deprecate_controller_batch_skips_unmigrated_controller_payees() { + ExtBuilder::default().try_state(false).build_and_execute(|| { + // Given: + + let stash: u64 = 1000; + let ctlr: u64 = 1001; + + Ledger::::insert( + ctlr, + StakingLedger { controller: None, ..StakingLedger::default_from(stash) }, + ); + Bonded::::insert(stash, ctlr); + #[allow(deprecated)] + Payee::::insert(stash, RewardDestination::Controller); + + // When: + + let bounded_controllers: BoundedVec< + _, + ::MaxControllersInDeprecationBatch, + > = BoundedVec::try_from(vec![ctlr]).unwrap(); + + let result = + Staking::deprecate_controller_batch(RuntimeOrigin::root(), bounded_controllers); + assert_ok!(result); + assert_eq!( + result.unwrap().actual_weight.unwrap(), + ::WeightInfo::deprecate_controller_batch(1 as u32) + ); + + // Then: + + // Esure deprecation did not happen. + assert_eq!(Ledger::::get(ctlr).is_some(), true); + + // Bonded still keyed by controller. + assert_eq!(Bonded::::get(stash), Some(ctlr)); + + // Ledger is still keyed by controller. + let ledger_updated = Ledger::::get(ctlr).unwrap(); + assert_eq!(ledger_updated.stash, stash); + }) + } + + #[test] + fn deprecate_controller_batch_with_bad_state_ok() { + ExtBuilder::default().has_stakers(false).nominate(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // now let's deprecate all the controllers for all the existing ledgers. + let bounded_controllers: BoundedVec< + _, + ::MaxControllersInDeprecationBatch, + > = BoundedVec::try_from(vec![333, 444, 555, 777]).unwrap(); + + assert_ok!(Staking::deprecate_controller_batch( + RuntimeOrigin::root(), + bounded_controllers + )); + + assert_eq!( + *staking_events().last().unwrap(), + Event::ControllerBatchDeprecated { failures: 0 } + ); + }) + } + + #[test] + fn deprecate_controller_batch_with_bad_state_failures() { + ExtBuilder::default().has_stakers(false).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // now let's deprecate all the controllers for all the existing ledgers. + let bounded_controllers: BoundedVec< + _, + ::MaxControllersInDeprecationBatch, + > = BoundedVec::try_from(vec![777, 555, 444, 333]).unwrap(); + + assert_ok!(Staking::deprecate_controller_batch( + RuntimeOrigin::root(), + bounded_controllers + )); + + assert_eq!( + *staking_events().last().unwrap(), + Event::ControllerBatchDeprecated { failures: 2 } + ); + }) + } + + #[test] + fn set_controller_with_bad_state_ok() { + ExtBuilder::default().has_stakers(false).nominate(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // in this case, setting controller works due to the ordering of the calls. + assert_ok!(Staking::set_controller(RuntimeOrigin::signed(333))); + assert_ok!(Staking::set_controller(RuntimeOrigin::signed(444))); + assert_ok!(Staking::set_controller(RuntimeOrigin::signed(555))); + }) + } + + #[test] + fn set_controller_with_bad_state_fails() { + ExtBuilder::default().has_stakers(false).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // setting the controller of ledger associated with stash 555 fails since its stash is a + // controller of another ledger. + assert_noop!( + Staking::set_controller(RuntimeOrigin::signed(555)), + Error::::BadState + ); + assert_noop!( + Staking::set_controller(RuntimeOrigin::signed(444)), + Error::::BadState + ); + assert_ok!(Staking::set_controller(RuntimeOrigin::signed(333))); + }) + } +} + +mod ledger_recovery { + use super::*; + + #[test] + fn inspect_recovery_ledger_simple_works() { + ExtBuilder::default().has_stakers(true).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // non corrupted ledger. + assert_eq!(Staking::inspect_bond_state(&11).unwrap(), LedgerIntegrityState::Ok); + + // non bonded stash. + assert!(Bonded::::get(&1111).is_none()); + assert!(Staking::inspect_bond_state(&1111).is_err()); + + // double bonded but not corrupted. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + }) + } + + #[test] + fn inspect_recovery_ledger_corupted_killed_works() { + ExtBuilder::default().has_stakers(true).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + let lock_333_before = asset::staked::(&333); + + // get into corrupted and killed ledger state by killing a corrupted ledger: + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + // kill(333) + // (444, 444) -> corrupted and None. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + + // now try-state fails. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // 333 is corrupted since it's controller is linking 444 ledger. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Corrupted); + // 444 however is OK. + assert_eq!(Staking::inspect_bond_state(&444).unwrap(), LedgerIntegrityState::Ok); + + // kill the corrupted ledger that is associated with stash 333. + assert_ok!(StakingLedger::::kill(&333)); + + // 333 bond is no more but it returns `BadState` because the lock on this stash is + // still set (see checks below). + assert_eq!(Staking::inspect_bond_state(&333), Err(Error::::BadState)); + // now the *other* ledger associated with 444 has been corrupted and killed (None). + assert_eq!( + Staking::inspect_bond_state(&444), + Ok(LedgerIntegrityState::CorruptedKilled) + ); + + // side effects on 333 - ledger, bonded, payee, lock should be completely empty. + // however, 333 lock remains. + assert_eq!(asset::staked::(&333), lock_333_before); // NOK + assert!(Bonded::::get(&333).is_none()); // OK + assert!(Payee::::get(&333).is_none()); // OK + assert!(Ledger::::get(&444).is_none()); // OK + + // side effects on 444 - ledger, bonded, payee, lock should remain be intact. + // however, 444 lock was removed. + assert_eq!(asset::staked::(&444), 0); // NOK + assert!(Bonded::::get(&444).is_some()); // OK + assert!(Payee::::get(&444).is_some()); // OK + assert!(Ledger::::get(&555).is_none()); // NOK + + assert!(Staking::do_try_state(System::block_number()).is_err()); + }) + } + + #[test] + fn inspect_recovery_ledger_corupted_killed_other_works() { + ExtBuilder::default().has_stakers(true).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + let lock_333_before = asset::staked::(&333); + + // get into corrupted and killed ledger state by killing a corrupted ledger: + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + // kill(444) + // (333, 444) -> corrupted and None + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + + // now try-state fails. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // 333 is corrupted since it's controller is linking 444 ledger. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Corrupted); + // 444 however is OK. + assert_eq!(Staking::inspect_bond_state(&444).unwrap(), LedgerIntegrityState::Ok); + + // kill the *other* ledger that is double bonded but not corrupted. + assert_ok!(StakingLedger::::kill(&444)); + + // now 333 is corrupted and None through the *other* ledger being killed. + assert_eq!( + Staking::inspect_bond_state(&333).unwrap(), + LedgerIntegrityState::CorruptedKilled, + ); + // 444 is cleaned and not a stash anymore; no lock left behind. + assert_eq!(Ledger::::get(&444), None); + assert_eq!(Staking::inspect_bond_state(&444), Err(Error::::NotStash)); + + // side effects on 333 - ledger, bonded, payee, lock should be intact. + assert_eq!(asset::staked::(&333), lock_333_before); // OK + assert_eq!(Bonded::::get(&333), Some(444)); // OK + assert!(Payee::::get(&333).is_some()); + // however, ledger associated with its controller was killed. + assert!(Ledger::::get(&444).is_none()); // NOK + + // side effects on 444 - ledger, bonded, payee, lock should be completely removed. + assert_eq!(asset::staked::(&444), 0); // OK + assert!(Bonded::::get(&444).is_none()); // OK + assert!(Payee::::get(&444).is_none()); // OK + assert!(Ledger::::get(&555).is_none()); // OK + + assert!(Staking::do_try_state(System::block_number()).is_err()); + }) + } + + #[test] + fn inspect_recovery_ledger_lock_corrupted_works() { + ExtBuilder::default().has_stakers(true).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // get into lock corrupted ledger state by bond_extra on a ledger that is double bonded + // with a corrupted ledger. + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + // bond_extra(333, 10) -> lock corrupted on 444 + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + bond_extra_no_checks(&333, 10); + + // now try-state fails. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // 333 is corrupted since it's controller is linking 444 ledger. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Corrupted); + // 444 ledger is not corrupted but locks got out of sync. + assert_eq!( + Staking::inspect_bond_state(&444).unwrap(), + LedgerIntegrityState::LockCorrupted + ); + }) + } + + // Corrupted ledger restore. + // + // * Double bonded and corrupted ledger. + #[test] + fn restore_ledger_corrupted_works() { + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // get into corrupted and killed ledger state. + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Corrupted); + + // now try-state fails. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // recover the ledger bonded by 333 stash. + assert_ok!(Staking::restore_ledger(RuntimeOrigin::root(), 333, None, None, None)); + + // try-state checks are ok now. + assert_ok!(Staking::do_try_state(System::block_number())); + }) + } + + // Corrupted and killed ledger restore. + // + // * Double bonded and corrupted ledger. + // * Ledger killed by own controller. + #[test] + fn restore_ledger_corrupted_killed_works() { + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // ledger.total == lock + let total_444_before_corruption = asset::staked::(&444); + + // get into corrupted and killed ledger state by killing a corrupted ledger: + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + // kill(333) + // (444, 444) -> corrupted and None. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + + // kill the corrupted ledger that is associated with stash 333. + assert_ok!(StakingLedger::::kill(&333)); + + // 333 bond is no more but it returns `BadState` because the lock on this stash is + // still set (see checks below). + assert_eq!(Staking::inspect_bond_state(&333), Err(Error::::BadState)); + // now the *other* ledger associated with 444 has been corrupted and killed (None). + assert!(Staking::ledger(StakingAccount::Stash(444)).is_err()); + + // try-state should fail. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // recover the ledger bonded by 333 stash. + assert_ok!(Staking::restore_ledger(RuntimeOrigin::root(), 333, None, None, None)); + + // for the try-state checks to pass, we also need to recover the stash 444 which is + // corrupted too by proxy of kill(333). Currently, both the lock and the ledger of 444 + // have been cleared so we need to provide the new amount to restore the ledger. + assert_noop!( + Staking::restore_ledger(RuntimeOrigin::root(), 444, None, None, None), + Error::::CannotRestoreLedger + ); + + assert_ok!(Staking::restore_ledger( + RuntimeOrigin::root(), + 444, + None, + Some(total_444_before_corruption), + None, + )); + + // try-state checks are ok now. + assert_ok!(Staking::do_try_state(System::block_number())); + }) + } + + // Corrupted and killed by *other* ledger restore. + // + // * Double bonded and corrupted ledger. + // * Ledger killed by own controller. + #[test] + fn restore_ledger_corrupted_killed_other_works() { + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // get into corrupted and killed ledger state by killing a corrupted ledger: + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + // kill(444) + // (333, 444) -> corrupted and None + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + + // now try-state fails. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // 333 is corrupted since it's controller is linking 444 ledger. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Corrupted); + // 444 however is OK. + assert_eq!(Staking::inspect_bond_state(&444).unwrap(), LedgerIntegrityState::Ok); + + // kill the *other* ledger that is double bonded but not corrupted. + assert_ok!(StakingLedger::::kill(&444)); + + // recover the ledger bonded by 333 stash. + assert_ok!(Staking::restore_ledger(RuntimeOrigin::root(), 333, None, None, None)); + + // 444 does not need recover in this case since it's been killed successfully. + assert_eq!(Staking::inspect_bond_state(&444), Err(Error::::NotStash)); + + // try-state checks are ok now. + assert_ok!(Staking::do_try_state(System::block_number())); + }) + } + + // Corrupted with bond_extra. + // + // * Double bonded and corrupted ledger. + // * Corrupted ledger calls `bond_extra` + #[test] + fn restore_ledger_corrupted_bond_extra_works() { + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + setup_double_bonded_ledgers(); + + let lock_333_before = asset::staked::(&333); + let lock_444_before = asset::staked::(&444); + + // get into corrupted and killed ledger state by killing a corrupted ledger: + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + // bond_extra(444, 40) -> OK + // bond_extra(333, 30) -> locks out of sync + + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + + // now try-state fails. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // if 444 bonds extra, the locks remain in sync. + bond_extra_no_checks(&444, 40); + assert_eq!(asset::staked::(&333), lock_333_before); + assert_eq!(asset::staked::(&444), lock_444_before + 40); + + // however if 333 bonds extra, the wrong lock is updated. + bond_extra_no_checks(&333, 30); + assert_eq!(asset::staked::(&333), lock_444_before + 40 + 30); //not OK + assert_eq!(asset::staked::(&444), lock_444_before + 40); // OK + + // recover the ledger bonded by 333 stash. Note that the total/lock needs to be + // re-written since on-chain data lock has become out of sync. + assert_ok!(Staking::restore_ledger( + RuntimeOrigin::root(), + 333, + None, + Some(lock_333_before + 30), + None + )); + + // now recover 444 that although it's not corrupted, its lock and ledger.total are out + // of sync. in which case, we need to explicitly set the ledger's lock and amount, + // otherwise the ledger recover will fail. + assert_noop!( + Staking::restore_ledger(RuntimeOrigin::root(), 444, None, None, None), + Error::::CannotRestoreLedger + ); + + //and enforcing a new ledger lock/total on this non-corrupted ledger will work. + assert_ok!(Staking::restore_ledger( + RuntimeOrigin::root(), + 444, + None, + Some(lock_444_before + 40), + None + )); + + // double-check that ledgers got to expected state and bond_extra done during the + // corrupted state is part of the recovered ledgers. + let ledger_333 = Bonded::::get(&333).and_then(Ledger::::get).unwrap(); + let ledger_444 = Bonded::::get(&444).and_then(Ledger::::get).unwrap(); + + assert_eq!(ledger_333.total, lock_333_before + 30); + assert_eq!(asset::staked::(&333), ledger_333.total); + assert_eq!(ledger_444.total, lock_444_before + 40); + assert_eq!(asset::staked::(&444), ledger_444.total); + + // try-state checks are ok now. + assert_ok!(Staking::do_try_state(System::block_number())); + }) + } +} + +mod validator_disabling_integration { + use super::*; + + #[test] + fn reenable_lower_offenders() { + ExtBuilder::default() + .validator_count(7) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41, 51, 201, 202]); + + // offence with a low slash + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(10)]); + on_offence_now(&[offence_from(21, None)], &[Perbill::from_percent(20)]); + + // it does NOT affect the nominator. + assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]); + + // both validators should be disabled + assert!(is_disabled(11)); + assert!(is_disabled(21)); + + // offence with a higher slash + on_offence_now(&[offence_from(31, None)], &[Perbill::from_percent(50)]); + + // First offender is no longer disabled + assert!(!is_disabled(11)); + // Mid offender is still disabled + assert!(is_disabled(21)); + // New offender is disabled + assert!(is_disabled(31)); + + assert_eq!( + staking_events_since_last_call(), + vec![ + Event::StakersElected, + Event::EraPaid { era_index: 0, validator_payout: 11075, remainder: 33225 }, + Event::SlashReported { + validator: 11, + fraction: Perbill::from_percent(10), + slash_era: 1 + }, + Event::Slashed { staker: 11, amount: 100 }, + Event::Slashed { staker: 101, amount: 12 }, + Event::SlashReported { + validator: 21, + fraction: Perbill::from_percent(20), + slash_era: 1 + }, + Event::Slashed { staker: 21, amount: 200 }, + Event::Slashed { staker: 101, amount: 75 }, + Event::SlashReported { + validator: 31, + fraction: Perbill::from_percent(50), + slash_era: 1 + }, + Event::Slashed { staker: 31, amount: 250 }, + ] + ); + + assert!(matches!( + session_events().as_slice(), + &[ + .., + SessionEvent::ValidatorDisabled { validator: 11 }, + SessionEvent::ValidatorDisabled { validator: 21 }, + SessionEvent::ValidatorDisabled { validator: 31 }, + SessionEvent::ValidatorReenabled { validator: 11 }, + ] + )); + }); + } + + #[test] + fn do_not_reenable_higher_offenders_mock() { + ExtBuilder::default() + .validator_count(7) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41, 51, 201, 202]); + + // offence with a major slash + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(50)]); + on_offence_now(&[offence_from(21, None)], &[Perbill::from_percent(50)]); + + // both validators should be disabled + assert!(is_disabled(11)); + assert!(is_disabled(21)); + + // offence with a minor slash + on_offence_now(&[offence_from(31, None)], &[Perbill::from_percent(10)]); + + // First and second offenders are still disabled + assert!(is_disabled(11)); + assert!(is_disabled(21)); + // New offender is not disabled as limit is reached and his prio is lower + assert!(!is_disabled(31)); + + assert_eq!( + staking_events_since_last_call(), + vec![ + Event::StakersElected, + Event::EraPaid { era_index: 0, validator_payout: 11075, remainder: 33225 }, + Event::SlashReported { + validator: 11, + fraction: Perbill::from_percent(50), + slash_era: 1 + }, + Event::Slashed { staker: 11, amount: 500 }, + Event::Slashed { staker: 101, amount: 62 }, + Event::SlashReported { + validator: 21, + fraction: Perbill::from_percent(50), + slash_era: 1 + }, + Event::Slashed { staker: 21, amount: 500 }, + Event::Slashed { staker: 101, amount: 187 }, + Event::SlashReported { + validator: 31, + fraction: Perbill::from_percent(10), + slash_era: 1 + }, + Event::Slashed { staker: 31, amount: 50 }, + ] + ); + + assert!(matches!( + session_events().as_slice(), + &[ + .., + SessionEvent::ValidatorDisabled { validator: 11 }, + SessionEvent::ValidatorDisabled { validator: 21 }, + ] + )); + }); + } + + #[test] + fn clear_disabled_only_on_era_change() { + ExtBuilder::default() + .validator_count(7) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) + .session_per_era(3) + .build_and_execute(|| { + assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41, 51, 201, 202]); + + // offence with a major slash + on_offence_now( + &[offence_from(11, None), offence_from(21, None)], + &[Perbill::from_percent(50), Perbill::from_percent(50)], + ); + + // both validators should be disabled + assert!(is_disabled(11)); + assert!(is_disabled(21)); + + // progress session and check if disablement is retained + start_session(2); + assert!(is_disabled(11)); + assert!(is_disabled(21)); + + // progress era (3 sessions per era) and clear disablement + start_session(3); + assert!(!is_disabled(11)); + assert!(!is_disabled(21)); + }); + } + + #[test] + fn validator_is_not_disabled_for_an_offence_in_previous_era() { + ExtBuilder::default() + .validator_count(4) + .set_status(41, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + + assert!(>::contains_key(11)); + assert!(Session::validators().contains(&11)); + + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(0)]); + + assert_eq!(ForceEra::::get(), Forcing::NotForcing); + assert!(is_disabled(11)); + + mock::start_active_era(2); + + // the validator is not disabled in the new era + Staking::validate(RuntimeOrigin::signed(11), Default::default()).unwrap(); + assert_eq!(ForceEra::::get(), Forcing::NotForcing); + assert!(>::contains_key(11)); + assert!(Session::validators().contains(&11)); + + mock::start_active_era(3); + + // an offence committed in era 1 is reported in era 3 + on_offence_in_era(&[offence_from(11, None)], &[Perbill::from_percent(0)], 1); + + // the validator doesn't get disabled for an old offence + assert!(Validators::::iter().any(|(stash, _)| stash == 11)); + assert!(!is_disabled(11)); + + // and we are not forcing a new era + assert_eq!(ForceEra::::get(), Forcing::NotForcing); + + on_offence_in_era( + &[offence_from(11, None)], + // NOTE: A 100% slash here would clean up the account, causing de-registration. + &[Perbill::from_percent(95)], + 1, + ); + + // the validator doesn't get disabled again + assert!(Validators::::iter().any(|(stash, _)| stash == 11)); + assert!(!is_disabled(11)); + // and we are still not forcing a new era + assert_eq!(ForceEra::::get(), Forcing::NotForcing); + }); + } + + #[test] + fn non_slashable_offence_disables_validator() { + ExtBuilder::default() + .validator_count(7) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .set_status(201, StakerStatus::Validator) + .set_status(202, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41, 51, 201, 202]); + + // offence with no slash associated + on_offence_now(&[offence_from(11, None)], &[Perbill::zero()]); + + // it does NOT affect the nominator. + assert_eq!(Nominators::::get(101).unwrap().targets, vec![11, 21]); + + // offence that slashes 25% of the bond + on_offence_now(&[offence_from(21, None)], &[Perbill::from_percent(25)]); + + // it DOES NOT affect the nominator. + assert_eq!(Nominators::::get(101).unwrap().targets, vec![11, 21]); + + assert_eq!( + staking_events_since_last_call(), + vec![ + Event::StakersElected, + Event::EraPaid { era_index: 0, validator_payout: 11075, remainder: 33225 }, + Event::SlashReported { + validator: 11, + fraction: Perbill::from_percent(0), + slash_era: 1 + }, + Event::SlashReported { + validator: 21, + fraction: Perbill::from_percent(25), + slash_era: 1 + }, + Event::Slashed { staker: 21, amount: 250 }, + Event::Slashed { staker: 101, amount: 94 } + ] + ); + + assert!(matches!( + session_events().as_slice(), + &[ + .., + SessionEvent::ValidatorDisabled { validator: 11 }, + SessionEvent::ValidatorDisabled { validator: 21 }, + ] + )); + + // the offence for validator 11 wasn't slashable but it is disabled + assert!(is_disabled(11)); + // validator 21 gets disabled too + assert!(is_disabled(21)); + }); + } + + #[test] + fn slashing_independent_of_disabling_validator() { + ExtBuilder::default() + .validator_count(5) + .set_status(41, StakerStatus::Validator) + .set_status(51, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41, 51]); + + let now = ActiveEra::::get().unwrap().index; + + // --- Disable without a slash --- + // offence with no slash associated + on_offence_in_era(&[offence_from(11, None)], &[Perbill::zero()], now); + + // nomination remains untouched. + assert_eq!(Nominators::::get(101).unwrap().targets, vec![11, 21]); + + // first validator is disabled + assert!(is_disabled(11)); + + // --- Slash without disabling (because limit reached) --- + // offence that slashes 50% of the bond (setup for next slash) + on_offence_in_era(&[offence_from(11, None)], &[Perbill::from_percent(50)], now); + + // offence that slashes 25% of the bond but does not disable + on_offence_in_era(&[offence_from(21, None)], &[Perbill::from_percent(25)], now); + + // nomination remains untouched. + assert_eq!(Nominators::::get(101).unwrap().targets, vec![11, 21]); + + // second validator is slashed but not disabled + assert!(!is_disabled(21)); + assert!(is_disabled(11)); + + assert_eq!( + staking_events_since_last_call(), + vec![ + Event::StakersElected, + Event::EraPaid { era_index: 0, validator_payout: 11075, remainder: 33225 }, + Event::SlashReported { + validator: 11, + fraction: Perbill::from_percent(0), + slash_era: 1 + }, + Event::SlashReported { + validator: 11, + fraction: Perbill::from_percent(50), + slash_era: 1 + }, + Event::Slashed { staker: 11, amount: 500 }, + Event::Slashed { staker: 101, amount: 62 }, + Event::SlashReported { + validator: 21, + fraction: Perbill::from_percent(25), + slash_era: 1 + }, + Event::Slashed { staker: 21, amount: 250 }, + Event::Slashed { staker: 101, amount: 94 } + ] + ); + + assert_eq!( + session_events(), + vec![ + SessionEvent::NewSession { session_index: 1 }, + SessionEvent::NewQueued, + SessionEvent::NewSession { session_index: 2 }, + SessionEvent::NewSession { session_index: 3 }, + SessionEvent::ValidatorDisabled { validator: 11 } + ] + ); + }); + } + + #[test] + fn offence_threshold_doesnt_force_new_era() { + ExtBuilder::default() + .validator_count(4) + .set_status(41, StakerStatus::Validator) + .build_and_execute(|| { + mock::start_active_era(1); + assert_eq_uvec!(Session::validators(), vec![11, 21, 31, 41]); + + assert_eq!( + UpToLimitWithReEnablingDisablingStrategy::::disable_limit( + Session::validators().len() + ), + 1 + ); + + // we have 4 validators and an offending validator threshold of 1, + // even if two validators commit an offence a new era should not be forced + on_offence_now(&[offence_from(11, None)], &[Perbill::from_percent(50)]); + + // 11 should be disabled because the byzantine threshold is 1 + assert!(is_disabled(11)); + + assert_eq!(ForceEra::::get(), Forcing::NotForcing); + + on_offence_now(&[offence_from(21, None)], &[Perbill::zero()]); + + // 21 should not be disabled because the number of disabled validators will be above + // the byzantine threshold + assert!(!is_disabled(21)); + + assert_eq!(ForceEra::::get(), Forcing::NotForcing); + + on_offence_now(&[offence_from(31, None)], &[Perbill::zero()]); + + // same for 31 + assert!(!is_disabled(31)); + + assert_eq!(ForceEra::::get(), Forcing::NotForcing); + }); + } +} + +#[cfg(all(feature = "try-runtime", test))] +mod migration_tests { + use super::*; + use frame_support::traits::UncheckedOnRuntimeUpgrade; + use migrations::{v15, v16}; + + #[test] + fn migrate_v15_to_v16_with_try_runtime() { + ExtBuilder::default().validator_count(7).build_and_execute(|| { + // Initial setup: Create old `DisabledValidators` in the form of `Vec` + let old_disabled_validators = vec![1u32, 2u32]; + v15::DisabledValidators::::put(old_disabled_validators.clone()); + + // Run pre-upgrade checks + let pre_upgrade_result = v16::VersionUncheckedMigrateV15ToV16::::pre_upgrade(); + assert!(pre_upgrade_result.is_ok()); + let pre_upgrade_state = pre_upgrade_result.unwrap(); + + // Run the migration + v16::VersionUncheckedMigrateV15ToV16::::on_runtime_upgrade(); + + // Run post-upgrade checks + let post_upgrade_result = + v16::VersionUncheckedMigrateV15ToV16::::post_upgrade(pre_upgrade_state); + assert!(post_upgrade_result.is_ok()); + }); + } +} + +mod getters { + use crate::{ + mock::{self, Perbill}, + tests::{Staking, Test}, + }; + use pallet_staking::{ + pallet::pallet::{Invulnerables, MinimumValidatorCount, ValidatorCount}, + slashing, + ActiveEra, ActiveEraInfo, BalanceOf, CanceledSlashPayout, ClaimedRewards, CurrentEra, + CurrentPlannedSession, EraRewardPoints, ErasRewardPoints, ErasStakersClipped, + ErasStartSessionIndex, ErasTotalStake, ErasValidatorPrefs, ErasValidatorReward, ForceEra, + Forcing, Nominations, Nominators, SlashRewardFraction, SlashingSpans, + ValidatorPrefs, Validators, + }; + use sp_staking::{EraIndex, Exposure, IndividualExposure, Page, SessionIndex}; + + #[test] + fn get_validator_count_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let v: u32 = 12; + ValidatorCount::::put(v); + + // when + let result = Staking::validator_count(); + + // then + assert_eq!(result, v); + }); + } + + #[test] + fn get_minimum_validator_count_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let v: u32 = 12; + MinimumValidatorCount::::put(v); + + // when + let result = Staking::minimum_validator_count(); + + // then + assert_eq!(result, v); + }); + } + + #[test] + fn get_invulnerables_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let v: Vec = vec![1, 2, 3]; + Invulnerables::::put(v.clone()); + + // when + let result = Staking::invulnerables(); + + // then + assert_eq!(result, v); + }); + } + + #[test] + fn get_validators_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let account_id: mock::AccountId = 1; + let validator_prefs = ValidatorPrefs::default(); + + Validators::::insert(account_id, validator_prefs.clone()); + + // when + let result = Staking::validators(&account_id); + + // then + assert_eq!(result, validator_prefs); + }); + } + + #[test] + fn get_nominators_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let account_id: mock::AccountId = 1; + let nominations: Nominations = Nominations { + targets: Default::default(), + submitted_in: Default::default(), + suppressed: false, + }; + + Nominators::::insert(account_id, nominations.clone()); + + // when + let result = Staking::nominators(account_id); + + // then + assert_eq!(result, Some(nominations)); + }); + } + + #[test] + fn get_current_era_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let era: EraIndex = 12; + CurrentEra::::put(era); + + // when + let result = Staking::current_era(); + + // then + assert_eq!(result, Some(era)); + }); + } + + #[test] + fn get_active_era_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let era = ActiveEraInfo { index: 2, start: None }; + ActiveEra::::put(era); + + // when + let result: Option = Staking::active_era(); + + // then + if let Some(era_info) = result { + assert_eq!(era_info.index, 2); + assert_eq!(era_info.start, None); + } else { + panic!("Expected Some(era_info), got None"); + }; + }); + } + + #[test] + fn get_eras_start_session_index_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let era: EraIndex = 12; + let session_index: SessionIndex = 14; + ErasStartSessionIndex::::insert(era, session_index); + + // when + let result = Staking::eras_start_session_index(era); + + // then + assert_eq!(result, Some(session_index)); + }); + } + + #[test] + fn get_eras_stakers_clipped_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let era: EraIndex = 12; + let account_id: mock::AccountId = 1; + let exposure: Exposure> = Exposure { + total: 1125, + own: 1000, + others: vec![IndividualExposure { who: 101, value: 125 }], + }; + ErasStakersClipped::::insert(era, account_id, exposure.clone()); + + // when + let result = Staking::eras_stakers_clipped(era, &account_id); + + // then + assert_eq!(result, exposure); + }); + } + + #[test] + fn get_claimed_rewards_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let era: EraIndex = 12; + let account_id: mock::AccountId = 1; + let rewards = Vec::::new(); + ClaimedRewards::::insert(era, account_id, rewards.clone()); + + // when + let result = Staking::claimed_rewards(era, &account_id); + + // then + assert_eq!(result, rewards); + }); + } + + #[test] + fn get_eras_validator_prefs_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let era: EraIndex = 12; + let account_id: mock::AccountId = 1; + let validator_prefs = ValidatorPrefs::default(); + + ErasValidatorPrefs::::insert(era, account_id, validator_prefs.clone()); + + // when + let result = Staking::eras_validator_prefs(era, &account_id); + + // then + assert_eq!(result, validator_prefs); + }); + } + + #[test] + fn get_eras_validator_reward_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let era: EraIndex = 12; + let balance_of = BalanceOf::::default(); + + ErasValidatorReward::::insert(era, balance_of); + + // when + let result = Staking::eras_validator_reward(era); + + // then + assert_eq!(result, Some(balance_of)); + }); + } + + #[test] + fn get_eras_reward_points_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let era: EraIndex = 12; + let reward_points = EraRewardPoints:: { + total: 1, + individual: vec![(11, 1)].into_iter().collect(), + }; + ErasRewardPoints::::insert(era, reward_points); + + // when + let result = Staking::eras_reward_points(era); + + // then + assert_eq!(result.total, 1); + }); + } + + #[test] + fn get_eras_total_stake_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let era: EraIndex = 12; + let balance_of = BalanceOf::::default(); + + ErasTotalStake::::insert(era, balance_of); + + // when + let result = Staking::eras_total_stake(era); + + // then + assert_eq!(result, balance_of); + }); + } + + #[test] + fn get_force_era_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let forcing = Forcing::NotForcing; + ForceEra::::put(forcing); + + // when + let result = Staking::force_era(); + + // then + assert_eq!(result, forcing); + }); + } + + #[test] + fn get_slash_reward_fraction_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let perbill = Perbill::one(); + SlashRewardFraction::::put(perbill); + + // when + let result = Staking::slash_reward_fraction(); + + // then + assert_eq!(result, perbill); + }); + } + + #[test] + fn get_canceled_payout_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let balance_of = BalanceOf::::default(); + CanceledSlashPayout::::put(balance_of); + + // when + let result = Staking::canceled_payout(); + + // then + assert_eq!(result, balance_of); + }); + } + + #[test] + fn get_slashing_spans_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let account_id: mock::AccountId = 1; + let spans = slashing::SlashingSpans::new(2); + SlashingSpans::::insert(account_id, spans); + + // when + let result: Option = Staking::slashing_spans(&account_id); + + // then + // simple check so as not to add extra macros to slashing::SlashingSpans struct + assert!(result.is_some()); + }); + } + + #[test] + fn get_current_planned_session_returns_value_from_storage() { + sp_io::TestExternalities::default().execute_with(|| { + // given + let session_index = SessionIndex::default(); + CurrentPlannedSession::::put(session_index); + + // when + let result = Staking::current_planned_session(); + + // then + assert_eq!(result, session_index); + }); + } +} + +mod hold_migration { + use super::*; + use frame_support::traits::fungible::Mutate; + use sp_staking::{Stake, StakingInterface}; + + #[test] + fn ledger_update_creates_hold() { + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + // GIVEN alice who is a nominator with old currency + let alice = 300; + bond_nominator(alice, 1000, vec![11]); + assert_eq!(asset::staked::(&alice), 1000); + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), 0); + // migrate alice currency to legacy locks + testing_utils::migrate_to_old_currency::(alice); + // no more holds + assert_eq!(asset::staked::(&alice), 0); + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), 1000); + assert_eq!( + ::stake(&alice), + Ok(Stake { total: 1000, active: 1000 }) + ); + + // any ledger mutation should create a hold + hypothetically!({ + // give some extra balance to alice. + let _ = asset::mint_into_existing::(&alice, 100); + + // WHEN new fund is bonded to ledger. + assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(alice), 100)); + + // THEN new hold is created + assert_eq!(asset::staked::(&alice), 1000 + 100); + assert_eq!( + ::stake(&alice), + Ok(Stake { total: 1100, active: 1100 }) + ); + + // old locked balance is untouched + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), 1000); + }); + + hypothetically!({ + // WHEN new fund is unbonded from ledger. + assert_ok!(Staking::unbond(RuntimeOrigin::signed(alice), 100)); + + // THEN hold is updated. + assert_eq!(asset::staked::(&alice), 1000); + assert_eq!( + ::stake(&alice), + Ok(Stake { total: 1000, active: 900 }) + ); + + // old locked balance is untouched + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), 1000); + }); + + // WHEN alice currency is migrated. + assert_ok!(Staking::migrate_currency(RuntimeOrigin::signed(1), alice)); + + // THEN hold is updated. + assert_eq!(asset::staked::(&alice), 1000); + assert_eq!( + ::stake(&alice), + Ok(Stake { total: 1000, active: 1000 }) + ); + + // ensure cannot migrate again. + assert_noop!( + Staking::migrate_currency(RuntimeOrigin::signed(1), alice), + Error::::AlreadyMigrated + ); + + // locked balance is removed + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), 0); + }); + } + + #[test] + fn migrate_removes_old_lock() { + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + // GIVEN alice who is a nominator with old currency + let alice = 300; + bond_nominator(alice, 1000, vec![11]); + testing_utils::migrate_to_old_currency::(alice); + assert_eq!(asset::staked::(&alice), 0); + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), 1000); + let pre_migrate_consumer = System::consumers(&alice); + System::reset_events(); + + // WHEN alice currency is migrated. + assert_ok!(Staking::migrate_currency(RuntimeOrigin::signed(1), alice)); + + // THEN + // the extra consumer from old code is removed. + assert_eq!(System::consumers(&alice), pre_migrate_consumer - 1); + // ensure no lock + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), 0); + // ensure stake and hold are same. + assert_eq!( + ::stake(&alice), + Ok(Stake { total: 1000, active: 1000 }) + ); + assert_eq!(asset::staked::(&alice), 1000); + // ensure events are emitted. + assert_eq!( + staking_events_since_last_call(), + vec![Event::CurrencyMigrated { stash: alice, force_withdraw: 0 }] + ); + + // ensure cannot migrate again. + assert_noop!( + Staking::migrate_currency(RuntimeOrigin::signed(1), alice), + Error::::AlreadyMigrated + ); + }); + } + #[test] + fn cannot_hold_all_stake() { + // When there is not enough funds to hold all stake, part of the stake if force withdrawn. + // At end of the migration, the stake and hold should be same. + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + // GIVEN alice who is a nominator with old currency. + let alice = 300; + let stake = 1000; + bond_nominator(alice, stake, vec![11]); + testing_utils::migrate_to_old_currency::(alice); + assert_eq!(asset::staked::(&alice), 0); + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), stake); + // ledger has 1000 staked. + assert_eq!( + ::stake(&alice), + Ok(Stake { total: stake, active: stake }) + ); + + // Get rid of the extra ED to emulate all their balance including ED is staked. + assert_ok!(Balances::transfer_allow_death( + RuntimeOrigin::signed(alice), + 10, + ExistentialDeposit::get() + )); + + let expected_force_withdraw = ExistentialDeposit::get(); + + // ledger mutation would fail in this case before migration because of failing hold. + assert_noop!( + Staking::unbond(RuntimeOrigin::signed(alice), 100), + Error::::NotEnoughFunds + ); + + // clear events + System::reset_events(); + + // WHEN alice currency is migrated. + assert_ok!(Staking::migrate_currency(RuntimeOrigin::signed(1), alice)); + + // THEN + let expected_hold = stake - expected_force_withdraw; + // ensure no lock + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), 0); + // ensure stake and hold are same. + assert_eq!( + ::stake(&alice), + Ok(Stake { total: expected_hold, active: expected_hold }) + ); + assert_eq!(asset::staked::(&alice), expected_hold); + // ensure events are emitted. + assert_eq!( + staking_events_since_last_call(), + vec![Event::CurrencyMigrated { + stash: alice, + force_withdraw: expected_force_withdraw + }] + ); + + // ensure cannot migrate again. + assert_noop!( + Staking::migrate_currency(RuntimeOrigin::signed(1), alice), + Error::::AlreadyMigrated + ); + + // unbond works after migration. + assert_ok!(Staking::unbond(RuntimeOrigin::signed(alice), 100)); + }); + } + + #[test] + fn overstaked_and_partially_unbonding() { + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + // GIVEN alice who is a nominator with T::OldCurrency. + let alice = 300; + // 1000 + ED + let _ = Balances::make_free_balance_be(&alice, 1001); + let stake = 600; + let reserved_by_another_pallet = 400; + assert_ok!(Staking::bond( + RuntimeOrigin::signed(alice), + stake, + RewardDestination::Staked + )); + + // AND Alice is partially unbonding. + assert_ok!(Staking::unbond(RuntimeOrigin::signed(alice), 300)); + + // AND Alice has some funds reserved with another pallet. + assert_ok!(Balances::reserve(&alice, reserved_by_another_pallet)); + + // convert stake to T::OldCurrency. + testing_utils::migrate_to_old_currency::(alice); + assert_eq!(asset::staked::(&alice), 0); + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), stake); + + // ledger has correct amount staked. + assert_eq!( + ::stake(&alice), + Ok(Stake { total: stake, active: stake - 300 }) + ); + + // Alice becomes overstaked by withdrawing some staked balance. + assert_ok!(Balances::transfer_allow_death( + RuntimeOrigin::signed(alice), + 10, + reserved_by_another_pallet + )); + + let expected_force_withdraw = reserved_by_another_pallet; + + // ledger mutation would fail in this case before migration because of failing hold. + assert_noop!( + Staking::unbond(RuntimeOrigin::signed(alice), 100), + Error::::NotEnoughFunds + ); + + // clear events + System::reset_events(); + + // WHEN alice currency is migrated. + assert_ok!(Staking::migrate_currency(RuntimeOrigin::signed(1), alice)); + + // THEN + let expected_hold = stake - expected_force_withdraw; + // ensure no lock + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), 0); + // ensure stake and hold are same. + assert_eq!( + ::stake(&alice), + // expected stake is 0 since force withdrawn (400) is taken out completely of + // active stake. + Ok(Stake { total: expected_hold, active: 0 }) + ); + + assert_eq!(asset::staked::(&alice), expected_hold); + // ensure events are emitted. + assert_eq!( + staking_events_since_last_call(), + vec![Event::CurrencyMigrated { + stash: alice, + force_withdraw: expected_force_withdraw + }] + ); + + // ensure cannot migrate again. + assert_noop!( + Staking::migrate_currency(RuntimeOrigin::signed(1), alice), + Error::::AlreadyMigrated + ); + + // unbond works after migration. + assert_ok!(Staking::unbond(RuntimeOrigin::signed(alice), 100)); + }); + } + + #[test] + fn virtual_staker_consumer_provider_dec() { + // Ensure virtual stakers consumer and provider count is decremented. + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + // 200 virtual bonds + bond_virtual_nominator(200, 201, 500, vec![11, 21]); + + // previously the virtual nominator had a provider inc by the delegation system as + // well as a consumer by this pallet. + System::inc_providers(&200); + System::inc_consumers(&200).expect("has provider, can consume"); + + hypothetically!({ + // migrate 200 + assert_ok!(Staking::migrate_currency(RuntimeOrigin::signed(1), 200)); + + // ensure account does not exist in system anymore. + assert_eq!(System::consumers(&200), 0); + assert_eq!(System::providers(&200), 0); + assert!(!System::account_exists(&200)); + + // ensure cannot migrate again. + assert_noop!( + Staking::migrate_currency(RuntimeOrigin::signed(1), 200), + Error::::AlreadyMigrated + ); + }); + + hypothetically!({ + // 200 has an erroneously extra provider + System::inc_providers(&200); + + // causes migration to fail. + assert_noop!( + Staking::migrate_currency(RuntimeOrigin::signed(1), 200), + Error::::BadState + ); + }); + + // 200 is funded for more than ED by a random account. + assert_ok!(Balances::transfer_allow_death(RuntimeOrigin::signed(999), 200, 10)); + + // it has an extra provider now. + assert_eq!(System::providers(&200), 2); + + // migrate 200 + assert_ok!(Staking::migrate_currency(RuntimeOrigin::signed(1), 200)); + + // 1 provider is left, consumers is 0. + assert_eq!(System::providers(&200), 1); + assert_eq!(System::consumers(&200), 0); + + // ensure cannot migrate again. + assert_noop!( + Staking::migrate_currency(RuntimeOrigin::signed(1), 200), + Error::::AlreadyMigrated + ); + }); + } + + #[test] + fn remove_old_lock_when_stake_already_on_hold() { + // When the hold is already migrated because of interactions with the ledger, we still + // want to remove the old lock via the explicit `migrate_currency`. + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + // GIVEN alice and bob who are bonded with old currency. + let alice = 300; + let bob = 301; + Balances::set_balance(&alice, 3000); + Balances::set_balance(&bob, 3000); + + mock::start_active_era(1); + let init_stake = 1000; + assert_ok!(Staking::bond( + RuntimeOrigin::signed(alice), + init_stake, + RewardDestination::Staked + )); + assert_ok!(Staking::bond( + RuntimeOrigin::signed(bob), + init_stake, + RewardDestination::Staked + )); + + // convert hold to lock. + testing_utils::migrate_to_old_currency::(alice); + testing_utils::migrate_to_old_currency::(bob); + + // this returns the hold balance which is 0 because of the above migration. + assert_eq!(asset::staked::(&alice), 0); + assert_eq!(asset::staked::(&bob), 0); + + // but instead of hold, the balance is locked. + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), init_stake); + assert_eq!(Balances::balance_locked(STAKING_ID, &bob), init_stake); + + // ledger has 1000 staked. + assert_eq!( + ::stake(&alice), + Ok(Stake { total: init_stake, active: init_stake }) + ); + assert_eq!( + ::stake(&bob), + Ok(Stake { total: init_stake, active: init_stake }) + ); + + // -- WHEN Alice interacts with ledger that updates the hold. + assert_ok!(Staking::bond_extra(RuntimeOrigin::signed(alice), 500)); + + // this will update the ledger and the held balance. + assert_eq!(asset::staked::(&alice), init_stake + 500); + // but the locked balance remains + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), init_stake); + + // clear events + System::reset_events(); + + // To remove the old locks, alice needs to migrate currency. + // AND alice currency is migrated. + assert_ok!(Staking::migrate_currency(RuntimeOrigin::signed(1), alice)); + + // THEN + let expected_hold = init_stake + 500; + // ensure no lock + assert_eq!(Balances::balance_locked(STAKING_ID, &alice), 0); + // ensure stake and hold are same. + assert_eq!( + ::stake(&alice), + Ok(Stake { total: expected_hold, active: expected_hold }) + ); + assert_eq!(asset::staked::(&alice), expected_hold); + + // ensure events are emitted. + assert_eq!( + staking_events_since_last_call(), + vec![Event::CurrencyMigrated { stash: alice, force_withdraw: 0 }] + ); + + // ensure cannot migrate again. + assert_noop!( + Staking::migrate_currency(RuntimeOrigin::signed(1), alice), + Error::::AlreadyMigrated + ); + + // -- WHEN Bob withdraws all stake before migration. + assert_ok!(Staking::unbond(RuntimeOrigin::signed(bob), init_stake)); + + mock::start_active_era(4); + assert_ok!(Staking::withdraw_unbonded(RuntimeOrigin::signed(bob), 0)); + + // assert lock still exists but there is no stake. + assert_eq!(Balances::balance_locked(STAKING_ID, &bob), init_stake); + assert_eq!(asset::staked::(&bob), 0); + assert_eq!( + ::stake(&bob).unwrap_err(), + Error::::NotStash.into() + ); + + // clear events + System::reset_events(); + + // AND Bob wants to remove the old lock. + assert_ok!(Staking::migrate_currency(RuntimeOrigin::signed(1), bob)); + + // THEN ensure no lock + assert_eq!(Balances::balance_locked(STAKING_ID, &bob), 0); + + // And they cannot migrate again. + assert_noop!( + Staking::migrate_currency(RuntimeOrigin::signed(1), bob), + Error::::AlreadyMigrated + ); + }); + } +} + +// Tests for manual_slash extrinsic +// Covers the following scenarios: +// 1. Basic slashing functionality - verifies root origin slashing works correctly +// 2. Slashing with a lower percentage - should have no effect +// 3. Slashing with a higher percentage - should increase the slash amount +// 4. Slashing in non-existent eras - should fail with an error +// 5. Slashing in previous eras - should work within history depth +#[test] +fn manual_slashing_works() { + ExtBuilder::default().validator_count(2).build_and_execute(|| { + // setup: Start with era 0 + start_active_era(0); + + let validator_stash = 11; + let initial_balance = Staking::slashable_balance_of(&validator_stash); + assert!(initial_balance > 0, "Validator must have stake to be slashed"); + + // scenario 1: basic slashing works + // this verifies that the manual_slash extrinsic properly slashes a validator when + // called with root origin + let current_era = CurrentEra::::get().unwrap(); + let slash_fraction_1 = Perbill::from_percent(25); + + // only root can call this function + assert_noop!( + Staking::manual_slash( + RuntimeOrigin::signed(10), + validator_stash, + current_era, + slash_fraction_1 + ), + BadOrigin + ); + + // root can slash + assert_ok!(Staking::manual_slash( + RuntimeOrigin::root(), + validator_stash, + current_era, + slash_fraction_1 + )); + + // check if balance was slashed correctly (25%) + let balance_after_first_slash = Staking::slashable_balance_of(&validator_stash); + let expected_balance_1 = initial_balance - (initial_balance / 4); // 25% slash + + assert!( + balance_after_first_slash <= expected_balance_1 && + balance_after_first_slash >= expected_balance_1 - 5, + "First slash was not applied correctly. Expected around {}, got {}", + expected_balance_1, + balance_after_first_slash + ); + + // clear events from first slash + System::reset_events(); + + // scenario 2: slashing with a smaller fraction has no effect + // when a validator has already been slashed by a higher percentage, + // attempting to slash with a lower percentage should have no effect + let slash_fraction_2 = Perbill::from_percent(10); // Smaller than 25% + assert_ok!(Staking::manual_slash( + RuntimeOrigin::root(), + validator_stash, + current_era, + slash_fraction_2 + )); + + // balance should not change because we already slashed with a higher percentage + let balance_after_second_slash = Staking::slashable_balance_of(&validator_stash); + assert_eq!( + balance_after_first_slash, balance_after_second_slash, + "Balance changed after slashing with smaller fraction" + ); + + // verify no Slashed event since slash fraction is lower than previous + let no_slashed_events = !System::events().iter().any(|record| { + matches!(record.event, RuntimeEvent::Staking(Event::::Slashed { .. })) + }); + assert!(no_slashed_events, "A Slashed event was incorrectly emitted immediately"); + + // clear events again + System::reset_events(); + + // scenario 3: slashing with a larger fraction works + // when a validator is slashed with a higher percentage than previous slashes, + // their stake should be further reduced to match the new larger slash percentage + let slash_fraction_3 = Perbill::from_percent(50); // Larger than 25% + assert_ok!(Staking::manual_slash( + RuntimeOrigin::root(), + validator_stash, + current_era, + slash_fraction_3 + )); + + // check if balance was further slashed (from 75% to 50% of original) + let balance_after_third_slash = Staking::slashable_balance_of(&validator_stash); + let expected_balance_3 = initial_balance / 2; // 50% of original + + assert!( + balance_after_third_slash <= expected_balance_3 && + balance_after_third_slash >= expected_balance_3 - 5, + "Third slash was not applied correctly. Expected around {}, got {}", + expected_balance_3, + balance_after_third_slash + ); + + // verify a Slashed event was emitted + assert!( + System::events().iter().any(|record| { + matches!( + record.event, + RuntimeEvent::Staking(Event::::Slashed { staker, .. }) + if staker == validator_stash + ) + }), + "No Slashed event was emitted after effective slash" + ); + + // scenario 4: slashing in a non-existent era fails + // the manual_slash extrinsic should validate that the era exists within history depth + assert_noop!( + Staking::manual_slash(RuntimeOrigin::root(), validator_stash, 999, slash_fraction_1), + Error::::InvalidEraToReward + ); + + // move to next era + start_active_era(1); + + // scenario 5: slashing in previous era still works + // as long as the era is within history depth, validators can be slashed for past eras + assert_ok!(Staking::manual_slash( + RuntimeOrigin::root(), + validator_stash, + 0, + Perbill::from_percent(75) + )); + + // check balance was further reduced + let balance_after_fifth_slash = Staking::slashable_balance_of(&validator_stash); + let expected_balance_5 = initial_balance / 4; // 25% of original (75% slashed) + + assert!( + balance_after_fifth_slash <= expected_balance_5 && + balance_after_fifth_slash >= expected_balance_5 - 5, + "Fifth slash was not applied correctly. Expected around {}, got {}", + expected_balance_5, + balance_after_fifth_slash + ); + }) +} diff --git a/pallets/staking/src/types.rs b/pallets/validators/src/types.rs similarity index 67% rename from pallets/staking/src/types.rs rename to pallets/validators/src/types.rs index 2377d56c79..bc5012218a 100644 --- a/pallets/staking/src/types.rs +++ b/pallets/validators/src/types.rs @@ -1,12 +1,11 @@ -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; - -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; +use pallet_staking::permissioned_staking::WhoToSlash; use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; use sp_runtime::RuntimeDebug; /// Preference of an identity regarding validation. -#[derive(Decode, Encode, RuntimeDebug, TypeInfo)] +#[derive(Decode, Encode, MaxEncodedLen, RuntimeDebug, TypeInfo)] #[derive(Clone, Copy, Eq, PartialEq)] pub struct PermissionedIdentityPrefs { /// Intended number of validators an identity wants to run. @@ -40,9 +39,9 @@ impl PermissionedIdentityPrefs { /// Switch used to change the "victim" for slashing. Victims can be /// validators, both validators and nominators, or no-one. -#[derive(Decode, Encode, MaxEncodedLen, RuntimeDebug, TypeInfo)] -#[derive(Clone, Copy, Default, Eq, PartialEq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, RuntimeDebug)] +#[derive(Clone, Copy, Default, Eq, PartialEq, TypeInfo)] +#[derive(Serialize, Deserialize)] pub enum SlashingSwitch { /// Allow validators but not nominators to get slashed. Validator, @@ -52,3 +51,13 @@ pub enum SlashingSwitch { #[default] None, } + +impl From for Option { + fn from(value: SlashingSwitch) -> Self { + match value { + SlashingSwitch::Validator => Some(WhoToSlash::Validator), + SlashingSwitch::ValidatorAndNominator => Some(WhoToSlash::ValidatorAndNominator), + SlashingSwitch::None => None, + } + } +} diff --git a/pallets/weights/Cargo.toml b/pallets/weights/Cargo.toml index 410c003e80..8c37348929 100644 --- a/pallets/weights/Cargo.toml +++ b/pallets/weights/Cargo.toml @@ -6,23 +6,25 @@ edition = "2021" [dependencies] # substrate pallets -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -pallet-timestamp = { version = "4.0.0-dev", default-features = false } -pallet-babe = { version = "4.0.0-dev", default-features = false } -pallet-contracts = { version = "4.0.0-dev", default-features = false } -pallet-im-online = { version = "4.0.0-dev", default-features = false } -pallet-indices = { version = "4.0.0-dev", default-features = false } -pallet-grandpa = { version = "4.0.0-dev", default-features = false } -pallet-preimage = { version = "4.0.0-dev", default-features = false } -pallet-scheduler = { version = "4.0.0-dev", default-features = false } -pallet-session = { version = "4.0.0-dev", default-features = false } -sp-std = { version = "5.0.0", default-features = false } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +pallet-timestamp = { workspace = true, default-features = false } +pallet-babe = { workspace = true, default-features = false } +pallet-balances = { workspace = true, default-features = false } +pallet-contracts = { workspace = true, default-features = false } +pallet-im-online = { workspace = true, default-features = false } +pallet-indices = { workspace = true, default-features = false } +pallet-grandpa = { workspace = true, default-features = false } +pallet-preimage = { workspace = true, default-features = false } +pallet-scheduler = { workspace = true, default-features = false } +pallet-session = { workspace = true, default-features = false } +pallet-staking = { workspace = true, default-features = false } +pallet-transaction-payment = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } # our pallets pallet-asset = { workspace = true, default-features = false } -pallet-balances = { workspace = true, default-features = false } -pallet-staking = { workspace = true, default-features = false } +pallet-validators = { workspace = true, default-features = false } pallet-committee = { workspace = true, default-features = false } pallet-compliance-manager = { workspace = true, default-features = false } pallet-corporate-actions = { workspace = true, default-features = false } @@ -42,6 +44,7 @@ pallet-treasury = { workspace = true, default-features = false } pallet-utility = { workspace = true, default-features = false } polymesh-contracts = { workspace = true, default-features = false } polymesh-primitives = { workspace = true, default-features = false } +polymesh-transaction-payment = { workspace = true, default-features = false } [features] default = ["std"] @@ -52,6 +55,7 @@ std = [ "pallet-asset/std", "pallet-babe/std", "pallet-staking/std", + "pallet-validators/std", "pallet-balances/std", "pallet-compliance-manager/std", "pallet-corporate-actions/std", @@ -75,4 +79,5 @@ std = [ "pallet-utility/std", "polymesh-contracts/std", "polymesh-primitives/std", + "polymesh-transaction-payment/std", ] diff --git a/pallets/weights/src/frame_system.rs b/pallets/weights/src/frame_system.rs index cfb1c412e9..afdde848db 100644 --- a/pallets/weights/src/frame_system.rs +++ b/pallets/weights/src/frame_system.rs @@ -56,16 +56,16 @@ impl frame_system::WeightInfo for SubstrateWeight { /// The range of component `b` is `[0, 7864320]`. fn remark(b: u32) -> Weight { // Minimum execution time: 2_213 nanoseconds. - Weight::from_ref_time(12_794_737) + Weight::from_parts(12_794_737, 0) // Standard Error: 0 - .saturating_add(Weight::from_ref_time(346).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(346, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 7864320]`. fn remark_with_event(b: u32) -> Weight { // Minimum execution time: 7_861 nanoseconds. - Weight::from_ref_time(7_881_000) + Weight::from_parts(7_881_000, 0) // Standard Error: 0 - .saturating_add(Weight::from_ref_time(1_288).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(1_288, 0).saturating_mul(b.into())) } // Storage: System Digest (r:1 w:1) // Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) @@ -73,18 +73,31 @@ impl frame_system::WeightInfo for SubstrateWeight { // Proof Skipped: unknown `0x3a686561707061676573` (r:0 w:1) fn set_heap_pages() -> Weight { // Minimum execution time: 4_276 nanoseconds. - Weight::from_ref_time(5_388_000) + Weight::from_parts(5_388_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(2)) } + /// Storage: System Digest (r:1 w:1) + /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: unknown `0x3a636f6465` (r:0 w:1) + /// Proof Skipped: unknown `0x3a636f6465` (r:0 w:1) + fn set_code() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `1485` + // Minimum execution time: 84_000_503_000 picoseconds. + Weight::from_parts(87_586_619_000, 1485) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(2_u64)) + } // Storage: Skipped Metadata (r:0 w:0) // Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[0, 1000]`. fn set_storage(i: u32) -> Weight { // Minimum execution time: 2_403 nanoseconds. - Weight::from_ref_time(2_494_000) + Weight::from_parts(2_494_000, 0) // Standard Error: 1_536 - .saturating_add(Weight::from_ref_time(919_406).saturating_mul(i.into())) + .saturating_add(Weight::from_parts(919_406, 0).saturating_mul(i.into())) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } // Storage: Skipped Metadata (r:0 w:0) @@ -92,9 +105,9 @@ impl frame_system::WeightInfo for SubstrateWeight { /// The range of component `i` is `[0, 1000]`. fn kill_storage(i: u32) -> Weight { // Minimum execution time: 2_384 nanoseconds. - Weight::from_ref_time(2_644_000) + Weight::from_parts(2_644_000, 0) // Standard Error: 1_357 - .saturating_add(Weight::from_ref_time(664_809).saturating_mul(i.into())) + .saturating_add(Weight::from_parts(664_809, 0).saturating_mul(i.into())) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } // Storage: Skipped Metadata (r:0 w:0) @@ -102,10 +115,34 @@ impl frame_system::WeightInfo for SubstrateWeight { /// The range of component `p` is `[0, 1000]`. fn kill_prefix(p: u32) -> Weight { // Minimum execution time: 4_476 nanoseconds. - Weight::from_ref_time(4_787_000) + Weight::from_parts(4_787_000, 0) // Standard Error: 1_811 - .saturating_add(Weight::from_ref_time(1_200_907).saturating_mul(p.into())) + .saturating_add(Weight::from_parts(1_200_907, 0).saturating_mul(p.into())) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(p.into()))) } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 12_466_000 picoseconds. + Weight::from_parts(15_570_000, 0).saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `MultiBlockMigrations::Cursor` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `21` + // Estimated: `67035` + // Minimum execution time: 163_673_542_000 picoseconds. + Weight::from_parts(166_858_158_000, 67035) + .saturating_add(DbWeight::get().reads(2_u64)) + .saturating_add(DbWeight::get().writes(2_u64)) + } } diff --git a/pallets/weights/src/lib.rs b/pallets/weights/src/lib.rs index 3dfcd82030..634dd2e440 100644 --- a/pallets/weights/src/lib.rs +++ b/pallets/weights/src/lib.rs @@ -50,4 +50,6 @@ pub mod pallet_sto; pub mod pallet_timestamp; pub mod pallet_treasury; pub mod pallet_utility; +pub mod pallet_validators; pub mod polymesh_contracts; +pub mod polymesh_transaction_payment; diff --git a/pallets/weights/src/pallet_asset.rs b/pallets/weights/src/pallet_asset.rs index 9affe8717f..87869582b6 100644 --- a/pallets/weights/src/pallet_asset.rs +++ b/pallets/weights/src/pallet_asset.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_asset //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,158 +54,131 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Asset TickerConfig (r:1 w:0) - // Proof: Asset TickerConfig (max_values: Some(1), max_size: Some(10), added: 505, mode: MaxEncodedLen) + // Proof Skipped: Asset TickerConfig (max_values: Some(1), max_size: None, mode: Measured) // Storage: Asset TickerAssetId (r:1 w:0) - // Proof: Asset TickerAssetId (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + // Proof Skipped: Asset TickerAssetId (max_values: None, max_size: None, mode: Measured) // Storage: Asset UniqueTickerRegistration (r:1 w:1) - // Proof: Asset UniqueTickerRegistration (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + // Proof Skipped: Asset UniqueTickerRegistration (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Identity CurrentPayer (r:1 w:0) - // Proof: Identity CurrentPayer (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentPayer (max_values: Some(1), max_size: None, mode: Measured) // Storage: Asset TickersOwnedByUser (r:0 w:1) - // Proof: Asset TickersOwnedByUser (max_values: None, max_size: Some(61), added: 2536, mode: MaxEncodedLen) + // Proof Skipped: Asset TickersOwnedByUser (max_values: None, max_size: None, mode: Measured) fn register_unique_ticker() -> Weight { - // Minimum execution time: 63_726 nanoseconds. - Weight::from_ref_time(67_341_000) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 49_124 nanoseconds. + Weight::from_parts(52_329_000, 0) + .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity Authorizations (r:1 w:1) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity OutdatedAuthorizations (r:1 w:0) - // Proof: Identity OutdatedAuthorizations (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Identity OutdatedAuthorizations (max_values: None, max_size: None, mode: Measured) // Storage: Asset TickerAssetId (r:1 w:0) - // Proof: Asset TickerAssetId (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + // Proof Skipped: Asset TickerAssetId (max_values: None, max_size: None, mode: Measured) // Storage: Asset UniqueTickerRegistration (r:1 w:1) - // Proof: Asset UniqueTickerRegistration (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + // Proof Skipped: Asset UniqueTickerRegistration (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:1) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: Asset TickersOwnedByUser (r:0 w:2) - // Proof: Asset TickersOwnedByUser (max_values: None, max_size: Some(61), added: 2536, mode: MaxEncodedLen) + // Proof Skipped: Asset TickersOwnedByUser (max_values: None, max_size: None, mode: Measured) fn accept_ticker_transfer() -> Weight { - // Minimum execution time: 76_204 nanoseconds. - Weight::from_ref_time(87_151_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 61_791 nanoseconds. + Weight::from_parts(63_646_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(6)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity Authorizations (r:1 w:1) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity OutdatedAuthorizations (r:1 w:0) - // Proof: Identity OutdatedAuthorizations (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Identity OutdatedAuthorizations (max_values: None, max_size: None, mode: Measured) // Storage: Asset Assets (r:1 w:1) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Asset AssetIdTicker (r:1 w:0) - // Proof: Asset AssetIdTicker (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + // Proof Skipped: Asset AssetIdTicker (max_values: None, max_size: None, mode: Measured) // Storage: Asset UniqueTickerRegistration (r:1 w:1) - // Proof: Asset UniqueTickerRegistration (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + // Proof Skipped: Asset UniqueTickerRegistration (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:1) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: Asset TickersOwnedByUser (r:0 w:2) - // Proof: Asset TickersOwnedByUser (max_values: None, max_size: Some(61), added: 2536, mode: MaxEncodedLen) + // Proof Skipped: Asset TickersOwnedByUser (max_values: None, max_size: None, mode: Measured) // Storage: Asset SecurityTokensOwnedByUser (r:0 w:2) - // Proof: Asset SecurityTokensOwnedByUser (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Asset SecurityTokensOwnedByUser (max_values: None, max_size: None, mode: Measured) fn accept_asset_ownership_transfer() -> Weight { - // Minimum execution time: 98_809 nanoseconds. - Weight::from_ref_time(102_734_000) - .saturating_add(DbWeight::get().reads(14)) + // Minimum execution time: 89_264 nanoseconds. + Weight::from_parts(90_495_000, 0) + .saturating_add(DbWeight::get().reads(10)) .saturating_add(DbWeight::get().writes(9)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System BlockHash (r:1 w:0) // Proof: System BlockHash (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) // Storage: Asset AssetNonce (r:1 w:1) - // Proof: Asset AssetNonce (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Asset AssetNonce (max_values: None, max_size: None, mode: Measured) // Storage: Asset Assets (r:1 w:1) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) + // Storage: Portfolio PortfolioCustodian (r:1 w:0) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Identity CurrentPayer (r:1 w:0) - // Proof: Identity CurrentPayer (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentPayer (max_values: Some(1), max_size: None, mode: Measured) // Storage: ExternalAgents NumFullAgents (r:1 w:1) - // Proof: ExternalAgents NumFullAgents (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents NumFullAgents (max_values: None, max_size: None, mode: Measured) // Storage: Asset FundingRound (r:0 w:1) // Proof Skipped: Asset FundingRound (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetNames (r:0 w:1) // Proof Skipped: Asset AssetNames (max_values: None, max_size: None, mode: Measured) // Storage: Asset SecurityTokensOwnedByUser (r:0 w:1) - // Proof: Asset SecurityTokensOwnedByUser (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Asset SecurityTokensOwnedByUser (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetIdentifiers (r:0 w:1) // Proof Skipped: Asset AssetIdentifiers (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents AgentOf (r:0 w:1) - // Proof: ExternalAgents AgentOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents AgentOf (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:0 w:1) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[1, 128]`. /// The range of component `i` is `[1, 512]`. /// The range of component `f` is `[1, 128]`. fn create_asset(n: u32, i: u32, f: u32) -> Weight { - // Minimum execution time: 90_306 nanoseconds. - Weight::from_ref_time(97_355_043) - // Standard Error: 11_077 - .saturating_add(Weight::from_ref_time(1_694).saturating_mul(n.into())) - // Standard Error: 2_763 - .saturating_add(Weight::from_ref_time(81_643).saturating_mul(i.into())) - // Standard Error: 11_077 - .saturating_add(Weight::from_ref_time(4_720).saturating_mul(f.into())) - .saturating_add(DbWeight::get().reads(12)) + // Minimum execution time: 79_620 nanoseconds. + Weight::from_parts(84_893_228, 0) + .saturating_add(Weight::from_parts(20_181, 0).saturating_mul(n.into())) + // Standard Error: 2_282 + .saturating_add(Weight::from_parts(66_647, 0).saturating_mul(i.into())) + // Standard Error: 9_149 + .saturating_add(Weight::from_parts(13_187, 0).saturating_mul(f.into())) + .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().writes(9)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -213,23 +186,17 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset Assets (r:1 w:0) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: Asset Frozen (r:1 w:1) - // Proof: Asset Frozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Asset Frozen (max_values: None, max_size: None, mode: Measured) fn freeze() -> Weight { - // Minimum execution time: 56_755 nanoseconds. - Weight::from_ref_time(60_942_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 40_401 nanoseconds. + Weight::from_parts(41_663_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -237,25 +204,19 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset Assets (r:1 w:0) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: Asset Frozen (r:1 w:1) - // Proof: Asset Frozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Asset Frozen (max_values: None, max_size: None, mode: Measured) fn unfreeze() -> Weight { - // Minimum execution time: 55_072 nanoseconds. - Weight::from_ref_time(58_598_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 41_673 nanoseconds. + Weight::from_parts(45_007_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Asset Assets (r:1 w:0) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -264,23 +225,17 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Proof Skipped: Asset AssetNames (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[1, 128]`. fn rename_asset(n: u32) -> Weight { - // Minimum execution time: 51_837 nanoseconds. - Weight::from_ref_time(59_367_944) + // Minimum execution time: 35_943 nanoseconds. + Weight::from_parts(40_348_962, 0) // Standard Error: 5_348 - .saturating_add(Weight::from_ref_time(8_093).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(9)) + .saturating_add(Weight::from_parts(8_093, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -290,41 +245,35 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset Assets (r:1 w:1) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Asset BalanceOf (r:1 w:1) - // Proof: Asset BalanceOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + // Proof Skipped: Asset BalanceOf (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint CachedNextCheckpoints (r:1 w:0) // Proof Skipped: Checkpoint CachedNextCheckpoints (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint CheckpointIdSequence (r:1 w:0) - // Proof: Checkpoint CheckpointIdSequence (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint CheckpointIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetBalances (r:1 w:1) - // Proof: Portfolio PortfolioAssetBalances (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetBalances (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetCount (r:1 w:1) - // Proof: Portfolio PortfolioAssetCount (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetCount (max_values: None, max_size: None, mode: Measured) // Storage: Statistics ActiveAssetStats (r:1 w:0) - // Proof: Statistics ActiveAssetStats (max_values: None, max_size: Some(423), added: 2898, mode: MaxEncodedLen) + // Proof Skipped: Statistics ActiveAssetStats (max_values: None, max_size: None, mode: Measured) // Storage: Asset FundingRound (r:1 w:0) // Proof Skipped: Asset FundingRound (max_values: None, max_size: None, mode: Measured) // Storage: Asset IssuedInFundingRound (r:1 w:1) // Proof Skipped: Asset IssuedInFundingRound (max_values: None, max_size: None, mode: Measured) fn issue() -> Weight { - // Minimum execution time: 103_145 nanoseconds. - Weight::from_ref_time(108_733_000) - .saturating_add(DbWeight::get().reads(20)) + // Minimum execution time: 86_960 nanoseconds. + Weight::from_parts(97_256_000, 0) + .saturating_add(DbWeight::get().reads(16)) .saturating_add(DbWeight::get().writes(5)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -332,37 +281,31 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Portfolio Portfolios (r:1 w:0) // Proof Skipped: Portfolio Portfolios (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:1 w:0) - // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) // Storage: Asset Assets (r:1 w:1) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetBalances (r:1 w:1) - // Proof: Portfolio PortfolioAssetBalances (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetBalances (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedAssets (r:1 w:0) - // Proof: Portfolio PortfolioLockedAssets (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedAssets (max_values: None, max_size: None, mode: Measured) // Storage: Asset BalanceOf (r:1 w:1) - // Proof: Asset BalanceOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + // Proof Skipped: Asset BalanceOf (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint CachedNextCheckpoints (r:1 w:0) // Proof Skipped: Checkpoint CachedNextCheckpoints (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint CheckpointIdSequence (r:1 w:0) - // Proof: Checkpoint CheckpointIdSequence (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint CheckpointIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: Statistics ActiveAssetStats (r:1 w:0) - // Proof: Statistics ActiveAssetStats (max_values: None, max_size: Some(423), added: 2898, mode: MaxEncodedLen) + // Proof Skipped: Statistics ActiveAssetStats (max_values: None, max_size: None, mode: Measured) fn redeem() -> Weight { - // Minimum execution time: 92_739 nanoseconds. - Weight::from_ref_time(95_493_000) - .saturating_add(DbWeight::get().reads(17)) + // Minimum execution time: 77_997 nanoseconds. + Weight::from_parts(79_950_000, 0) + .saturating_add(DbWeight::get().reads(13)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -370,53 +313,41 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset Assets (r:1 w:1) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) fn make_divisible() -> Weight { - // Minimum execution time: 51_687 nanoseconds. - Weight::from_ref_time(54_251_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 36_563 nanoseconds. + Weight::from_parts(37_907_000, 0) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Asset AssetDocumentsIdSequence (r:1 w:1) - // Proof: Asset AssetDocumentsIdSequence (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Asset AssetDocumentsIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetDocuments (r:0 w:64) // Proof Skipped: Asset AssetDocuments (max_values: None, max_size: None, mode: Measured) /// The range of component `d` is `[1, 64]`. fn add_documents(d: u32) -> Weight { - // Minimum execution time: 65_490 nanoseconds. - Weight::from_ref_time(66_672_016) - // Standard Error: 40_736 - .saturating_add(Weight::from_ref_time(11_127_312).saturating_mul(d.into())) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 49_905 nanoseconds. + Weight::from_parts(44_909_679, 0) + // Standard Error: 34_183 + .saturating_add(Weight::from_parts(11_133_100, 0).saturating_mul(d.into())) + .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(1)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(d.into()))) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -425,23 +356,17 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Proof Skipped: Asset AssetDocuments (max_values: None, max_size: None, mode: Measured) /// The range of component `d` is `[1, 64]`. fn remove_documents(d: u32) -> Weight { - // Minimum execution time: 38_247 nanoseconds. - Weight::from_ref_time(41_300_548) - // Standard Error: 23_228 - .saturating_add(Weight::from_ref_time(6_206_348).saturating_mul(d.into())) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 22_182 nanoseconds. + Weight::from_parts(21_595_029, 0) + // Standard Error: 21_140 + .saturating_add(Weight::from_parts(6_496_860, 0).saturating_mul(d.into())) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(d.into()))) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -450,23 +375,17 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Proof Skipped: Asset FundingRound (max_values: None, max_size: None, mode: Measured) /// The range of component `f` is `[1, 128]`. fn set_funding_round(f: u32) -> Weight { - // Minimum execution time: 46_250 nanoseconds. - Weight::from_ref_time(53_301_698) + // Minimum execution time: 30_045 nanoseconds. + Weight::from_parts(34_308_258, 0) // Standard Error: 3_823 - .saturating_add(Weight::from_ref_time(5_302).saturating_mul(f.into())) - .saturating_add(DbWeight::get().reads(8)) + .saturating_add(Weight::from_parts(5_302, 0).saturating_mul(f.into())) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -475,23 +394,17 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Proof Skipped: Asset AssetIdentifiers (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[1, 512]`. fn update_identifiers(i: u32) -> Weight { - // Minimum execution time: 48_783 nanoseconds. - Weight::from_ref_time(54_715_281) - // Standard Error: 2_741 - .saturating_add(Weight::from_ref_time(59_353).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 31_056 nanoseconds. + Weight::from_parts(34_256_155, 0) + // Standard Error: 2_248 + .saturating_add(Weight::from_parts(59_751, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -499,58 +412,46 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset Assets (r:1 w:0) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: Asset BalanceOf (r:2 w:2) - // Proof: Asset BalanceOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + // Proof Skipped: Asset BalanceOf (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetBalances (r:2 w:2) - // Proof: Portfolio PortfolioAssetBalances (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetBalances (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedAssets (r:1 w:0) - // Proof: Portfolio PortfolioLockedAssets (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedAssets (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint CachedNextCheckpoints (r:1 w:0) // Proof Skipped: Checkpoint CachedNextCheckpoints (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint CheckpointIdSequence (r:1 w:0) - // Proof: Checkpoint CheckpointIdSequence (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint CheckpointIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetCount (r:1 w:1) - // Proof: Portfolio PortfolioAssetCount (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetCount (max_values: None, max_size: None, mode: Measured) // Storage: Statistics ActiveAssetStats (r:1 w:0) - // Proof: Statistics ActiveAssetStats (max_values: None, max_size: Some(423), added: 2898, mode: MaxEncodedLen) + // Proof Skipped: Statistics ActiveAssetStats (max_values: None, max_size: None, mode: Measured) fn controller_transfer() -> Weight { - // Minimum execution time: 130_507 nanoseconds. - Weight::from_ref_time(170_727_000) - .saturating_add(DbWeight::get().reads(18)) + // Minimum execution time: 94_831 nanoseconds. + Weight::from_parts(97_556_000, 0) + .saturating_add(DbWeight::get().reads(14)) .saturating_add(DbWeight::get().writes(5)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Asset CustomTypesInverse (r:1 w:1) // Proof Skipped: Asset CustomTypesInverse (max_values: None, max_size: None, mode: Measured) // Storage: Asset CustomTypeIdSequence (r:1 w:1) - // Proof: Asset CustomTypeIdSequence (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Proof Skipped: Asset CustomTypeIdSequence (max_values: Some(1), max_size: None, mode: Measured) // Storage: Asset CustomTypes (r:0 w:1) // Proof Skipped: Asset CustomTypes (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[1, 2048]`. fn register_custom_asset_type(n: u32) -> Weight { - // Minimum execution time: 45_658 nanoseconds. - Weight::from_ref_time(51_602_738) - // Standard Error: 702 - .saturating_add(Weight::from_ref_time(7_076).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(7)) + // Minimum execution time: 30_265 nanoseconds. + Weight::from_parts(32_957_363, 0) + // Standard Error: 406 + .saturating_add(Weight::from_parts(6_526, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -558,25 +459,19 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset AssetMetadataGlobalKeyToName (r:1 w:0) // Proof Skipped: Asset AssetMetadataGlobalKeyToName (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataValueDetails (r:1 w:1) - // Proof: Asset AssetMetadataValueDetails (max_values: None, max_size: Some(67), added: 2542, mode: MaxEncodedLen) + // Proof Skipped: Asset AssetMetadataValueDetails (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataValues (r:0 w:1) // Proof Skipped: Asset AssetMetadataValues (max_values: None, max_size: None, mode: Measured) fn set_asset_metadata() -> Weight { - // Minimum execution time: 70_646 nanoseconds. - Weight::from_ref_time(76_696_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 55_263 nanoseconds. + Weight::from_parts(57_176_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -584,23 +479,19 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset AssetMetadataGlobalKeyToName (r:1 w:0) // Proof Skipped: Asset AssetMetadataGlobalKeyToName (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataValueDetails (r:1 w:1) - // Proof: Asset AssetMetadataValueDetails (max_values: None, max_size: Some(67), added: 2542, mode: MaxEncodedLen) + // Proof Skipped: Asset AssetMetadataValueDetails (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) fn set_asset_metadata_details() -> Weight { - // Minimum execution time: 62_383 nanoseconds. - Weight::from_ref_time(70_946_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 48_102 nanoseconds. + Weight::from_parts(52_127_000, 0) + .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -608,9 +499,9 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset AssetMetadataLocalNameToKey (r:1 w:1) // Proof Skipped: Asset AssetMetadataLocalNameToKey (max_values: None, max_size: None, mode: Measured) // Storage: Asset CurrentAssetMetadataLocalKey (r:1 w:1) - // Proof: Asset CurrentAssetMetadataLocalKey (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Asset CurrentAssetMetadataLocalKey (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataValueDetails (r:1 w:1) - // Proof: Asset AssetMetadataValueDetails (max_values: None, max_size: Some(67), added: 2542, mode: MaxEncodedLen) + // Proof Skipped: Asset AssetMetadataValueDetails (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataValues (r:0 w:1) // Proof Skipped: Asset AssetMetadataValues (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataLocalKeyToName (r:0 w:1) @@ -618,21 +509,15 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset AssetMetadataLocalSpecs (r:0 w:1) // Proof Skipped: Asset AssetMetadataLocalSpecs (max_values: None, max_size: None, mode: Measured) fn register_and_set_local_asset_metadata() -> Weight { - // Minimum execution time: 100_911 nanoseconds. - Weight::from_ref_time(108_373_000) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 82_333 nanoseconds. + Weight::from_parts(86_209_000, 0) + .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(6)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -640,63 +525,51 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset AssetMetadataLocalNameToKey (r:1 w:1) // Proof Skipped: Asset AssetMetadataLocalNameToKey (max_values: None, max_size: None, mode: Measured) // Storage: Asset CurrentAssetMetadataLocalKey (r:1 w:1) - // Proof: Asset CurrentAssetMetadataLocalKey (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Asset CurrentAssetMetadataLocalKey (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataLocalKeyToName (r:0 w:1) // Proof Skipped: Asset AssetMetadataLocalKeyToName (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataLocalSpecs (r:0 w:1) // Proof Skipped: Asset AssetMetadataLocalSpecs (max_values: None, max_size: None, mode: Measured) fn register_asset_metadata_local_type() -> Weight { - // Minimum execution time: 75_253 nanoseconds. - Weight::from_ref_time(81_022_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 60_210 nanoseconds. + Weight::from_parts(61_893_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(4)) } // Storage: Asset AssetMetadataGlobalNameToKey (r:1 w:1) // Proof Skipped: Asset AssetMetadataGlobalNameToKey (max_values: None, max_size: None, mode: Measured) // Storage: Asset CurrentAssetMetadataGlobalKey (r:1 w:1) - // Proof: Asset CurrentAssetMetadataGlobalKey (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Asset CurrentAssetMetadataGlobalKey (max_values: Some(1), max_size: None, mode: Measured) // Storage: Asset AssetMetadataGlobalKeyToName (r:0 w:1) // Proof Skipped: Asset AssetMetadataGlobalKeyToName (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataGlobalSpecs (r:0 w:1) // Proof Skipped: Asset AssetMetadataGlobalSpecs (max_values: None, max_size: None, mode: Measured) fn register_asset_metadata_global_type() -> Weight { - // Minimum execution time: 34_301 nanoseconds. - Weight::from_ref_time(38_698_000) + // Minimum execution time: 35_473 nanoseconds. + Weight::from_parts(41_562_000, 0) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(4)) } // Storage: Asset Assets (r:1 w:1) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) fn update_asset_type() -> Weight { - // Minimum execution time: 53_871 nanoseconds. - Weight::from_ref_time(58_538_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 36_665 nanoseconds. + Weight::from_parts(43_065_000, 0) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -704,11 +577,11 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset AssetMetadataLocalKeyToName (r:1 w:1) // Proof Skipped: Asset AssetMetadataLocalKeyToName (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataValueDetails (r:1 w:1) - // Proof: Asset AssetMetadataValueDetails (max_values: None, max_size: Some(67), added: 2542, mode: MaxEncodedLen) - // Storage: Nft CollectionAsset (r:1 w:0) - // Proof: Nft CollectionAsset (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - // Storage: Nft CollectionKeys (r:1 w:0) - // Proof Skipped: Nft CollectionKeys (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Asset AssetMetadataValueDetails (max_values: None, max_size: None, mode: Measured) + // Storage: NFT CollectionAsset (r:1 w:0) + // Proof Skipped: NFT CollectionAsset (max_values: None, max_size: None, mode: Measured) + // Storage: NFT CollectionKeys (r:1 w:0) + // Proof Skipped: NFT CollectionKeys (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataValues (r:0 w:1) // Proof Skipped: Asset AssetMetadataValues (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataLocalNameToKey (r:0 w:1) @@ -716,21 +589,15 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset AssetMetadataLocalSpecs (r:0 w:1) // Proof Skipped: Asset AssetMetadataLocalSpecs (max_values: None, max_size: None, mode: Measured) fn remove_local_metadata_key() -> Weight { - // Minimum execution time: 78_718 nanoseconds. - Weight::from_ref_time(83_675_000) - .saturating_add(DbWeight::get().reads(12)) + // Minimum execution time: 65_649 nanoseconds. + Weight::from_parts(66_860_000, 0) + .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(5)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -738,197 +605,163 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset AssetMetadataLocalKeyToName (r:1 w:0) // Proof Skipped: Asset AssetMetadataLocalKeyToName (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataValueDetails (r:1 w:1) - // Proof: Asset AssetMetadataValueDetails (max_values: None, max_size: Some(67), added: 2542, mode: MaxEncodedLen) + // Proof Skipped: Asset AssetMetadataValueDetails (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataValues (r:0 w:1) // Proof Skipped: Asset AssetMetadataValues (max_values: None, max_size: None, mode: Measured) fn remove_metadata_value() -> Weight { - // Minimum execution time: 59_940 nanoseconds. - Weight::from_ref_time(62_985_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 45_568 nanoseconds. + Weight::from_parts(46_749_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Asset Assets (r:1 w:0) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: Asset BalanceOf (r:2 w:2) - // Proof: Asset BalanceOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + // Proof Skipped: Asset BalanceOf (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio Portfolios (r:2 w:0) // Proof Skipped: Portfolio Portfolios (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetBalances (r:2 w:2) - // Proof: Portfolio PortfolioAssetBalances (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetBalances (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedAssets (r:1 w:0) - // Proof: Portfolio PortfolioLockedAssets (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedAssets (max_values: None, max_size: None, mode: Measured) // Storage: Asset Frozen (r:1 w:0) - // Proof: Asset Frozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Asset Frozen (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity Claims (r:4 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetTransferCompliances (r:1 w:0) - // Proof: Statistics AssetTransferCompliances (max_values: None, max_size: Some(246), added: 2721, mode: MaxEncodedLen) + // Proof Skipped: Statistics AssetTransferCompliances (max_values: None, max_size: None, mode: Measured) // Storage: ComplianceManager AssetCompliances (r:1 w:0) // Proof Skipped: ComplianceManager AssetCompliances (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint CachedNextCheckpoints (r:1 w:0) // Proof Skipped: Checkpoint CachedNextCheckpoints (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint CheckpointIdSequence (r:1 w:0) - // Proof: Checkpoint CheckpointIdSequence (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint CheckpointIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetCount (r:1 w:1) - // Proof: Portfolio PortfolioAssetCount (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetCount (max_values: None, max_size: None, mode: Measured) // Storage: Statistics ActiveAssetStats (r:1 w:0) - // Proof: Statistics ActiveAssetStats (max_values: None, max_size: Some(423), added: 2898, mode: MaxEncodedLen) + // Proof Skipped: Statistics ActiveAssetStats (max_values: None, max_size: None, mode: Measured) fn base_transfer() -> Weight { - // Minimum execution time: 161_463 nanoseconds. - Weight::from_ref_time(173_099_000) + // Minimum execution time: 164_396 nanoseconds. + Weight::from_parts(168_101_000, 0) .saturating_add(DbWeight::get().reads(21)) .saturating_add(DbWeight::get().writes(5)) } // Storage: Asset AssetsExemptFromAffirmation (r:0 w:1) - // Proof: Asset AssetsExemptFromAffirmation (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Asset AssetsExemptFromAffirmation (max_values: None, max_size: None, mode: Measured) fn exempt_asset_affirmation() -> Weight { - // Minimum execution time: 11_076 nanoseconds. - Weight::from_ref_time(12_279_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 13_289 nanoseconds. + Weight::from_parts(16_024_000, 0).saturating_add(DbWeight::get().writes(1)) } // Storage: Asset AssetsExemptFromAffirmation (r:0 w:1) - // Proof: Asset AssetsExemptFromAffirmation (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Asset AssetsExemptFromAffirmation (max_values: None, max_size: None, mode: Measured) fn remove_asset_affirmation_exemption() -> Weight { - // Minimum execution time: 11_106 nanoseconds. - Weight::from_ref_time(11_667_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 13_811 nanoseconds. + Weight::from_parts(14_711_000, 0).saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Asset PreApprovedAsset (r:0 w:1) - // Proof: Asset PreApprovedAsset (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Asset PreApprovedAsset (max_values: None, max_size: None, mode: Measured) fn pre_approve_asset() -> Weight { - // Minimum execution time: 35_714 nanoseconds. - Weight::from_ref_time(37_156_000) - .saturating_add(DbWeight::get().reads(5)) + // Minimum execution time: 20_762 nanoseconds. + Weight::from_parts(22_614_000, 0) + .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Asset PreApprovedAsset (r:0 w:1) - // Proof: Asset PreApprovedAsset (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Asset PreApprovedAsset (max_values: None, max_size: None, mode: Measured) fn remove_asset_pre_approval() -> Weight { - // Minimum execution time: 35_304 nanoseconds. - Weight::from_ref_time(39_419_000) - .saturating_add(DbWeight::get().reads(5)) + // Minimum execution time: 21_572 nanoseconds. + Weight::from_parts(23_626_000, 0) + .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Asset MandatoryMediators (r:1 w:1) - // Proof: Asset MandatoryMediators (max_values: None, max_size: Some(161), added: 2636, mode: MaxEncodedLen) + // Proof Skipped: Asset MandatoryMediators (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[1, 4]`. fn add_mandatory_mediators(n: u32) -> Weight { - // Minimum execution time: 50_326 nanoseconds. - Weight::from_ref_time(56_082_500) - // Standard Error: 232_681 - .saturating_add(Weight::from_ref_time(421_968).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 33_950 nanoseconds. + Weight::from_parts(37_383_822, 0) + // Standard Error: 148_326 + .saturating_add(Weight::from_parts(584_842, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Asset MandatoryMediators (r:1 w:1) - // Proof: Asset MandatoryMediators (max_values: None, max_size: Some(161), added: 2636, mode: MaxEncodedLen) + // Proof Skipped: Asset MandatoryMediators (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[1, 4]`. fn remove_mandatory_mediators(n: u32) -> Weight { - // Minimum execution time: 51_087 nanoseconds. - Weight::from_ref_time(56_207_675) - // Standard Error: 227_232 - .saturating_add(Weight::from_ref_time(585_583).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 35_053 nanoseconds. + Weight::from_parts(39_197_078, 0) + // Standard Error: 113_163 + .saturating_add(Weight::from_parts(169_623, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Asset UniqueTickerRegistration (r:1 w:1) - // Proof: Asset UniqueTickerRegistration (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + // Proof Skipped: Asset UniqueTickerRegistration (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Asset TickerAssetId (r:1 w:1) - // Proof: Asset TickerAssetId (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + // Proof Skipped: Asset TickerAssetId (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetIdTicker (r:1 w:1) - // Proof: Asset AssetIdTicker (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + // Proof Skipped: Asset AssetIdTicker (max_values: None, max_size: None, mode: Measured) fn link_ticker_to_asset_id() -> Weight { - // Minimum execution time: 64_497 nanoseconds. - Weight::from_ref_time(65_049_000) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 50_786 nanoseconds. + Weight::from_parts(55_283_000, 0) + .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Asset UniqueTickerRegistration (r:1 w:1) - // Proof: Asset UniqueTickerRegistration (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + // Proof Skipped: Asset UniqueTickerRegistration (max_values: None, max_size: None, mode: Measured) // Storage: Asset TickerAssetId (r:1 w:1) - // Proof: Asset TickerAssetId (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + // Proof Skipped: Asset TickerAssetId (max_values: None, max_size: None, mode: Measured) // Storage: Asset TickersOwnedByUser (r:0 w:1) - // Proof: Asset TickersOwnedByUser (max_values: None, max_size: Some(61), added: 2536, mode: MaxEncodedLen) + // Proof Skipped: Asset TickersOwnedByUser (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetIdTicker (r:0 w:1) - // Proof: Asset AssetIdTicker (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + // Proof Skipped: Asset AssetIdTicker (max_values: None, max_size: None, mode: Measured) fn unlink_ticker_from_asset_id() -> Weight { - // Minimum execution time: 65_029 nanoseconds. - Weight::from_ref_time(75_212_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 49_083 nanoseconds. + Weight::from_parts(52_949_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(4)) } // Storage: Asset AssetMetadataGlobalNameToKey (r:1 w:0) @@ -936,8 +769,8 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Storage: Asset AssetMetadataGlobalSpecs (r:1 w:1) // Proof Skipped: Asset AssetMetadataGlobalSpecs (max_values: None, max_size: None, mode: Measured) fn update_global_metadata_spec() -> Weight { - // Minimum execution time: 40_751 nanoseconds. - Weight::from_ref_time(44_277_000) + // Minimum execution time: 40_469 nanoseconds. + Weight::from_parts(40_786_000, 0) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } @@ -951,7 +784,7 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) fn transfer_asset_base_weight() -> Weight { // Minimum execution time: 28_885 nanoseconds. - Weight::from_ref_time(30_178_000).saturating_add(DbWeight::get().reads(6)) + Weight::from_parts(30_178_000, 0).saturating_add(DbWeight::get().reads(6)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) @@ -963,6 +796,6 @@ impl pallet_asset::WeightInfo for SubstrateWeight { // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) fn receiver_affirm_asset_transfer_base_weight() -> Weight { // Minimum execution time: 24_004 nanoseconds. - Weight::from_ref_time(26_399_000).saturating_add(DbWeight::get().reads(5)) + Weight::from_parts(26_399_000, 0).saturating_add(DbWeight::get().reads(5)) } } diff --git a/pallets/weights/src/pallet_babe.rs b/pallets/weights/src/pallet_babe.rs index 172aa34218..59a12c6b4d 100644 --- a/pallets/weights/src/pallet_babe.rs +++ b/pallets/weights/src/pallet_babe.rs @@ -1,13 +1,13 @@ // This file is part of Substrate. -// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, @@ -21,39 +21,34 @@ use polymesh_primitives::{ RocksDbWeight as DbWeight, Weight, WEIGHT_REF_TIME_PER_MICROS, WEIGHT_REF_TIME_PER_NANOS, }; - /// Weights for pallet_babe using the Substrate node and recommended hardware. pub struct SubstrateWeight; impl pallet_babe::WeightInfo for SubstrateWeight { fn plan_config_change() -> Weight { - Weight::zero() + DbWeight::get().writes(1) } - // WARNING! Some components were not used: ["x"] - fn report_equivocation(validator_count: u32) -> Weight { + fn report_equivocation(validator_count: u32, max_nominators_per_validator: u32) -> Weight { // we take the validator set count from the membership proof to // calculate the weight but we set a floor of 100 validators. let validator_count = validator_count.max(100) as u64; - // worst case we are considering is that the given offender - // is backed by 200 nominators - const MAX_NOMINATORS: u64 = 200; - // checking membership proof - Weight::from_ref_time(35u64 * WEIGHT_REF_TIME_PER_MICROS) + Weight::from_parts(35u64 * WEIGHT_REF_TIME_PER_MICROS, 0) .saturating_add( - Weight::from_ref_time(175u64 * WEIGHT_REF_TIME_PER_NANOS) + Weight::from_parts(175u64 * WEIGHT_REF_TIME_PER_NANOS, 0) .saturating_mul(validator_count), ) .saturating_add(DbWeight::get().reads(5)) // check equivocation proof - .saturating_add(Weight::from_ref_time(110u64 * WEIGHT_REF_TIME_PER_MICROS)) + .saturating_add(Weight::from_parts(110u64 * WEIGHT_REF_TIME_PER_MICROS, 0)) // report offence - .saturating_add(Weight::from_ref_time(110u64 * WEIGHT_REF_TIME_PER_MICROS)) - .saturating_add(Weight::from_ref_time( - 25u64 * WEIGHT_REF_TIME_PER_MICROS * MAX_NOMINATORS, + .saturating_add(Weight::from_parts(110u64 * WEIGHT_REF_TIME_PER_MICROS, 0)) + .saturating_add(Weight::from_parts( + 25u64 * WEIGHT_REF_TIME_PER_MICROS * max_nominators_per_validator as u64, + 0, )) - .saturating_add(DbWeight::get().reads(14 + 3 * MAX_NOMINATORS)) - .saturating_add(DbWeight::get().writes(10 + 3 * MAX_NOMINATORS)) + .saturating_add(DbWeight::get().reads(14 + 3 * max_nominators_per_validator as u64)) + .saturating_add(DbWeight::get().writes(10 + 3 * max_nominators_per_validator as u64)) } } diff --git a/pallets/weights/src/pallet_balances.rs b/pallets/weights/src/pallet_balances.rs index b1d82a82c9..9fcfc2ce5b 100644 --- a/pallets/weights/src/pallet_balances.rs +++ b/pallets/weights/src/pallet_balances.rs @@ -53,76 +53,117 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; /// Weights for pallet_balances using the Substrate node and recommended hardware. pub struct SubstrateWeight; impl pallet_balances::WeightInfo for SubstrateWeight { - // Storage: System Account (r:2 w:2) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - // Storage: Identity KeyRecords (r:2 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - fn transfer() -> Weight { - // Minimum execution time: 41_953 nanoseconds. - Weight::from_ref_time(45_729_000) - .saturating_add(DbWeight::get().reads(4)) - .saturating_add(DbWeight::get().writes(2)) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn transfer_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 58_474_000 picoseconds. + Weight::from_parts(59_117_000, 3593) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) } - // Storage: System Account (r:2 w:2) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - // Storage: Identity KeyRecords (r:2 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - fn transfer_with_memo() -> Weight { - // Minimum execution time: 42_414 nanoseconds. - Weight::from_ref_time(43_586_000) - .saturating_add(DbWeight::get().reads(4)) - .saturating_add(DbWeight::get().writes(2)) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn transfer_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 44_629_000 picoseconds. + Weight::from_parts(45_798_000, 3593) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) } - // Storage: Identity KeyRecords (r:2 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:2 w:2) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - fn deposit_block_reward_reserve_balance() -> Weight { - // Minimum execution time: 60_511 nanoseconds. - Weight::from_ref_time(64_106_000) - .saturating_add(DbWeight::get().reads(8)) - .saturating_add(DbWeight::get().writes(2)) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn force_set_balance_creating() -> Weight { + // Proof Size summary in bytes: + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 16_483_000 picoseconds. + Weight::from_parts(16_939_000, 3593) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) } - // Storage: System Account (r:2 w:2) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - fn set_balance() -> Weight { - // Minimum execution time: 48_843 nanoseconds. - Weight::from_ref_time(50_946_000) - .saturating_add(DbWeight::get().reads(3)) - .saturating_add(DbWeight::get().writes(2)) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn force_set_balance_killing() -> Weight { + // Proof Size summary in bytes: + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 24_638_000 picoseconds. + Weight::from_parts(25_487_000, 3593) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) } - // Storage: System Account (r:2 w:2) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - // Storage: Identity KeyRecords (r:2 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn force_transfer() -> Weight { - // Minimum execution time: 33_280 nanoseconds. - Weight::from_ref_time(36_064_000) - .saturating_add(DbWeight::get().reads(4)) - .saturating_add(DbWeight::get().writes(2)) + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `6196` + // Minimum execution time: 60_041_000 picoseconds. + Weight::from_parts(63_365_000, 6196) + .saturating_add(DbWeight::get().reads(2_u64)) + .saturating_add(DbWeight::get().writes(2_u64)) } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:1) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - fn burn_account_balance() -> Weight { - // Minimum execution time: 44_236 nanoseconds. - Weight::from_ref_time(45_638_000) - .saturating_add(DbWeight::get().reads(6)) - .saturating_add(DbWeight::get().writes(1)) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn transfer_all() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 54_445_000 picoseconds. + Weight::from_parts(55_623_000, 3593) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn force_unreserve() -> Weight { + // Proof Size summary in bytes: + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 19_309_000 picoseconds. + Weight::from_parts(19_953_000, 3593) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `System::Account` (r:999 w:999) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(u: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (135 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 19_362_000 picoseconds. + Weight::from_parts(19_612_000, 990) + // Standard Error: 13_108 + .saturating_add(Weight::from_parts(16_444_591, 0).saturating_mul(u.into())) + .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + } + fn force_adjust_total_issuance() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 5_096_000 picoseconds. + Weight::from_parts(5_351_000, 0) + } + fn burn_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 29_641_000 picoseconds. + Weight::from_parts(30_219_000, 0) + } + fn burn_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 20_462_000 picoseconds. + Weight::from_parts(20_720_000, 0) } } diff --git a/pallets/weights/src/pallet_capital_distribution.rs b/pallets/weights/src/pallet_capital_distribution.rs index bfea6bff88..9c59c05c2f 100644 --- a/pallets/weights/src/pallet_capital_distribution.rs +++ b/pallets/weights/src/pallet_capital_distribution.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_capital_distribution //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,23 +54,17 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_corporate_actions::distribution::WeightInfo for SubstrateWeight { // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: CapitalDistribution Distributions (r:1 w:1) - // Proof: CapitalDistribution Distributions (max_values: None, max_size: Some(159), added: 2634, mode: MaxEncodedLen) + // Proof Skipped: CapitalDistribution Distributions (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:1 w:0) - // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio Portfolios (r:1 w:0) // Proof Skipped: Portfolio Portfolios (max_values: None, max_size: None, mode: Measured) // Storage: CorporateAction CorporateActions (r:1 w:0) @@ -78,169 +72,161 @@ impl pallet_corporate_actions::distribution::WeightInfo for SubstrateWeight { // Storage: Asset Assets (r:1 w:0) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetBalances (r:1 w:0) - // Proof: Portfolio PortfolioAssetBalances (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetBalances (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedAssets (r:1 w:1) - // Proof: Portfolio PortfolioLockedAssets (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedAssets (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) fn distribute() -> Weight { - // Minimum execution time: 100_781 nanoseconds. - Weight::from_ref_time(110_085_000) - .saturating_add(DbWeight::get().reads(17)) + // Minimum execution time: 81_412 nanoseconds. + Weight::from_parts(91_938_000, 0) + .saturating_add(DbWeight::get().reads(13)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:4 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: CapitalDistribution HolderPaid (r:1 w:1) - // Proof: CapitalDistribution HolderPaid (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + // Proof Skipped: CapitalDistribution HolderPaid (max_values: None, max_size: None, mode: Measured) // Storage: CapitalDistribution Distributions (r:1 w:1) - // Proof: CapitalDistribution Distributions (max_values: None, max_size: Some(159), added: 2634, mode: MaxEncodedLen) + // Proof Skipped: CapitalDistribution Distributions (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: CorporateAction CorporateActions (r:1 w:0) // Proof Skipped: CorporateAction CorporateActions (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint SchedulePoints (r:1 w:0) // Proof Skipped: Checkpoint SchedulePoints (max_values: None, max_size: None, mode: Measured) // Storage: Asset BalanceOf (r:3 w:2) - // Proof: Asset BalanceOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + // Proof Skipped: Asset BalanceOf (max_values: None, max_size: None, mode: Measured) // Storage: Asset Assets (r:1 w:0) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedAssets (r:1 w:1) - // Proof: Portfolio PortfolioLockedAssets (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedAssets (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio Portfolios (r:1 w:0) // Proof Skipped: Portfolio Portfolios (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetBalances (r:2 w:2) - // Proof: Portfolio PortfolioAssetBalances (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetBalances (max_values: None, max_size: None, mode: Measured) // Storage: Asset Frozen (r:1 w:0) - // Proof: Asset Frozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Asset Frozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:4 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetTransferCompliances (r:1 w:0) - // Proof: Statistics AssetTransferCompliances (max_values: None, max_size: Some(246), added: 2721, mode: MaxEncodedLen) + // Proof Skipped: Statistics AssetTransferCompliances (max_values: None, max_size: None, mode: Measured) // Storage: ComplianceManager AssetCompliances (r:1 w:0) // Proof Skipped: ComplianceManager AssetCompliances (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint CachedNextCheckpoints (r:1 w:0) // Proof Skipped: Checkpoint CachedNextCheckpoints (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint CheckpointIdSequence (r:1 w:0) - // Proof: Checkpoint CheckpointIdSequence (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint CheckpointIdSequence (max_values: None, max_size: None, mode: Measured) /// The range of component `t` is `[0, 1000]`. /// The range of component `w` is `[0, 1000]`. fn claim(t: u32, w: u32) -> Weight { - // Minimum execution time: 276_114 nanoseconds. - Weight::from_ref_time(279_222_776) - // Standard Error: 1_869 - .saturating_add(Weight::from_ref_time(24_532).saturating_mul(t.into())) - // Standard Error: 1_869 - .saturating_add(Weight::from_ref_time(15_303).saturating_mul(w.into())) + // Minimum execution time: 282_282 nanoseconds. + Weight::from_parts(295_677_207, 0) + // Standard Error: 2_270 + .saturating_add(Weight::from_parts(37_836, 0).saturating_mul(t.into())) + // Standard Error: 2_270 + .saturating_add(Weight::from_parts(13_878, 0).saturating_mul(w.into())) .saturating_add(DbWeight::get().reads(24)) .saturating_add(DbWeight::get().writes(7)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:4 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: CapitalDistribution HolderPaid (r:1 w:1) - // Proof: CapitalDistribution HolderPaid (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + // Proof Skipped: CapitalDistribution HolderPaid (max_values: None, max_size: None, mode: Measured) // Storage: CapitalDistribution Distributions (r:1 w:1) - // Proof: CapitalDistribution Distributions (max_values: None, max_size: Some(159), added: 2634, mode: MaxEncodedLen) + // Proof Skipped: CapitalDistribution Distributions (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: CorporateAction CorporateActions (r:1 w:0) // Proof Skipped: CorporateAction CorporateActions (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint SchedulePoints (r:1 w:0) // Proof Skipped: Checkpoint SchedulePoints (max_values: None, max_size: None, mode: Measured) // Storage: Asset BalanceOf (r:3 w:2) - // Proof: Asset BalanceOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + // Proof Skipped: Asset BalanceOf (max_values: None, max_size: None, mode: Measured) // Storage: Asset Assets (r:1 w:0) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedAssets (r:1 w:1) - // Proof: Portfolio PortfolioLockedAssets (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedAssets (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio Portfolios (r:1 w:0) // Proof Skipped: Portfolio Portfolios (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetBalances (r:2 w:2) - // Proof: Portfolio PortfolioAssetBalances (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetBalances (max_values: None, max_size: None, mode: Measured) // Storage: Asset Frozen (r:1 w:0) - // Proof: Asset Frozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Asset Frozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:4 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetTransferCompliances (r:1 w:0) - // Proof: Statistics AssetTransferCompliances (max_values: None, max_size: Some(246), added: 2721, mode: MaxEncodedLen) + // Proof Skipped: Statistics AssetTransferCompliances (max_values: None, max_size: None, mode: Measured) // Storage: ComplianceManager AssetCompliances (r:1 w:0) // Proof Skipped: ComplianceManager AssetCompliances (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint CachedNextCheckpoints (r:1 w:0) // Proof Skipped: Checkpoint CachedNextCheckpoints (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint CheckpointIdSequence (r:1 w:0) - // Proof: Checkpoint CheckpointIdSequence (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint CheckpointIdSequence (max_values: None, max_size: None, mode: Measured) /// The range of component `t` is `[0, 1000]`. /// The range of component `w` is `[0, 1000]`. fn push_benefit(t: u32, w: u32) -> Weight { - // Minimum execution time: 285_929 nanoseconds. - Weight::from_ref_time(290_297_753) - // Standard Error: 2_111 - .saturating_add(Weight::from_ref_time(27_742).saturating_mul(t.into())) - // Standard Error: 2_111 - .saturating_add(Weight::from_ref_time(19_877).saturating_mul(w.into())) + // Minimum execution time: 299_609 nanoseconds. + Weight::from_parts(292_208_631, 0) + // Standard Error: 2_178 + .saturating_add(Weight::from_parts(45_439, 0).saturating_mul(t.into())) + // Standard Error: 2_178 + .saturating_add(Weight::from_parts(29_985, 0).saturating_mul(w.into())) .saturating_add(DbWeight::get().reads(27)) .saturating_add(DbWeight::get().writes(7)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: CapitalDistribution Distributions (r:1 w:1) - // Proof: CapitalDistribution Distributions (max_values: None, max_size: Some(159), added: 2634, mode: MaxEncodedLen) + // Proof Skipped: CapitalDistribution Distributions (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Portfolio PortfolioCustodian (r:1 w:0) - // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedAssets (r:1 w:1) - // Proof: Portfolio PortfolioLockedAssets (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedAssets (max_values: None, max_size: None, mode: Measured) fn reclaim() -> Weight { - // Minimum execution time: 72_700 nanoseconds. - Weight::from_ref_time(74_972_000) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 59_550 nanoseconds. + Weight::from_parts(63_365_000, 0) + .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: CapitalDistribution Distributions (r:1 w:1) - // Proof: CapitalDistribution Distributions (max_values: None, max_size: Some(159), added: 2634, mode: MaxEncodedLen) + // Proof Skipped: CapitalDistribution Distributions (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Portfolio PortfolioLockedAssets (r:1 w:1) - // Proof: Portfolio PortfolioLockedAssets (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedAssets (max_values: None, max_size: None, mode: Measured) fn remove_distribution() -> Weight { - // Minimum execution time: 69_355 nanoseconds. - Weight::from_ref_time(70_566_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 57_575 nanoseconds. + Weight::from_parts(59_079_000, 0) + .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(2)) } } diff --git a/pallets/weights/src/pallet_checkpoint.rs b/pallets/weights/src/pallet_checkpoint.rs index d52e21898e..d6a187d964 100644 --- a/pallets/weights/src/pallet_checkpoint.rs +++ b/pallets/weights/src/pallet_checkpoint.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_checkpoint //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,83 +54,69 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_asset::checkpoint::WeightInfo for SubstrateWeight { // Storage: Checkpoint SchedulesMaxComplexity (r:0 w:1) - // Proof: Checkpoint SchedulesMaxComplexity (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint SchedulesMaxComplexity (max_values: Some(1), max_size: None, mode: Measured) fn set_schedules_max_complexity() -> Weight { - // Minimum execution time: 8_703 nanoseconds. - Weight::from_ref_time(9_895_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 11_066 nanoseconds. + Weight::from_parts(11_147_000, 0).saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Checkpoint CheckpointIdSequence (r:1 w:1) - // Proof: Checkpoint CheckpointIdSequence (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint CheckpointIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: Asset Assets (r:1 w:0) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint TotalSupply (r:0 w:1) - // Proof: Checkpoint TotalSupply (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint TotalSupply (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint Timestamps (r:0 w:1) - // Proof: Checkpoint Timestamps (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint Timestamps (max_values: None, max_size: None, mode: Measured) fn create_checkpoint() -> Weight { - // Minimum execution time: 68_784 nanoseconds. - Weight::from_ref_time(70_386_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 58_728 nanoseconds. + Weight::from_parts(64_186_000, 0) + .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Checkpoint SchedulesMaxComplexity (r:1 w:0) - // Proof: Checkpoint SchedulesMaxComplexity (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint SchedulesMaxComplexity (max_values: Some(1), max_size: None, mode: Measured) // Storage: Checkpoint CachedNextCheckpoints (r:1 w:1) // Proof Skipped: Checkpoint CachedNextCheckpoints (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Checkpoint ScheduleIdSequence (r:1 w:1) - // Proof: Checkpoint ScheduleIdSequence (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint ScheduleIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduledCheckpoints (r:0 w:1) // Proof Skipped: Checkpoint ScheduledCheckpoints (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduleRefCount (r:0 w:1) - // Proof: Checkpoint ScheduleRefCount (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint ScheduleRefCount (max_values: None, max_size: None, mode: Measured) fn create_schedule() -> Weight { - // Minimum execution time: 88_713 nanoseconds. - Weight::from_ref_time(93_971_000) - .saturating_add(DbWeight::get().reads(13)) + // Minimum execution time: 81_152 nanoseconds. + Weight::from_parts(97_196_000, 0) + .saturating_add(DbWeight::get().reads(10)) .saturating_add(DbWeight::get().writes(4)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -138,13 +124,13 @@ impl pallet_asset::checkpoint::WeightInfo for SubstrateWeight { // Storage: Checkpoint ScheduledCheckpoints (r:1 w:1) // Proof Skipped: Checkpoint ScheduledCheckpoints (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduleRefCount (r:1 w:1) - // Proof: Checkpoint ScheduleRefCount (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint ScheduleRefCount (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint CachedNextCheckpoints (r:1 w:1) // Proof Skipped: Checkpoint CachedNextCheckpoints (max_values: None, max_size: None, mode: Measured) fn remove_schedule() -> Weight { - // Minimum execution time: 82_724 nanoseconds. - Weight::from_ref_time(85_929_000) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 69_505 nanoseconds. + Weight::from_parts(72_329_000, 0) + .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(3)) } } diff --git a/pallets/weights/src/pallet_committee.rs b/pallets/weights/src/pallet_committee.rs index 251775981e..d60732e164 100644 --- a/pallets/weights/src/pallet_committee.rs +++ b/pallets/weights/src/pallet_committee.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_committee //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -53,116 +53,92 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; /// Weights for pallet_committee using the Substrate node and recommended hardware. pub struct SubstrateWeight; impl pallet_committee::WeightInfo for SubstrateWeight { - // Storage: PolymeshCommittee VoteThreshold (r:0 w:1) - // Proof: PolymeshCommittee VoteThreshold (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Instance1Committee VoteThreshold (r:0 w:1) + // Proof Skipped: Instance1Committee VoteThreshold (max_values: Some(1), max_size: None, mode: Measured) fn set_vote_threshold() -> Weight { - // Minimum execution time: 7_591 nanoseconds. - Weight::from_ref_time(9_164_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 10_135 nanoseconds. + Weight::from_parts(11_227_000, 0).saturating_add(DbWeight::get().writes(1)) } - // Storage: PolymeshCommittee Members (r:1 w:0) - // Proof Skipped: PolymeshCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - // Storage: PolymeshCommittee ReleaseCoordinator (r:0 w:1) - // Proof: PolymeshCommittee ReleaseCoordinator (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + // Storage: Instance1Committee Members (r:1 w:0) + // Proof Skipped: Instance1Committee Members (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance1Committee ReleaseCoordinator (r:0 w:1) + // Proof Skipped: Instance1Committee ReleaseCoordinator (max_values: Some(1), max_size: None, mode: Measured) fn set_release_coordinator() -> Weight { - // Minimum execution time: 39_479 nanoseconds. - Weight::from_ref_time(42_193_000) + // Minimum execution time: 48_141 nanoseconds. + Weight::from_parts(53_229_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } - // Storage: PolymeshCommittee ExpiresAfter (r:0 w:1) - // Proof: PolymeshCommittee ExpiresAfter (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + // Storage: Instance1Committee ExpiresAfter (r:0 w:1) + // Proof Skipped: Instance1Committee ExpiresAfter (max_values: Some(1), max_size: None, mode: Measured) fn set_expires_after() -> Weight { - // Minimum execution time: 7_782 nanoseconds. - Weight::from_ref_time(8_012_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 9_975 nanoseconds. + Weight::from_parts(11_197_000, 0).saturating_add(DbWeight::get().writes(1)) } - // Storage: PolymeshCommittee Voting (r:1 w:1) - // Proof Skipped: PolymeshCommittee Voting (max_values: None, max_size: None, mode: Measured) + // Storage: Instance1Committee Voting (r:1 w:1) + // Proof Skipped: Instance1Committee Voting (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: PolymeshCommittee Members (r:1 w:0) - // Proof Skipped: PolymeshCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - // Storage: PolymeshCommittee ProposalCount (r:1 w:1) - // Proof: PolymeshCommittee ProposalCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - // Storage: PolymeshCommittee ProposalOf (r:1 w:1) - // Proof Skipped: PolymeshCommittee ProposalOf (max_values: None, max_size: None, mode: Measured) - // Storage: PolymeshCommittee Proposals (r:1 w:1) - // Proof Skipped: PolymeshCommittee Proposals (max_values: Some(1), max_size: None, mode: Measured) - // Storage: PolymeshCommittee ExpiresAfter (r:1 w:0) - // Proof: PolymeshCommittee ExpiresAfter (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Instance1Committee Members (r:1 w:0) + // Proof Skipped: Instance1Committee Members (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance1Committee ProposalCount (r:1 w:1) + // Proof Skipped: Instance1Committee ProposalCount (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance1Committee ProposalOf (r:1 w:1) + // Proof Skipped: Instance1Committee ProposalOf (max_values: None, max_size: None, mode: Measured) + // Storage: Instance1Committee Proposals (r:1 w:1) + // Proof Skipped: Instance1Committee Proposals (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance1Committee ExpiresAfter (r:1 w:0) + // Proof Skipped: Instance1Committee ExpiresAfter (max_values: Some(1), max_size: None, mode: Measured) fn vote_or_propose_new_proposal() -> Weight { - // Minimum execution time: 175_102 nanoseconds. - Weight::from_ref_time(187_271_000) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 149_715 nanoseconds. + Weight::from_parts(156_454_000, 0) + .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(4)) } - // Storage: PolymeshCommittee Voting (r:1 w:1) - // Proof Skipped: PolymeshCommittee Voting (max_values: None, max_size: None, mode: Measured) + // Storage: Instance1Committee Voting (r:1 w:1) + // Proof Skipped: Instance1Committee Voting (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: PolymeshCommittee Members (r:1 w:0) - // Proof Skipped: PolymeshCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - // Storage: PolymeshCommittee VoteThreshold (r:1 w:0) - // Proof: PolymeshCommittee VoteThreshold (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Instance1Committee Members (r:1 w:0) + // Proof Skipped: Instance1Committee Members (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance1Committee VoteThreshold (r:1 w:0) + // Proof Skipped: Instance1Committee VoteThreshold (max_values: Some(1), max_size: None, mode: Measured) fn vote_or_propose_existing_proposal() -> Weight { - // Minimum execution time: 148_123 nanoseconds. - Weight::from_ref_time(167_150_000) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 119_660 nanoseconds. + Weight::from_parts(135_473_000, 0) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: PolymeshCommittee Members (r:1 w:0) - // Proof Skipped: PolymeshCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - // Storage: PolymeshCommittee Voting (r:1 w:1) - // Proof Skipped: PolymeshCommittee Voting (max_values: None, max_size: None, mode: Measured) - // Storage: PolymeshCommittee VoteThreshold (r:1 w:0) - // Proof: PolymeshCommittee VoteThreshold (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: PolymeshCommittee ProposalOf (r:1 w:1) - // Proof Skipped: PolymeshCommittee ProposalOf (max_values: None, max_size: None, mode: Measured) - // Storage: PolymeshCommittee Proposals (r:1 w:1) - // Proof Skipped: PolymeshCommittee Proposals (max_values: Some(1), max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Instance1Committee Members (r:1 w:0) + // Proof Skipped: Instance1Committee Members (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance1Committee Voting (r:1 w:1) + // Proof Skipped: Instance1Committee Voting (max_values: None, max_size: None, mode: Measured) + // Storage: Instance1Committee VoteThreshold (r:1 w:0) + // Proof Skipped: Instance1Committee VoteThreshold (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance1Committee ProposalOf (r:1 w:1) + // Proof Skipped: Instance1Committee ProposalOf (max_values: None, max_size: None, mode: Measured) + // Storage: Instance1Committee Proposals (r:1 w:1) + // Proof Skipped: Instance1Committee Proposals (max_values: Some(1), max_size: None, mode: Measured) fn vote_aye() -> Weight { - // Minimum execution time: 277_426 nanoseconds. - Weight::from_ref_time(283_316_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 266_349 nanoseconds. + Weight::from_parts(275_382_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: PolymeshCommittee Members (r:1 w:0) - // Proof Skipped: PolymeshCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - // Storage: PolymeshCommittee Voting (r:1 w:1) - // Proof Skipped: PolymeshCommittee Voting (max_values: None, max_size: None, mode: Measured) - // Storage: PolymeshCommittee VoteThreshold (r:1 w:0) - // Proof: PolymeshCommittee VoteThreshold (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Instance1Committee Members (r:1 w:0) + // Proof Skipped: Instance1Committee Members (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance1Committee Voting (r:1 w:1) + // Proof Skipped: Instance1Committee Voting (max_values: None, max_size: None, mode: Measured) + // Storage: Instance1Committee VoteThreshold (r:1 w:0) + // Proof Skipped: Instance1Committee VoteThreshold (max_values: Some(1), max_size: None, mode: Measured) fn vote_nay() -> Weight { - // Minimum execution time: 128_122 nanoseconds. - Weight::from_ref_time(135_624_000) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 107_030 nanoseconds. + Weight::from_parts(109_584_000, 0) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(1)) } } diff --git a/pallets/weights/src/pallet_compliance_manager.rs b/pallets/weights/src/pallet_compliance_manager.rs index d5a7c012f5..74f0efdff3 100644 --- a/pallets/weights/src/pallet_compliance_manager.rs +++ b/pallets/weights/src/pallet_compliance_manager.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_compliance_manager //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -58,27 +58,21 @@ impl pallet_compliance_manager::WeightInfo for SubstrateWeight { /// The range of component `c` is `[1, 10]`. /// The range of component `d` is `[1, 10]`. fn condition_costs(a: u32, b: u32, c: u32, d: u32) -> Weight { - // Minimum execution time: 9_404 nanoseconds. - Weight::from_ref_time(10_015_000) - // Standard Error: 64_392 - .saturating_add(Weight::from_ref_time(4_291_077).saturating_mul(a.into())) - // Standard Error: 64_392 - .saturating_add(Weight::from_ref_time(312_778).saturating_mul(b.into())) - // Standard Error: 64_392 - .saturating_add(Weight::from_ref_time(1_280_895).saturating_mul(c.into())) + // Minimum execution time: 10_175 nanoseconds. + Weight::from_parts(10_696_000, 0) + // Standard Error: 62_942 + .saturating_add(Weight::from_parts(4_457_478, 0).saturating_mul(a.into())) + // Standard Error: 62_942 + .saturating_add(Weight::from_parts(496_104, 0).saturating_mul(b.into())) + // Standard Error: 62_942 + .saturating_add(Weight::from_parts(1_188_416, 0).saturating_mul(c.into())) // Manually set for `d` - .saturating_add(Weight::from_ref_time(721_394).saturating_mul(d.into())) + .saturating_add(Weight::from_parts(721_394, 0).saturating_mul(d.into())) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -88,28 +82,22 @@ impl pallet_compliance_manager::WeightInfo for SubstrateWeight { // Storage: ComplianceManager TrustedClaimIssuer (r:1 w:0) // Proof Skipped: ComplianceManager TrustedClaimIssuer (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) /// The range of component `c` is `[1, 6]`. fn add_compliance_requirement(c: u32) -> Weight { - // Minimum execution time: 71_377 nanoseconds. - Weight::from_ref_time(76_477_459) - // Standard Error: 117_286 - .saturating_add(Weight::from_ref_time(1_396_847).saturating_mul(c.into())) - .saturating_add(DbWeight::get().reads(12)) + // Minimum execution time: 56_464 nanoseconds. + Weight::from_parts(61_594_226, 0) + // Standard Error: 149_493 + .saturating_add(Weight::from_parts(1_040_910, 0).saturating_mul(c.into())) + .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -117,21 +105,15 @@ impl pallet_compliance_manager::WeightInfo for SubstrateWeight { // Storage: ComplianceManager AssetCompliances (r:1 w:1) // Proof Skipped: ComplianceManager AssetCompliances (max_values: None, max_size: None, mode: Measured) fn remove_compliance_requirement() -> Weight { - // Minimum execution time: 59_800 nanoseconds. - Weight::from_ref_time(61_332_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 42_534 nanoseconds. + Weight::from_parts(45_248_000, 0) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -139,21 +121,15 @@ impl pallet_compliance_manager::WeightInfo for SubstrateWeight { // Storage: ComplianceManager AssetCompliances (r:1 w:1) // Proof Skipped: ComplianceManager AssetCompliances (max_values: None, max_size: None, mode: Measured) fn pause_asset_compliance() -> Weight { - // Minimum execution time: 61_663 nanoseconds. - Weight::from_ref_time(62_814_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 45_218 nanoseconds. + Weight::from_parts(48_943_000, 0) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -161,47 +137,35 @@ impl pallet_compliance_manager::WeightInfo for SubstrateWeight { // Storage: ComplianceManager AssetCompliances (r:1 w:1) // Proof Skipped: ComplianceManager AssetCompliances (max_values: None, max_size: None, mode: Measured) fn resume_asset_compliance() -> Weight { - // Minimum execution time: 57_146 nanoseconds. - Weight::from_ref_time(64_276_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 40_681 nanoseconds. + Weight::from_parts(41_382_000, 0) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity DidRecords (r:1 w:0) - // Proof: Identity DidRecords (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity DidRecords (max_values: None, max_size: None, mode: Measured) // Storage: ComplianceManager TrustedClaimIssuer (r:1 w:1) // Proof Skipped: ComplianceManager TrustedClaimIssuer (max_values: None, max_size: None, mode: Measured) // Storage: ComplianceManager AssetCompliances (r:1 w:0) // Proof Skipped: ComplianceManager AssetCompliances (max_values: None, max_size: None, mode: Measured) fn add_default_trusted_claim_issuer() -> Weight { - // Minimum execution time: 65_829 nanoseconds. - Weight::from_ref_time(68_463_000) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 55_262 nanoseconds. + Weight::from_parts(56_735_000, 0) + .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -209,21 +173,15 @@ impl pallet_compliance_manager::WeightInfo for SubstrateWeight { // Storage: ComplianceManager TrustedClaimIssuer (r:1 w:1) // Proof Skipped: ComplianceManager TrustedClaimIssuer (max_values: None, max_size: None, mode: Measured) fn remove_default_trusted_claim_issuer() -> Weight { - // Minimum execution time: 58_889 nanoseconds. - Weight::from_ref_time(59_650_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 39_650 nanoseconds. + Weight::from_parts(41_631_000, 0) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -234,23 +192,17 @@ impl pallet_compliance_manager::WeightInfo for SubstrateWeight { // Proof Skipped: ComplianceManager TrustedClaimIssuer (max_values: None, max_size: None, mode: Measured) /// The range of component `c` is `[1, 6]`. fn change_compliance_requirement(c: u32) -> Weight { - // Minimum execution time: 65_488 nanoseconds. - Weight::from_ref_time(71_228_943) - // Standard Error: 70_542 - .saturating_add(Weight::from_ref_time(1_162_894).saturating_mul(c.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 50_094 nanoseconds. + Weight::from_parts(53_594_702, 0) + // Standard Error: 148_982 + .saturating_add(Weight::from_parts(1_820_606, 0).saturating_mul(c.into())) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -261,23 +213,17 @@ impl pallet_compliance_manager::WeightInfo for SubstrateWeight { // Proof Skipped: ComplianceManager AssetCompliances (max_values: None, max_size: None, mode: Measured) /// The range of component `c` is `[0, 2]`. fn replace_asset_compliance(c: u32) -> Weight { - // Minimum execution time: 61_573 nanoseconds. - Weight::from_ref_time(67_872_363) - // Standard Error: 193_486 - .saturating_add(Weight::from_ref_time(10_857_275).saturating_mul(c.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 47_191 nanoseconds. + Weight::from_parts(51_858_764, 0) + // Standard Error: 325_921 + .saturating_add(Weight::from_parts(10_811_499, 0).saturating_mul(c.into())) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -285,9 +231,9 @@ impl pallet_compliance_manager::WeightInfo for SubstrateWeight { // Storage: ComplianceManager AssetCompliances (r:0 w:1) // Proof Skipped: ComplianceManager AssetCompliances (max_values: None, max_size: None, mode: Measured) fn reset_asset_compliance() -> Weight { - // Minimum execution time: 51_877 nanoseconds. - Weight::from_ref_time(54_132_000) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 34_480 nanoseconds. + Weight::from_parts(36_745_000, 0) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(1)) } // Storage: ComplianceManager TrustedClaimIssuer (r:1 w:0) @@ -299,31 +245,31 @@ impl pallet_compliance_manager::WeightInfo for SubstrateWeight { /// The range of component `c` is `[1, 400]`. /// The range of component `t` is `[0, 1]`. fn is_condition_satisfied(c: u32, t: u32) -> Weight { - // Minimum execution time: 18_308 nanoseconds. - Weight::from_ref_time(18_378_000) - // Standard Error: 1_968 - .saturating_add(Weight::from_ref_time(4_064_708).saturating_mul(c.into())) - // Standard Error: 848_942 - .saturating_add(Weight::from_ref_time(12_185_068).saturating_mul(t.into())) + // Minimum execution time: 19_079 nanoseconds. + Weight::from_parts(19_800_000, 0) + // Standard Error: 2_678 + .saturating_add(Weight::from_parts(4_485_426, 0).saturating_mul(c.into())) + // Standard Error: 1_155_484 + .saturating_add(Weight::from_parts(13_588_582, 0).saturating_mul(t.into())) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(t.into()))) } // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) /// The range of component `e` is `[0, 1]`. fn is_identity_condition(e: u32) -> Weight { - // Minimum execution time: 781 nanoseconds. - Weight::from_ref_time(1_025_807) - // Standard Error: 54_026 - .saturating_add(Weight::from_ref_time(8_552_192).saturating_mul(e.into())) + // Minimum execution time: 600 nanoseconds. + Weight::from_parts(1_073_485, 0) + // Standard Error: 57_226 + .saturating_add(Weight::from_parts(9_208_847, 0).saturating_mul(e.into())) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(e.into()))) } /// The range of component `i` is `[0, 10000]`. fn is_any_requirement_compliant(i: u32) -> Weight { - // Minimum execution time: 541 nanoseconds. - Weight::from_ref_time(1_639_578) - // Standard Error: 168 - .saturating_add(Weight::from_ref_time(106_858).saturating_mul(i.into())) + // Minimum execution time: 611 nanoseconds. + Weight::from_parts(4_210_562, 0) + // Standard Error: 197 + .saturating_add(Weight::from_parts(111_013, 0).saturating_mul(i.into())) } } diff --git a/pallets/weights/src/pallet_contracts.rs b/pallets/weights/src/pallet_contracts.rs index 14e79e8f6e..60a2686b29 100644 --- a/pallets/weights/src/pallet_contracts.rs +++ b/pallets/weights/src/pallet_contracts.rs @@ -1,13 +1,13 @@ // This file is part of Substrate. -// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, @@ -15,1950 +15,1024 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_contracts +//! Autogenerated weights for `pallet_contracts` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! DATE: 2023-07-25, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-ynta1nyy-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./polymesh +// target/production/substrate-node // benchmark // pallet -// -s -// 100 -// -r -// 5 -// -p=* -// -e=* -// --heap-pages -// 4096 -// --db-cache -// 512 -// --execution -// wasm -// --wasm-execution -// compiled -// --output -// ./Polymesh/pallets/weights/src/ -// --template -// ./.maintain/frame-weight-template.hbs +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/substrate/.git/.artifacts/bench.json +// --pallet=pallet_contracts +// --chain=dev +// --header=./HEADER-APACHE2 +// --output=./frame/contracts/src/weights.rs +// --template=./.maintain/frame-weight-template.hbs +#![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; -/// Weights for pallet_contracts using the Substrate node and recommended hardware. +/// Weights for `pallet_contracts` using the Substrate node and recommended hardware. pub struct SubstrateWeight; -impl pallet_contracts::weights::WeightInfo for SubstrateWeight { - // Storage: Contracts DeletionQueue (r:1 w:0) - // Proof: Contracts DeletionQueue (max_values: Some(1), max_size: Some(133122), added: 133617, mode: Measured) - fn on_process_deletion_queue_batch() -> Weight { - // Minimum execution time: 3_976 nanoseconds. - Weight::from_ref_time(4_227_000).saturating_add(DbWeight::get().reads(1)) - } - // Storage: Skipped Metadata (r:0 w:0) - // Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) - /// The range of component `k` is `[0, 1024]`. - fn on_initialize_per_trie_key(k: u32) -> Weight { - // Minimum execution time: 15_323 nanoseconds. - Weight::from_ref_time(15_714_000) - // Standard Error: 1_653 - .saturating_add(Weight::from_ref_time(1_014_805).saturating_mul(k.into())) - .saturating_add(DbWeight::get().reads(1)) - .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(k.into()))) - .saturating_add(DbWeight::get().writes(1)) - .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(k.into()))) - } - // Storage: Contracts DeletionQueue (r:1 w:1) - // Proof: Contracts DeletionQueue (max_values: Some(1), max_size: Some(133122), added: 133617, mode: Measured) - /// The range of component `q` is `[0, 1024]`. - fn on_initialize_per_queue_item(q: u32) -> Weight { - // Minimum execution time: 4_337 nanoseconds. - Weight::from_ref_time(2_663_978) - // Standard Error: 9_706 - .saturating_add(Weight::from_ref_time(1_861_521).saturating_mul(q.into())) - .saturating_add(DbWeight::get().reads(1)) - .saturating_add(DbWeight::get().writes(1)) - } - // Storage: Contracts PristineCode (r:1 w:0) - // Proof: Contracts PristineCode (max_values: None, max_size: Some(125988), added: 128463, mode: Measured) - // Storage: Contracts CodeStorage (r:0 w:1) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - /// The range of component `c` is `[0, 61717]`. - fn reinstrument(c: u32) -> Weight { - // Minimum execution time: 53_400 nanoseconds. - Weight::from_ref_time(63_326_873) - // Standard Error: 147 - .saturating_add(Weight::from_ref_time(54_195).saturating_mul(c.into())) - .saturating_add(DbWeight::get().reads(1)) - .saturating_add(DbWeight::get().writes(1)) - } - // Storage: Identity KeyRecords (r:2 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System Account (r:1 w:1) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `c` is `[0, 125952]`. - fn call_with_code_per_byte(c: u32) -> Weight { - // Minimum execution time: 540_821 nanoseconds. - Weight::from_ref_time(577_943_143) - // Standard Error: 174 - .saturating_add(Weight::from_ref_time(32_416).saturating_mul(c.into())) - .saturating_add(DbWeight::get().reads(12)) - .saturating_add(DbWeight::get().writes(4)) - } - // Storage: Identity KeyRecords (r:3 w:1) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: Contracts OwnerInfoOf (r:1 w:1) - // Proof: Contracts OwnerInfoOf (max_values: None, max_size: Some(88), added: 2563, mode: Measured) - // Storage: Contracts Nonce (r:1 w:1) - // Proof: Contracts Nonce (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: System Account (r:2 w:2) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: Measured) - // Storage: System EventTopics (r:3 w:3) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - // Storage: Identity DidKeys (r:0 w:1) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Identity KeyPortfolioPermissions (r:0 w:1) - // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) - // Storage: Identity KeyExtrinsicPermissions (r:0 w:1) - // Proof Skipped: Identity KeyExtrinsicPermissions (max_values: None, max_size: None, mode: Measured) - // Storage: Identity KeyAssetPermissions (r:0 w:1) - // Proof Skipped: Identity KeyAssetPermissions (max_values: None, max_size: None, mode: Measured) - // Storage: Contracts CodeStorage (r:0 w:1) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: Contracts PristineCode (r:0 w:1) - // Proof: Contracts PristineCode (max_values: None, max_size: Some(125988), added: 128463, mode: Measured) - /// The range of component `c` is `[0, 61717]`. - /// The range of component `i` is `[0, 1048576]`. - /// The range of component `s` is `[0, 1048576]`. - fn instantiate_with_code(c: u32, i: u32, s: u32) -> Weight { - // Minimum execution time: 3_878_728 nanoseconds. - Weight::from_ref_time(693_972_051) - // Standard Error: 187 - .saturating_add(Weight::from_ref_time(100_167).saturating_mul(c.into())) - // Standard Error: 11 - .saturating_add(Weight::from_ref_time(1_550).saturating_mul(i.into())) - // Standard Error: 11 - .saturating_add(Weight::from_ref_time(1_601).saturating_mul(s.into())) - .saturating_add(DbWeight::get().reads(16)) - .saturating_add(DbWeight::get().writes(15)) - } - // Storage: Identity KeyRecords (r:3 w:1) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: Contracts Nonce (r:1 w:1) - // Proof: Contracts Nonce (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: System Account (r:2 w:2) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: Measured) - // Storage: Contracts OwnerInfoOf (r:1 w:1) - // Proof: Contracts OwnerInfoOf (max_values: None, max_size: Some(88), added: 2563, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - // Storage: Identity DidKeys (r:0 w:1) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Identity KeyPortfolioPermissions (r:0 w:1) - // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) - // Storage: Identity KeyExtrinsicPermissions (r:0 w:1) - // Proof Skipped: Identity KeyExtrinsicPermissions (max_values: None, max_size: None, mode: Measured) - // Storage: Identity KeyAssetPermissions (r:0 w:1) - // Proof Skipped: Identity KeyAssetPermissions (max_values: None, max_size: None, mode: Measured) - /// The range of component `i` is `[0, 1048576]`. - /// The range of component `s` is `[0, 1048576]`. - fn instantiate(i: u32, s: u32) -> Weight { - // Minimum execution time: 1_998_126 nanoseconds. - Weight::from_ref_time(384_573_388) - // Standard Error: 8 - .saturating_add(Weight::from_ref_time(1_563).saturating_mul(i.into())) - // Standard Error: 8 - .saturating_add(Weight::from_ref_time(1_613).saturating_mul(s.into())) - .saturating_add(DbWeight::get().reads(16)) - .saturating_add(DbWeight::get().writes(12)) - } - // Storage: Identity KeyRecords (r:2 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System Account (r:1 w:1) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - fn call() -> Weight { - // Minimum execution time: 245_889 nanoseconds. - Weight::from_ref_time(276_054_000) - .saturating_add(DbWeight::get().reads(12)) - .saturating_add(DbWeight::get().writes(4)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: Contracts OwnerInfoOf (r:1 w:1) - // Proof: Contracts OwnerInfoOf (max_values: None, max_size: Some(88), added: 2563, mode: Measured) - // Storage: System EventTopics (r:1 w:1) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - // Storage: Contracts CodeStorage (r:0 w:1) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: Contracts PristineCode (r:0 w:1) - // Proof: Contracts PristineCode (max_values: None, max_size: Some(125988), added: 128463, mode: Measured) - /// The range of component `c` is `[0, 61717]`. - fn upload_code(c: u32) -> Weight { - // Minimum execution time: 564_797 nanoseconds. - Weight::from_ref_time(598_173_828) - // Standard Error: 298 - .saturating_add(Weight::from_ref_time(98_207).saturating_mul(c.into())) - .saturating_add(DbWeight::get().reads(7)) - .saturating_add(DbWeight::get().writes(4)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: Contracts OwnerInfoOf (r:1 w:1) - // Proof: Contracts OwnerInfoOf (max_values: None, max_size: Some(88), added: 2563, mode: Measured) - // Storage: System EventTopics (r:1 w:1) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - // Storage: Contracts CodeStorage (r:0 w:1) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: Contracts PristineCode (r:0 w:1) - // Proof: Contracts PristineCode (max_values: None, max_size: Some(125988), added: 128463, mode: Measured) - fn remove_code() -> Weight { - // Minimum execution time: 63_966 nanoseconds. - Weight::from_ref_time(66_920_000) - .saturating_add(DbWeight::get().reads(7)) - .saturating_add(DbWeight::get().writes(4)) - } - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts OwnerInfoOf (r:2 w:2) - // Proof: Contracts OwnerInfoOf (max_values: None, max_size: Some(88), added: 2563, mode: Measured) - // Storage: System EventTopics (r:3 w:3) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - fn set_code() -> Weight { - // Minimum execution time: 37_527 nanoseconds. - Weight::from_ref_time(40_390_000) - .saturating_add(DbWeight::get().reads(6)) - .saturating_add(DbWeight::get().writes(6)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_caller(r: u32) -> Weight { - // Minimum execution time: 523_846 nanoseconds. - Weight::from_ref_time(555_283_517) - // Standard Error: 119_283 - .saturating_add(Weight::from_ref_time(34_403_204).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1601 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_is_contract(r: u32) -> Weight { - // Minimum execution time: 527_511 nanoseconds. - Weight::from_ref_time(397_513_912) - // Standard Error: 775_745 - .saturating_add(Weight::from_ref_time(306_459_192).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().reads((80_u64).saturating_mul(r.into()))) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1601 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_code_hash(r: u32) -> Weight { - // Minimum execution time: 528_202 nanoseconds. - Weight::from_ref_time(397_864_443) - // Standard Error: 816_166 - .saturating_add(Weight::from_ref_time(392_206_177).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().reads((80_u64).saturating_mul(r.into()))) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_own_code_hash(r: u32) -> Weight { - // Minimum execution time: 527_782 nanoseconds. - Weight::from_ref_time(556_350_298) - // Standard Error: 285_990 - .saturating_add(Weight::from_ref_time(47_026_771).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_caller_is_origin(r: u32) -> Weight { - // Minimum execution time: 526_820 nanoseconds. - Weight::from_ref_time(556_093_160) - // Standard Error: 119_283 - .saturating_add(Weight::from_ref_time(10_906_360).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_address(r: u32) -> Weight { - // Minimum execution time: 527_501 nanoseconds. - Weight::from_ref_time(559_700_423) - // Standard Error: 132_729 - .saturating_add(Weight::from_ref_time(33_770_625).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_gas_left(r: u32) -> Weight { - // Minimum execution time: 528_742 nanoseconds. - Weight::from_ref_time(564_866_652) - // Standard Error: 127_233 - .saturating_add(Weight::from_ref_time(33_166_665).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:2 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_balance(r: u32) -> Weight { - // Minimum execution time: 523_946 nanoseconds. - Weight::from_ref_time(573_437_181) - // Standard Error: 234_629 - .saturating_add(Weight::from_ref_time(170_616_101).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(11)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_value_transferred(r: u32) -> Weight { - // Minimum execution time: 526_238 nanoseconds. - Weight::from_ref_time(559_048_166) - // Standard Error: 172_069 - .saturating_add(Weight::from_ref_time(33_843_592).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_minimum_balance(r: u32) -> Weight { - // Minimum execution time: 525_448 nanoseconds. - Weight::from_ref_time(553_270_611) - // Standard Error: 139_208 - .saturating_add(Weight::from_ref_time(34_189_121).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_block_number(r: u32) -> Weight { - // Minimum execution time: 526_119 nanoseconds. - Weight::from_ref_time(559_366_345) - // Standard Error: 108_401 - .saturating_add(Weight::from_ref_time(33_650_874).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_now(r: u32) -> Weight { - // Minimum execution time: 526_480 nanoseconds. - Weight::from_ref_time(561_503_863) - // Standard Error: 129_832 - .saturating_add(Weight::from_ref_time(33_644_096).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - // Proof: TransactionPayment NextFeeMultiplier (max_values: Some(1), max_size: Some(16), added: 511, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_weight_to_fee(r: u32) -> Weight { - // Minimum execution time: 522_352 nanoseconds. - Weight::from_ref_time(560_876_274) - // Standard Error: 160_615 - .saturating_add(Weight::from_ref_time(119_618_219).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(11)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_gas(r: u32) -> Weight { - // Minimum execution time: 219_520 nanoseconds. - Weight::from_ref_time(242_833_568) - // Standard Error: 99_077 - .saturating_add(Weight::from_ref_time(9_331_370).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_input(r: u32) -> Weight { - // Minimum execution time: 522_524 nanoseconds. - Weight::from_ref_time(556_526_408) - // Standard Error: 100_774 - .saturating_add(Weight::from_ref_time(24_791_762).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `n` is `[0, 1024]`. - fn seal_input_per_kb(n: u32) -> Weight { - // Minimum execution time: 554_061 nanoseconds. - Weight::from_ref_time(565_676_259) - // Standard Error: 8_715 - .saturating_add(Weight::from_ref_time(11_865_975).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 1]`. - fn seal_return(r: u32) -> Weight { - // Minimum execution time: 516_345 nanoseconds. - Weight::from_ref_time(545_428_144) - // Standard Error: 5_011_570 - .saturating_add(Weight::from_ref_time(2_163_020).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `n` is `[0, 1024]`. - fn seal_return_per_kb(n: u32) -> Weight { - // Minimum execution time: 530_936 nanoseconds. - Weight::from_ref_time(556_530_842) - // Standard Error: 3_520 - .saturating_add(Weight::from_ref_time(284_791).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:4 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:4 w:4) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: Measured) - // Storage: Contracts DeletionQueue (r:1 w:1) - // Proof: Contracts DeletionQueue (max_values: Some(1), max_size: Some(133122), added: 133617, mode: Measured) - // Storage: Contracts OwnerInfoOf (r:1 w:1) - // Proof: Contracts OwnerInfoOf (max_values: None, max_size: Some(88), added: 2563, mode: Measured) - // Storage: System EventTopics (r:3 w:3) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 1]`. - fn seal_terminate(r: u32) -> Weight { - // Minimum execution time: 522_024 nanoseconds. - Weight::from_ref_time(554_541_096) - // Standard Error: 5_739_935 - .saturating_add(Weight::from_ref_time(73_574_570).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().reads((10_u64).saturating_mul(r.into()))) - .saturating_add(DbWeight::get().writes(3)) - .saturating_add(DbWeight::get().writes((7_u64).saturating_mul(r.into()))) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: RandomnessCollectiveFlip RandomMaterial (r:1 w:0) - // Proof: RandomnessCollectiveFlip RandomMaterial (max_values: Some(1), max_size: Some(2594), added: 3089, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_random(r: u32) -> Weight { - // Minimum execution time: 522_093 nanoseconds. - Weight::from_ref_time(564_361_561) - // Standard Error: 199_260 - .saturating_add(Weight::from_ref_time(185_943_661).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(11)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_deposit_event(r: u32) -> Weight { - // Minimum execution time: 523_524 nanoseconds. - Weight::from_ref_time(580_562_913) - // Standard Error: 294_841 - .saturating_add(Weight::from_ref_time(321_589_317).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:322 w:322) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `t` is `[0, 4]`. - /// The range of component `n` is `[0, 16]`. - fn seal_deposit_event_per_topic_and_kb(t: u32, n: u32) -> Weight { - // Minimum execution time: 1_682_403 nanoseconds. - Weight::from_ref_time(842_877_771) - // Standard Error: 829_052 - .saturating_add(Weight::from_ref_time(252_190_620).saturating_mul(t.into())) - // Standard Error: 225_983 - .saturating_add(Weight::from_ref_time(56_055_640).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().reads((80_u64).saturating_mul(t.into()))) - .saturating_add(DbWeight::get().writes(3)) - .saturating_add(DbWeight::get().writes((80_u64).saturating_mul(t.into()))) - } - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_debug_message(r: u32) -> Weight { - // Minimum execution time: 215_783 nanoseconds. - Weight::from_ref_time(238_081_555) - // Standard Error: 101_403 - .saturating_add(Weight::from_ref_time(17_553_904).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(6)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `i` is `[0, 1024]`. - fn seal_debug_message_per_kb(i: u32) -> Weight { - // Minimum execution time: 629_093 nanoseconds. - Weight::from_ref_time(661_562_743) - // Standard Error: 2_844 - .saturating_add(Weight::from_ref_time(852_358).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(6)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Skipped Metadata (r:0 w:0) - // Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 10]`. - fn seal_set_storage(r: u32) -> Weight { - // Minimum execution time: 524_947 nanoseconds. - Weight::from_ref_time(468_265_151) - // Standard Error: 1_137_296 - .saturating_add(Weight::from_ref_time(503_173_868).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().reads((80_u64).saturating_mul(r.into()))) - .saturating_add(DbWeight::get().writes(3)) - .saturating_add(DbWeight::get().writes((80_u64).saturating_mul(r.into()))) - } - // Storage: Skipped Metadata (r:0 w:0) - // Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) - /// The range of component `n` is `[0, 8]`. - fn seal_set_storage_per_new_kb(n: u32) -> Weight { - // Minimum execution time: 730_164 nanoseconds. - Weight::from_ref_time(918_834_147) - // Standard Error: 2_107_295 - .saturating_add(Weight::from_ref_time(105_144_502).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(58)) - .saturating_add(DbWeight::get().reads((7_u64).saturating_mul(n.into()))) - .saturating_add(DbWeight::get().writes(51)) - .saturating_add(DbWeight::get().writes((7_u64).saturating_mul(n.into()))) - } - // Storage: Skipped Metadata (r:0 w:0) - // Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) - /// The range of component `n` is `[0, 8]`. - fn seal_set_storage_per_old_kb(n: u32) -> Weight { - // Minimum execution time: 735_272 nanoseconds. - Weight::from_ref_time(883_668_183) - // Standard Error: 1_549_905 - .saturating_add(Weight::from_ref_time(63_633_258).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(57)) - .saturating_add(DbWeight::get().reads((7_u64).saturating_mul(n.into()))) - .saturating_add(DbWeight::get().writes(50)) - .saturating_add(DbWeight::get().writes((7_u64).saturating_mul(n.into()))) - } - // Storage: Skipped Metadata (r:0 w:0) - // Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 10]`. - fn seal_clear_storage(r: u32) -> Weight { - // Minimum execution time: 525_779 nanoseconds. - Weight::from_ref_time(470_012_174) - // Standard Error: 1_040_597 - .saturating_add(Weight::from_ref_time(497_818_740).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().reads((80_u64).saturating_mul(r.into()))) - .saturating_add(DbWeight::get().writes(3)) - .saturating_add(DbWeight::get().writes((80_u64).saturating_mul(r.into()))) - } - // Storage: Skipped Metadata (r:0 w:0) - // Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) - /// The range of component `n` is `[0, 8]`. - fn seal_clear_storage_per_kb(n: u32) -> Weight { - // Minimum execution time: 698_547 nanoseconds. - Weight::from_ref_time(845_589_720) - // Standard Error: 1_746_906 - .saturating_add(Weight::from_ref_time(68_116_173).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(56)) - .saturating_add(DbWeight::get().reads((7_u64).saturating_mul(n.into()))) - .saturating_add(DbWeight::get().writes(49)) - .saturating_add(DbWeight::get().writes((7_u64).saturating_mul(n.into()))) - } - // Storage: Skipped Metadata (r:0 w:0) - // Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 10]`. - fn seal_get_storage(r: u32) -> Weight { - // Minimum execution time: 524_937 nanoseconds. - Weight::from_ref_time(499_235_847) - // Standard Error: 833_562 - .saturating_add(Weight::from_ref_time(419_411_717).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().reads((80_u64).saturating_mul(r.into()))) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Skipped Metadata (r:0 w:0) - // Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) - /// The range of component `n` is `[0, 8]`. - fn seal_get_storage_per_kb(n: u32) -> Weight { - // Minimum execution time: 659_298 nanoseconds. - Weight::from_ref_time(806_624_172) - // Standard Error: 1_558_888 - .saturating_add(Weight::from_ref_time(155_780_234).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(57)) - .saturating_add(DbWeight::get().reads((7_u64).saturating_mul(n.into()))) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Skipped Metadata (r:0 w:0) - // Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 10]`. - fn seal_contains_storage(r: u32) -> Weight { - // Minimum execution time: 524_697 nanoseconds. - Weight::from_ref_time(486_839_180) - // Standard Error: 921_666 - .saturating_add(Weight::from_ref_time(396_312_810).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().reads((80_u64).saturating_mul(r.into()))) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Skipped Metadata (r:0 w:0) - // Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) - /// The range of component `n` is `[0, 8]`. - fn seal_contains_storage_per_kb(n: u32) -> Weight { - // Minimum execution time: 658_558 nanoseconds. - Weight::from_ref_time(790_340_713) - // Standard Error: 1_363_405 - .saturating_add(Weight::from_ref_time(60_074_828).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(56)) - .saturating_add(DbWeight::get().reads((7_u64).saturating_mul(n.into()))) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Skipped Metadata (r:0 w:0) - // Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 10]`. - fn seal_take_storage(r: u32) -> Weight { - // Minimum execution time: 523_115 nanoseconds. - Weight::from_ref_time(467_995_064) - // Standard Error: 1_162_377 - .saturating_add(Weight::from_ref_time(511_579_790).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().reads((80_u64).saturating_mul(r.into()))) - .saturating_add(DbWeight::get().writes(3)) - .saturating_add(DbWeight::get().writes((80_u64).saturating_mul(r.into()))) - } - // Storage: Skipped Metadata (r:0 w:0) - // Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) - /// The range of component `n` is `[0, 8]`. - fn seal_take_storage_per_kb(n: u32) -> Weight { - // Minimum execution time: 701_593 nanoseconds. - Weight::from_ref_time(861_901_495) - // Standard Error: 1_816_711 - .saturating_add(Weight::from_ref_time(158_033_438).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(57)) - .saturating_add(DbWeight::get().reads((7_u64).saturating_mul(n.into()))) - .saturating_add(DbWeight::get().writes(50)) - .saturating_add(DbWeight::get().writes((7_u64).saturating_mul(n.into()))) - } - // Storage: Identity KeyRecords (r:1602 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1602 w:1601) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_transfer(r: u32) -> Weight { - // Minimum execution time: 528_082 nanoseconds. - Weight::from_ref_time(540_641_000) - // Standard Error: 2_268_145 - .saturating_add(Weight::from_ref_time(2_818_079_627).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(12)) - .saturating_add(DbWeight::get().reads((160_u64).saturating_mul(r.into()))) - .saturating_add(DbWeight::get().writes(4)) - .saturating_add(DbWeight::get().writes((80_u64).saturating_mul(r.into()))) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1601 w:1601) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:2 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:1602 w:1602) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_call(r: u32) -> Weight { - // Minimum execution time: 527_550 nanoseconds. - Weight::from_ref_time(537_526_000) - // Standard Error: 9_328_669 - .saturating_add(Weight::from_ref_time(38_277_163_473).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(11)) - .saturating_add(DbWeight::get().reads((160_u64).saturating_mul(r.into()))) - .saturating_add(DbWeight::get().writes(3)) - .saturating_add(DbWeight::get().writes((160_u64).saturating_mul(r.into()))) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1536 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:1537 w:1537) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_delegate_call(r: u32) -> Weight { - // Minimum execution time: 529_014 nanoseconds. - Weight::from_ref_time(543_015_000) - // Standard Error: 10_034_631 - .saturating_add(Weight::from_ref_time(38_085_820_243).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().reads((150_u64).saturating_mul(r.into()))) - .saturating_add(DbWeight::get().writes(3)) - .saturating_add(DbWeight::get().writes((75_u64).saturating_mul(r.into()))) - } - // Storage: Identity KeyRecords (r:4 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:82 w:3) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:81 w:3) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:2 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: Identity IsDidFrozen (r:3 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: Measured) - // Storage: System EventTopics (r:4 w:4) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `t` is `[0, 1]`. - /// The range of component `c` is `[0, 1024]`. - fn seal_call_per_transfer_clone_kb(t: u32, c: u32) -> Weight { - // Minimum execution time: 2_383_715 nanoseconds. - Weight::from_ref_time(13_838_973_067) - // Standard Error: 22_196 - .saturating_add(Weight::from_ref_time(12_185_812).saturating_mul(c.into())) - .saturating_add(DbWeight::get().reads(171)) - .saturating_add(DbWeight::get().reads((9_u64).saturating_mul(t.into()))) - .saturating_add(DbWeight::get().writes(163)) - } - // Storage: Identity KeyRecords (r:3202 w:1600) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:3202 w:3202) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1601 w:1601) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1601 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: Contracts Nonce (r:1 w:1) - // Proof: Contracts Nonce (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: Measured) - // Storage: Contracts OwnerInfoOf (r:1600 w:1600) - // Proof: Contracts OwnerInfoOf (max_values: None, max_size: Some(88), added: 2563, mode: Measured) - // Storage: System EventTopics (r:1602 w:1602) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - // Storage: Identity DidKeys (r:0 w:1600) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Identity KeyPortfolioPermissions (r:0 w:1600) - // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) - // Storage: Identity KeyExtrinsicPermissions (r:0 w:1600) - // Proof Skipped: Identity KeyExtrinsicPermissions (max_values: None, max_size: None, mode: Measured) - // Storage: Identity KeyAssetPermissions (r:0 w:1600) - // Proof Skipped: Identity KeyAssetPermissions (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_instantiate(r: u32) -> Weight { - // Minimum execution time: 532_698 nanoseconds. - Weight::from_ref_time(547_732_000) - // Standard Error: 61_834_234 - .saturating_add(Weight::from_ref_time(53_166_481_809).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(13)) - .saturating_add(DbWeight::get().reads((640_u64).saturating_mul(r.into()))) - .saturating_add(DbWeight::get().writes(5)) - .saturating_add(DbWeight::get().writes((800_u64).saturating_mul(r.into()))) - } - // Storage: Identity KeyRecords (r:162 w:80) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:162 w:162) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:81 w:81) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:2 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: Contracts Nonce (r:1 w:1) - // Proof: Contracts Nonce (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: Measured) - // Storage: Contracts OwnerInfoOf (r:1 w:1) - // Proof: Contracts OwnerInfoOf (max_values: None, max_size: Some(88), added: 2563, mode: Measured) - // Storage: System EventTopics (r:82 w:82) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - // Storage: Identity DidKeys (r:0 w:80) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Identity KeyPortfolioPermissions (r:0 w:80) - // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) - // Storage: Identity KeyExtrinsicPermissions (r:0 w:80) - // Proof Skipped: Identity KeyExtrinsicPermissions (max_values: None, max_size: None, mode: Measured) - // Storage: Identity KeyAssetPermissions (r:0 w:80) - // Proof Skipped: Identity KeyAssetPermissions (max_values: None, max_size: None, mode: Measured) - /// The range of component `t` is `[0, 1]`. - /// The range of component `i` is `[0, 960]`. - /// The range of component `s` is `[0, 960]`. - fn seal_instantiate_per_transfer_input_salt_kb(t: u32, i: u32, s: u32) -> Weight { - // Minimum execution time: 143_039_451 nanoseconds. - Weight::from_ref_time(24_149_373_642) - // Standard Error: 107_503_088 - .saturating_add(Weight::from_ref_time(1_573_055_094).saturating_mul(t.into())) - // Standard Error: 170_588 - .saturating_add(Weight::from_ref_time(123_562_194).saturating_mul(i.into())) - // Standard Error: 170_588 - .saturating_add(Weight::from_ref_time(123_174_665).saturating_mul(s.into())) - .saturating_add(DbWeight::get().reads(495)) - .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(t.into()))) - .saturating_add(DbWeight::get().writes(726)) - .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(t.into()))) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 1]`. - fn seal_hash_sha2_256(r: u32) -> Weight { - // Minimum execution time: 521_092 nanoseconds. - Weight::from_ref_time(549_756_253) - // Standard Error: 4_912_912 - .saturating_add(Weight::from_ref_time(42_145_080).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `n` is `[0, 1024]`. - fn seal_hash_sha2_256_per_kb(n: u32) -> Weight { - // Minimum execution time: 565_038 nanoseconds. - Weight::from_ref_time(570_743_640) - // Standard Error: 75_789 - .saturating_add(Weight::from_ref_time(71_877_485).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 1]`. - fn seal_hash_keccak_256(r: u32) -> Weight { - // Minimum execution time: 520_631 nanoseconds. - Weight::from_ref_time(548_856_345) - // Standard Error: 4_774_220 - .saturating_add(Weight::from_ref_time(72_776_321).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `n` is `[0, 1024]`. - fn seal_hash_keccak_256_per_kb(n: u32) -> Weight { - // Minimum execution time: 603_646 nanoseconds. - Weight::from_ref_time(589_857_099) - // Standard Error: 92_340 - .saturating_add(Weight::from_ref_time(233_271_241).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 1]`. - fn seal_hash_blake2_256(r: u32) -> Weight { - // Minimum execution time: 521_293 nanoseconds. - Weight::from_ref_time(548_086_915) - // Standard Error: 4_227_483 - .saturating_add(Weight::from_ref_time(44_695_417).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `n` is `[0, 1024]`. - fn seal_hash_blake2_256_per_kb(n: u32) -> Weight { - // Minimum execution time: 584_126 nanoseconds. - Weight::from_ref_time(455_420_818) - // Standard Error: 55_489 - .saturating_add(Weight::from_ref_time(99_687_551).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 1]`. - fn seal_hash_blake2_128(r: u32) -> Weight { - // Minimum execution time: 522_604 nanoseconds. - Weight::from_ref_time(553_499_457) - // Standard Error: 4_520_787 - .saturating_add(Weight::from_ref_time(54_118_542).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `n` is `[0, 1024]`. - fn seal_hash_blake2_128_per_kb(n: u32) -> Weight { - // Minimum execution time: 590_276 nanoseconds. - Weight::from_ref_time(446_645_617) - // Standard Error: 32_141 - .saturating_add(Weight::from_ref_time(99_746_726).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 1]`. - fn seal_ecdsa_recover(r: u32) -> Weight { - // Minimum execution time: 525_218 nanoseconds. - Weight::from_ref_time(554_737_112) - // Standard Error: 5_073_773 - .saturating_add(Weight::from_ref_time(3_710_895_554).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 1]`. - fn seal_ecdsa_to_eth_address(r: u32) -> Weight { - // Minimum execution time: 524_447 nanoseconds. - Weight::from_ref_time(553_526_771) - // Standard Error: 4_965_388 - .saturating_add(Weight::from_ref_time(883_719_895).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1536 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: Contracts OwnerInfoOf (r:1536 w:1536) - // Proof: Contracts OwnerInfoOf (max_values: None, max_size: Some(88), added: 2563, mode: Measured) - // Storage: System EventTopics (r:1538 w:1538) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_set_code_hash(r: u32) -> Weight { - // Minimum execution time: 529_995 nanoseconds. - Weight::from_ref_time(545_868_000) - // Standard Error: 5_045_496 - .saturating_add(Weight::from_ref_time(2_026_142_732).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().reads((225_u64).saturating_mul(r.into()))) - .saturating_add(DbWeight::get().writes(3)) - .saturating_add(DbWeight::get().writes((150_u64).saturating_mul(r.into()))) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_reentrance_count(r: u32) -> Weight { - // Minimum execution time: 524_397 nanoseconds. - Weight::from_ref_time(557_472_545) - // Standard Error: 116_920 - .saturating_add(Weight::from_ref_time(11_388_938).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_account_reentrance_count(r: u32) -> Weight { - // Minimum execution time: 528_141 nanoseconds. - Weight::from_ref_time(625_286_159) - // Standard Error: 314_371 - .saturating_add(Weight::from_ref_time(25_329_831).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) - .saturating_add(DbWeight::get().writes(3)) - } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: System Account (r:1 w:0) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: Measured) - // Storage: Contracts ContractInfoOf (r:1 w:1) - // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: Measured) - // Storage: Contracts CodeStorage (r:1 w:0) - // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: Measured) - // Storage: Contracts Nonce (r:1 w:1) - // Proof: Contracts Nonce (max_values: Some(1), max_size: Some(8), added: 503, mode: Measured) - // Storage: System EventTopics (r:2 w:2) - // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) - /// The range of component `r` is `[0, 20]`. - fn seal_instantiation_nonce(r: u32) -> Weight { - // Minimum execution time: 535_894 nanoseconds. - Weight::from_ref_time(561_829_766) - // Standard Error: 105_459 - .saturating_add(Weight::from_ref_time(9_173_564).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(11)) - .saturating_add(DbWeight::get().writes(4)) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64const(r: u32) -> Weight { - // Minimum execution time: 1_352 nanoseconds. - Weight::from_ref_time(2_783_730) - // Standard Error: 7_339 - .saturating_add(Weight::from_ref_time(444_972).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64load(r: u32) -> Weight { - // Minimum execution time: 1_903 nanoseconds. - Weight::from_ref_time(3_697_937) - // Standard Error: 11_979 - .saturating_add(Weight::from_ref_time(966_137).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64store(r: u32) -> Weight { - // Minimum execution time: 1_973 nanoseconds. - Weight::from_ref_time(2_757_471) - // Standard Error: 13_718 - .saturating_add(Weight::from_ref_time(1_104_431).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_select(r: u32) -> Weight { - // Minimum execution time: 1_412 nanoseconds. - Weight::from_ref_time(3_181_079) - // Standard Error: 10_936 - .saturating_add(Weight::from_ref_time(955_369).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_if(r: u32) -> Weight { - // Minimum execution time: 1_412 nanoseconds. - Weight::from_ref_time(2_324_194) - // Standard Error: 25_130 - .saturating_add(Weight::from_ref_time(1_440_799).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_br(r: u32) -> Weight { - // Minimum execution time: 1_372 nanoseconds. - Weight::from_ref_time(3_283_270) - // Standard Error: 8_465 - .saturating_add(Weight::from_ref_time(544_421).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_br_if(r: u32) -> Weight { - // Minimum execution time: 1_382 nanoseconds. - Weight::from_ref_time(3_338_465) - // Standard Error: 9_756 - .saturating_add(Weight::from_ref_time(816_473).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_br_table(r: u32) -> Weight { - // Minimum execution time: 1_382 nanoseconds. - Weight::from_ref_time(3_177_028) - // Standard Error: 10_463 - .saturating_add(Weight::from_ref_time(1_035_963).saturating_mul(r.into())) - } - /// The range of component `e` is `[1, 256]`. - fn instr_br_table_per_entry(e: u32) -> Weight { - // Minimum execution time: 3_225 nanoseconds. - Weight::from_ref_time(4_194_754) - // Standard Error: 558 - .saturating_add(Weight::from_ref_time(4_369).saturating_mul(e.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_call(r: u32) -> Weight { - // Minimum execution time: 1_352 nanoseconds. - Weight::from_ref_time(1_834_243) - // Standard Error: 14_134 - .saturating_add(Weight::from_ref_time(3_373_361).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_call_indirect(r: u32) -> Weight { - // Minimum execution time: 1_823 nanoseconds. - Weight::from_ref_time(3_998_489) - // Standard Error: 19_496 - .saturating_add(Weight::from_ref_time(5_744_104).saturating_mul(r.into())) - } - /// The range of component `p` is `[0, 128]`. - fn instr_call_indirect_per_param(p: u32) -> Weight { - // Minimum execution time: 7_912 nanoseconds. - Weight::from_ref_time(10_851_572) - // Standard Error: 3_777 - .saturating_add(Weight::from_ref_time(181_526).saturating_mul(p.into())) - } - /// The range of component `l` is `[0, 1024]`. - fn instr_call_per_local(l: u32) -> Weight { - // Minimum execution time: 4_396 nanoseconds. - Weight::from_ref_time(4_797_570) - // Standard Error: 921 - .saturating_add(Weight::from_ref_time(115_290).saturating_mul(l.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_local_get(r: u32) -> Weight { - // Minimum execution time: 3_966 nanoseconds. - Weight::from_ref_time(5_462_134) - // Standard Error: 7_223 - .saturating_add(Weight::from_ref_time(309_078).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_local_set(r: u32) -> Weight { - // Minimum execution time: 3_946 nanoseconds. - Weight::from_ref_time(4_964_072) - // Standard Error: 7_086 - .saturating_add(Weight::from_ref_time(334_457).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_local_tee(r: u32) -> Weight { - // Minimum execution time: 3_936 nanoseconds. - Weight::from_ref_time(6_557_158) - // Standard Error: 9_590 - .saturating_add(Weight::from_ref_time(465_847).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_global_get(r: u32) -> Weight { - // Minimum execution time: 1_622 nanoseconds. - Weight::from_ref_time(3_553_697) - // Standard Error: 9_162 - .saturating_add(Weight::from_ref_time(872_644).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_global_set(r: u32) -> Weight { - // Minimum execution time: 1_603 nanoseconds. - Weight::from_ref_time(3_406_118) - // Standard Error: 8_451 - .saturating_add(Weight::from_ref_time(896_599).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_memory_current(r: u32) -> Weight { - // Minimum execution time: 1_993 nanoseconds. - Weight::from_ref_time(3_550_590) - // Standard Error: 8_487 - .saturating_add(Weight::from_ref_time(677_960).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 1]`. - fn instr_memory_grow(r: u32) -> Weight { - // Minimum execution time: 1_382 nanoseconds. - Weight::from_ref_time(1_782_096) - // Standard Error: 936_282 - .saturating_add(Weight::from_ref_time(296_916_570).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64clz(r: u32) -> Weight { - // Minimum execution time: 1_422 nanoseconds. - Weight::from_ref_time(3_246_580) - // Standard Error: 8_507 - .saturating_add(Weight::from_ref_time(750_957).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64ctz(r: u32) -> Weight { - // Minimum execution time: 1_412 nanoseconds. - Weight::from_ref_time(3_370_936) - // Standard Error: 7_962 - .saturating_add(Weight::from_ref_time(743_303).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64popcnt(r: u32) -> Weight { - // Minimum execution time: 1_362 nanoseconds. - Weight::from_ref_time(3_312_128) - // Standard Error: 8_706 - .saturating_add(Weight::from_ref_time(731_242).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64eqz(r: u32) -> Weight { - // Minimum execution time: 1_392 nanoseconds. - Weight::from_ref_time(3_198_835) - // Standard Error: 7_976 - .saturating_add(Weight::from_ref_time(745_980).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64extendsi32(r: u32) -> Weight { - // Minimum execution time: 1_392 nanoseconds. - Weight::from_ref_time(3_585_237) - // Standard Error: 8_560 - .saturating_add(Weight::from_ref_time(736_239).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64extendui32(r: u32) -> Weight { - // Minimum execution time: 1_392 nanoseconds. - Weight::from_ref_time(3_206_681) - // Standard Error: 8_505 - .saturating_add(Weight::from_ref_time(763_525).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i32wrapi64(r: u32) -> Weight { - // Minimum execution time: 1_372 nanoseconds. - Weight::from_ref_time(2_983_110) - // Standard Error: 13_750 - .saturating_add(Weight::from_ref_time(2_218_164).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64eq(r: u32) -> Weight { - // Minimum execution time: 1_352 nanoseconds. - Weight::from_ref_time(3_205_218) - // Standard Error: 10_221 - .saturating_add(Weight::from_ref_time(805_266).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64ne(r: u32) -> Weight { - // Minimum execution time: 1_422 nanoseconds. - Weight::from_ref_time(3_239_502) - // Standard Error: 10_206 - .saturating_add(Weight::from_ref_time(786_528).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64lts(r: u32) -> Weight { - // Minimum execution time: 1_392 nanoseconds. - Weight::from_ref_time(3_325_658) - // Standard Error: 9_625 - .saturating_add(Weight::from_ref_time(802_863).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64ltu(r: u32) -> Weight { - // Minimum execution time: 1_442 nanoseconds. - Weight::from_ref_time(3_201_207) - // Standard Error: 8_220 - .saturating_add(Weight::from_ref_time(778_538).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64gts(r: u32) -> Weight { - // Minimum execution time: 1_392 nanoseconds. - Weight::from_ref_time(3_259_518) - // Standard Error: 9_793 - .saturating_add(Weight::from_ref_time(799_152).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64gtu(r: u32) -> Weight { - // Minimum execution time: 1_312 nanoseconds. - Weight::from_ref_time(3_294_521) - // Standard Error: 8_990 - .saturating_add(Weight::from_ref_time(780_969).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64les(r: u32) -> Weight { - // Minimum execution time: 1_472 nanoseconds. - Weight::from_ref_time(3_594_211) - // Standard Error: 9_450 - .saturating_add(Weight::from_ref_time(771_796).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64leu(r: u32) -> Weight { - // Minimum execution time: 1_472 nanoseconds. - Weight::from_ref_time(3_424_447) - // Standard Error: 9_162 - .saturating_add(Weight::from_ref_time(771_317).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64ges(r: u32) -> Weight { - // Minimum execution time: 1_412 nanoseconds. - Weight::from_ref_time(3_190_916) - // Standard Error: 9_309 - .saturating_add(Weight::from_ref_time(786_726).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64geu(r: u32) -> Weight { - // Minimum execution time: 1_382 nanoseconds. - Weight::from_ref_time(3_500_169) - // Standard Error: 9_913 - .saturating_add(Weight::from_ref_time(794_546).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64add(r: u32) -> Weight { - // Minimum execution time: 1_372 nanoseconds. - Weight::from_ref_time(3_731_711) - // Standard Error: 9_528 - .saturating_add(Weight::from_ref_time(749_925).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64sub(r: u32) -> Weight { - // Minimum execution time: 1_342 nanoseconds. - Weight::from_ref_time(3_159_584) - // Standard Error: 9_229 - .saturating_add(Weight::from_ref_time(769_079).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64mul(r: u32) -> Weight { - // Minimum execution time: 1_292 nanoseconds. - Weight::from_ref_time(3_687_415) - // Standard Error: 9_473 - .saturating_add(Weight::from_ref_time(756_447).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64divs(r: u32) -> Weight { - // Minimum execution time: 1_372 nanoseconds. - Weight::from_ref_time(3_205_775) - // Standard Error: 10_518 - .saturating_add(Weight::from_ref_time(946_927).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64divu(r: u32) -> Weight { - // Minimum execution time: 1_402 nanoseconds. - Weight::from_ref_time(3_434_550) - // Standard Error: 11_131 - .saturating_add(Weight::from_ref_time(1_021_101).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64rems(r: u32) -> Weight { - // Minimum execution time: 1_412 nanoseconds. - Weight::from_ref_time(3_546_024) - // Standard Error: 9_706 - .saturating_add(Weight::from_ref_time(972_567).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64remu(r: u32) -> Weight { - // Minimum execution time: 1_402 nanoseconds. - Weight::from_ref_time(3_021_270) - // Standard Error: 10_847 - .saturating_add(Weight::from_ref_time(945_604).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64and(r: u32) -> Weight { - // Minimum execution time: 1_302 nanoseconds. - Weight::from_ref_time(3_505_463) - // Standard Error: 10_203 - .saturating_add(Weight::from_ref_time(796_210).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64or(r: u32) -> Weight { - // Minimum execution time: 1_372 nanoseconds. - Weight::from_ref_time(3_516_154) - // Standard Error: 10_127 - .saturating_add(Weight::from_ref_time(773_188).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64xor(r: u32) -> Weight { - // Minimum execution time: 1_372 nanoseconds. - Weight::from_ref_time(3_567_010) - // Standard Error: 9_691 - .saturating_add(Weight::from_ref_time(774_602).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64shl(r: u32) -> Weight { - // Minimum execution time: 1_402 nanoseconds. - Weight::from_ref_time(3_452_123) - // Standard Error: 9_970 - .saturating_add(Weight::from_ref_time(797_048).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64shrs(r: u32) -> Weight { - // Minimum execution time: 1_342 nanoseconds. - Weight::from_ref_time(3_440_660) - // Standard Error: 9_536 - .saturating_add(Weight::from_ref_time(764_439).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64shru(r: u32) -> Weight { - // Minimum execution time: 1_373 nanoseconds. - Weight::from_ref_time(3_004_001) - // Standard Error: 9_392 - .saturating_add(Weight::from_ref_time(773_645).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64rotl(r: u32) -> Weight { - // Minimum execution time: 1_362 nanoseconds. - Weight::from_ref_time(3_273_952) - // Standard Error: 10_637 - .saturating_add(Weight::from_ref_time(809_037).saturating_mul(r.into())) - } - /// The range of component `r` is `[0, 50]`. - fn instr_i64rotr(r: u32) -> Weight { - // Minimum execution time: 1_322 nanoseconds. - Weight::from_ref_time(3_288_736) - // Standard Error: 9_241 - .saturating_add(Weight::from_ref_time(769_025).saturating_mul(r.into())) - } +impl pallet_contracts::WeightInfo for SubstrateWeight { + /// Storage: `Contracts::DeletionQueueCounter` (r:1 w:0) + /// Proof: `Contracts::DeletionQueueCounter` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) + fn on_process_deletion_queue_batch() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `1485` + // Minimum execution time: 662_000 picoseconds. + Weight::from_parts(715_000, 1485) + .saturating_add(DbWeight::get().reads(1_u64)) + } + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `k` is `[0, 1024]`. + fn on_initialize_per_trie_key(k: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `224 + k * (69 ±0)` + // Estimated: `216 + k * (70 ±0)` + // Minimum execution time: 12_277_000 picoseconds. + Weight::from_parts(12_597_000, 216) + // Standard Error: 3_444 + .saturating_add(Weight::from_parts(1_357_086, 0).saturating_mul(k.into())) + .saturating_add(DbWeight::get().reads(2_u64)) + .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(k.into()))) + .saturating_add(DbWeight::get().writes(2_u64)) + .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(k.into()))) + .saturating_add(Weight::from_parts(0, 70).saturating_mul(k.into())) + } + /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc553022fca90611ba8b7942f8bdb3b97f6580` (r:2 w:1) + /// Proof: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc553022fca90611ba8b7942f8bdb3b97f6580` (r:2 w:1) + /// The range of component `c` is `[0, 125952]`. + fn v9_migration_step(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `49 + c * (1 ±0)` + // Estimated: `5987 + c * (1 ±0)` + // Minimum execution time: 5_876_000 picoseconds. + Weight::from_parts(6_203_000, 5987) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_860, 0).saturating_mul(c.into())) + .saturating_add(DbWeight::get().reads(2_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) + } + /// Storage: `Contracts::ContractInfoOf` (r:2 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + fn v10_migration_step() -> Weight { + // Proof Size summary in bytes: + // Measured: `322` + // Estimated: `6262` + // Minimum execution time: 14_462_000 picoseconds. + Weight::from_parts(15_233_000, 6262) + .saturating_add(DbWeight::get().reads(3_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Contracts::DeletionQueue` (r:1 w:1025) + /// Proof: `Contracts::DeletionQueue` (`max_values`: None, `max_size`: Some(142), added: 2617, mode: `Measured`) + /// Storage: `Contracts::DeletionQueueCounter` (r:0 w:1) + /// Proof: `Contracts::DeletionQueueCounter` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) + /// The range of component `k` is `[0, 1024]`. + fn v11_migration_step(k: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `9 + k * (1 ±0)` + // Estimated: `3473 + k * (1 ±0)` + // Minimum execution time: 2_288_000 picoseconds. + Weight::from_parts(2_332_000, 3473) + // Standard Error: 885 + .saturating_add(Weight::from_parts(1_101_283, 0).saturating_mul(k.into())) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(2_u64)) + .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(k.into()))) + .saturating_add(Weight::from_parts(0, 1).saturating_mul(k.into())) + } + /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc553053f13fd319a03c211337c76e0fe776df` (r:2 w:0) + /// Proof: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc553053f13fd319a03c211337c76e0fe776df` (r:2 w:0) + /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc553022fca90611ba8b7942f8bdb3b97f6580` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc553022fca90611ba8b7942f8bdb3b97f6580` (r:1 w:1) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `Contracts::CodeInfoOf` (r:0 w:1) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// The range of component `c` is `[0, 125952]`. + fn v12_migration_step(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `188 + c * (1 ±0)` + // Estimated: `6126 + c * (1 ±0)` + // Minimum execution time: 15_169_000 picoseconds. + Weight::from_parts(5_930_836, 6126) + // Standard Error: 6 + .saturating_add(Weight::from_parts(818, 0).saturating_mul(c.into())) + .saturating_add(DbWeight::get().reads(4_u64)) + .saturating_add(DbWeight::get().writes(2_u64)) + .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) + } + /// Storage: `Contracts::ContractInfoOf` (r:2 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + fn v13_migration_step() -> Weight { + // Proof Size summary in bytes: + // Measured: `303` + // Estimated: `6243` + // Minimum execution time: 11_213_000 picoseconds. + Weight::from_parts(11_459_000, 6243) + .saturating_add(DbWeight::get().reads(2_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Contracts::CodeInfoOf` (r:2 w:0) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `Balances::Holds` (r:1 w:0) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(427), added: 2902, mode: `Measured`) + fn v14_migration_step() -> Weight { + // Proof Size summary in bytes: + // Measured: `139` + // Estimated: `6079` + // Minimum execution time: 43_708_000 picoseconds. + Weight::from_parts(44_426_000, 6079) + .saturating_add(DbWeight::get().reads(4_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Contracts::ContractInfoOf` (r:2 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + /// Storage: `System::Account` (r:2 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + fn v15_migration_step() -> Weight { + // Proof Size summary in bytes: + // Measured: `355` + // Estimated: `6295` + // Minimum execution time: 38_695_000 picoseconds. + Weight::from_parts(39_802_000, 6295) + .saturating_add(DbWeight::get().reads(4_u64)) + .saturating_add(DbWeight::get().writes(2_u64)) + } + /// Storage: `Contracts::ContractInfoOf` (r:2 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + fn v16_migration_step() -> Weight { + // Proof Size summary in bytes: + // Measured: `272` + // Estimated: `6212` + // Minimum execution time: 10_591_000 picoseconds. + Weight::from_parts(11_053_000, 6212) + .saturating_add(DbWeight::get().reads(2_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Contracts::MigrationInProgress` (r:1 w:1) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + fn migration_noop() -> Weight { + // Proof Size summary in bytes: + // Measured: `6` + // Estimated: `1491` + // Minimum execution time: 1_920_000 picoseconds. + Weight::from_parts(2_054_000, 1491) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Contracts::MigrationInProgress` (r:1 w:1) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:1) + fn migrate() -> Weight { + // Proof Size summary in bytes: + // Measured: `29` + // Estimated: `3494` + // Minimum execution time: 9_449_000 picoseconds. + Weight::from_parts(9_800_000, 3494) + .saturating_add(DbWeight::get().reads(2_u64)) + .saturating_add(DbWeight::get().writes(2_u64)) + } + /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) + fn on_runtime_upgrade_noop() -> Weight { + // Proof Size summary in bytes: + // Measured: `6` + // Estimated: `3471` + // Minimum execution time: 3_272_000 picoseconds. + Weight::from_parts(3_396_000, 3471) + .saturating_add(DbWeight::get().reads(1_u64)) + } + /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) + /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + fn on_runtime_upgrade_in_progress() -> Weight { + // Proof Size summary in bytes: + // Measured: `30` + // Estimated: `3495` + // Minimum execution time: 4_972_000 picoseconds. + Weight::from_parts(5_130_000, 3495) + .saturating_add(DbWeight::get().reads(2_u64)) + } + /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) + /// Storage: `Contracts::MigrationInProgress` (r:1 w:1) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + fn on_runtime_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `6` + // Estimated: `3471` + // Minimum execution time: 4_452_000 picoseconds. + Weight::from_parts(4_651_000, 3471) + .saturating_add(DbWeight::get().reads(2_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:1 w:0) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + /// Storage: `Timestamp::Now` (r:1 w:0) + /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// The range of component `c` is `[0, 125952]`. + fn call_with_code_per_byte(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `460 + c * (1 ±0)` + // Estimated: `3925 + c * (1 ±0)` + // Minimum execution time: 257_238_000 picoseconds. + Weight::from_parts(270_073_069, 3925) + // Standard Error: 8 + .saturating_add(Weight::from_parts(1_175, 0).saturating_mul(c.into())) + .saturating_add(DbWeight::get().reads(6_u64)) + .saturating_add(DbWeight::get().writes(2_u64)) + .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) + } + /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Balances::Holds` (r:2 w:2) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(427), added: 2902, mode: `Measured`) + /// Storage: `Contracts::Nonce` (r:1 w:1) + /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) + /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + /// Storage: `Timestamp::Now` (r:1 w:0) + /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:0 w:1) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + /// The range of component `c` is `[0, 125952]`. + /// The range of component `i` is `[0, 1048576]`. + /// The range of component `s` is `[0, 1048576]`. + fn instantiate_with_code(c: u32, i: u32, s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `5940` + // Minimum execution time: 11_691_973_000 picoseconds. + Weight::from_parts(11_859_232_000, 5940) + // Standard Error: 760 + .saturating_add(Weight::from_parts(8_842, 0).saturating_mul(c.into())) + // Standard Error: 91 + .saturating_add(Weight::from_parts(1_397, 0).saturating_mul(i.into())) + // Standard Error: 91 + .saturating_add(Weight::from_parts(1_561, 0).saturating_mul(s.into())) + .saturating_add(DbWeight::get().reads(8_u64)) + .saturating_add(DbWeight::get().writes(7_u64)) + } + /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:1 w:0) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + /// Storage: `Contracts::Nonce` (r:1 w:1) + /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) + /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + /// Storage: `Timestamp::Now` (r:1 w:0) + /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(427), added: 2902, mode: `Measured`) + /// The range of component `i` is `[0, 1048576]`. + /// The range of component `s` is `[0, 1048576]`. + fn instantiate(i: u32, s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `205` + // Estimated: `3670` + // Minimum execution time: 5_930_123_000 picoseconds. + Weight::from_parts(5_938_894_000, 3670) + // Standard Error: 72 + .saturating_add(Weight::from_parts(1_660, 0).saturating_mul(i.into())) + // Standard Error: 72 + .saturating_add(Weight::from_parts(1_841, 0).saturating_mul(s.into())) + .saturating_add(DbWeight::get().reads(8_u64)) + .saturating_add(DbWeight::get().writes(5_u64)) + } + /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:1 w:0) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + /// Storage: `Timestamp::Now` (r:1 w:0) + /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + fn call() -> Weight { + // Proof Size summary in bytes: + // Measured: `472` + // Estimated: `3937` + // Minimum execution time: 171_677_000 picoseconds. + Weight::from_parts(176_340_000, 3937) + .saturating_add(DbWeight::get().reads(6_u64)) + .saturating_add(DbWeight::get().writes(2_u64)) + } + /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(427), added: 2902, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:0 w:1) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + /// The range of component `c` is `[0, 125952]`. + fn upload_code_determinism_enforced(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3465` + // Minimum execution time: 233_222_000 picoseconds. + Weight::from_parts(256_594_116, 3465) + // Standard Error: 92 + .saturating_add(Weight::from_parts(48_635, 0).saturating_mul(c.into())) + .saturating_add(DbWeight::get().reads(3_u64)) + .saturating_add(DbWeight::get().writes(3_u64)) + } + /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(427), added: 2902, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:0 w:1) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + /// The range of component `c` is `[0, 125952]`. + fn upload_code_determinism_relaxed(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3465` + // Minimum execution time: 244_888_000 picoseconds. + Weight::from_parts(279_103_331, 3465) + // Standard Error: 76 + .saturating_add(Weight::from_parts(48_450, 0).saturating_mul(c.into())) + .saturating_add(DbWeight::get().reads(3_u64)) + .saturating_add(DbWeight::get().writes(3_u64)) + } + /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(427), added: 2902, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:0 w:1) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + fn remove_code() -> Weight { + // Proof Size summary in bytes: + // Measured: `178` + // Estimated: `3643` + // Minimum execution time: 41_485_000 picoseconds. + Weight::from_parts(42_404_000, 3643) + .saturating_add(DbWeight::get().reads(3_u64)) + .saturating_add(DbWeight::get().writes(3_u64)) + } + /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + /// Storage: `Contracts::CodeInfoOf` (r:2 w:2) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + fn set_code() -> Weight { + // Proof Size summary in bytes: + // Measured: `415` + // Estimated: `6355` + // Minimum execution time: 25_614_000 picoseconds. + Weight::from_parts(26_843_000, 6355) + .saturating_add(DbWeight::get().reads(4_u64)) + .saturating_add(DbWeight::get().writes(3_u64)) + } + /// The range of component `r` is `[0, 1600]`. + fn noop_host_fn(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 8_437_000 picoseconds. + Weight::from_parts(9_257_820, 0) + // Standard Error: 134 + .saturating_add(Weight::from_parts(52_863, 0).saturating_mul(r.into())) + } + fn seal_caller() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 687_000 picoseconds. + Weight::from_parts(756_000, 0) + } + /// Storage: `Contracts::ContractInfoOf` (r:1 w:0) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + fn seal_is_contract() -> Weight { + // Proof Size summary in bytes: + // Measured: `217` + // Estimated: `3682` + // Minimum execution time: 7_928_000 picoseconds. + Weight::from_parts(8_224_000, 3682) + .saturating_add(DbWeight::get().reads(1_u64)) + } + /// Storage: `Contracts::ContractInfoOf` (r:1 w:0) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + fn seal_code_hash() -> Weight { + // Proof Size summary in bytes: + // Measured: `310` + // Estimated: `3775` + // Minimum execution time: 9_508_000 picoseconds. + Weight::from_parts(9_994_000, 3775) + .saturating_add(DbWeight::get().reads(1_u64)) + } + fn seal_own_code_hash() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 815_000 picoseconds. + Weight::from_parts(920_000, 0) + } + fn seal_caller_is_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 370_000 picoseconds. + Weight::from_parts(393_000, 0) + } + fn seal_caller_is_root() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 295_000 picoseconds. + Weight::from_parts(329_000, 0) + } + fn seal_address() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 642_000 picoseconds. + Weight::from_parts(692_000, 0) + } + fn seal_gas_left() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 779_000 picoseconds. + Weight::from_parts(829_000, 0) + } + fn seal_balance() -> Weight { + // Proof Size summary in bytes: + // Measured: `101` + // Estimated: `0` + // Minimum execution time: 4_582_000 picoseconds. + Weight::from_parts(4_896_000, 0) + } + fn seal_value_transferred() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 723_000 picoseconds. + Weight::from_parts(773_000, 0) + } + fn seal_minimum_balance() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 718_000 picoseconds. + Weight::from_parts(751_000, 0) + } + fn seal_block_number() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 679_000 picoseconds. + Weight::from_parts(728_000, 0) + } + fn seal_now() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 723_000 picoseconds. + Weight::from_parts(774_000, 0) + } + fn seal_weight_to_fee() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_577_000 picoseconds. + Weight::from_parts(1_709_000, 0) + } + /// The range of component `n` is `[0, 1048572]`. + fn seal_input(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 566_000 picoseconds. + Weight::from_parts(430_440, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(113, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 1048572]`. + fn seal_return(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 337_000 picoseconds. + Weight::from_parts(389_000, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(203, 0).saturating_mul(n.into())) + } + /// Storage: `Contracts::DeletionQueueCounter` (r:1 w:1) + /// Proof: `Contracts::DeletionQueueCounter` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) + /// Storage: `Contracts::CodeInfoOf` (r:33 w:33) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Contracts::DeletionQueue` (r:0 w:1) + /// Proof: `Contracts::DeletionQueue` (`max_values`: None, `max_size`: Some(142), added: 2617, mode: `Measured`) + /// The range of component `n` is `[0, 32]`. + fn seal_terminate(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `182 + n * (78 ±0)` + // Estimated: `3647 + n * (2553 ±0)` + // Minimum execution time: 15_302_000 picoseconds. + Weight::from_parts(15_426_466, 3647) + // Standard Error: 8_441 + .saturating_add(Weight::from_parts(4_507_899, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(2_u64)) + .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(n.into()))) + .saturating_add(DbWeight::get().writes(3_u64)) + .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 2553).saturating_mul(n.into())) + } + /// Storage: `Babe::Randomness` (r:1 w:0) + /// Storage: `Babe::EpochStart` (r:1 w:0) + /// TODO: Weights need re-benchmarking after switching from RandomnessCollectiveFlip to Babe. + fn seal_random() -> Weight { + // Conservative overestimate from old RandomnessCollectiveFlip benchmarks. + Weight::from_parts(2_359_000, 1485) + .saturating_add(DbWeight::get().reads(1_u64)) + } + /// Storage: `System::EventTopics` (r:4 w:4) + /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `t` is `[0, 4]`. + /// The range of component `n` is `[0, 16384]`. + fn seal_deposit_event(t: u32, n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `990 + t * (2475 ±0)` + // Minimum execution time: 3_963_000 picoseconds. + Weight::from_parts(4_143_031, 990) + // Standard Error: 6_527 + .saturating_add(Weight::from_parts(2_186_206, 0).saturating_mul(t.into())) + // Standard Error: 1 + .saturating_add(Weight::from_parts(25, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(t.into()))) + .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(t.into()))) + .saturating_add(Weight::from_parts(0, 2475).saturating_mul(t.into())) + } + /// The range of component `i` is `[0, 1048576]`. + fn seal_debug_message(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 411_000 picoseconds. + Weight::from_parts(582_596, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(712, 0).saturating_mul(i.into())) + } + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn get_storage_empty() -> Weight { + // Proof Size summary in bytes: + // Measured: `16522` + // Estimated: `16522` + // Minimum execution time: 12_684_000 picoseconds. + Weight::from_parts(13_116_000, 16522) + .saturating_add(DbWeight::get().reads(1_u64)) + } + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn get_storage_full() -> Weight { + // Proof Size summary in bytes: + // Measured: `26532` + // Estimated: `26532` + // Minimum execution time: 53_633_000 picoseconds. + Weight::from_parts(55_592_000, 26532) + .saturating_add(DbWeight::get().reads(1_u64)) + } + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn set_storage_empty() -> Weight { + // Proof Size summary in bytes: + // Measured: `16522` + // Estimated: `16522` + // Minimum execution time: 14_319_000 picoseconds. + Weight::from_parts(14_725_000, 16522) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn set_storage_full() -> Weight { + // Proof Size summary in bytes: + // Measured: `26532` + // Estimated: `26532` + // Minimum execution time: 56_431_000 picoseconds. + Weight::from_parts(57_931_000, 26532) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `n` is `[0, 16384]`. + /// The range of component `o` is `[0, 16384]`. + fn seal_set_storage(n: u32, o: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `154 + o * (1 ±0)` + // Estimated: `153 + o * (1 ±0)` + // Minimum execution time: 9_356_000 picoseconds. + Weight::from_parts(8_075_772, 153) + // Standard Error: 2 + .saturating_add(Weight::from_parts(276, 0).saturating_mul(n.into())) + // Standard Error: 2 + .saturating_add(Weight::from_parts(114, 0).saturating_mul(o.into())) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + .saturating_add(Weight::from_parts(0, 1).saturating_mul(o.into())) + } + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `n` is `[0, 16384]`. + fn seal_clear_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `152 + n * (1 ±0)` + // Estimated: `152 + n * (1 ±0)` + // Minimum execution time: 6_210_000 picoseconds. + Weight::from_parts(7_608_498, 152) + // Standard Error: 2 + .saturating_add(Weight::from_parts(137, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) + } + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `n` is `[0, 16384]`. + fn seal_get_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `152 + n * (1 ±0)` + // Estimated: `152 + n * (1 ±0)` + // Minimum execution time: 5_676_000 picoseconds. + Weight::from_parts(7_581_087, 152) + // Standard Error: 2 + .saturating_add(Weight::from_parts(557, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) + } + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `n` is `[0, 16384]`. + fn seal_contains_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `152 + n * (1 ±0)` + // Estimated: `152 + n * (1 ±0)` + // Minimum execution time: 5_286_000 picoseconds. + Weight::from_parts(6_872_699, 152) + // Standard Error: 1 + .saturating_add(Weight::from_parts(119, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) + } + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `n` is `[0, 16384]`. + fn seal_take_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `152 + n * (1 ±0)` + // Estimated: `152 + n * (1 ±0)` + // Minimum execution time: 6_353_000 picoseconds. + Weight::from_parts(8_139_270, 152) + // Standard Error: 5 + .saturating_add(Weight::from_parts(590, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) + } + fn set_transient_storage_empty() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_487_000 picoseconds. + Weight::from_parts(1_610_000, 0) + } + fn set_transient_storage_full() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_549_000 picoseconds. + Weight::from_parts(2_699_000, 0) + } + fn get_transient_storage_empty() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_279_000 picoseconds. + Weight::from_parts(3_339_000, 0) + } + fn get_transient_storage_full() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_085_000 picoseconds. + Weight::from_parts(4_332_000, 0) + } + fn rollback_transient_storage() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_522_000 picoseconds. + Weight::from_parts(1_723_000, 0) + } + /// The range of component `n` is `[0, 16384]`. + /// The range of component `o` is `[0, 16384]`. + fn seal_set_transient_storage(n: u32, o: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 5_583_000 picoseconds. + Weight::from_parts(2_628_557, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(204, 0).saturating_mul(n.into())) + // Standard Error: 0 + .saturating_add(Weight::from_parts(222, 0).saturating_mul(o.into())) + } + /// The range of component `n` is `[0, 16384]`. + fn seal_clear_transient_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_188_000 picoseconds. + Weight::from_parts(2_515_424, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(227, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 16384]`. + fn seal_get_transient_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_890_000 picoseconds. + Weight::from_parts(2_182_387, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(226, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 16384]`. + fn seal_contains_transient_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_738_000 picoseconds. + Weight::from_parts(1_974_584, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(112, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 16384]`. + fn seal_take_transient_storage(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 7_913_000 picoseconds. + Weight::from_parts(8_133_541, 0) + // Standard Error: 2 + .saturating_add(Weight::from_parts(3, 0).saturating_mul(n.into())) + } + fn seal_transfer() -> Weight { + // Proof Size summary in bytes: + // Measured: `101` + // Estimated: `0` + // Minimum execution time: 8_943_000 picoseconds. + Weight::from_parts(9_230_000, 0) + } + /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:1 w:0) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// The range of component `t` is `[0, 1]`. + /// The range of component `i` is `[0, 1048576]`. + fn seal_call(t: u32, i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `459 + t * (242 ±0)` + // Estimated: `3924 + t * (2083 ±0)` + // Minimum execution time: 132_736_000 picoseconds. + Weight::from_parts(129_310_380, 3924) + // Standard Error: 270_788 + .saturating_add(Weight::from_parts(45_537_319, 0).saturating_mul(t.into())) + // Standard Error: 0 + .saturating_add(Weight::from_parts(7, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(3_u64)) + .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(t.into()))) + .saturating_add(DbWeight::get().writes(1_u64)) + .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(t.into()))) + .saturating_add(Weight::from_parts(0, 2083).saturating_mul(t.into())) + } + /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:1 w:0) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + fn seal_delegate_call() -> Weight { + // Proof Size summary in bytes: + // Measured: `269` + // Estimated: `3734` + // Minimum execution time: 120_046_000 picoseconds. + Weight::from_parts(121_748_000, 3734) + .saturating_add(DbWeight::get().reads(2_u64)) + } + /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:1 w:0) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + /// Storage: `Contracts::Nonce` (r:1 w:0) + /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) + /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// The range of component `i` is `[0, 983040]`. + /// The range of component `s` is `[0, 983040]`. + fn seal_instantiate(i: u32, s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `463` + // Estimated: `3937` + // Minimum execution time: 1_877_748_000 picoseconds. + Weight::from_parts(156_912_679, 3937) + // Standard Error: 19 + .saturating_add(Weight::from_parts(1_663, 0).saturating_mul(i.into())) + // Standard Error: 19 + .saturating_add(Weight::from_parts(2_033, 0).saturating_mul(s.into())) + .saturating_add(DbWeight::get().reads(5_u64)) + .saturating_add(DbWeight::get().writes(3_u64)) + } + /// The range of component `n` is `[0, 1048576]`. + fn seal_hash_sha2_256(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 940_000 picoseconds. + Weight::from_parts(8_848_107, 0) + // Standard Error: 1 + .saturating_add(Weight::from_parts(1_322, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 1048576]`. + fn seal_hash_keccak_256(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_308_000 picoseconds. + Weight::from_parts(13_432_971, 0) + // Standard Error: 1 + .saturating_add(Weight::from_parts(3_515, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 1048576]`. + fn seal_hash_blake2_256(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 839_000 picoseconds. + Weight::from_parts(4_868_192, 0) + // Standard Error: 1 + .saturating_add(Weight::from_parts(1_458, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 1048576]`. + fn seal_hash_blake2_128(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 790_000 picoseconds. + Weight::from_parts(814_000, 0) + // Standard Error: 2 + .saturating_add(Weight::from_parts(1_495, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 125697]`. + fn seal_sr25519_verify(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 42_811_000 picoseconds. + Weight::from_parts(41_107_222, 0) + // Standard Error: 9 + .saturating_add(Weight::from_parts(4_949, 0).saturating_mul(n.into())) + } + fn seal_ecdsa_recover() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 47_723_000 picoseconds. + Weight::from_parts(48_486_000, 0) + } + fn seal_ecdsa_to_eth_address() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 12_903_000 picoseconds. + Weight::from_parts(13_026_000, 0) + } + /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:1 w:0) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + fn seal_set_code_hash() -> Weight { + // Proof Size summary in bytes: + // Measured: `269` + // Estimated: `3734` + // Minimum execution time: 19_643_000 picoseconds. + Weight::from_parts(20_330_000, 3734) + .saturating_add(DbWeight::get().reads(2_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + fn lock_delegate_dependency() -> Weight { + // Proof Size summary in bytes: + // Measured: `218` + // Estimated: `3683` + // Minimum execution time: 10_632_000 picoseconds. + Weight::from_parts(11_052_000, 3683) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`) + fn unlock_delegate_dependency() -> Weight { + // Proof Size summary in bytes: + // Measured: `218` + // Estimated: `3558` + // Minimum execution time: 9_383_000 picoseconds. + Weight::from_parts(9_640_000, 3558) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + fn seal_reentrance_count() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 391_000 picoseconds. + Weight::from_parts(415_000, 0) + } + fn seal_account_reentrance_count() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 375_000 picoseconds. + Weight::from_parts(397_000, 0) + } + /// Storage: `Contracts::Nonce` (r:1 w:0) + /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) + fn seal_instantiation_nonce() -> Weight { + // Proof Size summary in bytes: + // Measured: `82` + // Estimated: `1567` + // Minimum execution time: 2_883_000 picoseconds. + Weight::from_parts(3_005_000, 1567) + .saturating_add(DbWeight::get().reads(1_u64)) + } + /// The range of component `r` is `[0, 5000]`. + fn instr_i64_load_store(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 947_000 picoseconds. + Weight::from_parts(943_263, 0) + // Standard Error: 11 + .saturating_add(Weight::from_parts(7_556, 0).saturating_mul(r.into())) + } } diff --git a/pallets/weights/src/pallet_corporate_actions.rs b/pallets/weights/src/pallet_corporate_actions.rs index ae345e6982..19452b3ffe 100644 --- a/pallets/weights/src/pallet_corporate_actions.rs +++ b/pallets/weights/src/pallet_corporate_actions.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_corporate_actions //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,21 +54,15 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_corporate_actions::WeightInfo for SubstrateWeight { // Storage: CorporateAction MaxDetailsLength (r:0 w:1) - // Proof: CorporateAction MaxDetailsLength (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Proof Skipped: CorporateAction MaxDetailsLength (max_values: Some(1), max_size: None, mode: Measured) fn set_max_details_length() -> Weight { - // Minimum execution time: 7_852 nanoseconds. - Weight::from_ref_time(8_353_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 9_604 nanoseconds. + Weight::from_parts(10_586_000, 0).saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -77,45 +71,33 @@ impl pallet_corporate_actions::WeightInfo for SubstrateWeight { // Proof Skipped: CorporateAction DefaultTargetIdentities (max_values: None, max_size: None, mode: Measured) /// The range of component `t` is `[0, 500]`. fn set_default_targets(t: u32) -> Weight { - // Minimum execution time: 53_280 nanoseconds. - Weight::from_ref_time(64_817_391) - // Standard Error: 2_790 - .saturating_add(Weight::from_ref_time(310_282).saturating_mul(t.into())) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 34_903 nanoseconds. + Weight::from_parts(43_628_601, 0) + // Standard Error: 2_349 + .saturating_add(Weight::from_parts(313_974, 0).saturating_mul(t.into())) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: CorporateAction DefaultWithholdingTax (r:1 w:1) - // Proof: CorporateAction DefaultWithholdingTax (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: CorporateAction DefaultWithholdingTax (max_values: None, max_size: None, mode: Measured) fn set_default_withholding_tax() -> Weight { - // Minimum execution time: 53_320 nanoseconds. - Weight::from_ref_time(57_887_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 35_834 nanoseconds. + Weight::from_parts(40_821_000, 0) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -124,51 +106,47 @@ impl pallet_corporate_actions::WeightInfo for SubstrateWeight { // Proof Skipped: CorporateAction DidWithholdingTax (max_values: None, max_size: None, mode: Measured) /// The range of component `w` is `[0, 999]`. fn set_did_withholding_tax(w: u32) -> Weight { - // Minimum execution time: 57_666 nanoseconds. - Weight::from_ref_time(74_073_885) - // Standard Error: 1_775 - .saturating_add(Weight::from_ref_time(91_435).saturating_mul(w.into())) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 37_276 nanoseconds. + Weight::from_parts(58_202_009, 0) + // Standard Error: 1_772 + .saturating_add(Weight::from_parts(68_189, 0).saturating_mul(w.into())) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: CorporateAction MaxDetailsLength (r:1 w:0) - // Proof: CorporateAction MaxDetailsLength (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Proof Skipped: CorporateAction MaxDetailsLength (max_values: Some(1), max_size: None, mode: Measured) // Storage: CorporateAction CAIdSequence (r:1 w:1) - // Proof: CorporateAction CAIdSequence (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: CorporateAction CAIdSequence (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Checkpoint SchedulesMaxComplexity (r:1 w:0) - // Proof: Checkpoint SchedulesMaxComplexity (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint SchedulesMaxComplexity (max_values: Some(1), max_size: None, mode: Measured) // Storage: Checkpoint CachedNextCheckpoints (r:1 w:1) // Proof Skipped: Checkpoint CachedNextCheckpoints (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduleIdSequence (r:1 w:1) - // Proof: Checkpoint ScheduleIdSequence (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint ScheduleIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: CorporateAction DefaultTargetIdentities (r:1 w:0) // Proof Skipped: CorporateAction DefaultTargetIdentities (max_values: None, max_size: None, mode: Measured) // Storage: CorporateAction DefaultWithholdingTax (r:1 w:0) - // Proof: CorporateAction DefaultWithholdingTax (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: CorporateAction DefaultWithholdingTax (max_values: None, max_size: None, mode: Measured) // Storage: CorporateAction DidWithholdingTax (r:1 w:0) // Proof Skipped: CorporateAction DidWithholdingTax (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduledCheckpoints (r:0 w:1) // Proof Skipped: Checkpoint ScheduledCheckpoints (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduleRefCount (r:0 w:1) - // Proof: Checkpoint ScheduleRefCount (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint ScheduleRefCount (max_values: None, max_size: None, mode: Measured) // Storage: CorporateAction CorporateActions (r:0 w:1) // Proof Skipped: CorporateAction CorporateActions (max_values: None, max_size: None, mode: Measured) // Storage: CorporateAction Details (r:0 w:1) @@ -176,47 +154,43 @@ impl pallet_corporate_actions::WeightInfo for SubstrateWeight { /// The range of component `w` is `[0, 1000]`. /// The range of component `t` is `[0, 500]`. fn initiate_corporate_action_use_defaults(w: u32, t: u32) -> Weight { - // Minimum execution time: 178_668 nanoseconds. - Weight::from_ref_time(181_321_577) - // Standard Error: 1_851 - .saturating_add(Weight::from_ref_time(52_142).saturating_mul(w.into())) - // Standard Error: 3_702 - .saturating_add(Weight::from_ref_time(35_107).saturating_mul(t.into())) - .saturating_add(DbWeight::get().reads(18)) + // Minimum execution time: 164_487 nanoseconds. + Weight::from_parts(132_794_590, 0) + // Standard Error: 1_984 + .saturating_add(Weight::from_parts(71_890, 0).saturating_mul(w.into())) + // Standard Error: 3_966 + .saturating_add(Weight::from_parts(72_435, 0).saturating_mul(t.into())) + .saturating_add(DbWeight::get().reads(15)) .saturating_add(DbWeight::get().writes(7)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: CorporateAction MaxDetailsLength (r:1 w:0) - // Proof: CorporateAction MaxDetailsLength (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Proof Skipped: CorporateAction MaxDetailsLength (max_values: Some(1), max_size: None, mode: Measured) // Storage: CorporateAction CAIdSequence (r:1 w:1) - // Proof: CorporateAction CAIdSequence (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: CorporateAction CAIdSequence (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Checkpoint SchedulesMaxComplexity (r:1 w:0) - // Proof: Checkpoint SchedulesMaxComplexity (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint SchedulesMaxComplexity (max_values: Some(1), max_size: None, mode: Measured) // Storage: Checkpoint CachedNextCheckpoints (r:1 w:1) // Proof Skipped: Checkpoint CachedNextCheckpoints (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduleIdSequence (r:1 w:1) - // Proof: Checkpoint ScheduleIdSequence (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint ScheduleIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduledCheckpoints (r:0 w:1) // Proof Skipped: Checkpoint ScheduledCheckpoints (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduleRefCount (r:0 w:1) - // Proof: Checkpoint ScheduleRefCount (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint ScheduleRefCount (max_values: None, max_size: None, mode: Measured) // Storage: CorporateAction CorporateActions (r:0 w:1) // Proof Skipped: CorporateAction CorporateActions (max_values: None, max_size: None, mode: Measured) // Storage: CorporateAction Details (r:0 w:1) @@ -224,25 +198,19 @@ impl pallet_corporate_actions::WeightInfo for SubstrateWeight { /// The range of component `w` is `[0, 1000]`. /// The range of component `t` is `[0, 500]`. fn initiate_corporate_action_provided(w: u32, t: u32) -> Weight { - // Minimum execution time: 262_914 nanoseconds. - Weight::from_ref_time(161_394_546) - // Standard Error: 2_122 - .saturating_add(Weight::from_ref_time(132_270).saturating_mul(w.into())) - // Standard Error: 4_243 - .saturating_add(Weight::from_ref_time(236_032).saturating_mul(t.into())) - .saturating_add(DbWeight::get().reads(15)) + // Minimum execution time: 268_151 nanoseconds. + Weight::from_parts(140_602_268, 0) + // Standard Error: 2_141 + .saturating_add(Weight::from_parts(140_908, 0).saturating_mul(w.into())) + // Standard Error: 4_281 + .saturating_add(Weight::from_parts(278_367, 0).saturating_mul(t.into())) + .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().writes(7)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -255,24 +223,18 @@ impl pallet_corporate_actions::WeightInfo for SubstrateWeight { // Proof Skipped: CorporateAction CADocLink (max_values: None, max_size: None, mode: Measured) /// The range of component `d` is `[0, 1000]`. fn link_ca_doc(d: u32) -> Weight { - // Minimum execution time: 57_256 nanoseconds. - Weight::from_ref_time(61_102_000) - // Standard Error: 7_645 - .saturating_add(Weight::from_ref_time(3_833_168).saturating_mul(d.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 42_243 nanoseconds. + Weight::from_parts(42_443_000, 0) + // Standard Error: 7_796 + .saturating_add(Weight::from_parts(4_013_372, 0).saturating_mul(d.into())) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(d.into()))) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -280,9 +242,11 @@ impl pallet_corporate_actions::WeightInfo for SubstrateWeight { // Storage: CorporateAction CorporateActions (r:1 w:1) // Proof Skipped: CorporateAction CorporateActions (max_values: None, max_size: None, mode: Measured) // Storage: CorporateBallot TimeRanges (r:1 w:1) - // Proof: CorporateBallot TimeRanges (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: CorporateBallot TimeRanges (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Checkpoint ScheduleRefCount (r:1 w:1) - // Proof: Checkpoint ScheduleRefCount (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint ScheduleRefCount (max_values: None, max_size: None, mode: Measured) // Storage: CorporateAction Details (r:0 w:1) // Proof Skipped: CorporateAction Details (max_values: None, max_size: None, mode: Measured) // Storage: CorporateAction CADocLink (r:0 w:1) @@ -292,23 +256,17 @@ impl pallet_corporate_actions::WeightInfo for SubstrateWeight { // Storage: CorporateBallot Metas (r:0 w:1) // Proof Skipped: CorporateBallot Metas (max_values: None, max_size: None, mode: Measured) // Storage: CorporateBallot RCV (r:0 w:1) - // Proof: CorporateBallot RCV (max_values: None, max_size: Some(37), added: 2512, mode: MaxEncodedLen) + // Proof Skipped: CorporateBallot RCV (max_values: None, max_size: None, mode: Measured) fn remove_ca_with_ballot() -> Weight { - // Minimum execution time: 86_390 nanoseconds. - Weight::from_ref_time(89_073_000) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 87_891 nanoseconds. + Weight::from_parts(107_050_000, 0) + .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(8)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -316,31 +274,27 @@ impl pallet_corporate_actions::WeightInfo for SubstrateWeight { // Storage: CorporateAction CorporateActions (r:1 w:1) // Proof Skipped: CorporateAction CorporateActions (max_values: None, max_size: None, mode: Measured) // Storage: CapitalDistribution Distributions (r:1 w:1) - // Proof: CapitalDistribution Distributions (max_values: None, max_size: Some(159), added: 2634, mode: MaxEncodedLen) + // Proof Skipped: CapitalDistribution Distributions (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Portfolio PortfolioLockedAssets (r:1 w:1) - // Proof: Portfolio PortfolioLockedAssets (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedAssets (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduleRefCount (r:1 w:1) - // Proof: Checkpoint ScheduleRefCount (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint ScheduleRefCount (max_values: None, max_size: None, mode: Measured) // Storage: CorporateAction Details (r:0 w:1) // Proof Skipped: CorporateAction Details (max_values: None, max_size: None, mode: Measured) // Storage: CorporateAction CADocLink (r:0 w:1) // Proof Skipped: CorporateAction CADocLink (max_values: None, max_size: None, mode: Measured) fn remove_ca_with_dist() -> Weight { - // Minimum execution time: 91_487 nanoseconds. - Weight::from_ref_time(97_416_000) - .saturating_add(DbWeight::get().reads(12)) + // Minimum execution time: 80_921 nanoseconds. + Weight::from_parts(85_537_000, 0) + .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().writes(6)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -348,37 +302,33 @@ impl pallet_corporate_actions::WeightInfo for SubstrateWeight { // Storage: CorporateAction CorporateActions (r:1 w:1) // Proof Skipped: CorporateAction CorporateActions (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduleRefCount (r:1 w:2) - // Proof: Checkpoint ScheduleRefCount (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint ScheduleRefCount (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint SchedulesMaxComplexity (r:1 w:0) - // Proof: Checkpoint SchedulesMaxComplexity (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint SchedulesMaxComplexity (max_values: Some(1), max_size: None, mode: Measured) // Storage: Checkpoint CachedNextCheckpoints (r:1 w:1) // Proof Skipped: Checkpoint CachedNextCheckpoints (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Checkpoint ScheduleIdSequence (r:1 w:1) - // Proof: Checkpoint ScheduleIdSequence (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint ScheduleIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: CorporateBallot TimeRanges (r:1 w:0) - // Proof: CorporateBallot TimeRanges (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: CorporateBallot TimeRanges (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduledCheckpoints (r:0 w:1) // Proof Skipped: Checkpoint ScheduledCheckpoints (max_values: None, max_size: None, mode: Measured) fn change_record_date_with_ballot() -> Weight { - // Minimum execution time: 104_287 nanoseconds. - Weight::from_ref_time(105_128_000) - .saturating_add(DbWeight::get().reads(16)) + // Minimum execution time: 99_510 nanoseconds. + Weight::from_parts(102_093_000, 0) + .saturating_add(DbWeight::get().reads(13)) .saturating_add(DbWeight::get().writes(6)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -386,25 +336,27 @@ impl pallet_corporate_actions::WeightInfo for SubstrateWeight { // Storage: CorporateAction CorporateActions (r:1 w:1) // Proof Skipped: CorporateAction CorporateActions (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduleRefCount (r:1 w:2) - // Proof: Checkpoint ScheduleRefCount (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint ScheduleRefCount (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint SchedulesMaxComplexity (r:1 w:0) - // Proof: Checkpoint SchedulesMaxComplexity (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint SchedulesMaxComplexity (max_values: Some(1), max_size: None, mode: Measured) // Storage: Checkpoint CachedNextCheckpoints (r:1 w:1) // Proof Skipped: Checkpoint CachedNextCheckpoints (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Checkpoint ScheduleIdSequence (r:1 w:1) - // Proof: Checkpoint ScheduleIdSequence (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Checkpoint ScheduleIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: CapitalDistribution Distributions (r:1 w:0) - // Proof: CapitalDistribution Distributions (max_values: None, max_size: Some(159), added: 2634, mode: MaxEncodedLen) + // Proof Skipped: CapitalDistribution Distributions (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint ScheduledCheckpoints (r:0 w:1) // Proof Skipped: Checkpoint ScheduledCheckpoints (max_values: None, max_size: None, mode: Measured) fn change_record_date_with_dist() -> Weight { - // Minimum execution time: 107_101 nanoseconds. - Weight::from_ref_time(114_512_000) - .saturating_add(DbWeight::get().reads(16)) + // Minimum execution time: 100_200 nanoseconds. + Weight::from_parts(101_983_000, 0) + .saturating_add(DbWeight::get().reads(13)) .saturating_add(DbWeight::get().writes(6)) } } diff --git a/pallets/weights/src/pallet_corporate_ballot.rs b/pallets/weights/src/pallet_corporate_ballot.rs index 7a9fbcbb21..68b5dd2794 100644 --- a/pallets/weights/src/pallet_corporate_ballot.rs +++ b/pallets/weights/src/pallet_corporate_ballot.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_corporate_ballot //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,62 +54,54 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_corporate_actions::ballot::WeightInfo for SubstrateWeight { // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: CorporateAction CorporateActions (r:1 w:0) // Proof Skipped: CorporateAction CorporateActions (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: CorporateBallot TimeRanges (r:1 w:1) - // Proof: CorporateBallot TimeRanges (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: CorporateBallot TimeRanges (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: CorporateBallot MotionNumChoices (r:0 w:1) // Proof Skipped: CorporateBallot MotionNumChoices (max_values: None, max_size: None, mode: Measured) // Storage: CorporateBallot Metas (r:0 w:1) // Proof Skipped: CorporateBallot Metas (max_values: None, max_size: None, mode: Measured) // Storage: CorporateBallot RCV (r:0 w:1) - // Proof: CorporateBallot RCV (max_values: None, max_size: Some(37), added: 2512, mode: MaxEncodedLen) + // Proof Skipped: CorporateBallot RCV (max_values: None, max_size: None, mode: Measured) /// The range of component `c` is `[0, 1000]`. fn attach_ballot(c: u32) -> Weight { - // Minimum execution time: 78_287 nanoseconds. - Weight::from_ref_time(87_972_593) - // Standard Error: 1_544 - .saturating_add(Weight::from_ref_time(36_165).saturating_mul(c.into())) - .saturating_add(DbWeight::get().reads(12)) + // Minimum execution time: 67_091 nanoseconds. + Weight::from_parts(74_961_125, 0) + // Standard Error: 1_675 + .saturating_add(Weight::from_parts(38_276, 0).saturating_mul(c.into())) + .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().writes(4)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: CorporateBallot TimeRanges (r:1 w:0) + // Proof Skipped: CorporateBallot TimeRanges (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: CorporateBallot TimeRanges (r:1 w:0) - // Proof: CorporateBallot TimeRanges (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) // Storage: CorporateAction CorporateActions (r:1 w:0) // Proof Skipped: CorporateAction CorporateActions (max_values: None, max_size: None, mode: Measured) // Storage: CorporateBallot MotionNumChoices (r:1 w:0) // Proof Skipped: CorporateBallot MotionNumChoices (max_values: None, max_size: None, mode: Measured) // Storage: CorporateBallot RCV (r:1 w:0) - // Proof: CorporateBallot RCV (max_values: None, max_size: Some(37), added: 2512, mode: MaxEncodedLen) + // Proof Skipped: CorporateBallot RCV (max_values: None, max_size: None, mode: Measured) // Storage: Checkpoint SchedulePoints (r:1 w:0) // Proof Skipped: Checkpoint SchedulePoints (max_values: None, max_size: None, mode: Measured) // Storage: Asset BalanceOf (r:1 w:0) - // Proof: Asset BalanceOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + // Proof Skipped: Asset BalanceOf (max_values: None, max_size: None, mode: Measured) // Storage: CorporateBallot Votes (r:1 w:1) // Proof Skipped: CorporateBallot Votes (max_values: None, max_size: None, mode: Measured) // Storage: CorporateBallot Results (r:1 w:1) @@ -117,116 +109,100 @@ impl pallet_corporate_actions::ballot::WeightInfo for SubstrateWeight { /// The range of component `c` is `[0, 1000]`. /// The range of component `t` is `[0, 1000]`. fn vote(c: u32, t: u32) -> Weight { - // Minimum execution time: 134_542 nanoseconds. - Weight::from_ref_time(95_233_256) - // Standard Error: 2_013 - .saturating_add(Weight::from_ref_time(60_260).saturating_mul(c.into())) - // Standard Error: 2_013 - .saturating_add(Weight::from_ref_time(81_807).saturating_mul(t.into())) - .saturating_add(DbWeight::get().reads(13)) + // Minimum execution time: 119_479 nanoseconds. + Weight::from_parts(80_064_182, 0) + // Standard Error: 1_740 + .saturating_add(Weight::from_parts(65_826, 0).saturating_mul(c.into())) + // Standard Error: 1_740 + .saturating_add(Weight::from_parts(80_482, 0).saturating_mul(t.into())) + .saturating_add(DbWeight::get().reads(10)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: CorporateBallot TimeRanges (r:1 w:1) - // Proof: CorporateBallot TimeRanges (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: CorporateBallot TimeRanges (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) fn change_end() -> Weight { - // Minimum execution time: 57_697 nanoseconds. - Weight::from_ref_time(59_990_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 44_336 nanoseconds. + Weight::from_parts(46_128_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: CorporateBallot TimeRanges (r:1 w:0) - // Proof: CorporateBallot TimeRanges (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: CorporateBallot TimeRanges (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: CorporateBallot MotionNumChoices (r:0 w:1) // Proof Skipped: CorporateBallot MotionNumChoices (max_values: None, max_size: None, mode: Measured) // Storage: CorporateBallot Metas (r:0 w:1) // Proof Skipped: CorporateBallot Metas (max_values: None, max_size: None, mode: Measured) /// The range of component `c` is `[0, 1000]`. fn change_meta(c: u32) -> Weight { - // Minimum execution time: 63_245 nanoseconds. - Weight::from_ref_time(70_199_311) - // Standard Error: 1_741 - .saturating_add(Weight::from_ref_time(39_413).saturating_mul(c.into())) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 47_822 nanoseconds. + Weight::from_parts(54_981_701, 0) + // Standard Error: 1_669 + .saturating_add(Weight::from_parts(39_212, 0).saturating_mul(c.into())) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: CorporateBallot TimeRanges (r:1 w:0) - // Proof: CorporateBallot TimeRanges (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: CorporateBallot TimeRanges (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: CorporateBallot RCV (r:0 w:1) - // Proof: CorporateBallot RCV (max_values: None, max_size: Some(37), added: 2512, mode: MaxEncodedLen) + // Proof Skipped: CorporateBallot RCV (max_values: None, max_size: None, mode: Measured) fn change_rcv() -> Weight { - // Minimum execution time: 58_017 nanoseconds. - Weight::from_ref_time(61_943_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 43_334 nanoseconds. + Weight::from_parts(46_760_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: CorporateBallot TimeRanges (r:1 w:1) - // Proof: CorporateBallot TimeRanges (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + // Proof Skipped: CorporateBallot TimeRanges (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: CorporateBallot MotionNumChoices (r:0 w:1) // Proof Skipped: CorporateBallot MotionNumChoices (max_values: None, max_size: None, mode: Measured) // Storage: CorporateBallot Metas (r:0 w:1) // Proof Skipped: CorporateBallot Metas (max_values: None, max_size: None, mode: Measured) // Storage: CorporateBallot RCV (r:0 w:1) - // Proof: CorporateBallot RCV (max_values: None, max_size: Some(37), added: 2512, mode: MaxEncodedLen) + // Proof Skipped: CorporateBallot RCV (max_values: None, max_size: None, mode: Measured) fn remove_ballot() -> Weight { - // Minimum execution time: 62_794 nanoseconds. - Weight::from_ref_time(64_177_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 48_623 nanoseconds. + Weight::from_parts(50_136_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(4)) } } diff --git a/pallets/weights/src/pallet_external_agents.rs b/pallets/weights/src/pallet_external_agents.rs index 1d38f40fdf..8d53db1ff7 100644 --- a/pallets/weights/src/pallet_external_agents.rs +++ b/pallets/weights/src/pallet_external_agents.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_external_agents //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,243 +54,189 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_external_agents::WeightInfo for SubstrateWeight { // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: ExternalAgents AGIdSequence (r:1 w:1) - // Proof: ExternalAgents AGIdSequence (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents AGIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupPermissions (r:0 w:1) // Proof Skipped: ExternalAgents GroupPermissions (max_values: None, max_size: None, mode: Measured) /// The range of component `p` is `[0, 19]`. fn create_group(p: u32) -> Weight { - // Minimum execution time: 51_438 nanoseconds. - Weight::from_ref_time(55_558_001) - // Standard Error: 42_354 - .saturating_add(Weight::from_ref_time(683_925).saturating_mul(p.into())) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 35_183 nanoseconds. + Weight::from_parts(39_772_344, 0) + // Standard Error: 28_474 + .saturating_add(Weight::from_parts(569_661, 0).saturating_mul(p.into())) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: ExternalAgents AGIdSequence (r:1 w:0) - // Proof: ExternalAgents AGIdSequence (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents AGIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupPermissions (r:0 w:1) // Proof Skipped: ExternalAgents GroupPermissions (max_values: None, max_size: None, mode: Measured) /// The range of component `p` is `[0, 19]`. fn set_group_permissions(p: u32) -> Weight { - // Minimum execution time: 52_149 nanoseconds. - Weight::from_ref_time(57_330_424) - // Standard Error: 26_026 - .saturating_add(Weight::from_ref_time(694_412).saturating_mul(p.into())) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 35_944 nanoseconds. + Weight::from_parts(39_599_164, 0) + // Standard Error: 18_415 + .saturating_add(Weight::from_parts(653_565, 0).saturating_mul(p.into())) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:2 w:1) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: ExternalAgents NumFullAgents (r:1 w:1) - // Proof: ExternalAgents NumFullAgents (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents NumFullAgents (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents AgentOf (r:0 w:1) - // Proof: ExternalAgents AgentOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents AgentOf (max_values: None, max_size: None, mode: Measured) fn remove_agent() -> Weight { - // Minimum execution time: 59_811 nanoseconds. - Weight::from_ref_time(61_432_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 44_916 nanoseconds. + Weight::from_parts(45_919_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:1) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents NumFullAgents (r:1 w:1) - // Proof: ExternalAgents NumFullAgents (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents NumFullAgents (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents AgentOf (r:0 w:1) - // Proof: ExternalAgents AgentOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents AgentOf (max_values: None, max_size: None, mode: Measured) fn abdicate() -> Weight { - // Minimum execution time: 53_360 nanoseconds. - Weight::from_ref_time(58_438_000) - .saturating_add(DbWeight::get().reads(7)) + // Minimum execution time: 35_794 nanoseconds. + Weight::from_parts(39_620_000, 0) + .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:2 w:1) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: ExternalAgents AGIdSequence (r:1 w:0) - // Proof: ExternalAgents AGIdSequence (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents AGIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents NumFullAgents (r:1 w:1) - // Proof: ExternalAgents NumFullAgents (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents NumFullAgents (max_values: None, max_size: None, mode: Measured) fn change_group_custom() -> Weight { - // Minimum execution time: 60_671 nanoseconds. - Weight::from_ref_time(64_366_000) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 46_660 nanoseconds. + Weight::from_parts(50_255_000, 0) + .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:2 w:1) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: ExternalAgents NumFullAgents (r:1 w:1) - // Proof: ExternalAgents NumFullAgents (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents NumFullAgents (max_values: None, max_size: None, mode: Measured) fn change_group_builtin() -> Weight { - // Minimum execution time: 58_098 nanoseconds. - Weight::from_ref_time(60_962_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 42_934 nanoseconds. + Weight::from_parts(43_255_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity Authorizations (r:1 w:1) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity OutdatedAuthorizations (r:1 w:0) - // Proof: Identity OutdatedAuthorizations (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Identity OutdatedAuthorizations (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:2 w:1) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: ExternalAgents NumFullAgents (r:1 w:1) - // Proof: ExternalAgents NumFullAgents (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents NumFullAgents (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:1) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents AgentOf (r:0 w:1) - // Proof: ExternalAgents AgentOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents AgentOf (max_values: None, max_size: None, mode: Measured) fn accept_become_agent() -> Weight { - // Minimum execution time: 80_001 nanoseconds. - Weight::from_ref_time(86_710_000) - .saturating_add(DbWeight::get().reads(13)) + // Minimum execution time: 69_164 nanoseconds. + Weight::from_parts(71_556_000, 0) + .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().writes(6)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: ExternalAgents AGIdSequence (r:1 w:1) - // Proof: ExternalAgents AGIdSequence (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents AGIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity CurrentAuthId (r:1 w:1) - // Proof: Identity CurrentAuthId (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentAuthId (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:1) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: Identity Authorizations (r:0 w:1) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupPermissions (r:0 w:1) // Proof Skipped: ExternalAgents GroupPermissions (max_values: None, max_size: None, mode: Measured) /// The range of component `p` is `[0, 19]`. fn create_group_and_add_auth(p: u32) -> Weight { - // Minimum execution time: 65_478 nanoseconds. - Weight::from_ref_time(72_292_155) - // Standard Error: 36_641 - .saturating_add(Weight::from_ref_time(601_196).saturating_mul(p.into())) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 52_729 nanoseconds. + Weight::from_parts(57_036_314, 0) + // Standard Error: 26_050 + .saturating_add(Weight::from_parts(570_204, 0).saturating_mul(p.into())) + .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(6)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:2 w:1) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: ExternalAgents AGIdSequence (r:1 w:1) - // Proof: ExternalAgents AGIdSequence (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents AGIdSequence (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents NumFullAgents (r:1 w:1) - // Proof: ExternalAgents NumFullAgents (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents NumFullAgents (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupPermissions (r:0 w:1) // Proof Skipped: ExternalAgents GroupPermissions (max_values: None, max_size: None, mode: Measured) /// The range of component `p` is `[0, 19]`. fn create_and_change_custom_group(p: u32) -> Weight { - // Minimum execution time: 69_945 nanoseconds. - Weight::from_ref_time(76_145_423) - // Standard Error: 30_749 - .saturating_add(Weight::from_ref_time(510_945).saturating_mul(p.into())) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 60_300 nanoseconds. + Weight::from_parts(63_331_883, 0) + // Standard Error: 32_956 + .saturating_add(Weight::from_parts(563_391, 0).saturating_mul(p.into())) + .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(4)) } } diff --git a/pallets/weights/src/pallet_grandpa.rs b/pallets/weights/src/pallet_grandpa.rs index 1dfd670134..a105dbd286 100644 --- a/pallets/weights/src/pallet_grandpa.rs +++ b/pallets/weights/src/pallet_grandpa.rs @@ -54,36 +54,34 @@ use polymesh_primitives::{ /// Weights for pallet_grandpa using the Substrate node and recommended hardware. pub struct SubstrateWeight; impl pallet_grandpa::WeightInfo for SubstrateWeight { - fn report_equivocation(validator_count: u32) -> Weight { + fn report_equivocation(validator_count: u32, max_nominators_per_validator: u32) -> Weight { // we take the validator set count from the membership proof to // calculate the weight but we set a floor of 100 validators. let validator_count = validator_count.max(100) as u64; - // worst case we are considering is that the given offender - // is backed by 200 nominators - const MAX_NOMINATORS: u64 = 200; - // checking membership proof - Weight::from_ref_time(35u64 * WEIGHT_REF_TIME_PER_MICROS) + Weight::from_parts(35u64 * WEIGHT_REF_TIME_PER_MICROS, 0) .saturating_add( - Weight::from_ref_time(175u64 * WEIGHT_REF_TIME_PER_NANOS) + Weight::from_parts(175u64 * WEIGHT_REF_TIME_PER_NANOS, 0) .saturating_mul(validator_count), ) .saturating_add(DbWeight::get().reads(5)) // check equivocation proof - .saturating_add(Weight::from_ref_time(95u64 * WEIGHT_REF_TIME_PER_MICROS)) + .saturating_add(Weight::from_parts(95u64 * WEIGHT_REF_TIME_PER_MICROS, 0)) // report offence - .saturating_add(Weight::from_ref_time(110u64 * WEIGHT_REF_TIME_PER_MICROS)) - .saturating_add(Weight::from_ref_time( - 25u64 * WEIGHT_REF_TIME_PER_MICROS * MAX_NOMINATORS, + .saturating_add(Weight::from_parts(110u64 * WEIGHT_REF_TIME_PER_MICROS, 0)) + .saturating_add(Weight::from_parts( + 25u64 * WEIGHT_REF_TIME_PER_MICROS * max_nominators_per_validator as u64, + 0, )) - .saturating_add(DbWeight::get().reads(14 + 3 * MAX_NOMINATORS)) - .saturating_add(DbWeight::get().writes(10 + 3 * MAX_NOMINATORS)) + .saturating_add(DbWeight::get().reads(14 + 3 * max_nominators_per_validator as u64)) + .saturating_add(DbWeight::get().writes(10 + 3 * max_nominators_per_validator as u64)) // fetching set id -> session index mappings .saturating_add(DbWeight::get().reads(2)) } - // Storage: Grandpa Stalled (r:0 w:1) + fn note_stalled() -> Weight { - Weight::from_ref_time(2_979_000).saturating_add(DbWeight::get().writes(1)) + Weight::from_parts(3u64 * WEIGHT_REF_TIME_PER_MICROS, 0) + .saturating_add(DbWeight::get().writes(1)) } } diff --git a/pallets/weights/src/pallet_group.rs b/pallets/weights/src/pallet_group.rs index 1b37262f2d..0edd835308 100644 --- a/pallets/weights/src/pallet_group.rs +++ b/pallets/weights/src/pallet_group.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_group //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -53,97 +53,95 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; /// Weights for pallet_group using the Substrate node and recommended hardware. pub struct SubstrateWeight; impl pallet_group::WeightInfo for SubstrateWeight { - // Storage: CddServiceProviders ActiveMembersLimit (r:1 w:1) - // Proof: CddServiceProviders ActiveMembersLimit (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: Instance2Group ActiveMembersLimit (r:1 w:1) + // Proof Skipped: Instance2Group ActiveMembersLimit (max_values: Some(1), max_size: None, mode: Measured) fn set_active_members_limit() -> Weight { - // Minimum execution time: 11_367 nanoseconds. - Weight::from_ref_time(12_679_000) + // Minimum execution time: 14_232 nanoseconds. + Weight::from_parts(15_674_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } - // Storage: CddServiceProviders ActiveMembers (r:1 w:1) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: CddServiceProviders ActiveMembersLimit (r:1 w:0) - // Proof: CddServiceProviders ActiveMembersLimit (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: Instance2Group ActiveMembers (r:1 w:1) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembersLimit (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembersLimit (max_values: Some(1), max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Identity Claims (r:1 w:1) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) fn add_member() -> Weight { - // Minimum execution time: 90_075 nanoseconds. - Weight::from_ref_time(93_540_000) + // Minimum execution time: 102_413 nanoseconds. + Weight::from_parts(108_412_000, 0) .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(2)) } - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: CddServiceProviders InactiveMembers (r:1 w:1) - // Proof Skipped: CddServiceProviders InactiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group InactiveMembers (r:1 w:1) + // Proof Skipped: Instance2Group InactiveMembers (max_values: Some(1), max_size: None, mode: Measured) fn remove_member() -> Weight { - // Minimum execution time: 73_841 nanoseconds. - Weight::from_ref_time(87_891_000) + // Minimum execution time: 78_647 nanoseconds. + Weight::from_parts(80_401_000, 0) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } - // Storage: CddServiceProviders ActiveMembers (r:1 w:1) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:1) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity Claims (r:1 w:1) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders InactiveMembers (r:1 w:1) - // Proof Skipped: CddServiceProviders InactiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group InactiveMembers (r:1 w:1) + // Proof Skipped: Instance2Group InactiveMembers (max_values: Some(1), max_size: None, mode: Measured) fn disable_member() -> Weight { - // Minimum execution time: 96_736 nanoseconds. - Weight::from_ref_time(104_937_000) + // Minimum execution time: 107_641 nanoseconds. + Weight::from_parts(113_250_000, 0) .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(3)) } - // Storage: CddServiceProviders ActiveMembers (r:1 w:1) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:1) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Identity Claims (r:2 w:2) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) fn swap_member() -> Weight { - // Minimum execution time: 116_275 nanoseconds. - Weight::from_ref_time(123_114_000) + // Minimum execution time: 125_188 nanoseconds. + Weight::from_parts(136_303_000, 0) .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(3)) } - // Storage: CddServiceProviders ActiveMembersLimit (r:1 w:0) - // Proof: CddServiceProviders ActiveMembersLimit (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:1) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembersLimit (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembersLimit (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:1) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Identity Claims (r:1001 w:1001) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) /// The range of component `m` is `[1, 1000]`. fn reset_members(m: u32) -> Weight { - // Minimum execution time: 43_455 nanoseconds. - Weight::from_ref_time(46_159_000) - // Standard Error: 18_045 - .saturating_add(Weight::from_ref_time(13_558_073).saturating_mul(m.into())) + // Minimum execution time: 47_890 nanoseconds. + Weight::from_parts(53_350_000, 0) + // Standard Error: 37_131 + .saturating_add(Weight::from_parts(14_607_210, 0).saturating_mul(m.into())) .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(DbWeight::get().writes(2)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(m.into()))) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:1) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:3 w:1) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidRecords (r:1 w:0) - // Proof: Identity DidRecords (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity DidRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:1) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:1 w:1) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) fn abdicate_membership() -> Weight { - // Minimum execution time: 139_349 nanoseconds. - Weight::from_ref_time(143_084_000) - .saturating_add(DbWeight::get().reads(7)) + // Minimum execution time: 108_652 nanoseconds. + Weight::from_parts(120_459_000, 0) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(2)) } } diff --git a/pallets/weights/src/pallet_identity.rs b/pallets/weights/src/pallet_identity.rs index 66db839e62..6e74672249 100644 --- a/pallets/weights/src/pallet_identity.rs +++ b/pallets/weights/src/pallet_identity.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_identity //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,29 +54,23 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_identity::WeightInfo for SubstrateWeight { // Storage: Identity KeyRecords (r:2 w:1) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity ParentDid (r:1 w:1) - // Proof: Identity ParentDid (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) + // Proof Skipped: Identity ParentDid (max_values: None, max_size: None, mode: Measured) // Storage: Identity AccountKeyRefCount (r:1 w:0) - // Proof: Identity AccountKeyRefCount (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + // Proof Skipped: Identity AccountKeyRefCount (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Identity MultiPurposeNonce (r:1 w:1) - // Proof: Identity MultiPurposeNonce (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity MultiPurposeNonce (max_values: Some(1), max_size: None, mode: Measured) // Storage: System ParentHash (r:1 w:0) // Proof: System ParentHash (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) // Storage: Identity DidRecords (r:1 w:1) - // Proof: Identity DidRecords (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity DidRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidKeys (r:0 w:2) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity DidKeys (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyPortfolioPermissions (r:0 w:1) // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyExtrinsicPermissions (r:0 w:1) @@ -84,134 +78,115 @@ impl pallet_identity::WeightInfo for SubstrateWeight { // Storage: Identity KeyAssetPermissions (r:0 w:1) // Proof Skipped: Identity KeyAssetPermissions (max_values: None, max_size: None, mode: Measured) // Storage: Identity ChildDid (r:0 w:1) - // Proof: Identity ChildDid (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity ChildDid (max_values: None, max_size: None, mode: Measured) fn create_child_identity() -> Weight { - // Minimum execution time: 90_245 nanoseconds. - Weight::from_ref_time(93_110_000) - .saturating_add(DbWeight::get().reads(13)) + // Minimum execution time: 75_032 nanoseconds. + Weight::from_parts(77_236_000, 0) + .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().writes(10)) } // Storage: Identity KeyRecords (r:100 w:99) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Identity ParentDid (r:1 w:99) + // Proof Skipped: Identity ParentDid (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: Identity ParentDid (r:1 w:99) - // Proof: Identity ParentDid (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) // Storage: Identity OffChainAuthorizationNonce (r:1 w:1) - // Proof: Identity OffChainAuthorizationNonce (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Identity OffChainAuthorizationNonce (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Identity MultiPurposeNonce (r:1 w:1) - // Proof: Identity MultiPurposeNonce (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity MultiPurposeNonce (max_values: Some(1), max_size: None, mode: Measured) // Storage: System ParentHash (r:1 w:0) // Proof: System ParentHash (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) // Storage: Identity DidRecords (r:99 w:99) - // Proof: Identity DidRecords (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity DidRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidKeys (r:0 w:99) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity DidKeys (max_values: None, max_size: None, mode: Measured) // Storage: Identity ChildDid (r:0 w:99) - // Proof: Identity ChildDid (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity ChildDid (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[0, 100]`. fn create_child_identities(i: u32) -> Weight { - // Minimum execution time: 42_053 nanoseconds. - Weight::from_ref_time(89_970_948) - // Standard Error: 110_748 - .saturating_add(Weight::from_ref_time(144_106_906).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 28_963 nanoseconds. + Weight::from_parts(56_653_013, 0) + // Standard Error: 56_157 + .saturating_add(Weight::from_parts(83_550_764, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().reads((2_u64).saturating_mul(i.into()))) .saturating_add(DbWeight::get().writes(2)) .saturating_add(DbWeight::get().writes((5_u64).saturating_mul(i.into()))) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity ParentDid (r:1 w:1) - // Proof: Identity ParentDid (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) + // Proof Skipped: Identity ParentDid (max_values: None, max_size: None, mode: Measured) // Storage: Identity ChildDid (r:0 w:1) - // Proof: Identity ChildDid (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity ChildDid (max_values: None, max_size: None, mode: Measured) fn unlink_child_identity() -> Weight { - // Minimum execution time: 42_594 nanoseconds. - Weight::from_ref_time(46_139_000) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 26_710 nanoseconds. + Weight::from_parts(28_303_000, 0) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(2)) } - // Storage: Identity KeyRecords (r:2 w:1) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:201 w:1) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity MultiPurposeNonce (r:1 w:1) - // Proof: Identity MultiPurposeNonce (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity MultiPurposeNonce (max_values: Some(1), max_size: None, mode: Measured) // Storage: System ParentHash (r:1 w:0) // Proof: System ParentHash (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) // Storage: Identity DidRecords (r:1 w:1) - // Proof: Identity DidRecords (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity DidRecords (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity CurrentAuthId (r:1 w:1) - // Proof: Identity CurrentAuthId (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentAuthId (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:199) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidKeys (r:0 w:1) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity DidKeys (max_values: None, max_size: None, mode: Measured) // Storage: Identity Authorizations (r:0 w:199) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[0, 200]`. fn cdd_register_did(i: u32) -> Weight { - // Minimum execution time: 61_382 nanoseconds. - Weight::from_ref_time(90_535_438) - // Standard Error: 24_037 - .saturating_add(Weight::from_ref_time(12_786_370).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(13)) + // Minimum execution time: 46_980 nanoseconds. + Weight::from_parts(74_450_297, 0) + // Standard Error: 37_790 + .saturating_add(Weight::from_parts(15_103_103, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(10)) + .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(DbWeight::get().writes(6)) .saturating_add(DbWeight::get().writes((2_u64).saturating_mul(i.into()))) } // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:1) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: CddServiceProviders InactiveMembers (r:1 w:1) - // Proof Skipped: CddServiceProviders InactiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:1) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group InactiveMembers (r:1 w:1) + // Proof Skipped: Instance2Group InactiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity Claims (r:1 w:1) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) fn invalidate_cdd_claims() -> Weight { - // Minimum execution time: 44_958 nanoseconds. - Weight::from_ref_time(45_719_000) + // Minimum execution time: 49_044 nanoseconds. + Weight::from_parts(52_138_000, 0) .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Identity KeyRecords (r:200 w:199) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity AccountKeyRefCount (r:199 w:0) - // Proof: Identity AccountKeyRefCount (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + // Proof Skipped: Identity AccountKeyRefCount (max_values: None, max_size: None, mode: Measured) // Storage: Identity CurrentAuthId (r:1 w:0) - // Proof: Identity CurrentAuthId (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentAuthId (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity DidKeys (r:0 w:199) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity DidKeys (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyPortfolioPermissions (r:0 w:199) // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyExtrinsicPermissions (r:0 w:199) @@ -219,61 +194,61 @@ impl pallet_identity::WeightInfo for SubstrateWeight { // Storage: Identity KeyAssetPermissions (r:0 w:199) // Proof Skipped: Identity KeyAssetPermissions (max_values: None, max_size: None, mode: Measured) // Storage: Identity OutdatedAuthorizations (r:0 w:199) - // Proof: Identity OutdatedAuthorizations (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Identity OutdatedAuthorizations (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[0, 200]`. fn remove_secondary_keys(i: u32) -> Weight { - // Minimum execution time: 34_331 nanoseconds. - Weight::from_ref_time(47_714_873) - // Standard Error: 42_063 - .saturating_add(Weight::from_ref_time(17_971_373).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 17_726 nanoseconds. + Weight::from_parts(18_758_000, 0) + // Standard Error: 18_807 + .saturating_add(Weight::from_parts(20_191_800, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().reads((2_u64).saturating_mul(i.into()))) .saturating_add(DbWeight::get().writes((6_u64).saturating_mul(i.into()))) } // Storage: Identity Authorizations (r:2 w:2) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity OutdatedAuthorizations (r:1 w:0) - // Proof: Identity OutdatedAuthorizations (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Identity OutdatedAuthorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidRecords (r:1 w:1) - // Proof: Identity DidRecords (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity DidRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:2 w:2) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity AccountKeyRefCount (r:1 w:0) - // Proof: Identity AccountKeyRefCount (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + // Proof Skipped: Identity AccountKeyRefCount (max_values: None, max_size: None, mode: Measured) // Storage: Identity CddAuthForPrimaryKeyRotation (r:1 w:0) - // Proof: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Proof Skipped: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:2 w:2) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:2) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidKeys (r:0 w:2) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity DidKeys (max_values: None, max_size: None, mode: Measured) fn accept_primary_key() -> Weight { - // Minimum execution time: 89_375 nanoseconds. - Weight::from_ref_time(102_884_000) + // Minimum execution time: 94_412 nanoseconds. + Weight::from_parts(95_482_000, 0) .saturating_add(DbWeight::get().reads(11)) .saturating_add(DbWeight::get().writes(11)) } // Storage: Identity Authorizations (r:2 w:2) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity OutdatedAuthorizations (r:1 w:0) - // Proof: Identity OutdatedAuthorizations (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Identity OutdatedAuthorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidRecords (r:1 w:1) - // Proof: Identity DidRecords (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity DidRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:2) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity CddAuthForPrimaryKeyRotation (r:1 w:0) - // Proof: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Proof Skipped: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:2 w:2) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:2) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidKeys (r:0 w:1) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity DidKeys (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyPortfolioPermissions (r:0 w:1) // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyExtrinsicPermissions (r:0 w:1) @@ -281,41 +256,41 @@ impl pallet_identity::WeightInfo for SubstrateWeight { // Storage: Identity KeyAssetPermissions (r:0 w:1) // Proof Skipped: Identity KeyAssetPermissions (max_values: None, max_size: None, mode: Measured) fn rotate_primary_key_to_secondary() -> Weight { - // Minimum execution time: 88_903 nanoseconds. - Weight::from_ref_time(90_485_000) + // Minimum execution time: 94_401 nanoseconds. + Weight::from_parts(97_495_000, 0) .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().writes(13)) } // Storage: Identity CddAuthForPrimaryKeyRotation (r:0 w:1) - // Proof: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + // Proof Skipped: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: None, mode: Measured) fn change_cdd_requirement_for_mk_rotation() -> Weight { - // Minimum execution time: 7_832 nanoseconds. - Weight::from_ref_time(9_915_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 9_873 nanoseconds. + Weight::from_parts(10_345_000, 0).saturating_add(DbWeight::get().writes(1)) } // Storage: Identity Authorizations (r:1 w:1) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity OutdatedAuthorizations (r:1 w:0) - // Proof: Identity OutdatedAuthorizations (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Identity OutdatedAuthorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidRecords (r:1 w:0) - // Proof: Identity DidRecords (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity DidRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:1) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity Claims (r:2 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:1) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidKeys (r:0 w:1) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity DidKeys (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyPortfolioPermissions (r:0 w:1) // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyExtrinsicPermissions (r:0 w:1) @@ -323,25 +298,19 @@ impl pallet_identity::WeightInfo for SubstrateWeight { // Storage: Identity KeyAssetPermissions (r:0 w:1) // Proof Skipped: Identity KeyAssetPermissions (max_values: None, max_size: None, mode: Measured) fn join_identity_as_key() -> Weight { - // Minimum execution time: 81_021 nanoseconds. - Weight::from_ref_time(98_688_000) + // Minimum execution time: 85_988 nanoseconds. + Weight::from_parts(90_807_000, 0) .saturating_add(DbWeight::get().reads(11)) .saturating_add(DbWeight::get().writes(8)) } // Storage: Identity KeyRecords (r:1 w:1) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: Identity AccountKeyRefCount (r:1 w:0) - // Proof: Identity AccountKeyRefCount (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + // Proof Skipped: Identity AccountKeyRefCount (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidKeys (r:0 w:1) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity DidKeys (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyPortfolioPermissions (r:0 w:1) // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyExtrinsicPermissions (r:0 w:1) @@ -349,67 +318,51 @@ impl pallet_identity::WeightInfo for SubstrateWeight { // Storage: Identity KeyAssetPermissions (r:0 w:1) // Proof Skipped: Identity KeyAssetPermissions (max_values: None, max_size: None, mode: Measured) fn leave_identity_as_key() -> Weight { - // Minimum execution time: 53_390 nanoseconds. - Weight::from_ref_time(55_673_000) - .saturating_add(DbWeight::get().reads(7)) + // Minimum execution time: 37_647 nanoseconds. + Weight::from_parts(38_818_000, 0) + .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(5)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:3 w:1) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidRecords (r:1 w:0) - // Proof: Identity DidRecords (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity DidRecords (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity Claims (r:1 w:1) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) fn add_claim() -> Weight { - // Minimum execution time: 55_724 nanoseconds. - Weight::from_ref_time(58_708_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 42_213 nanoseconds. + Weight::from_parts(44_476_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:3 w:1) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Identity Claims (r:1 w:1) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) fn revoke_claim() -> Weight { - // Minimum execution time: 37_626 nanoseconds. - Weight::from_ref_time(39_549_000) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 25_428 nanoseconds. + Weight::from_parts(25_869_000, 0) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:3 w:1) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Identity Claims (r:1 w:1) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) fn revoke_claim_by_index() -> Weight { - // Minimum execution time: 38_788 nanoseconds. - Weight::from_ref_time(41_122_000) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 25_438 nanoseconds. + Weight::from_parts(27_070_000, 0) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:2 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyAssetPermissions (r:1 w:1) // Proof Skipped: Identity KeyAssetPermissions (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyExtrinsicPermissions (r:1 w:1) @@ -417,9 +370,9 @@ impl pallet_identity::WeightInfo for SubstrateWeight { // Storage: Identity KeyPortfolioPermissions (r:1 w:1) // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) fn set_secondary_key_permissions() -> Weight { - // Minimum execution time: 61_172 nanoseconds. - Weight::from_ref_time(68_212_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 43_335 nanoseconds. + Weight::from_parts(44_738_000, 0) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(3)) } /// The range of component `a` is `[0, 2000]`. @@ -427,109 +380,81 @@ impl pallet_identity::WeightInfo for SubstrateWeight { /// The range of component `l` is `[0, 80]`. /// The range of component `e` is `[0, 80]`. fn permissions_cost(a: u32, p: u32, l: u32, e: u32) -> Weight { - // Minimum execution time: 227_893 nanoseconds. - Weight::from_ref_time(228_884_000) + // Minimum execution time: 236_785 nanoseconds. + Weight::from_parts(239_349_000, 0) // Manually set for `a` - .saturating_add(Weight::from_ref_time(100_000).saturating_mul(a.into())) + .saturating_add(Weight::from_parts(100_000, 0).saturating_mul(a.into())) // Manually set for `p` - .saturating_add(Weight::from_ref_time(100_000).saturating_mul(p.into())) - // Standard Error: 179_834 - .saturating_add(Weight::from_ref_time(15_417_476).saturating_mul(l.into())) - // Standard Error: 179_834 - .saturating_add(Weight::from_ref_time(14_255_820).saturating_mul(e.into())) + .saturating_add(Weight::from_parts(100_000, 0).saturating_mul(p.into())) + // Standard Error: 191_296 + .saturating_add(Weight::from_parts(16_520_754, 0).saturating_mul(l.into())) + // Standard Error: 191_296 + .saturating_add(Weight::from_parts(15_479_353, 0).saturating_mul(e.into())) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:0 w:1) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) fn freeze_secondary_keys() -> Weight { - // Minimum execution time: 33_650 nanoseconds. - Weight::from_ref_time(36_594_000) - .saturating_add(DbWeight::get().reads(5)) + // Minimum execution time: 18_638 nanoseconds. + Weight::from_parts(23_155_000, 0) + .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:0 w:1) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) fn unfreeze_secondary_keys() -> Weight { - // Minimum execution time: 32_278 nanoseconds. - Weight::from_ref_time(33_901_000) - .saturating_add(DbWeight::get().reads(5)) + // Minimum execution time: 19_509 nanoseconds. + Weight::from_parts(21_011_000, 0) + .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity CurrentAuthId (r:1 w:1) - // Proof: Identity CurrentAuthId (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentAuthId (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:1) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: Identity Authorizations (r:0 w:1) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) fn add_authorization() -> Weight { - // Minimum execution time: 44_296 nanoseconds. - Weight::from_ref_time(46_550_000) - .saturating_add(DbWeight::get().reads(7)) + // Minimum execution time: 28_182 nanoseconds. + Weight::from_parts(30_175_000, 0) + .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(4)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity Authorizations (r:1 w:1) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity OutdatedAuthorizations (r:1 w:0) - // Proof: Identity OutdatedAuthorizations (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Identity OutdatedAuthorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:1) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) fn remove_authorization() -> Weight { - // Minimum execution time: 51_007 nanoseconds. - Weight::from_ref_time(53_551_000) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 36_194 nanoseconds. + Weight::from_parts(36_805_000, 0) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Identity KeyRecords (r:200 w:199) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity OffChainAuthorizationNonce (r:1 w:1) + // Proof Skipped: Identity OffChainAuthorizationNonce (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) - // Storage: Identity OffChainAuthorizationNonce (r:1 w:1) - // Proof: Identity OffChainAuthorizationNonce (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidKeys (r:0 w:199) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity DidKeys (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyPortfolioPermissions (r:0 w:199) // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyExtrinsicPermissions (r:0 w:199) @@ -538,36 +463,30 @@ impl pallet_identity::WeightInfo for SubstrateWeight { // Proof Skipped: Identity KeyAssetPermissions (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[0, 200]`. fn add_secondary_keys_with_authorization(i: u32) -> Weight { - // Minimum execution time: 47_481 nanoseconds. - Weight::from_ref_time(57_963_316) - // Standard Error: 40_840 - .saturating_add(Weight::from_ref_time(132_436_689).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 32_549 nanoseconds. + Weight::from_parts(59_806_284, 0) + // Standard Error: 46_061 + .saturating_add(Weight::from_parts(71_476_387, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(DbWeight::get().writes(1)) .saturating_add(DbWeight::get().writes((5_u64).saturating_mul(i.into()))) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity CustomClaimsInverse (r:1 w:1) // Proof Skipped: Identity CustomClaimsInverse (max_values: None, max_size: None, mode: Measured) // Storage: Identity CustomClaimIdSequence (r:1 w:1) - // Proof: Identity CustomClaimIdSequence (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Proof Skipped: Identity CustomClaimIdSequence (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity CustomClaims (r:0 w:1) // Proof Skipped: Identity CustomClaims (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[1, 2048]`. fn register_custom_claim_type(n: u32) -> Weight { - // Minimum execution time: 41_543 nanoseconds. - Weight::from_ref_time(47_530_945) - // Standard Error: 631 - .saturating_add(Weight::from_ref_time(6_764).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(7)) + // Minimum execution time: 26_490 nanoseconds. + Weight::from_parts(31_039_092, 0) + // Standard Error: 342 + .saturating_add(Weight::from_parts(5_119, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(3)) } } diff --git a/pallets/weights/src/pallet_im_online.rs b/pallets/weights/src/pallet_im_online.rs index f99f66063c..30729e3f05 100644 --- a/pallets/weights/src/pallet_im_online.rs +++ b/pallets/weights/src/pallet_im_online.rs @@ -1,13 +1,13 @@ // This file is part of Substrate. -// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, @@ -18,61 +18,61 @@ //! Autogenerated weights for pallet_im_online //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: -// ./polymesh +// ./target/production/substrate // benchmark // pallet -// -s -// 100 -// -r -// 5 -// -p=* -// -e=* -// --heap-pages -// 4096 -// --db-cache -// 512 -// --execution -// wasm -// --wasm-execution -// compiled -// --output -// ./Polymesh/pallets/weights/src/ -// --template -// ./.maintain/frame-weight-template.hbs +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_im_online +// --no-storage-info +// --no-median-slopes +// --no-min-squares +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./frame/im-online/src/weights.rs +// --header=./HEADER-APACHE2 +// --template=./.maintain/frame-weight-template.hbs +#![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; /// Weights for pallet_im_online using the Substrate node and recommended hardware. pub struct SubstrateWeight; impl pallet_im_online::WeightInfo for SubstrateWeight { - // Storage: Session Validators (r:1 w:0) - // Proof Skipped: Session Validators (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Session CurrentIndex (r:1 w:0) - // Proof Skipped: Session CurrentIndex (max_values: Some(1), max_size: None, mode: Measured) - // Storage: ImOnline Keys (r:1 w:0) - // Proof: ImOnline Keys (max_values: Some(1), max_size: Some(320002), added: 320497, mode: MaxEncodedLen) - // Storage: ImOnline ReceivedHeartbeats (r:1 w:1) - // Proof: ImOnline ReceivedHeartbeats (max_values: None, max_size: Some(10021032), added: 10023507, mode: MaxEncodedLen) - // Storage: ImOnline AuthoredBlocks (r:1 w:0) - // Proof: ImOnline AuthoredBlocks (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) - /// The range of component `k` is `[1, 1000]`. - /// The range of component `e` is `[1, 100]`. - fn validate_unsigned_and_then_heartbeat(k: u32, e: u32) -> Weight { - // Minimum execution time: 145_028 nanoseconds. - Weight::from_ref_time(124_121_935) - // Standard Error: 1_342 - .saturating_add(Weight::from_ref_time(29_304).saturating_mul(k.into())) - // Standard Error: 13_550 - .saturating_add(Weight::from_ref_time(569_717).saturating_mul(e.into())) - .saturating_add(DbWeight::get().reads(4)) - .saturating_add(DbWeight::get().writes(1)) - } + /// Storage: Session Validators (r:1 w:0) + /// Proof Skipped: Session Validators (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: Session CurrentIndex (r:1 w:0) + /// Proof Skipped: Session CurrentIndex (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ImOnline Keys (r:1 w:0) + /// Proof: ImOnline Keys (max_values: Some(1), max_size: Some(320002), added: 320497, mode: MaxEncodedLen) + /// Storage: ImOnline ReceivedHeartbeats (r:1 w:1) + /// Proof: ImOnline ReceivedHeartbeats (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + /// Storage: ImOnline AuthoredBlocks (r:1 w:0) + /// Proof: ImOnline AuthoredBlocks (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + /// The range of component `k` is `[1, 1000]`. + fn validate_unsigned_and_then_heartbeat(k: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `295 + k * (32 ±0)` + // Estimated: `321487 + k * (1761 ±0)` + // Minimum execution time: 80_568_000 picoseconds. + Weight::from_parts(95_175_595, 321487) + // Standard Error: 627 + .saturating_add(Weight::from_parts(39_094, 0).saturating_mul(k.into())) + .saturating_add(DbWeight::get().reads(4_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + .saturating_add(Weight::from_parts(0, 1761).saturating_mul(k.into())) + } } diff --git a/pallets/weights/src/pallet_indices.rs b/pallets/weights/src/pallet_indices.rs index 49aaebfa98..3e10bd468c 100644 --- a/pallets/weights/src/pallet_indices.rs +++ b/pallets/weights/src/pallet_indices.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_indices //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -56,8 +56,8 @@ impl pallet_indices::WeightInfo for SubstrateWeight { // Storage: Indices Accounts (r:1 w:1) // Proof: Indices Accounts (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) fn claim() -> Weight { - // Minimum execution time: 21_533 nanoseconds. - Weight::from_ref_time(23_345_000) + // Minimum execution time: 22_144 nanoseconds. + Weight::from_parts(24_166_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } @@ -66,16 +66,16 @@ impl pallet_indices::WeightInfo for SubstrateWeight { // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn transfer() -> Weight { - // Minimum execution time: 27_992 nanoseconds. - Weight::from_ref_time(28_453_000) + // Minimum execution time: 28_173 nanoseconds. + Weight::from_parts(32_519_000, 0) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Indices Accounts (r:1 w:1) // Proof: Indices Accounts (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) fn free() -> Weight { - // Minimum execution time: 22_544 nanoseconds. - Weight::from_ref_time(23_596_000) + // Minimum execution time: 24_186 nanoseconds. + Weight::from_parts(31_498_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } @@ -84,17 +84,28 @@ impl pallet_indices::WeightInfo for SubstrateWeight { // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn force_transfer() -> Weight { - // Minimum execution time: 25_859 nanoseconds. - Weight::from_ref_time(27_191_000) + // Minimum execution time: 26_850 nanoseconds. + Weight::from_parts(28_423_000, 0) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Indices Accounts (r:1 w:1) // Proof: Indices Accounts (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) fn freeze() -> Weight { - // Minimum execution time: 21_382 nanoseconds. - Weight::from_ref_time(22_584_000) + // Minimum execution time: 21_212 nanoseconds. + Weight::from_parts(22_885_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } + /// Storage: `Indices::Accounts` (r:1 w:1) + /// Proof: `Indices::Accounts` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + fn poke_deposit() -> Weight { + // Proof Size summary in bytes: + // Measured: `75` + // Estimated: `3534` + // Minimum execution time: 20_268_000 picoseconds. + Weight::from_parts(20_592_000, 3534) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } } diff --git a/pallets/weights/src/pallet_multisig.rs b/pallets/weights/src/pallet_multisig.rs index 06eb41fe1a..ef7a63a6ac 100644 --- a/pallets/weights/src/pallet_multisig.rs +++ b/pallets/weights/src/pallet_multisig.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_multisig //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,17 +54,17 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: Identity KeyRecords (r:2 w:1) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig MultiSigNonce (r:1 w:1) // Proof Skipped: MultiSig MultiSigNonce (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity CurrentAuthId (r:1 w:1) - // Proof: Identity CurrentAuthId (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentAuthId (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:50) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidKeys (r:0 w:1) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity DidKeys (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyPortfolioPermissions (r:0 w:1) // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyExtrinsicPermissions (r:0 w:1) @@ -79,10 +79,10 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[1, 50]`. fn create_multisig(i: u32) -> Weight { - // Minimum execution time: 67_080 nanoseconds. - Weight::from_ref_time(59_790_135) - // Standard Error: 33_166 - .saturating_add(Weight::from_ref_time(12_485_379).saturating_mul(i.into())) + // Minimum execution time: 67_951 nanoseconds. + Weight::from_parts(66_528_129, 0) + // Standard Error: 38_800 + .saturating_add(Weight::from_parts(13_064_257, 0).saturating_mul(i.into())) .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(10)) .saturating_add(DbWeight::get().writes((2_u64).saturating_mul(i.into()))) @@ -92,9 +92,9 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig MultiSigSignsRequired (r:1 w:0) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig NextProposalId (r:1 w:1) // Proof Skipped: MultiSig NextProposalId (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) @@ -110,8 +110,8 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig ProposalStates (r:0 w:1) // Proof Skipped: MultiSig ProposalStates (max_values: None, max_size: None, mode: Measured) fn create_proposal() -> Weight { - // Minimum execution time: 76_304 nanoseconds. - Weight::from_ref_time(77_606_000) + // Minimum execution time: 80_460 nanoseconds. + Weight::from_parts(85_689_000, 0) .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(5)) } @@ -124,9 +124,9 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig MultiSigSignsRequired (r:1 w:0) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig Votes (r:1 w:1) // Proof Skipped: MultiSig Votes (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig Proposals (r:1 w:0) @@ -134,8 +134,8 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig ProposalVoteCounts (r:1 w:1) // Proof Skipped: MultiSig ProposalVoteCounts (max_values: None, max_size: None, mode: Measured) fn approve() -> Weight { - // Minimum execution time: 63_044 nanoseconds. - Weight::from_ref_time(73_911_000) + // Minimum execution time: 69_423 nanoseconds. + Weight::from_parts(74_581_000, 0) .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().writes(2)) } @@ -150,8 +150,8 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig ProposalStates (r:0 w:1) // Proof Skipped: MultiSig ProposalStates (max_values: None, max_size: None, mode: Measured) fn execute_proposal() -> Weight { - // Minimum execution time: 40_591 nanoseconds. - Weight::from_ref_time(41_422_000) + // Minimum execution time: 43_335 nanoseconds. + Weight::from_parts(46_059_000, 0) .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(5)) } @@ -164,9 +164,9 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig MultiSigSignsRequired (r:1 w:0) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig ProposalVoteCounts (r:1 w:1) // Proof Skipped: MultiSig ProposalVoteCounts (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig Votes (r:1 w:1) @@ -176,23 +176,23 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig Proposals (r:0 w:1) // Proof Skipped: MultiSig Proposals (max_values: None, max_size: None, mode: Measured) fn reject() -> Weight { - // Minimum execution time: 68_843 nanoseconds. - Weight::from_ref_time(78_089_000) + // Minimum execution time: 77_705 nanoseconds. + Weight::from_parts(84_526_000, 0) .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().writes(4)) } // Storage: Identity Authorizations (r:1 w:1) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity OutdatedAuthorizations (r:1 w:0) - // Proof: Identity OutdatedAuthorizations (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Identity OutdatedAuthorizations (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig MultiSigSignsRequired (r:2 w:0) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:2 w:1) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: Identity CddAuthForPrimaryKeyRotation (r:1 w:0) - // Proof: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + // Proof Skipped: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: None, mode: Measured) // Storage: MultiSig MultiSigSigners (r:1 w:1) // Proof Skipped: MultiSig MultiSigSigners (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig NextProposalId (r:1 w:0) @@ -200,37 +200,37 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig NumberOfSigners (r:1 w:1) // Proof Skipped: MultiSig NumberOfSigners (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:1) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) fn accept_multisig_signer() -> Weight { - // Minimum execution time: 77_706 nanoseconds. - Weight::from_ref_time(81_572_000) + // Minimum execution time: 87_010 nanoseconds. + Weight::from_parts(91_728_000, 0) .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().writes(6)) } // Storage: MultiSig MultiSigSignsRequired (r:1 w:0) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig NumberOfSigners (r:1 w:0) // Proof Skipped: MultiSig NumberOfSigners (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity CurrentAuthId (r:1 w:1) - // Proof: Identity CurrentAuthId (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentAuthId (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:49) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: Identity Authorizations (r:0 w:49) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[1, 49]`. fn add_multisig_signers(i: u32) -> Weight { - // Minimum execution time: 52_038 nanoseconds. - Weight::from_ref_time(43_503_720) - // Standard Error: 35_256 - .saturating_add(Weight::from_ref_time(12_462_676).saturating_mul(i.into())) + // Minimum execution time: 53_981 nanoseconds. + Weight::from_parts(44_757_621, 0) + // Standard Error: 46_317 + .saturating_add(Weight::from_parts(13_288_505, 0).saturating_mul(i.into())) .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(2)) .saturating_add(DbWeight::get().writes((2_u64).saturating_mul(i.into()))) @@ -238,11 +238,11 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig MultiSigSignsRequired (r:1 w:0) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:50 w:49) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: Identity CddAuthForPrimaryKeyRotation (r:1 w:0) - // Proof: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + // Proof Skipped: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: None, mode: Measured) // Storage: MultiSig NumberOfSigners (r:1 w:1) // Proof Skipped: MultiSig NumberOfSigners (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig MultiSigSigners (r:49 w:49) @@ -251,65 +251,53 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Proof Skipped: MultiSig NextProposalId (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[2, 50]`. fn remove_multisig_signers(i: u32) -> Weight { - // Minimum execution time: 54_512 nanoseconds. - Weight::from_ref_time(34_575_871) - // Standard Error: 44_875 - .saturating_add(Weight::from_ref_time(11_108_190).saturating_mul(i.into())) + // Minimum execution time: 63_505 nanoseconds. + Weight::from_parts(49_344_283, 0) + // Standard Error: 38_046 + .saturating_add(Weight::from_parts(11_866_085, 0).saturating_mul(i.into())) .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().reads((2_u64).saturating_mul(i.into()))) .saturating_add(DbWeight::get().writes(3)) .saturating_add(DbWeight::get().writes((2_u64).saturating_mul(i.into()))) } // Storage: Identity KeyRecords (r:2 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig AdminDid (r:1 w:0) // Proof Skipped: MultiSig AdminDid (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig MultiSigSignsRequired (r:1 w:0) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig NumberOfSigners (r:1 w:0) // Proof Skipped: MultiSig NumberOfSigners (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity CurrentAuthId (r:1 w:1) - // Proof: Identity CurrentAuthId (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentAuthId (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:49) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: Identity Authorizations (r:0 w:49) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[1, 49]`. fn add_multisig_signers_via_admin(i: u32) -> Weight { - // Minimum execution time: 77_166 nanoseconds. - Weight::from_ref_time(72_214_755) - // Standard Error: 40_115 - .saturating_add(Weight::from_ref_time(12_569_732).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(12)) + // Minimum execution time: 69_765 nanoseconds. + Weight::from_parts(63_090_803, 0) + // Standard Error: 32_773 + .saturating_add(Weight::from_parts(13_322_994, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(2)) .saturating_add(DbWeight::get().writes((2_u64).saturating_mul(i.into()))) } // Storage: Identity KeyRecords (r:51 w:49) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig AdminDid (r:1 w:0) // Proof Skipped: MultiSig AdminDid (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig MultiSigSignsRequired (r:1 w:0) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: Identity CddAuthForPrimaryKeyRotation (r:1 w:0) - // Proof: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + // Proof Skipped: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: None, mode: Measured) // Storage: MultiSig NumberOfSigners (r:1 w:1) // Proof Skipped: MultiSig NumberOfSigners (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig MultiSigSigners (r:49 w:49) @@ -318,11 +306,11 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Proof Skipped: MultiSig NextProposalId (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[2, 50]`. fn remove_multisig_signers_via_admin(i: u32) -> Weight { - // Minimum execution time: 80_220 nanoseconds. - Weight::from_ref_time(64_554_566) - // Standard Error: 39_706 - .saturating_add(Weight::from_ref_time(10_922_191).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 71_507 nanoseconds. + Weight::from_parts(56_681_928, 0) + // Standard Error: 35_587 + .saturating_add(Weight::from_parts(11_972_501, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().reads((2_u64).saturating_mul(i.into()))) .saturating_add(DbWeight::get().writes(3)) .saturating_add(DbWeight::get().writes((2_u64).saturating_mul(i.into()))) @@ -330,105 +318,87 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig MultiSigSignsRequired (r:1 w:1) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig NumberOfSigners (r:1 w:0) // Proof Skipped: MultiSig NumberOfSigners (max_values: None, max_size: None, mode: Measured) // Storage: Identity CddAuthForPrimaryKeyRotation (r:1 w:0) - // Proof: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + // Proof Skipped: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: None, mode: Measured) // Storage: MultiSig NextProposalId (r:1 w:0) // Proof Skipped: MultiSig NextProposalId (max_values: None, max_size: None, mode: Measured) fn change_sigs_required() -> Weight { - // Minimum execution time: 39_129 nanoseconds. - Weight::from_ref_time(40_912_000) + // Minimum execution time: 43_505 nanoseconds. + Weight::from_parts(55_693_000, 0) .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:2 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig AdminDid (r:1 w:0) // Proof Skipped: MultiSig AdminDid (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig MultiSigSignsRequired (r:1 w:1) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig NumberOfSigners (r:1 w:0) // Proof Skipped: MultiSig NumberOfSigners (max_values: None, max_size: None, mode: Measured) // Storage: Identity CddAuthForPrimaryKeyRotation (r:1 w:0) - // Proof: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + // Proof Skipped: Identity CddAuthForPrimaryKeyRotation (max_values: Some(1), max_size: None, mode: Measured) // Storage: MultiSig NextProposalId (r:1 w:0) // Proof Skipped: MultiSig NextProposalId (max_values: None, max_size: None, mode: Measured) fn change_sigs_required_via_admin() -> Weight { - // Minimum execution time: 67_421 nanoseconds. - Weight::from_ref_time(71_037_000) - .saturating_add(DbWeight::get().reads(12)) + // Minimum execution time: 59_249 nanoseconds. + Weight::from_parts(62_192_000, 0) + .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(1)) } // Storage: MultiSig MultiSigSignsRequired (r:1 w:0) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig AdminDid (r:0 w:1) // Proof Skipped: MultiSig AdminDid (max_values: None, max_size: None, mode: Measured) fn add_admin() -> Weight { - // Minimum execution time: 29_464 nanoseconds. - Weight::from_ref_time(30_346_000) + // Minimum execution time: 30_275 nanoseconds. + Weight::from_parts(32_309_000, 0) .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig AdminDid (r:1 w:1) // Proof Skipped: MultiSig AdminDid (max_values: None, max_size: None, mode: Measured) fn remove_admin_via_admin() -> Weight { - // Minimum execution time: 49_955 nanoseconds. - Weight::from_ref_time(51_347_000) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 31_397 nanoseconds. + Weight::from_parts(32_168_000, 0) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } // Storage: MultiSig MultiSigSignsRequired (r:1 w:0) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig PayingDid (r:1 w:1) // Proof Skipped: MultiSig PayingDid (max_values: None, max_size: None, mode: Measured) fn remove_payer() -> Weight { - // Minimum execution time: 30_626 nanoseconds. - Weight::from_ref_time(32_809_000) + // Minimum execution time: 31_638 nanoseconds. + Weight::from_parts(33_621_000, 0) .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig PayingDid (r:1 w:1) // Proof Skipped: MultiSig PayingDid (max_values: None, max_size: None, mode: Measured) fn remove_payer_via_payer() -> Weight { - // Minimum execution time: 47_130 nanoseconds. - Weight::from_ref_time(52_589_000) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 30_997 nanoseconds. + Weight::from_parts(32_099_000, 0) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } // Storage: MultiSig MultiSigSignsRequired (r:1 w:0) @@ -436,27 +406,27 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: Identity Authorizations (r:1 w:1) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity OutdatedAuthorizations (r:1 w:0) - // Proof: Identity OutdatedAuthorizations (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Identity OutdatedAuthorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidRecords (r:1 w:0) - // Proof: Identity DidRecords (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity DidRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:1) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity Claims (r:2 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:1) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidKeys (r:0 w:1) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity DidKeys (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyPortfolioPermissions (r:0 w:1) // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyExtrinsicPermissions (r:0 w:1) @@ -466,8 +436,8 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig AuthToProposalId (r:0 w:1) // Proof Skipped: MultiSig AuthToProposalId (max_values: None, max_size: None, mode: Measured) fn join_identity() -> Weight { - // Minimum execution time: 95_955 nanoseconds. - Weight::from_ref_time(97_166_000) + // Minimum execution time: 110_895 nanoseconds. + Weight::from_parts(125_979_000, 0) .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().writes(9)) } @@ -480,7 +450,7 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig MultiSigSignsRequired (r:1 w:0) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig LastInvalidProposal (r:1 w:0) // Proof Skipped: MultiSig LastInvalidProposal (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig Votes (r:1 w:1) @@ -492,8 +462,8 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig ProposalStates (r:0 w:1) // Proof Skipped: MultiSig ProposalStates (max_values: None, max_size: None, mode: Measured) fn create_join_identity() -> Weight { - // Minimum execution time: 73_149 nanoseconds. - Weight::from_ref_time(76_575_000) + // Minimum execution time: 78_387 nanoseconds. + Weight::from_parts(81_713_000, 0) .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(6)) } @@ -508,7 +478,7 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig MultiSigSignsRequired (r:1 w:0) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig Votes (r:1 w:1) // Proof Skipped: MultiSig Votes (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig Proposals (r:1 w:0) @@ -516,22 +486,22 @@ impl pallet_multisig::WeightInfo for SubstrateWeight { // Storage: MultiSig ProposalVoteCounts (r:1 w:1) // Proof Skipped: MultiSig ProposalVoteCounts (max_values: None, max_size: None, mode: Measured) fn approve_join_identity() -> Weight { - // Minimum execution time: 65_428 nanoseconds. - Weight::from_ref_time(66_780_000) + // Minimum execution time: 73_511 nanoseconds. + Weight::from_parts(76_465_000, 0) .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().writes(2)) } // Storage: MultiSig MultiSigSignsRequired (r:1 w:0) // Proof Skipped: MultiSig MultiSigSignsRequired (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) // Storage: MultiSig AdminDid (r:1 w:1) // Proof Skipped: MultiSig AdminDid (max_values: None, max_size: None, mode: Measured) fn remove_admin() -> Weight { - // Minimum execution time: 29_254 nanoseconds. - Weight::from_ref_time(31_998_000) + // Minimum execution time: 32_839 nanoseconds. + Weight::from_parts(33_820_000, 0) .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(1)) } diff --git a/pallets/weights/src/pallet_nft.rs b/pallets/weights/src/pallet_nft.rs index 16df65a1d4..369fb79f6a 100644 --- a/pallets/weights/src/pallet_nft.rs +++ b/pallets/weights/src/pallet_nft.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_nft //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,179 +54,157 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_nft::WeightInfo for SubstrateWeight { // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System BlockHash (r:1 w:0) // Proof: System BlockHash (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) // Storage: Asset AssetNonce (r:1 w:1) - // Proof: Asset AssetNonce (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - // Storage: Nft CollectionAsset (r:1 w:1) - // Proof: Nft CollectionAsset (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Asset AssetNonce (max_values: None, max_size: None, mode: Measured) + // Storage: NFT CollectionAsset (r:1 w:1) + // Proof Skipped: NFT CollectionAsset (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetMetadataGlobalKeyToName (r:255 w:0) // Proof Skipped: Asset AssetMetadataGlobalKeyToName (max_values: None, max_size: None, mode: Measured) // Storage: Asset Assets (r:1 w:1) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) + // Storage: Portfolio PortfolioCustodian (r:1 w:0) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Identity CurrentPayer (r:1 w:0) - // Proof: Identity CurrentPayer (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentPayer (max_values: Some(1), max_size: None, mode: Measured) // Storage: ExternalAgents NumFullAgents (r:1 w:1) - // Proof: ExternalAgents NumFullAgents (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) - // Storage: Nft CurrentCollectionId (r:1 w:1) - // Proof: Nft CurrentCollectionId (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents NumFullAgents (max_values: None, max_size: None, mode: Measured) + // Storage: NFT CurrentCollectionId (r:1 w:1) + // Proof Skipped: NFT CurrentCollectionId (max_values: Some(1), max_size: None, mode: Measured) + // Storage: NFT Collection (r:0 w:1) + // Proof Skipped: NFT Collection (max_values: None, max_size: None, mode: Measured) + // Storage: NFT CollectionKeys (r:0 w:1) + // Proof Skipped: NFT CollectionKeys (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetNames (r:0 w:1) // Proof Skipped: Asset AssetNames (max_values: None, max_size: None, mode: Measured) // Storage: Asset SecurityTokensOwnedByUser (r:0 w:1) - // Proof: Asset SecurityTokensOwnedByUser (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Asset SecurityTokensOwnedByUser (max_values: None, max_size: None, mode: Measured) // Storage: Asset AssetIdentifiers (r:0 w:1) // Proof Skipped: Asset AssetIdentifiers (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents AgentOf (r:0 w:1) - // Proof: ExternalAgents AgentOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents AgentOf (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:0 w:1) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) - // Storage: Nft Collection (r:0 w:1) - // Proof: Nft Collection (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - // Storage: Nft CollectionKeys (r:0 w:1) - // Proof Skipped: Nft CollectionKeys (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[1, 255]`. fn create_nft_collection(n: u32) -> Weight { - // Minimum execution time: 129_685 nanoseconds. - Weight::from_ref_time(137_525_691) - // Standard Error: 10_618 - .saturating_add(Weight::from_ref_time(2_504_965).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(14)) + // Minimum execution time: 112_277 nanoseconds. + Weight::from_parts(116_687_560, 0) + // Standard Error: 12_225 + .saturating_add(Weight::from_parts(2_590_390, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(11)) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().writes(12)) } - // Storage: Nft CollectionAsset (r:1 w:0) - // Proof: Nft CollectionAsset (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Storage: NFT CollectionAsset (r:1 w:0) + // Proof Skipped: NFT CollectionAsset (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Nft CollectionKeys (r:1 w:0) - // Proof Skipped: Nft CollectionKeys (max_values: None, max_size: None, mode: Measured) - // Storage: Nft NFTsInCollection (r:1 w:1) - // Proof: Nft NFTsInCollection (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - // Storage: Nft NumberOfNFTs (r:1 w:1) - // Proof: Nft NumberOfNFTs (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - // Storage: Nft CurrentNFTId (r:1 w:1) - // Proof: Nft CurrentNFTId (max_values: None, max_size: Some(32), added: 2507, mode: MaxEncodedLen) + // Storage: NFT CollectionKeys (r:1 w:0) + // Proof Skipped: NFT CollectionKeys (max_values: None, max_size: None, mode: Measured) + // Storage: NFT NFTsInCollection (r:1 w:1) + // Proof Skipped: NFT NFTsInCollection (max_values: None, max_size: None, mode: Measured) + // Storage: NFT NumberOfNFTs (r:1 w:1) + // Proof Skipped: NFT NumberOfNFTs (max_values: None, max_size: None, mode: Measured) + // Storage: NFT CurrentNFTId (r:1 w:1) + // Proof Skipped: NFT CurrentNFTId (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioNFT (r:0 w:1) - // Proof: Portfolio PortfolioNFT (max_values: None, max_size: Some(90), added: 2565, mode: MaxEncodedLen) - // Storage: Nft MetadataValue (r:0 w:255) - // Proof Skipped: Nft MetadataValue (max_values: None, max_size: None, mode: Measured) - // Storage: Nft NFTOwner (r:0 w:1) - // Proof: Nft NFTOwner (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioNFT (max_values: None, max_size: None, mode: Measured) + // Storage: NFT MetadataValue (r:0 w:255) + // Proof Skipped: NFT MetadataValue (max_values: None, max_size: None, mode: Measured) + // Storage: NFT NFTOwner (r:0 w:1) + // Proof Skipped: NFT NFTOwner (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[1, 255]`. fn issue_nft(n: u32) -> Weight { - // Minimum execution time: 78_757 nanoseconds. - Weight::from_ref_time(82_036_303) - // Standard Error: 10_808 - .saturating_add(Weight::from_ref_time(3_094_813).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(13)) + // Minimum execution time: 63_275 nanoseconds. + Weight::from_parts(65_757_843, 0) + // Standard Error: 10_580 + .saturating_add(Weight::from_parts(3_304_052, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().writes(5)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(n.into()))) } - // Storage: Nft CollectionAsset (r:1 w:0) - // Proof: Nft CollectionAsset (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Storage: NFT CollectionAsset (r:1 w:0) + // Proof Skipped: NFT CollectionAsset (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:1 w:0) - // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioNFT (r:1 w:1) - // Proof: Portfolio PortfolioNFT (max_values: None, max_size: Some(90), added: 2565, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioNFT (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedNFT (r:1 w:0) - // Proof: Portfolio PortfolioLockedNFT (max_values: None, max_size: Some(90), added: 2565, mode: MaxEncodedLen) - // Storage: Nft NFTsInCollection (r:1 w:1) - // Proof: Nft NFTsInCollection (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - // Storage: Nft NumberOfNFTs (r:1 w:1) - // Proof: Nft NumberOfNFTs (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - // Storage: Nft MetadataValue (r:256 w:255) - // Proof Skipped: Nft MetadataValue (max_values: None, max_size: None, mode: Measured) - // Storage: Nft NFTOwner (r:0 w:1) - // Proof: Nft NFTOwner (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedNFT (max_values: None, max_size: None, mode: Measured) + // Storage: NFT NFTsInCollection (r:1 w:1) + // Proof Skipped: NFT NFTsInCollection (max_values: None, max_size: None, mode: Measured) + // Storage: NFT NumberOfNFTs (r:1 w:1) + // Proof Skipped: NFT NumberOfNFTs (max_values: None, max_size: None, mode: Measured) + // Storage: NFT MetadataValue (r:256 w:255) + // Proof Skipped: NFT MetadataValue (max_values: None, max_size: None, mode: Measured) + // Storage: NFT NFTOwner (r:1 w:1) + // Proof Skipped: NFT NFTOwner (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[1, 255]`. fn redeem_nft(n: u32) -> Weight { - // Minimum execution time: 94_061 nanoseconds. - Weight::from_ref_time(87_454_675) - // Standard Error: 8_486 - .saturating_add(Weight::from_ref_time(4_722_602).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(15)) + // Minimum execution time: 83_425 nanoseconds. + Weight::from_parts(79_468_509, 0) + // Standard Error: 9_091 + .saturating_add(Weight::from_parts(4_986_847, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().writes(4)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(n.into()))) } - // Storage: Nft CollectionAsset (r:1 w:0) - // Proof: Nft CollectionAsset (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - // Storage: Nft NumberOfNFTs (r:2 w:2) - // Proof: Nft NumberOfNFTs (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) + // Storage: NFT CollectionAsset (r:1 w:0) + // Proof Skipped: NFT CollectionAsset (max_values: None, max_size: None, mode: Measured) + // Storage: NFT NumberOfNFTs (r:2 w:2) + // Proof Skipped: NFT NumberOfNFTs (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioNFT (r:10 w:20) - // Proof: Portfolio PortfolioNFT (max_values: None, max_size: Some(90), added: 2565, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioNFT (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedNFT (r:10 w:0) - // Proof: Portfolio PortfolioLockedNFT (max_values: None, max_size: Some(90), added: 2565, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedNFT (max_values: None, max_size: None, mode: Measured) // Storage: Asset Frozen (r:1 w:0) - // Proof: Asset Frozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Asset Frozen (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity Claims (r:4 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: ComplianceManager AssetCompliances (r:1 w:0) // Proof Skipped: ComplianceManager AssetCompliances (max_values: None, max_size: None, mode: Measured) - // Storage: Nft NFTOwner (r:0 w:10) - // Proof: Nft NFTOwner (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Storage: NFT NFTOwner (r:0 w:10) + // Proof Skipped: NFT NFTOwner (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[1, 10]`. fn base_nft_transfer(n: u32) -> Weight { - // Minimum execution time: 125_458 nanoseconds. - Weight::from_ref_time(119_702_844) - // Standard Error: 99_329 - .saturating_add(Weight::from_ref_time(13_378_308).saturating_mul(n.into())) + // Minimum execution time: 132_779 nanoseconds. + Weight::from_parts(127_076_178, 0) + // Standard Error: 135_156 + .saturating_add(Weight::from_parts(14_141_631, 0).saturating_mul(n.into())) .saturating_add(DbWeight::get().reads(11)) .saturating_add(DbWeight::get().reads((2_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().writes(2)) .saturating_add(DbWeight::get().writes((3_u64).saturating_mul(n.into()))) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -234,24 +212,24 @@ impl pallet_nft::WeightInfo for SubstrateWeight { // Storage: Portfolio Portfolios (r:1 w:0) // Proof Skipped: Portfolio Portfolios (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:1 w:0) - // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) - // Storage: Nft CollectionAsset (r:1 w:0) - // Proof: Nft CollectionAsset (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - // Storage: Nft NumberOfNFTs (r:2 w:2) - // Proof: Nft NumberOfNFTs (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) + // Storage: NFT CollectionAsset (r:1 w:0) + // Proof Skipped: NFT CollectionAsset (max_values: None, max_size: None, mode: Measured) + // Storage: NFT NumberOfNFTs (r:2 w:2) + // Proof Skipped: NFT NumberOfNFTs (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioNFT (r:10 w:20) - // Proof: Portfolio PortfolioNFT (max_values: None, max_size: Some(90), added: 2565, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioNFT (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedNFT (r:10 w:0) - // Proof: Portfolio PortfolioLockedNFT (max_values: None, max_size: Some(90), added: 2565, mode: MaxEncodedLen) - // Storage: Nft NFTOwner (r:0 w:10) - // Proof: Nft NFTOwner (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedNFT (max_values: None, max_size: None, mode: Measured) + // Storage: NFT NFTOwner (r:0 w:10) + // Proof Skipped: NFT NFTOwner (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[1, 10]`. fn controller_transfer(n: u32) -> Weight { - // Minimum execution time: 93_139 nanoseconds. - Weight::from_ref_time(85_640_069) - // Standard Error: 91_703 - .saturating_add(Weight::from_ref_time(13_802_261).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(13)) + // Minimum execution time: 79_298 nanoseconds. + Weight::from_parts(70_256_608, 0) + // Standard Error: 122_051 + .saturating_add(Weight::from_parts(14_678_121, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().reads((2_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().writes(2)) .saturating_add(DbWeight::get().writes((3_u64).saturating_mul(n.into()))) diff --git a/pallets/weights/src/pallet_pips.rs b/pallets/weights/src/pallet_pips.rs index 9cb4ca266b..6ea71f690e 100644 --- a/pallets/weights/src/pallet_pips.rs +++ b/pallets/weights/src/pallet_pips.rs @@ -18,19 +18,19 @@ //! Autogenerated weights for pallet_pips //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2025-01-20, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `HNDesktop`, CPU: `Intel(R) Core(TM) i5-10600K CPU @ 4.10GHz` // Executed Command: -// ./polymesh +// ./target/release/polymesh // benchmark // pallet // -s // 100 // -r // 5 -// -p=* +// -p=pallet_pips // -e=* // --heap-pages // 4096 @@ -41,7 +41,7 @@ // --wasm-execution // compiled // --output -// ./Polymesh/pallets/weights/src/ +// ./pallets/weights/src/ // --template // ./.maintain/frame-weight-template.hbs @@ -56,59 +56,53 @@ impl pallet_pips::WeightInfo for SubstrateWeight { // Storage: Pips PruneHistoricalPips (r:1 w:1) // Proof: Pips PruneHistoricalPips (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) fn set_prune_historical_pips() -> Weight { - // Minimum execution time: 11_087 nanoseconds. - Weight::from_ref_time(11_717_000) + // Minimum execution time: 17_519 nanoseconds. + Weight::from_parts(17_652_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Pips MinimumProposalDeposit (r:1 w:1) // Proof: Pips MinimumProposalDeposit (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) fn set_min_proposal_deposit() -> Weight { - // Minimum execution time: 14_181 nanoseconds. - Weight::from_ref_time(16_195_000) + // Minimum execution time: 20_637 nanoseconds. + Weight::from_parts(21_244_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Pips DefaultEnactmentPeriod (r:1 w:1) // Proof: Pips DefaultEnactmentPeriod (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) fn set_default_enactment_period() -> Weight { - // Minimum execution time: 14_462 nanoseconds. - Weight::from_ref_time(16_305_000) + // Minimum execution time: 20_395 nanoseconds. + Weight::from_parts(20_535_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Pips PendingPipExpiry (r:1 w:1) // Proof Skipped: Pips PendingPipExpiry (max_values: Some(1), max_size: None, mode: Measured) fn set_pending_pip_expiry() -> Weight { - // Minimum execution time: 13_811 nanoseconds. - Weight::from_ref_time(14_993_000) + // Minimum execution time: 21_154 nanoseconds. + Weight::from_parts(21_741_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Pips MaxPipSkipCount (r:1 w:1) // Proof: Pips MaxPipSkipCount (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) fn set_max_pip_skip_count() -> Weight { - // Minimum execution time: 10_996 nanoseconds. - Weight::from_ref_time(11_467_000) + // Minimum execution time: 17_035 nanoseconds. + Weight::from_parts(17_344_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Pips ActivePipLimit (r:1 w:1) // Proof: Pips ActivePipLimit (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) fn set_active_pip_limit() -> Weight { - // Minimum execution time: 12_869 nanoseconds. - Weight::from_ref_time(15_353_000) + // Minimum execution time: 19_938 nanoseconds. + Weight::from_parts(20_366_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Pips PipIdSequence (r:1 w:1) // Proof: Pips PipIdSequence (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) // Storage: Pips ActivePipLimit (r:1 w:0) @@ -142,9 +136,9 @@ impl pallet_pips::WeightInfo for SubstrateWeight { // Storage: Pips ProposalStates (r:0 w:1) // Proof: Pips ProposalStates (max_values: None, max_size: Some(13), added: 2488, mode: MaxEncodedLen) fn propose_from_community() -> Weight { - // Minimum execution time: 124_157 nanoseconds. - Weight::from_ref_time(134_491_000) - .saturating_add(DbWeight::get().reads(17)) + // Minimum execution time: 129_932 nanoseconds. + Weight::from_parts(130_345_000, 0) + .saturating_add(DbWeight::get().reads(13)) .saturating_add(DbWeight::get().writes(11)) } // Storage: Pips PipIdSequence (r:1 w:1) @@ -166,19 +160,13 @@ impl pallet_pips::WeightInfo for SubstrateWeight { // Storage: Pips ProposalStates (r:0 w:1) // Proof: Pips ProposalStates (max_values: None, max_size: Some(13), added: 2488, mode: MaxEncodedLen) fn propose_from_committee() -> Weight { - // Minimum execution time: 50_636 nanoseconds. - Weight::from_ref_time(53_931_000) + // Minimum execution time: 65_140 nanoseconds. + Weight::from_parts(65_704_000, 0) .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(6)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Pips Proposals (r:1 w:0) // Proof Skipped: Pips Proposals (max_values: None, max_size: None, mode: Measured) // Storage: Pips ProposalStates (r:1 w:0) @@ -192,9 +180,9 @@ impl pallet_pips::WeightInfo for SubstrateWeight { // Storage: Pips LiveQueue (r:1 w:1) // Proof Skipped: Pips LiveQueue (max_values: Some(1), max_size: None, mode: Measured) fn vote() -> Weight { - // Minimum execution time: 118_989 nanoseconds. - Weight::from_ref_time(134_702_000) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 108_219 nanoseconds. + Weight::from_parts(115_627_000, 0) + .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(4)) } // Storage: Pips ProposalStates (r:1 w:1) @@ -210,8 +198,8 @@ impl pallet_pips::WeightInfo for SubstrateWeight { // Storage: Pips PipToSchedule (r:0 w:1) // Proof: Pips PipToSchedule (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) fn approve_committee_proposal() -> Weight { - // Minimum execution time: 46_921 nanoseconds. - Weight::from_ref_time(49_374_000) + // Minimum execution time: 65_605 nanoseconds. + Weight::from_parts(67_197_000, 0) .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(4)) } @@ -238,8 +226,8 @@ impl pallet_pips::WeightInfo for SubstrateWeight { // Storage: Pips ProposalResult (r:0 w:1) // Proof: Pips ProposalResult (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) fn reject_proposal() -> Weight { - // Minimum execution time: 69_755 nanoseconds. - Weight::from_ref_time(74_191_000) + // Minimum execution time: 85_835 nanoseconds. + Weight::from_parts(87_787_000, 0) .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(9)) } @@ -258,19 +246,13 @@ impl pallet_pips::WeightInfo for SubstrateWeight { // Storage: Pips ProposalResult (r:0 w:1) // Proof: Pips ProposalResult (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) fn prune_proposal() -> Weight { - // Minimum execution time: 44_968 nanoseconds. - Weight::from_ref_time(46_269_000) + // Minimum execution time: 61_597 nanoseconds. + Weight::from_parts(62_681_000, 0) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(7)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: PolymeshCommittee ReleaseCoordinator (r:1 w:0) // Proof: PolymeshCommittee ReleaseCoordinator (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) // Storage: Pips ProposalStates (r:1 w:0) @@ -282,19 +264,13 @@ impl pallet_pips::WeightInfo for SubstrateWeight { // Storage: Pips PipToSchedule (r:0 w:1) // Proof: Pips PipToSchedule (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) fn reschedule_execution() -> Weight { - // Minimum execution time: 85_239 nanoseconds. - Weight::from_ref_time(93_881_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 77_090 nanoseconds. + Weight::from_parts(77_456_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(4)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: PolymeshCommittee Members (r:1 w:0) // Proof Skipped: PolymeshCommittee Members (max_values: Some(1), max_size: None, mode: Measured) // Storage: Pips SnapshotMeta (r:1 w:1) @@ -302,19 +278,13 @@ impl pallet_pips::WeightInfo for SubstrateWeight { // Storage: Pips SnapshotQueue (r:0 w:1) // Proof Skipped: Pips SnapshotQueue (max_values: Some(1), max_size: None, mode: Measured) fn clear_snapshot() -> Weight { - // Minimum execution time: 50_476 nanoseconds. - Weight::from_ref_time(54_622_000) - .saturating_add(DbWeight::get().reads(7)) + // Minimum execution time: 39_778 nanoseconds. + Weight::from_parts(40_192_000, 0) + .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: PolymeshCommittee Members (r:1 w:0) // Proof Skipped: PolymeshCommittee Members (max_values: Some(1), max_size: None, mode: Measured) // Storage: Pips SnapshotIdSequence (r:1 w:1) @@ -326,9 +296,9 @@ impl pallet_pips::WeightInfo for SubstrateWeight { // Storage: Pips SnapshotMeta (r:0 w:1) // Proof: Pips SnapshotMeta (max_values: Some(1), max_size: Some(40), added: 535, mode: MaxEncodedLen) fn snapshot() -> Weight { - // Minimum execution time: 70_968 nanoseconds. - Weight::from_ref_time(72_548_000) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 62_355 nanoseconds. + Weight::from_parts(70_260_000, 0) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Pips MaxPipSkipCount (r:1 w:0) @@ -361,14 +331,14 @@ impl pallet_pips::WeightInfo for SubstrateWeight { /// The range of component `r` is `[0, 33]`. /// The range of component `s` is `[0, 33]`. fn enact_snapshot_results(a: u32, r: u32, s: u32) -> Weight { - // Minimum execution time: 876_216 nanoseconds. - Weight::from_ref_time(150_324_091) - // Standard Error: 103_895 - .saturating_add(Weight::from_ref_time(34_756_262).saturating_mul(a.into())) - // Standard Error: 103_895 - .saturating_add(Weight::from_ref_time(15_591_440).saturating_mul(r.into())) - // Standard Error: 103_895 - .saturating_add(Weight::from_ref_time(6_671_231).saturating_mul(s.into())) + // Minimum execution time: 977_352 nanoseconds. + Weight::from_parts(159_135_641, 0) + // Standard Error: 45_263 + .saturating_add(Weight::from_parts(38_431_937, 0).saturating_mul(a.into())) + // Standard Error: 45_263 + .saturating_add(Weight::from_parts(16_926_524, 0).saturating_mul(r.into())) + // Standard Error: 45_263 + .saturating_add(Weight::from_parts(7_970_390, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().reads((2_u64).saturating_mul(a.into()))) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(r.into()))) @@ -399,8 +369,8 @@ impl pallet_pips::WeightInfo for SubstrateWeight { // Storage: Pips ProposalResult (r:0 w:1) // Proof: Pips ProposalResult (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) fn execute_scheduled_pip() -> Weight { - // Minimum execution time: 120_390 nanoseconds. - Weight::from_ref_time(122_634_000) + // Minimum execution time: 110_098 nanoseconds. + Weight::from_parts(111_819_000, 0) .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(9)) } @@ -429,8 +399,8 @@ impl pallet_pips::WeightInfo for SubstrateWeight { // Storage: Pips ProposalResult (r:0 w:1) // Proof: Pips ProposalResult (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) fn expire_scheduled_pip() -> Weight { - // Minimum execution time: 143_155 nanoseconds. - Weight::from_ref_time(148_643_000) + // Minimum execution time: 128_188 nanoseconds. + Weight::from_parts(129_249_000, 0) .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(10)) } @@ -449,12 +419,12 @@ impl pallet_pips::WeightInfo for SubstrateWeight { /// The range of component `r` is `[0, 128]`. /// The range of component `v` is `[0, 128]`. fn remove_pending_storage(r: u32, v: u32) -> Weight { - // Minimum execution time: 655_515 nanoseconds. - Weight::from_ref_time(81_639_463) - // Standard Error: 39_969 - .saturating_add(Weight::from_ref_time(21_271_082).saturating_mul(r.into())) - // Standard Error: 39_969 - .saturating_add(Weight::from_ref_time(4_999_901).saturating_mul(v.into())) + // Minimum execution time: 739_279 nanoseconds. + Weight::from_parts(63_144_485, 0) + // Standard Error: 18_226 + .saturating_add(Weight::from_parts(24_421_417, 0).saturating_mul(r.into())) + // Standard Error: 18_226 + .saturating_add(Weight::from_parts(5_613_829, 0).saturating_mul(v.into())) .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(r.into()))) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(v.into()))) diff --git a/pallets/weights/src/pallet_portfolio.rs b/pallets/weights/src/pallet_portfolio.rs index 29f3bd4ec6..7a4c63cde6 100644 --- a/pallets/weights/src/pallet_portfolio.rs +++ b/pallets/weights/src/pallet_portfolio.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_portfolio //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,157 +54,121 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_portfolio::WeightInfo for SubstrateWeight { // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio NameToNumber (r:1 w:1) // Proof Skipped: Portfolio NameToNumber (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio NextPortfolioNumber (r:1 w:1) - // Proof: Portfolio NextPortfolioNumber (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Portfolio NextPortfolioNumber (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio Portfolios (r:0 w:1) // Proof Skipped: Portfolio Portfolios (max_values: None, max_size: None, mode: Measured) /// The range of component `l` is `[1, 500]`. fn create_portfolio(l: u32) -> Weight { - // Minimum execution time: 44_907 nanoseconds. - Weight::from_ref_time(53_645_608) - // Standard Error: 3_075 - .saturating_add(Weight::from_ref_time(9_707).saturating_mul(l.into())) - .saturating_add(DbWeight::get().reads(7)) + // Minimum execution time: 29_945 nanoseconds. + Weight::from_parts(37_050_913, 0) + // Standard Error: 2_500 + .saturating_add(Weight::from_parts(8_946, 0).saturating_mul(l.into())) + .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetCount (r:1 w:1) - // Proof: Portfolio PortfolioAssetCount (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetCount (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioNFT (r:1 w:0) - // Proof: Portfolio PortfolioNFT (max_values: None, max_size: Some(90), added: 2565, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioNFT (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedNFT (r:1 w:0) - // Proof: Portfolio PortfolioLockedNFT (max_values: None, max_size: Some(90), added: 2565, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedNFT (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio Portfolios (r:1 w:1) // Proof Skipped: Portfolio Portfolios (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:1 w:1) - // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfoliosInCustody (r:0 w:1) - // Proof: Portfolio PortfoliosInCustody (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfoliosInCustody (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio NameToNumber (r:0 w:1) // Proof Skipped: Portfolio NameToNumber (max_values: None, max_size: None, mode: Measured) fn delete_portfolio() -> Weight { - // Minimum execution time: 72_729 nanoseconds. - Weight::from_ref_time(77_356_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 61_051 nanoseconds. + Weight::from_parts(69_163_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(5)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio Portfolios (r:1 w:1) // Proof Skipped: Portfolio Portfolios (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio NameToNumber (r:1 w:2) // Proof Skipped: Portfolio NameToNumber (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[1, 500]`. fn rename_portfolio(i: u32) -> Weight { - // Minimum execution time: 51_658 nanoseconds. - Weight::from_ref_time(59_738_619) - // Standard Error: 3_135 - .saturating_add(Weight::from_ref_time(13_609).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(7)) + // Minimum execution time: 36_695 nanoseconds. + Weight::from_parts(41_059_117, 0) + // Standard Error: 1_347 + .saturating_add(Weight::from_parts(20_675, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:1 w:1) - // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfoliosInCustody (r:0 w:1) - // Proof: Portfolio PortfoliosInCustody (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfoliosInCustody (max_values: None, max_size: None, mode: Measured) fn quit_portfolio_custody() -> Weight { - // Minimum execution time: 51_737 nanoseconds. - Weight::from_ref_time(52_108_000) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 36_354 nanoseconds. + Weight::from_parts(40_070_000, 0) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity Authorizations (r:1 w:1) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity OutdatedAuthorizations (r:1 w:0) - // Proof: Identity OutdatedAuthorizations (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Identity OutdatedAuthorizations (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:1 w:1) - // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfoliosInCustody (r:0 w:2) - // Proof: Portfolio PortfoliosInCustody (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfoliosInCustody (max_values: None, max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:1) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) fn accept_portfolio_custody() -> Weight { - // Minimum execution time: 73_401 nanoseconds. - Weight::from_ref_time(76_475_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 59_127 nanoseconds. + Weight::from_parts(59_309_000, 0) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(6)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio Portfolios (r:1 w:0) // Proof Skipped: Portfolio Portfolios (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:1 w:0) - // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioNFT (r:100 w:200) - // Proof: Portfolio PortfolioNFT (max_values: None, max_size: Some(90), added: 2565, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioNFT (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedNFT (r:100 w:0) - // Proof: Portfolio PortfolioLockedNFT (max_values: None, max_size: Some(90), added: 2565, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedNFT (max_values: None, max_size: None, mode: Measured) // Storage: Asset Assets (r:10 w:0) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetBalances (r:20 w:20) - // Proof: Portfolio PortfolioAssetBalances (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetBalances (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedAssets (r:10 w:0) - // Proof: Portfolio PortfolioLockedAssets (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedAssets (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetCount (r:1 w:1) - // Proof: Portfolio PortfolioAssetCount (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) - // Storage: Nft NFTOwner (r:0 w:100) - // Proof: Nft NFTOwner (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetCount (max_values: None, max_size: None, mode: Measured) + // Storage: NFT NFTOwner (r:0 w:100) + // Proof Skipped: NFT NFTOwner (max_values: None, max_size: None, mode: Measured) /// The range of component `f` is `[1, 10]`. /// The range of component `n` is `[1, 100]`. fn move_portfolio_funds(f: u32, n: u32) -> Weight { - // Minimum execution time: 379_240 nanoseconds. - Weight::from_ref_time(64_725_812) - // Standard Error: 296_727 - .saturating_add(Weight::from_ref_time(31_588_542).saturating_mul(f.into())) - // Standard Error: 27_882 - .saturating_add(Weight::from_ref_time(13_745_446).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 324_106 nanoseconds. + Weight::from_parts(69_877_225, 0) + // Standard Error: 363_511 + .saturating_add(Weight::from_parts(24_738_302, 0).saturating_mul(f.into())) + // Standard Error: 34_158 + .saturating_add(Weight::from_parts(14_948_726, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().reads((4_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((2_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().writes(1)) @@ -212,101 +176,71 @@ impl pallet_portfolio::WeightInfo for SubstrateWeight { .saturating_add(DbWeight::get().writes((3_u64).saturating_mul(n.into()))) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio Portfolios (r:1 w:0) // Proof Skipped: Portfolio Portfolios (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:1 w:0) - // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PreApprovedPortfolios (r:0 w:1) - // Proof: Portfolio PreApprovedPortfolios (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PreApprovedPortfolios (max_values: None, max_size: None, mode: Measured) fn pre_approve_portfolio() -> Weight { - // Minimum execution time: 45_107 nanoseconds. - Weight::from_ref_time(60_301_000) - .saturating_add(DbWeight::get().reads(7)) + // Minimum execution time: 28_823 nanoseconds. + Weight::from_parts(34_331_000, 0) + .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio Portfolios (r:1 w:0) // Proof Skipped: Portfolio Portfolios (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:1 w:0) - // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PreApprovedPortfolios (r:0 w:1) - // Proof: Portfolio PreApprovedPortfolios (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PreApprovedPortfolios (max_values: None, max_size: None, mode: Measured) fn remove_portfolio_pre_approval() -> Weight { - // Minimum execution time: 45_328 nanoseconds. - Weight::from_ref_time(48_192_000) - .saturating_add(DbWeight::get().reads(7)) + // Minimum execution time: 28_793 nanoseconds. + Weight::from_parts(30_766_000, 0) + .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio AllowedCustodians (r:0 w:1) - // Proof: Portfolio AllowedCustodians (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Portfolio AllowedCustodians (max_values: None, max_size: None, mode: Measured) fn allow_identity_to_create_portfolios() -> Weight { - // Minimum execution time: 35_834 nanoseconds. - Weight::from_ref_time(40_391_000) - .saturating_add(DbWeight::get().reads(5)) + // Minimum execution time: 15_053 nanoseconds. + Weight::from_parts(16_504_000, 0) + .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio AllowedCustodians (r:0 w:1) - // Proof: Portfolio AllowedCustodians (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Portfolio AllowedCustodians (max_values: None, max_size: None, mode: Measured) fn revoke_create_portfolios_permission() -> Weight { - // Minimum execution time: 35_373 nanoseconds. - Weight::from_ref_time(38_498_000) - .saturating_add(DbWeight::get().reads(5)) + // Minimum execution time: 15_784 nanoseconds. + Weight::from_parts(17_936_000, 0) + .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio AllowedCustodians (r:1 w:0) - // Proof: Portfolio AllowedCustodians (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Portfolio AllowedCustodians (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio NextPortfolioNumber (r:1 w:1) - // Proof: Portfolio NextPortfolioNumber (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Portfolio NextPortfolioNumber (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio NameToNumber (r:1 w:1) // Proof Skipped: Portfolio NameToNumber (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:0 w:1) - // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfoliosInCustody (r:0 w:1) - // Proof: Portfolio PortfoliosInCustody (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfoliosInCustody (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio Portfolios (r:0 w:1) // Proof Skipped: Portfolio Portfolios (max_values: None, max_size: None, mode: Measured) fn create_custody_portfolio() -> Weight { - // Minimum execution time: 63_256 nanoseconds. - Weight::from_ref_time(66_940_000) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 46_910 nanoseconds. + Weight::from_parts(48_954_000, 0) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(5)) } } diff --git a/pallets/weights/src/pallet_preimage.rs b/pallets/weights/src/pallet_preimage.rs index 153f5210e4..653fb6371f 100644 --- a/pallets/weights/src/pallet_preimage.rs +++ b/pallets/weights/src/pallet_preimage.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_preimage //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -59,10 +59,10 @@ impl pallet_preimage::WeightInfo for SubstrateWeight { // Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: MaxEncodedLen) /// The range of component `s` is `[0, 4194304]`. fn note_preimage(s: u32) -> Weight { - // Minimum execution time: 28_203 nanoseconds. - Weight::from_ref_time(28_254_999) - // Standard Error: 2 - .saturating_add(Weight::from_ref_time(1_501).saturating_mul(s.into())) + // Minimum execution time: 29_554 nanoseconds. + Weight::from_parts(22_909_597, 0) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_370, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(2)) } @@ -72,10 +72,10 @@ impl pallet_preimage::WeightInfo for SubstrateWeight { // Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: MaxEncodedLen) /// The range of component `s` is `[0, 4194304]`. fn note_requested_preimage(s: u32) -> Weight { - // Minimum execution time: 17_937 nanoseconds. - Weight::from_ref_time(1_683_598) - // Standard Error: 4 - .saturating_add(Weight::from_ref_time(1_510).saturating_mul(s.into())) + // Minimum execution time: 18_909 nanoseconds. + Weight::from_parts(19_329_000, 0) + // Standard Error: 2 + .saturating_add(Weight::from_parts(1_372, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(2)) } @@ -85,10 +85,10 @@ impl pallet_preimage::WeightInfo for SubstrateWeight { // Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: MaxEncodedLen) /// The range of component `s` is `[0, 4194304]`. fn note_no_deposit_preimage(s: u32) -> Weight { - // Minimum execution time: 17_246 nanoseconds. - Weight::from_ref_time(9_678_129) + // Minimum execution time: 18_167 nanoseconds. + Weight::from_parts(18_468_000, 0) // Standard Error: 1 - .saturating_add(Weight::from_ref_time(1_499).saturating_mul(s.into())) + .saturating_add(Weight::from_parts(1_362, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(2)) } @@ -97,8 +97,8 @@ impl pallet_preimage::WeightInfo for SubstrateWeight { // Storage: Preimage PreimageFor (r:0 w:1) // Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: MaxEncodedLen) fn unnote_preimage() -> Weight { - // Minimum execution time: 45_098 nanoseconds. - Weight::from_ref_time(46_080_000) + // Minimum execution time: 55_824 nanoseconds. + Weight::from_parts(57_286_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(2)) } @@ -107,40 +107,40 @@ impl pallet_preimage::WeightInfo for SubstrateWeight { // Storage: Preimage PreimageFor (r:0 w:1) // Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: MaxEncodedLen) fn unnote_no_deposit_preimage() -> Weight { - // Minimum execution time: 33_671 nanoseconds. - Weight::from_ref_time(37_296_000) + // Minimum execution time: 35_714 nanoseconds. + Weight::from_parts(37_967_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Preimage StatusFor (r:1 w:1) // Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) fn request_preimage() -> Weight { - // Minimum execution time: 34_522 nanoseconds. - Weight::from_ref_time(37_426_000) + // Minimum execution time: 32_498 nanoseconds. + Weight::from_parts(38_387_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Preimage StatusFor (r:1 w:1) // Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) fn request_no_deposit_preimage() -> Weight { - // Minimum execution time: 25_468 nanoseconds. - Weight::from_ref_time(27_331_000) + // Minimum execution time: 19_108 nanoseconds. + Weight::from_parts(21_673_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Preimage StatusFor (r:1 w:1) // Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) fn request_unnoted_preimage() -> Weight { - // Minimum execution time: 18_768 nanoseconds. - Weight::from_ref_time(22_253_000) + // Minimum execution time: 19_580 nanoseconds. + Weight::from_parts(21_141_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Preimage StatusFor (r:1 w:1) // Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) fn request_requested_preimage() -> Weight { - // Minimum execution time: 12_048 nanoseconds. - Weight::from_ref_time(13_801_000) + // Minimum execution time: 10_837 nanoseconds. + Weight::from_parts(11_948_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } @@ -149,25 +149,49 @@ impl pallet_preimage::WeightInfo for SubstrateWeight { // Storage: Preimage PreimageFor (r:0 w:1) // Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: MaxEncodedLen) fn unrequest_preimage() -> Weight { - // Minimum execution time: 42_694 nanoseconds. - Weight::from_ref_time(43_585_000) + // Minimum execution time: 31_718 nanoseconds. + Weight::from_parts(34_052_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Preimage StatusFor (r:1 w:1) // Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) fn unrequest_unnoted_preimage() -> Weight { - // Minimum execution time: 10_756 nanoseconds. - Weight::from_ref_time(12_919_000) + // Minimum execution time: 10_776 nanoseconds. + Weight::from_parts(11_267_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Preimage StatusFor (r:1 w:1) // Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) fn unrequest_multi_referenced_preimage() -> Weight { - // Minimum execution time: 9_925 nanoseconds. - Weight::from_ref_time(11_037_000) + // Minimum execution time: 11_066 nanoseconds. + Weight::from_parts(11_577_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } + /// Storage: `Preimage::StatusFor` (r:1023 w:1023) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1023 w:1023) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(11322), added: 13797, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1023 w:1023) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(427), added: 2902, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:0 w:1023) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// The range of component `n` is `[1, 1024]`. + fn ensure_updated(n: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + n * (227 ±0)` + // Estimated: `28584 + n * (2902 ±0)` + // Minimum execution time: 54_553_000 picoseconds. + Weight::from_parts(56_817_000, 28584) + // Standard Error: 37_902 + .saturating_add(Weight::from_parts(59_397_441, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(2_u64)) + .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(n.into()))) + .saturating_add(DbWeight::get().writes((4_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 2902).saturating_mul(n.into())) + } } diff --git a/pallets/weights/src/pallet_protocol_fee.rs b/pallets/weights/src/pallet_protocol_fee.rs index 56ad0ad588..6c1426f0f7 100644 --- a/pallets/weights/src/pallet_protocol_fee.rs +++ b/pallets/weights/src/pallet_protocol_fee.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_protocol_fee //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,15 +54,15 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_protocol_fee::WeightInfo for SubstrateWeight { // Storage: ProtocolFee Coefficient (r:0 w:1) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) fn change_coefficient() -> Weight { - // Minimum execution time: 7_911 nanoseconds. - Weight::from_ref_time(8_202_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 10_466 nanoseconds. + Weight::from_parts(10_776_000, 0).saturating_add(DbWeight::get().writes(1)) } // Storage: ProtocolFee BaseFees (r:0 w:1) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) fn change_base_fee() -> Weight { - // Minimum execution time: 8_643 nanoseconds. - Weight::from_ref_time(10_145_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 10_476 nanoseconds. + Weight::from_parts(12_649_000, 0).saturating_add(DbWeight::get().writes(1)) } } diff --git a/pallets/weights/src/pallet_relayer.rs b/pallets/weights/src/pallet_relayer.rs index d875d559de..55cadb84a6 100644 --- a/pallets/weights/src/pallet_relayer.rs +++ b/pallets/weights/src/pallet_relayer.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_relayer //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,111 +54,87 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_relayer::WeightInfo for SubstrateWeight { // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity CurrentAuthId (r:1 w:1) - // Proof: Identity CurrentAuthId (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentAuthId (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:1) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) // Storage: Identity Authorizations (r:0 w:1) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) fn set_paying_key() -> Weight { - // Minimum execution time: 31_176 nanoseconds. - Weight::from_ref_time(34_031_000) + // Minimum execution time: 34_151 nanoseconds. + Weight::from_parts(35_943_000, 0) .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(4)) } // Storage: Identity KeyRecords (r:2 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity Authorizations (r:1 w:1) // Proof Skipped: Identity Authorizations (max_values: None, max_size: None, mode: Measured) // Storage: Identity OutdatedAuthorizations (r:1 w:0) - // Proof: Identity OutdatedAuthorizations (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) + // Proof Skipped: Identity OutdatedAuthorizations (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity Claims (r:4 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Relayer Subsidies (r:1 w:1) - // Proof: Relayer Subsidies (max_values: None, max_size: Some(96), added: 2571, mode: MaxEncodedLen) + // Proof Skipped: Relayer Subsidies (max_values: None, max_size: None, mode: Measured) // Storage: Identity AccountKeyRefCount (r:2 w:2) - // Proof: Identity AccountKeyRefCount (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + // Proof Skipped: Identity AccountKeyRefCount (max_values: None, max_size: None, mode: Measured) // Storage: Identity NumberOfGivenAuths (r:1 w:1) - // Proof: Identity NumberOfGivenAuths (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + // Proof Skipped: Identity NumberOfGivenAuths (max_values: None, max_size: None, mode: Measured) // Storage: Identity AuthorizationsGiven (r:0 w:1) - // Proof: Identity AuthorizationsGiven (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Identity AuthorizationsGiven (max_values: None, max_size: None, mode: Measured) fn accept_paying_key() -> Weight { - // Minimum execution time: 84_136 nanoseconds. - Weight::from_ref_time(90_736_000) + // Minimum execution time: 93_059 nanoseconds. + Weight::from_parts(94_542_000, 0) .saturating_add(DbWeight::get().reads(14)) .saturating_add(DbWeight::get().writes(6)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Relayer Subsidies (r:1 w:1) - // Proof: Relayer Subsidies (max_values: None, max_size: Some(96), added: 2571, mode: MaxEncodedLen) + // Proof Skipped: Relayer Subsidies (max_values: None, max_size: None, mode: Measured) // Storage: Identity AccountKeyRefCount (r:2 w:2) - // Proof: Identity AccountKeyRefCount (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + // Proof Skipped: Identity AccountKeyRefCount (max_values: None, max_size: None, mode: Measured) fn remove_paying_key() -> Weight { - // Minimum execution time: 50_606 nanoseconds. - Weight::from_ref_time(52_769_000) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 36_174 nanoseconds. + Weight::from_parts(38_248_000, 0) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Relayer Subsidies (r:1 w:1) - // Proof: Relayer Subsidies (max_values: None, max_size: Some(96), added: 2571, mode: MaxEncodedLen) + // Proof Skipped: Relayer Subsidies (max_values: None, max_size: None, mode: Measured) fn update_polyx_limit() -> Weight { - // Minimum execution time: 42_553 nanoseconds. - Weight::from_ref_time(44_527_000) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 26_390 nanoseconds. + Weight::from_parts(28_032_000, 0) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Relayer Subsidies (r:1 w:1) - // Proof: Relayer Subsidies (max_values: None, max_size: Some(96), added: 2571, mode: MaxEncodedLen) + // Proof Skipped: Relayer Subsidies (max_values: None, max_size: None, mode: Measured) fn increase_polyx_limit() -> Weight { - // Minimum execution time: 42_513 nanoseconds. - Weight::from_ref_time(47_992_000) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 26_720 nanoseconds. + Weight::from_parts(27_942_000, 0) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Relayer Subsidies (r:1 w:1) - // Proof: Relayer Subsidies (max_values: None, max_size: Some(96), added: 2571, mode: MaxEncodedLen) + // Proof Skipped: Relayer Subsidies (max_values: None, max_size: None, mode: Measured) fn decrease_polyx_limit() -> Weight { - // Minimum execution time: 42_264 nanoseconds. - Weight::from_ref_time(47_942_000) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 26_670 nanoseconds. + Weight::from_parts(28_093_000, 0) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } } diff --git a/pallets/weights/src/pallet_scheduler.rs b/pallets/weights/src/pallet_scheduler.rs index ee7569e95c..e52e439939 100644 --- a/pallets/weights/src/pallet_scheduler.rs +++ b/pallets/weights/src/pallet_scheduler.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_scheduler //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -56,8 +56,8 @@ impl pallet_scheduler::WeightInfo for SubstrateWeight { // Storage: Scheduler IncompleteSince (r:1 w:1) // Proof: Scheduler IncompleteSince (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) fn service_agendas_base() -> Weight { - // Minimum execution time: 3_956 nanoseconds. - Weight::from_ref_time(4_306_000) + // Minimum execution time: 4_257 nanoseconds. + Weight::from_parts(4_717_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } @@ -65,56 +65,56 @@ impl pallet_scheduler::WeightInfo for SubstrateWeight { // Proof: Scheduler Agenda (max_values: None, max_size: Some(10463), added: 12938, mode: MaxEncodedLen) /// The range of component `s` is `[0, 50]`. fn service_agenda_base(s: u32) -> Weight { - // Minimum execution time: 3_926 nanoseconds. - Weight::from_ref_time(8_734_086) - // Standard Error: 13_013 - .saturating_add(Weight::from_ref_time(446_332).saturating_mul(s.into())) + // Minimum execution time: 4_056 nanoseconds. + Weight::from_parts(8_535_926, 0) + // Standard Error: 8_884 + .saturating_add(Weight::from_parts(452_167, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } fn service_task_base() -> Weight { - // Minimum execution time: 5_499 nanoseconds. - Weight::from_ref_time(5_678_000) + // Minimum execution time: 5_879 nanoseconds. + Weight::from_parts(6_429_000, 0) } // Storage: Preimage PreimageFor (r:1 w:1) - // Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: MaxEncodedLen) + // Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: Measured) // Storage: Preimage StatusFor (r:1 w:1) // Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) /// The range of component `s` is `[128, 4194304]`. fn service_task_fetched(s: u32) -> Weight { - // Minimum execution time: 23_065 nanoseconds. - Weight::from_ref_time(23_075_000) + // Minimum execution time: 23_575 nanoseconds. + Weight::from_parts(24_257_000, 0) // Standard Error: 1 - .saturating_add(Weight::from_ref_time(862).saturating_mul(s.into())) + .saturating_add(Weight::from_parts(730, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Scheduler Lookup (r:0 w:1) // Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) fn service_task_named() -> Weight { - // Minimum execution time: 6_971 nanoseconds. - Weight::from_ref_time(8_844_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 7_281 nanoseconds. + Weight::from_parts(7_652_000, 0).saturating_add(DbWeight::get().writes(1)) } fn service_task_periodic() -> Weight { - // Minimum execution time: 4_987 nanoseconds. - Weight::from_ref_time(5_399_000) + // Minimum execution time: 5_848 nanoseconds. + Weight::from_parts(6_821_000, 0) } fn execute_dispatch_signed() -> Weight { - // Minimum execution time: 2_434 nanoseconds. - Weight::from_ref_time(2_754_000) + // Minimum execution time: 2_534 nanoseconds. + Weight::from_parts(3_205_000, 0) } fn execute_dispatch_unsigned() -> Weight { - // Minimum execution time: 2_464 nanoseconds. - Weight::from_ref_time(2_604_000) + // Minimum execution time: 2_704 nanoseconds. + Weight::from_parts(4_746_000, 0) } // Storage: Scheduler Agenda (r:1 w:1) // Proof: Scheduler Agenda (max_values: None, max_size: Some(10463), added: 12938, mode: MaxEncodedLen) /// The range of component `s` is `[0, 49]`. fn schedule(s: u32) -> Weight { - // Minimum execution time: 12_970 nanoseconds. - Weight::from_ref_time(19_761_302) - // Standard Error: 18_907 - .saturating_add(Weight::from_ref_time(485_529).saturating_mul(s.into())) + // Minimum execution time: 13_140 nanoseconds. + Weight::from_parts(19_895_615, 0) + // Standard Error: 17_756 + .saturating_add(Weight::from_parts(475_043, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } @@ -124,10 +124,10 @@ impl pallet_scheduler::WeightInfo for SubstrateWeight { // Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) /// The range of component `s` is `[1, 50]`. fn cancel(s: u32) -> Weight { - // Minimum execution time: 17_356 nanoseconds. - Weight::from_ref_time(20_145_881) - // Standard Error: 18_316 - .saturating_add(Weight::from_ref_time(728_665).saturating_mul(s.into())) + // Minimum execution time: 17_917 nanoseconds. + Weight::from_parts(21_643_727, 0) + // Standard Error: 13_734 + .saturating_add(Weight::from_parts(682_001, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(2)) } @@ -137,10 +137,10 @@ impl pallet_scheduler::WeightInfo for SubstrateWeight { // Proof: Scheduler Agenda (max_values: None, max_size: Some(10463), added: 12938, mode: MaxEncodedLen) /// The range of component `s` is `[0, 49]`. fn schedule_named(s: u32) -> Weight { - // Minimum execution time: 16_064 nanoseconds. - Weight::from_ref_time(24_948_406) - // Standard Error: 19_234 - .saturating_add(Weight::from_ref_time(508_630).saturating_mul(s.into())) + // Minimum execution time: 16_564 nanoseconds. + Weight::from_parts(25_137_587, 0) + // Standard Error: 17_033 + .saturating_add(Weight::from_parts(508_209, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(2)) } @@ -150,11 +150,83 @@ impl pallet_scheduler::WeightInfo for SubstrateWeight { // Proof: Scheduler Agenda (max_values: None, max_size: Some(10463), added: 12938, mode: MaxEncodedLen) /// The range of component `s` is `[1, 50]`. fn cancel_named(s: u32) -> Weight { - // Minimum execution time: 19_559 nanoseconds. - Weight::from_ref_time(23_742_763) - // Standard Error: 19_014 - .saturating_add(Weight::from_ref_time(741_496).saturating_mul(s.into())) + // Minimum execution time: 19_960 nanoseconds. + Weight::from_parts(24_138_408, 0) + // Standard Error: 16_466 + .saturating_add(Weight::from_parts(713_572, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(2)) } + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// The range of component `s` is `[1, 512]`. + fn schedule_retry(s: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `31` + // Estimated: `110487` + // Minimum execution time: 8_844_000 picoseconds. + Weight::from_parts(10_762_174, 110487) + // Standard Error: 267 + .saturating_add(Weight::from_parts(16_285, 0).saturating_mul(s.into())) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(2_u64)) + } + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn set_retry() -> Weight { + // Proof Size summary in bytes: + // Measured: `90629` + // Estimated: `110487` + // Minimum execution time: 160_504_000 picoseconds. + Weight::from_parts(169_783_000, 110487) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Scheduler::Lookup` (r:1 w:0) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn set_retry_named() -> Weight { + // Proof Size summary in bytes: + // Measured: `91672` + // Estimated: `110487` + // Minimum execution time: 170_680_000 picoseconds. + Weight::from_parts(186_544_000, 110487) + .saturating_add(DbWeight::get().reads(2_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn cancel_retry() -> Weight { + // Proof Size summary in bytes: + // Measured: `90630` + // Estimated: `110487` + // Minimum execution time: 161_130_000 picoseconds. + Weight::from_parts(169_076_000, 110487) + .saturating_add(DbWeight::get().reads(1_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Scheduler::Lookup` (r:1 w:0) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn cancel_retry_named() -> Weight { + // Proof Size summary in bytes: + // Measured: `91672` + // Estimated: `110487` + // Minimum execution time: 170_742_000 picoseconds. + Weight::from_parts(182_329_000, 110487) + .saturating_add(DbWeight::get().reads(2_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } } diff --git a/pallets/weights/src/pallet_session.rs b/pallets/weights/src/pallet_session.rs index 9f9d1ef7c5..baf8e4cb7b 100644 --- a/pallets/weights/src/pallet_session.rs +++ b/pallets/weights/src/pallet_session.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_session //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -60,8 +60,8 @@ impl pallet_session::WeightInfo for SubstrateWeight { // Storage: Session KeyOwner (r:4 w:4) // Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) fn set_keys() -> Weight { - // Minimum execution time: 58_137 nanoseconds. - Weight::from_ref_time(58_958_000) + // Minimum execution time: 60_480 nanoseconds. + Weight::from_parts(61_743_000, 0) .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(5)) } @@ -72,8 +72,8 @@ impl pallet_session::WeightInfo for SubstrateWeight { // Storage: Session KeyOwner (r:0 w:4) // Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) fn purge_keys() -> Weight { - // Minimum execution time: 41_422 nanoseconds. - Weight::from_ref_time(42_874_000) + // Minimum execution time: 42_173 nanoseconds. + Weight::from_parts(45_859_000, 0) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(5)) } diff --git a/pallets/weights/src/pallet_settlement.rs b/pallets/weights/src/pallet_settlement.rs index 8251e597d9..27ef5d5c42 100644 --- a/pallets/weights/src/pallet_settlement.rs +++ b/pallets/weights/src/pallet_settlement.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_settlement //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -55,12 +55,6 @@ pub struct SubstrateWeight; impl pallet_settlement::WeightInfo for SubstrateWeight { // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement VenueCounter (r:1 w:1) // Proof: Settlement VenueCounter (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Settlement VenueInfo (r:0 w:1) @@ -76,61 +70,43 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `d` is `[1, 2048]`. /// The range of component `s` is `[0, 50]`. fn create_venue(d: u32, s: u32) -> Weight { - // Minimum execution time: 48_974 nanoseconds. - Weight::from_ref_time(57_830_988) - // Standard Error: 628 - .saturating_add(Weight::from_ref_time(2_082).saturating_mul(d.into())) - // Standard Error: 25_526 - .saturating_add(Weight::from_ref_time(2_134_048).saturating_mul(s.into())) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 38_007 nanoseconds. + Weight::from_parts(43_823_114, 0) + // Standard Error: 328 + .saturating_add(Weight::from_parts(338, 0).saturating_mul(d.into())) + // Standard Error: 13_352 + .saturating_add(Weight::from_parts(2_337_555, 0).saturating_mul(s.into())) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(5)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(s.into()))) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement VenueInfo (r:1 w:0) // Proof: Settlement VenueInfo (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) // Storage: Settlement Details (r:0 w:1) // Proof Skipped: Settlement Details (max_values: None, max_size: None, mode: Measured) /// The range of component `d` is `[1, 2048]`. fn update_venue_details(d: u32) -> Weight { - // Minimum execution time: 44_337 nanoseconds. - Weight::from_ref_time(51_844_276) - // Standard Error: 618 - .saturating_add(Weight::from_ref_time(1_286).saturating_mul(d.into())) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 27_702 nanoseconds. + Weight::from_parts(34_850_082, 0) + // Standard Error: 450 + .saturating_add(Weight::from_parts(2_322, 0).saturating_mul(d.into())) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement VenueInfo (r:1 w:1) // Proof: Settlement VenueInfo (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) fn update_venue_type() -> Weight { - // Minimum execution time: 43_295 nanoseconds. - Weight::from_ref_time(46_730_000) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 27_330 nanoseconds. + Weight::from_parts(28_732_000, 0) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement VenueInfo (r:1 w:0) // Proof: Settlement VenueInfo (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) // Storage: Settlement NumberOfVenueSigners (r:1 w:1) @@ -139,23 +115,17 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Settlement VenueSigners (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) /// The range of component `s` is `[0, 50]`. fn update_venue_signers(s: u32) -> Weight { - // Minimum execution time: 46_891 nanoseconds. - Weight::from_ref_time(59_156_481) - // Standard Error: 30_755 - .saturating_add(Weight::from_ref_time(4_205_735).saturating_mul(s.into())) - .saturating_add(DbWeight::get().reads(7)) + // Minimum execution time: 29_644 nanoseconds. + Weight::from_parts(41_178_975, 0) + // Standard Error: 25_032 + .saturating_add(Weight::from_parts(4_526_473, 0).saturating_mul(s.into())) + .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(s.into()))) .saturating_add(DbWeight::get().writes(1)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(s.into()))) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) // Storage: Permissions CurrentPalletName (r:1 w:0) @@ -165,19 +135,13 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Storage: Settlement VenueFiltering (r:0 w:1) // Proof: Settlement VenueFiltering (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) fn set_venue_filtering() -> Weight { - // Minimum execution time: 50_646 nanoseconds. - Weight::from_ref_time(58_017_000) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 33_059 nanoseconds. + Weight::from_parts(34_743_000, 0) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) // Storage: Permissions CurrentPalletName (r:1 w:0) @@ -188,21 +152,15 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Settlement VenueAllowList (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) /// The range of component `v` is `[0, 100]`. fn allow_venues(v: u32) -> Weight { - // Minimum execution time: 51_297 nanoseconds. - Weight::from_ref_time(52_344_917) - // Standard Error: 20_629 - .saturating_add(Weight::from_ref_time(2_228_588).saturating_mul(v.into())) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 29_734 nanoseconds. + Weight::from_parts(34_041_969, 0) + // Standard Error: 18_920 + .saturating_add(Weight::from_parts(2_558_029, 0).saturating_mul(v.into())) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(v.into()))) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) // Storage: Permissions CurrentPalletName (r:1 w:0) @@ -213,21 +171,15 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Settlement VenueAllowList (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) /// The range of component `v` is `[0, 100]`. fn disallow_venues(v: u32) -> Weight { - // Minimum execution time: 49_534 nanoseconds. - Weight::from_ref_time(51_584_159) - // Standard Error: 18_159 - .saturating_add(Weight::from_ref_time(2_206_981).saturating_mul(v.into())) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 32_018 nanoseconds. + Weight::from_parts(35_158_836, 0) + // Standard Error: 18_808 + .saturating_add(Weight::from_parts(2_479_690, 0).saturating_mul(v.into())) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(v.into()))) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionDetails (r:1 w:0) // Proof: Settlement InstructionDetails (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) // Storage: Settlement InstructionStatuses (r:1 w:0) @@ -264,15 +216,15 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `n` is `[0, 100]`. /// The range of component `o` is `[0, 10]`. fn affirm_with_receipts(f: u32, n: u32, o: u32) -> Weight { - // Minimum execution time: 1_859_762 nanoseconds. - Weight::from_ref_time(77_278_928) - // Standard Error: 489_520 - .saturating_add(Weight::from_ref_time(39_661_165).saturating_mul(f.into())) - // Standard Error: 45_281 - .saturating_add(Weight::from_ref_time(32_229_661).saturating_mul(n.into())) - // Standard Error: 443_430 - .saturating_add(Weight::from_ref_time(141_115_891).saturating_mul(o.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 1_362_039 nanoseconds. + Weight::from_parts(30_752_065, 0) + // Standard Error: 920_495 + .saturating_add(Weight::from_parts(50_145_102, 0).saturating_mul(f.into())) + // Standard Error: 85_148 + .saturating_add(Weight::from_parts(37_317_225, 0).saturating_mul(n.into())) + // Standard Error: 833_827 + .saturating_add(Weight::from_parts(84_072_250, 0).saturating_mul(o.into())) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().reads((6_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((5_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(o.into()))) @@ -283,12 +235,6 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:207 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionLegs (r:121 w:120) // Proof Skipped: Settlement InstructionLegs (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionDetails (r:1 w:1) @@ -301,6 +247,8 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Settlement InstructionStatuses (max_values: None, max_size: Some(21), added: 2496, mode: MaxEncodedLen) // Storage: Settlement InstructionAffirmsPending (r:1 w:1) // Proof: Settlement InstructionAffirmsPending (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Settlement InstructionLegStatus (r:120 w:120) // Proof: Settlement InstructionLegStatus (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) // Storage: Settlement OffChainAffirmations (r:10 w:10) @@ -327,6 +275,10 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Portfolio PortfolioAssetBalances (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) // Storage: Asset Frozen (r:110 w:0) // Proof: Asset Frozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Storage: CddServiceProviders ActiveMembers (r:1 w:0) + // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:205 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetTransferCompliances (r:10 w:0) // Proof: Statistics AssetTransferCompliances (max_values: None, max_size: Some(246), added: 2721, mode: MaxEncodedLen) // Storage: Statistics AssetStats (r:140 w:100) @@ -355,13 +307,13 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `n` is `[0, 100]`. /// The range of component `o` is `[0, 10]`. fn execute_manual_instruction(f: u32, n: u32, o: u32) -> Weight { - // Minimum execution time: 4_052_202 nanoseconds. - Weight::from_ref_time(4_061_556_000) - // Standard Error: 4_422_165 - .saturating_add(Weight::from_ref_time(243_990_566).saturating_mul(f.into())) - // Standard Error: 443_980 - .saturating_add(Weight::from_ref_time(165_926_396).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(21)) + // Minimum execution time: 4_326_122 nanoseconds. + Weight::from_parts(4_334_153_000, 0) + // Standard Error: 5_116_456 + .saturating_add(Weight::from_parts(248_402_942, 0).saturating_mul(f.into())) + // Standard Error: 494_029 + .saturating_add(Weight::from_parts(179_827_924, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(19)) .saturating_add(DbWeight::get().reads((60_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((18_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(o.into()))) @@ -372,12 +324,6 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement VenueInfo (r:1 w:0) // Proof: Settlement VenueInfo (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) // Storage: Asset Assets (r:110 w:0) @@ -400,6 +346,8 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Asset MandatoryMediators (max_values: None, max_size: Some(161), added: 2636, mode: MaxEncodedLen) // Storage: Settlement InstructionCounter (r:1 w:1) // Proof: Settlement InstructionCounter (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Scheduler Lookup (r:1 w:1) // Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) // Storage: Scheduler Agenda (r:1 w:1) @@ -426,15 +374,15 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `n` is `[0, 100]`. /// The range of component `o` is `[0, 10]`. fn add_instruction(f: u32, n: u32, o: u32) -> Weight { - // Minimum execution time: 597_207 nanoseconds. - Weight::from_ref_time(174_188_376) - // Standard Error: 687_005 - .saturating_add(Weight::from_ref_time(42_537_717).saturating_mul(f.into())) - // Standard Error: 63_549 - .saturating_add(Weight::from_ref_time(45_247_302).saturating_mul(n.into())) - // Standard Error: 622_320 - .saturating_add(Weight::from_ref_time(1_330_592).saturating_mul(o.into())) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 649_862 nanoseconds. + Weight::from_parts(181_103_629, 0) + // Standard Error: 859_961 + .saturating_add(Weight::from_parts(49_562_998, 0).saturating_mul(f.into())) + // Standard Error: 79_548 + .saturating_add(Weight::from_parts(50_371_349, 0).saturating_mul(n.into())) + // Standard Error: 778_992 + .saturating_add(Weight::from_parts(377_069, 0).saturating_mul(o.into())) + .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().reads((9_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((9_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().writes(8)) @@ -444,12 +392,6 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement VenueInfo (r:1 w:0) // Proof: Settlement VenueInfo (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) // Storage: Asset Assets (r:110 w:0) @@ -472,6 +414,8 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Asset MandatoryMediators (max_values: None, max_size: Some(161), added: 2636, mode: MaxEncodedLen) // Storage: Settlement InstructionCounter (r:1 w:1) // Proof: Settlement InstructionCounter (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Scheduler Lookup (r:1 w:1) // Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) // Storage: Scheduler Agenda (r:1 w:1) @@ -510,15 +454,15 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `n` is `[0, 100]`. /// The range of component `o` is `[0, 10]`. fn add_and_affirm_instruction(f: u32, n: u32, o: u32) -> Weight { - // Minimum execution time: 984_434 nanoseconds. - Weight::from_ref_time(227_269_495) - // Standard Error: 910_292 - .saturating_add(Weight::from_ref_time(67_029_389).saturating_mul(f.into())) - // Standard Error: 84_204 - .saturating_add(Weight::from_ref_time(73_771_559).saturating_mul(n.into())) - // Standard Error: 824_584 - .saturating_add(Weight::from_ref_time(6_324_027).saturating_mul(o.into())) - .saturating_add(DbWeight::get().reads(12)) + // Minimum execution time: 1_044_625 nanoseconds. + Weight::from_parts(35_687_014, 0) + // Standard Error: 1_353_987 + .saturating_add(Weight::from_parts(88_363_287, 0).saturating_mul(f.into())) + // Standard Error: 125_247 + .saturating_add(Weight::from_parts(84_907_864, 0).saturating_mul(n.into())) + // Standard Error: 1_226_503 + .saturating_add(Weight::from_parts(10_688_477, 0).saturating_mul(o.into())) + .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().reads((13_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((13_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(o.into()))) @@ -529,12 +473,6 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionDetails (r:1 w:0) // Proof: Settlement InstructionDetails (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) // Storage: Settlement InstructionStatuses (r:1 w:0) @@ -564,13 +502,13 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `f` is `[1, 10]`. /// The range of component `n` is `[1, 100]`. fn affirm_instruction(f: u32, n: u32) -> Weight { - // Minimum execution time: 526_480 nanoseconds. - Weight::from_ref_time(151_967_401) - // Standard Error: 453_636 - .saturating_add(Weight::from_ref_time(33_811_412).saturating_mul(f.into())) - // Standard Error: 42_627 - .saturating_add(Weight::from_ref_time(31_910_436).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(19)) + // Minimum execution time: 573_378 nanoseconds. + Weight::from_parts(227_742_958, 0) + // Standard Error: 621_956 + .saturating_add(Weight::from_parts(33_924_547, 0).saturating_mul(f.into())) + // Standard Error: 58_443 + .saturating_add(Weight::from_parts(36_201_669, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(15)) .saturating_add(DbWeight::get().reads((6_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((5_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().writes(1)) @@ -579,12 +517,6 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionDetails (r:1 w:0) // Proof: Settlement InstructionDetails (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) // Storage: Settlement InstructionStatuses (r:1 w:0) @@ -609,15 +541,13 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `n` is `[0, 100]`. /// The range of component `o` is `[0, 10]`. fn withdraw_affirmation(f: u32, n: u32, o: u32) -> Weight { - // Minimum execution time: 448_342 nanoseconds. - Weight::from_ref_time(88_480_002) - // Standard Error: 415_073 - .saturating_add(Weight::from_ref_time(30_175_775).saturating_mul(f.into())) - // Standard Error: 38_395 - .saturating_add(Weight::from_ref_time(32_651_548).saturating_mul(n.into())) - // Standard Error: 375_992 - .saturating_add(Weight::from_ref_time(5_106_412).saturating_mul(o.into())) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 472_688 nanoseconds. + Weight::from_parts(149_586_656, 0) + // Standard Error: 627_411 + .saturating_add(Weight::from_parts(35_874_804, 0).saturating_mul(f.into())) + // Standard Error: 58_037 + .saturating_add(Weight::from_parts(37_322_729, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().reads((5_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((5_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(o.into()))) @@ -693,12 +623,12 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `n` is `[0, 100]`. /// The range of component `o` is `[0, 10]`. fn execute_instruction_paused(f: u32, n: u32, o: u32) -> Weight { - // Minimum execution time: 2_282_727 nanoseconds. - Weight::from_ref_time(2_290_609_000) - // Standard Error: 3_059_483 - .saturating_add(Weight::from_ref_time(121_354_879).saturating_mul(f.into())) - // Standard Error: 295_414 - .saturating_add(Weight::from_ref_time(165_005_345).saturating_mul(n.into())) + // Minimum execution time: 2_385_781 nanoseconds. + Weight::from_parts(2_426_592_000, 0) + // Standard Error: 3_430_970 + .saturating_add(Weight::from_parts(118_611_412, 0).saturating_mul(f.into())) + // Standard Error: 331_283 + .saturating_add(Weight::from_parts(176_390_618, 0).saturating_mul(n.into())) .saturating_add(DbWeight::get().reads(16)) .saturating_add(DbWeight::get().reads((26_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((18_u64).saturating_mul(n.into()))) @@ -778,12 +708,12 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `n` is `[0, 100]`. /// The range of component `o` is `[0, 10]`. fn execute_scheduled_instruction(f: u32, n: u32, o: u32) -> Weight { - // Minimum execution time: 4_022_317 nanoseconds. - Weight::from_ref_time(4_023_859_000) - // Standard Error: 4_531_167 - .saturating_add(Weight::from_ref_time(225_266_267).saturating_mul(f.into())) - // Standard Error: 437_515 - .saturating_add(Weight::from_ref_time(163_641_362).saturating_mul(n.into())) + // Minimum execution time: 4_243_219 nanoseconds. + Weight::from_parts(4_250_300_000, 0) + // Standard Error: 4_870_147 + .saturating_add(Weight::from_parts(258_973_141, 0).saturating_mul(f.into())) + // Standard Error: 470_246 + .saturating_add(Weight::from_parts(175_126_988, 0).saturating_mul(n.into())) .saturating_add(DbWeight::get().reads(17)) .saturating_add(DbWeight::get().reads((60_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((18_u64).saturating_mul(n.into()))) @@ -795,16 +725,10 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } fn ensure_root_origin() -> Weight { // Minimum execution time: 591 nanoseconds. - Weight::from_ref_time(641_000) + Weight::from_parts(651_000, 0) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionDetails (r:1 w:0) // Proof: Settlement InstructionDetails (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) // Storage: Settlement InstructionStatuses (r:1 w:0) @@ -831,15 +755,15 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `n` is `[0, 100]`. /// The range of component `o` is `[0, 10]`. fn affirm_with_receipts_rcv(f: u32, n: u32, o: u32) -> Weight { - // Minimum execution time: 1_689_174 nanoseconds. - Weight::from_ref_time(125_184_104) - // Standard Error: 349_599 - .saturating_add(Weight::from_ref_time(20_098_108).saturating_mul(f.into())) - // Standard Error: 32_338 - .saturating_add(Weight::from_ref_time(19_767_832).saturating_mul(n.into())) - // Standard Error: 316_682 - .saturating_add(Weight::from_ref_time(140_312_288).saturating_mul(o.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 1_165_554 nanoseconds. + Weight::from_parts(152_923_311, 0) + // Standard Error: 520_828 + .saturating_add(Weight::from_parts(21_184_928, 0).saturating_mul(f.into())) + // Standard Error: 48_178 + .saturating_add(Weight::from_parts(21_625_684, 0).saturating_mul(n.into())) + // Standard Error: 471_790 + .saturating_add(Weight::from_parts(85_672_760, 0).saturating_mul(o.into())) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(o.into()))) @@ -850,12 +774,6 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionDetails (r:1 w:0) // Proof: Settlement InstructionDetails (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) // Storage: Settlement InstructionStatuses (r:1 w:0) @@ -873,13 +791,13 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `f` is `[1, 10]`. /// The range of component `n` is `[1, 100]`. fn affirm_instruction_rcv(f: u32, n: u32) -> Weight { - // Minimum execution time: 351_617 nanoseconds. - Weight::from_ref_time(152_725_030) - // Standard Error: 405_442 - .saturating_add(Weight::from_ref_time(19_430_316).saturating_mul(f.into())) - // Standard Error: 38_098 - .saturating_add(Weight::from_ref_time(19_529_520).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(19)) + // Minimum execution time: 366_979 nanoseconds. + Weight::from_parts(152_848_331, 0) + // Standard Error: 572_932 + .saturating_add(Weight::from_parts(23_592_317, 0).saturating_mul(f.into())) + // Standard Error: 53_837 + .saturating_add(Weight::from_parts(21_858_616, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(15)) .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().writes(1)) @@ -888,12 +806,6 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionDetails (r:1 w:0) // Proof: Settlement InstructionDetails (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) // Storage: Settlement InstructionStatuses (r:1 w:0) @@ -912,15 +824,15 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `n` is `[0, 100]`. /// The range of component `o` is `[0, 10]`. fn withdraw_affirmation_rcv(f: u32, n: u32, o: u32) -> Weight { - // Minimum execution time: 322_773 nanoseconds. - Weight::from_ref_time(90_513_094) - // Standard Error: 293_344 - .saturating_add(Weight::from_ref_time(20_333_788).saturating_mul(f.into())) - // Standard Error: 27_135 - .saturating_add(Weight::from_ref_time(19_564_050).saturating_mul(n.into())) - // Standard Error: 265_725 - .saturating_add(Weight::from_ref_time(4_641_820).saturating_mul(o.into())) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 334_761 nanoseconds. + Weight::from_parts(135_422_202, 0) + // Standard Error: 432_167 + .saturating_add(Weight::from_parts(21_839_953, 0).saturating_mul(f.into())) + // Standard Error: 39_976 + .saturating_add(Weight::from_parts(21_464_027, 0).saturating_mul(n.into())) + // Standard Error: 391_476 + .saturating_add(Weight::from_parts(1_853_671, 0).saturating_mul(o.into())) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(o.into()))) @@ -930,12 +842,6 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement VenueInfo (r:1 w:0) // Proof: Settlement VenueInfo (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) // Storage: Asset Assets (r:110 w:0) @@ -958,6 +864,8 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Asset MandatoryMediators (max_values: None, max_size: Some(161), added: 2636, mode: MaxEncodedLen) // Storage: Settlement InstructionCounter (r:1 w:1) // Proof: Settlement InstructionCounter (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Scheduler Lookup (r:1 w:1) // Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) // Storage: Scheduler Agenda (r:1 w:1) @@ -985,17 +893,15 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `o` is `[0, 10]`. /// The range of component `m` is `[0, 4]`. fn add_instruction_with_mediators(f: u32, n: u32, o: u32, m: u32) -> Weight { - // Minimum execution time: 593_100 nanoseconds. - Weight::from_ref_time(85_814_205) - // Standard Error: 608_044 - .saturating_add(Weight::from_ref_time(44_550_478).saturating_mul(f.into())) - // Standard Error: 56_109 - .saturating_add(Weight::from_ref_time(45_044_729).saturating_mul(n.into())) - // Standard Error: 550_973 - .saturating_add(Weight::from_ref_time(4_861_695).saturating_mul(o.into())) - // Standard Error: 1_275_849 - .saturating_add(Weight::from_ref_time(4_451_723).saturating_mul(m.into())) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 633_118 nanoseconds. + Weight::from_parts(167_302_584, 0) + // Standard Error: 809_143 + .saturating_add(Weight::from_parts(50_685_362, 0).saturating_mul(f.into())) + // Standard Error: 74_667 + .saturating_add(Weight::from_parts(50_629_572, 0).saturating_mul(n.into())) + // Standard Error: 733_198 + .saturating_add(Weight::from_parts(3_558_326, 0).saturating_mul(o.into())) + .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().reads((9_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((9_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().writes(8)) @@ -1006,12 +912,6 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement VenueInfo (r:1 w:0) // Proof: Settlement VenueInfo (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) // Storage: Asset Assets (r:110 w:0) @@ -1034,6 +934,8 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Asset MandatoryMediators (max_values: None, max_size: Some(161), added: 2636, mode: MaxEncodedLen) // Storage: Settlement InstructionCounter (r:1 w:1) // Proof: Settlement InstructionCounter (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Scheduler Lookup (r:1 w:1) // Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) // Storage: Scheduler Agenda (r:1 w:1) @@ -1073,17 +975,15 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `o` is `[0, 10]`. /// The range of component `m` is `[0, 4]`. fn add_and_affirm_with_mediators(f: u32, n: u32, o: u32, m: u32) -> Weight { - // Minimum execution time: 991_648 nanoseconds. - Weight::from_ref_time(120_646_133) - // Standard Error: 1_065_648 - .saturating_add(Weight::from_ref_time(80_464_049).saturating_mul(f.into())) - // Standard Error: 98_337 - .saturating_add(Weight::from_ref_time(74_208_129).saturating_mul(n.into())) - // Standard Error: 965_627 - .saturating_add(Weight::from_ref_time(3_657_355).saturating_mul(o.into())) - // Standard Error: 2_236_032 - .saturating_add(Weight::from_ref_time(3_432_237).saturating_mul(m.into())) - .saturating_add(DbWeight::get().reads(12)) + // Minimum execution time: 1_081_398 nanoseconds. + Weight::from_parts(102_620_422, 0) + // Standard Error: 1_211_850 + .saturating_add(Weight::from_parts(79_234_687, 0).saturating_mul(f.into())) + // Standard Error: 111_828 + .saturating_add(Weight::from_parts(85_074_081, 0).saturating_mul(n.into())) + // Standard Error: 1_098_106 + .saturating_add(Weight::from_parts(13_898_085, 0).saturating_mul(o.into())) + .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().reads((13_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((13_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(o.into()))) @@ -1095,12 +995,6 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionDetails (r:1 w:0) // Proof: Settlement InstructionDetails (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) // Storage: Settlement InstructionStatuses (r:1 w:0) @@ -1110,19 +1004,13 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Storage: Settlement InstructionAffirmsPending (r:1 w:1) // Proof: Settlement InstructionAffirmsPending (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) fn affirm_instruction_as_mediator() -> Weight { - // Minimum execution time: 109_785 nanoseconds. - Weight::from_ref_time(121_202_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 97_645 nanoseconds. + Weight::from_parts(104_767_000, 0) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionDetails (r:1 w:0) // Proof: Settlement InstructionDetails (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) // Storage: Settlement InstructionStatuses (r:1 w:0) @@ -1132,25 +1020,19 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Storage: Settlement InstructionAffirmsPending (r:1 w:1) // Proof: Settlement InstructionAffirmsPending (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) fn withdraw_affirmation_as_mediator() -> Weight { - // Minimum execution time: 107_733 nanoseconds. - Weight::from_ref_time(119_860_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 100_541 nanoseconds. + Weight::from_parts(107_081_000, 0) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionLegs (r:121 w:120) // Proof Skipped: Settlement InstructionLegs (max_values: None, max_size: None, mode: Measured) - // Storage: Settlement InstructionDetails (r:1 w:1) - // Proof: Settlement InstructionDetails (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) // Storage: Settlement InstructionStatuses (r:1 w:1) // Proof: Settlement InstructionStatuses (max_values: None, max_size: Some(21), added: 2496, mode: MaxEncodedLen) + // Storage: Settlement InstructionDetails (r:1 w:1) + // Proof: Settlement InstructionDetails (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) // Storage: Settlement VenueInfo (r:1 w:0) // Proof: Settlement VenueInfo (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) // Storage: Settlement InstructionMediatorsAffirmations (r:444 w:444) @@ -1177,15 +1059,15 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `n` is `[0, 100]`. /// The range of component `o` is `[0, 10]`. fn base_reject_instruction(f: u32, n: u32, o: u32) -> Weight { - // Minimum execution time: 512_760 nanoseconds. - Weight::from_ref_time(130_587_142) - // Standard Error: 375_315 - .saturating_add(Weight::from_ref_time(29_222_837).saturating_mul(f.into())) - // Standard Error: 38_330 - .saturating_add(Weight::from_ref_time(28_681_658).saturating_mul(n.into())) - // Standard Error: 375_315 - .saturating_add(Weight::from_ref_time(11_897_129).saturating_mul(o.into())) - .saturating_add(DbWeight::get().reads(14)) + // Minimum execution time: 545_769 nanoseconds. + Weight::from_parts(57_609_468, 0) + // Standard Error: 175_623 + .saturating_add(Weight::from_parts(33_741_621, 0).saturating_mul(f.into())) + // Standard Error: 17_936 + .saturating_add(Weight::from_parts(32_236_704, 0).saturating_mul(n.into())) + // Standard Error: 175_623 + .saturating_add(Weight::from_parts(13_428_424, 0).saturating_mul(o.into())) + .saturating_add(DbWeight::get().reads(10)) .saturating_add(DbWeight::get().reads((7_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((7_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().reads((2_u64).saturating_mul(o.into()))) @@ -1196,12 +1078,6 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:6 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionMediatorsAffirmations (r:445 w:0) // Proof: Settlement InstructionMediatorsAffirmations (max_values: None, max_size: Some(58), added: 2533, mode: MaxEncodedLen) // Storage: Settlement InstructionDetails (r:1 w:0) @@ -1212,6 +1088,8 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Settlement InstructionStatuses (max_values: None, max_size: Some(21), added: 2496, mode: MaxEncodedLen) // Storage: Settlement InstructionAffirmsPending (r:1 w:0) // Proof: Settlement InstructionAffirmsPending (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Settlement InstructionLegStatus (r:120 w:0) // Proof: Settlement InstructionLegStatus (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) // Storage: Settlement OffChainAffirmations (r:10 w:0) @@ -1238,6 +1116,10 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Portfolio PortfolioAssetBalances (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) // Storage: Asset Frozen (r:110 w:0) // Proof: Asset Frozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Storage: CddServiceProviders ActiveMembers (r:1 w:0) + // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:4 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetTransferCompliances (r:10 w:0) // Proof: Statistics AssetTransferCompliances (max_values: None, max_size: Some(246), added: 2721, mode: MaxEncodedLen) // Storage: ComplianceManager AssetCompliances (r:110 w:0) @@ -1262,13 +1144,13 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `n` is `[0, 100]`. /// The range of component `o` is `[0, 10]`. fn lock_instruction_extrinsic(f: u32, n: u32, o: u32) -> Weight { - // Minimum execution time: 2_079_000 nanoseconds. - Weight::from_ref_time(2_089_416_000) - // Standard Error: 2_597_622 - .saturating_add(Weight::from_ref_time(114_580_394).saturating_mul(f.into())) - // Standard Error: 260_798 - .saturating_add(Weight::from_ref_time(145_115_677).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(19)) + // Minimum execution time: 2_304_759 nanoseconds. + Weight::from_parts(2_306_732_000, 0) + // Standard Error: 2_531_717 + .saturating_add(Weight::from_parts(127_090_962, 0).saturating_mul(f.into())) + // Standard Error: 254_181 + .saturating_add(Weight::from_parts(160_208_420, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(17)) .saturating_add(DbWeight::get().reads((26_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((18_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(o.into()))) @@ -1276,22 +1158,20 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:202 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionLegs (r:121 w:120) // Proof Skipped: Settlement InstructionLegs (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionDetails (r:1 w:1) // Proof: Settlement InstructionDetails (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - // Storage: Settlement InstructionStatuses (r:1 w:1) - // Proof: Settlement InstructionStatuses (max_values: None, max_size: Some(21), added: 2496, mode: MaxEncodedLen) + // Storage: Settlement VenueInfo (r:1 w:0) + // Proof: Settlement VenueInfo (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) // Storage: Settlement InstructionMediatorsAffirmations (r:444 w:444) // Proof: Settlement InstructionMediatorsAffirmations (max_values: None, max_size: Some(58), added: 2533, mode: MaxEncodedLen) + // Storage: Settlement InstructionStatuses (r:1 w:1) + // Proof: Settlement InstructionStatuses (max_values: None, max_size: Some(21), added: 2496, mode: MaxEncodedLen) // Storage: Settlement LockedTimestamp (r:1 w:0) // Proof: Settlement LockedTimestamp (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Settlement InstructionLegStatus (r:120 w:120) // Proof: Settlement InstructionLegStatus (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) // Storage: Portfolio PortfolioLockedNFT (r:100 w:100) @@ -1320,6 +1200,8 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Portfolio PortfolioAssetCount (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) // Storage: Statistics ActiveAssetStats (r:10 w:0) // Proof: Statistics ActiveAssetStats (max_values: None, max_size: Some(423), added: 2898, mode: MaxEncodedLen) + // Storage: Identity Claims (r:200 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetStats (r:100 w:100) // Proof: Statistics AssetStats (max_values: None, max_size: Some(107), added: 2582, mode: MaxEncodedLen) // Storage: Settlement UserAffirmations (r:0 w:220) @@ -1338,13 +1220,13 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `n` is `[0, 100]`. /// The range of component `o` is `[0, 10]`. fn execute_locked_instruction(f: u32, n: u32, o: u32) -> Weight { - // Minimum execution time: 2_338_088 nanoseconds. - Weight::from_ref_time(2_345_368_000) - // Standard Error: 2_575_462 - .saturating_add(Weight::from_ref_time(138_468_439).saturating_mul(f.into())) - // Standard Error: 258_573 - .saturating_add(Weight::from_ref_time(54_883_779).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(14)) + // Minimum execution time: 2_551_296 nanoseconds. + Weight::from_parts(2_553_993_000, 0) + // Standard Error: 2_755_470 + .saturating_add(Weight::from_parts(148_087_830, 0).saturating_mul(f.into())) + // Standard Error: 276_646 + .saturating_add(Weight::from_parts(55_665_624, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().reads((47_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((11_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().reads((2_u64).saturating_mul(o.into()))) @@ -1355,12 +1237,6 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:6 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionLegs (r:121 w:120) // Proof Skipped: Settlement InstructionLegs (max_values: None, max_size: None, mode: Measured) // Storage: Settlement InstructionDetails (r:1 w:1) @@ -1373,6 +1249,8 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Settlement InstructionStatuses (max_values: None, max_size: Some(21), added: 2496, mode: MaxEncodedLen) // Storage: Settlement InstructionAffirmsPending (r:1 w:1) // Proof: Settlement InstructionAffirmsPending (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Settlement InstructionLegStatus (r:120 w:120) // Proof: Settlement InstructionLegStatus (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) // Storage: Settlement OffChainAffirmations (r:10 w:10) @@ -1399,6 +1277,10 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { // Proof: Portfolio PortfolioAssetBalances (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) // Storage: Asset Frozen (r:110 w:0) // Proof: Asset Frozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Storage: CddServiceProviders ActiveMembers (r:1 w:0) + // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:4 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetTransferCompliances (r:10 w:0) // Proof: Statistics AssetTransferCompliances (max_values: None, max_size: Some(246), added: 2721, mode: MaxEncodedLen) // Storage: ComplianceManager AssetCompliances (r:110 w:0) @@ -1425,13 +1307,13 @@ impl pallet_settlement::WeightInfo for SubstrateWeight { /// The range of component `n` is `[0, 100]`. /// The range of component `o` is `[0, 10]`. fn execute_manual_instruction_paused(f: u32, n: u32, o: u32) -> Weight { - // Minimum execution time: 2_407_883 nanoseconds. - Weight::from_ref_time(2_424_538_000) - // Standard Error: 2_747_969 - .saturating_add(Weight::from_ref_time(126_016_154).saturating_mul(f.into())) - // Standard Error: 275_893 - .saturating_add(Weight::from_ref_time(167_212_024).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(20)) + // Minimum execution time: 2_610_539 nanoseconds. + Weight::from_parts(2_619_700_000, 0) + // Standard Error: 2_902_849 + .saturating_add(Weight::from_parts(137_575_439, 0).saturating_mul(f.into())) + // Standard Error: 291_442 + .saturating_add(Weight::from_parts(180_560_856, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(18)) .saturating_add(DbWeight::get().reads((26_u64).saturating_mul(f.into()))) .saturating_add(DbWeight::get().reads((18_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(o.into()))) diff --git a/pallets/weights/src/pallet_staking.rs b/pallets/weights/src/pallet_staking.rs index ea2f120bb3..97994d6df6 100644 --- a/pallets/weights/src/pallet_staking.rs +++ b/pallets/weights/src/pallet_staking.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_staking //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-12-02, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -30,7 +30,7 @@ // 100 // -r // 5 -// -p=* +// -p=pallet_staking // -e=* // --heap-pages // 4096 @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -60,14 +60,14 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking CurrentEra (r:1 w:0) // Proof: Staking CurrentEra (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Balances Locks (r:1 w:1) // Proof Skipped: Balances Locks (max_values: None, max_size: None, mode: Measured) // Storage: Staking Payee (r:0 w:1) // Proof: Staking Payee (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn bond() -> Weight { - // Minimum execution time: 59_860 nanoseconds. - Weight::from_ref_time(64_396_000) + // Minimum execution time: 60_331 nanoseconds. + Weight::from_parts(70_966_000, 0) .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(4)) } @@ -82,10 +82,10 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking Validators (r:1 w:0) // Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) fn bond_extra() -> Weight { - // Minimum execution time: 60_591 nanoseconds. - Weight::from_ref_time(61_042_000) + // Minimum execution time: 57_987 nanoseconds. + Weight::from_parts(62_364_000, 0) .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(2)) } @@ -102,12 +102,12 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: System Account (r:1 w:1) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) fn unbond() -> Weight { - // Minimum execution time: 62_253 nanoseconds. - Weight::from_ref_time(62_904_000) + // Minimum execution time: 61_993 nanoseconds. + Weight::from_parts(65_178_000, 0) .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(3)) } @@ -121,10 +121,10 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) /// The range of component `s` is `[0, 100]`. fn withdraw_unbonded_update(s: u32) -> Weight { - // Minimum execution time: 39_810 nanoseconds. - Weight::from_ref_time(43_042_160) - // Standard Error: 5_821 - .saturating_add(Weight::from_ref_time(26_306).saturating_mul(s.into())) + // Minimum execution time: 39_089 nanoseconds. + Weight::from_parts(43_312_712, 0) + // Standard Error: 9_035 + .saturating_add(Weight::from_parts(23_827, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(3)) } @@ -150,10 +150,10 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Proof: Staking SpanSlash (max_values: None, max_size: Some(76), added: 2551, mode: MaxEncodedLen) /// The range of component `s` is `[0, 100]`. fn withdraw_unbonded_kill(s: u32) -> Weight { - // Minimum execution time: 64_186 nanoseconds. - Weight::from_ref_time(70_313_581) - // Standard Error: 13_114 - .saturating_add(Weight::from_ref_time(1_596_521).saturating_mul(s.into())) + // Minimum execution time: 65_528 nanoseconds. + Weight::from_parts(70_402_882, 0) + // Standard Error: 20_479 + .saturating_add(Weight::from_parts(1_555_243, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(6)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -167,7 +167,7 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking ValidatorCommissionCap (r:1 w:0) // Proof: Staking ValidatorCommissionCap (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Staking PermissionedIdentity (r:1 w:1) // Proof Skipped: Staking PermissionedIdentity (max_values: None, max_size: None, mode: Measured) // Storage: Staking Validators (r:1 w:1) @@ -175,7 +175,7 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking MaxValidatorsCount (r:1 w:0) // Proof: Staking MaxValidatorsCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) // Storage: Identity AccountKeyRefCount (r:1 w:1) - // Proof: Identity AccountKeyRefCount (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + // Proof Skipped: Identity AccountKeyRefCount (max_values: None, max_size: None, mode: Measured) // Storage: Staking Nominators (r:1 w:0) // Proof: Staking Nominators (max_values: None, max_size: Some(558), added: 3033, mode: MaxEncodedLen) // Storage: Staking Bonded (r:1 w:0) @@ -183,8 +183,8 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking CounterForValidators (r:1 w:1) // Proof: Staking CounterForValidators (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) fn validate() -> Weight { - // Minimum execution time: 68_553 nanoseconds. - Weight::from_ref_time(70_997_000) + // Minimum execution time: 67_872 nanoseconds. + Weight::from_parts(71_938_000, 0) .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().writes(4)) } @@ -194,10 +194,10 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Proof: Staking Nominators (max_values: None, max_size: Some(558), added: 3033, mode: MaxEncodedLen) /// The range of component `k` is `[1, 128]`. fn kick(k: u32) -> Weight { - // Minimum execution time: 35_423 nanoseconds. - Weight::from_ref_time(33_436_546) - // Standard Error: 30_431 - .saturating_add(Weight::from_ref_time(8_873_265).saturating_mul(k.into())) + // Minimum execution time: 34_292 nanoseconds. + Weight::from_parts(33_550_562, 0) + // Standard Error: 22_924 + .saturating_add(Weight::from_parts(8_737_552, 0).saturating_mul(k.into())) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(k.into()))) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(k.into()))) @@ -213,7 +213,13 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking Validators (r:17 w:0) // Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Staking CurrentEra (r:1 w:0) // Proof: Staking CurrentEra (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) // Storage: Staking Bonded (r:1 w:0) @@ -222,11 +228,11 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Proof: Staking CounterForNominators (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) /// The range of component `n` is `[1, 16]`. fn nominate(n: u32) -> Weight { - // Minimum execution time: 66_289 nanoseconds. - Weight::from_ref_time(68_503_326) - // Standard Error: 60_462 - .saturating_add(Weight::from_ref_time(4_268_999).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 83_956 nanoseconds. + Weight::from_parts(86_634_894, 0) + // Standard Error: 69_456 + .saturating_add(Weight::from_parts(4_443_175, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(13)) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().writes(2)) } @@ -235,18 +241,18 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking Validators (r:1 w:1) // Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Staking PermissionedIdentity (r:1 w:1) // Proof Skipped: Staking PermissionedIdentity (max_values: None, max_size: None, mode: Measured) // Storage: Identity AccountKeyRefCount (r:1 w:1) - // Proof: Identity AccountKeyRefCount (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + // Proof Skipped: Identity AccountKeyRefCount (max_values: None, max_size: None, mode: Measured) // Storage: Staking CounterForValidators (r:1 w:1) // Proof: Staking CounterForValidators (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) // Storage: Staking Nominators (r:1 w:0) // Proof: Staking Nominators (max_values: None, max_size: Some(558), added: 3033, mode: MaxEncodedLen) fn chill() -> Weight { - // Minimum execution time: 58_167 nanoseconds. - Weight::from_ref_time(61_642_000) + // Minimum execution time: 56_475 nanoseconds. + Weight::from_parts(57_165_000, 0) .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(4)) } @@ -255,8 +261,8 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking Payee (r:0 w:1) // Proof: Staking Payee (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn set_payee() -> Weight { - // Minimum execution time: 17_957 nanoseconds. - Weight::from_ref_time(20_240_000) + // Minimum execution time: 17_556 nanoseconds. + Weight::from_parts(17_957_000, 0) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } @@ -265,43 +271,43 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking Ledger (r:3 w:2) // Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) fn set_controller() -> Weight { - // Minimum execution time: 29_935 nanoseconds. - Weight::from_ref_time(31_848_000) + // Minimum execution time: 29_294 nanoseconds. + Weight::from_parts(31_197_000, 0) .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(3)) } // Storage: Staking ValidatorCount (r:0 w:1) // Proof: Staking ValidatorCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) fn set_validator_count() -> Weight { - // Minimum execution time: 3_366 nanoseconds. - Weight::from_ref_time(4_146_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 3_065 nanoseconds. + Weight::from_parts(3_475_000, 0).saturating_add(DbWeight::get().writes(1)) } // Storage: Staking ForceEra (r:0 w:1) // Proof: Staking ForceEra (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) fn force_no_eras() -> Weight { - // Minimum execution time: 11_317 nanoseconds. - Weight::from_ref_time(14_843_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 12_188 nanoseconds. + Weight::from_parts(18_618_000, 0).saturating_add(DbWeight::get().writes(1)) } // Storage: Staking ForceEra (r:0 w:1) // Proof: Staking ForceEra (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) fn force_new_era() -> Weight { - // Minimum execution time: 11_768 nanoseconds. - Weight::from_ref_time(16_796_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 10_927 nanoseconds. + Weight::from_parts(11_928_000, 0).saturating_add(DbWeight::get().writes(1)) } // Storage: Staking ForceEra (r:0 w:1) // Proof: Staking ForceEra (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) fn force_new_era_always() -> Weight { - // Minimum execution time: 11_858 nanoseconds. - Weight::from_ref_time(16_284_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 10_716 nanoseconds. + Weight::from_parts(11_498_000, 0).saturating_add(DbWeight::get().writes(1)) } // Storage: Staking Invulnerables (r:0 w:1) // Proof Skipped: Staking Invulnerables (max_values: Some(1), max_size: None, mode: Measured) /// The range of component `v` is `[0, 100]`. fn set_invulnerables(v: u32) -> Weight { - // Minimum execution time: 3_304 nanoseconds. - Weight::from_ref_time(4_493_658) - // Standard Error: 4_058 - .saturating_add(Weight::from_ref_time(17_700).saturating_mul(v.into())) + // Minimum execution time: 3_135 nanoseconds. + Weight::from_parts(5_195_193, 0) + // Standard Error: 4_599 + .saturating_add(Weight::from_parts(4_304, 0).saturating_mul(v.into())) .saturating_add(DbWeight::get().writes(1)) } // Storage: Staking Bonded (r:1 w:1) @@ -326,10 +332,10 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Proof: Staking SpanSlash (max_values: None, max_size: Some(76), added: 2551, mode: MaxEncodedLen) /// The range of component `s` is `[0, 100]`. fn force_unstake(s: u32) -> Weight { - // Minimum execution time: 54_412 nanoseconds. - Weight::from_ref_time(62_917_979) - // Standard Error: 13_753 - .saturating_add(Weight::from_ref_time(1_588_061).saturating_mul(s.into())) + // Minimum execution time: 53_891 nanoseconds. + Weight::from_parts(61_359_846, 0) + // Standard Error: 14_648 + .saturating_add(Weight::from_parts(1_530_947, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(7)) .saturating_add(DbWeight::get().writes(8)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -338,10 +344,10 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Proof Skipped: Staking UnappliedSlashes (max_values: None, max_size: None, mode: Measured) /// The range of component `s` is `[1, 1000]`. fn cancel_deferred_slash(s: u32) -> Weight { - // Minimum execution time: 116_665 nanoseconds. - Weight::from_ref_time(807_594_238) - // Standard Error: 61_663 - .saturating_add(Weight::from_ref_time(4_030_193).saturating_mul(s.into())) + // Minimum execution time: 113_771 nanoseconds. + Weight::from_parts(1_128_694_838, 0) + // Standard Error: 90_787 + .saturating_add(Weight::from_parts(5_999_718, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(1)) .saturating_add(DbWeight::get().writes(1)) } @@ -351,39 +357,6 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Proof: Staking ErasValidatorReward (max_values: None, max_size: Some(28), added: 2503, mode: MaxEncodedLen) // Storage: Staking Bonded (r:1025 w:0) // Proof: Staking Bonded (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - // Storage: Staking Ledger (r:1 w:1) - // Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - // Storage: Staking ErasStakersClipped (r:1 w:0) - // Proof Skipped: Staking ErasStakersClipped (max_values: None, max_size: None, mode: Measured) - // Storage: Staking ErasRewardPoints (r:1 w:0) - // Proof Skipped: Staking ErasRewardPoints (max_values: None, max_size: None, mode: Measured) - // Storage: Staking ErasValidatorPrefs (r:1 w:0) - // Proof: Staking ErasValidatorPrefs (max_values: None, max_size: Some(57), added: 2532, mode: MaxEncodedLen) - // Storage: Staking Payee (r:1025 w:0) - // Proof: Staking Payee (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: System Account (r:1026 w:1026) - // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - // Storage: Identity KeyRecords (r:2050 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Identity IsDidFrozen (r:1024 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) - /// The range of component `n` is `[0, 1024]`. - fn payout_stakers_dead_controller(n: u32) -> Weight { - // Minimum execution time: 193_310 nanoseconds. - Weight::from_ref_time(368_075_766) - // Standard Error: 60_365 - .saturating_add(Weight::from_ref_time(41_699_846).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(12)) - .saturating_add(DbWeight::get().reads((6_u64).saturating_mul(n.into()))) - .saturating_add(DbWeight::get().writes(3)) - .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - } - // Storage: Staking CurrentEra (r:1 w:0) - // Proof: Staking CurrentEra (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - // Storage: Staking ErasValidatorReward (r:1 w:0) - // Proof: Staking ErasValidatorReward (max_values: None, max_size: Some(28), added: 2503, mode: MaxEncodedLen) - // Storage: Staking Bonded (r:1025 w:0) - // Proof: Staking Bonded (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) // Storage: Staking Ledger (r:1025 w:1025) // Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) // Storage: Staking ErasStakersClipped (r:1 w:0) @@ -399,13 +372,13 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Balances Locks (r:1025 w:1025) // Proof Skipped: Balances Locks (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1026 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[0, 1024]`. fn payout_stakers_alive_staked(n: u32) -> Weight { - // Minimum execution time: 222_113 nanoseconds. - Weight::from_ref_time(269_725_573) - // Standard Error: 75_987 - .saturating_add(Weight::from_ref_time(49_684_473).saturating_mul(n.into())) + // Minimum execution time: 220_430 nanoseconds. + Weight::from_parts(367_311_716, 0) + // Standard Error: 54_323 + .saturating_add(Weight::from_parts(48_316_458, 0).saturating_mul(n.into())) .saturating_add(DbWeight::get().reads(13)) .saturating_add(DbWeight::get().reads((6_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().writes(4)) @@ -423,10 +396,10 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) /// The range of component `l` is `[1, 32]`. fn rebond(l: u32) -> Weight { - // Minimum execution time: 44_557 nanoseconds. - Weight::from_ref_time(49_453_802) - // Standard Error: 21_032 - .saturating_add(Weight::from_ref_time(54_407).saturating_mul(l.into())) + // Minimum execution time: 43_566 nanoseconds. + Weight::from_parts(47_774_541, 0) + // Standard Error: 22_727 + .saturating_add(Weight::from_parts(83_350, 0).saturating_mul(l.into())) .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(3)) } @@ -445,7 +418,7 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Balances Locks (r:1 w:1) // Proof Skipped: Balances Locks (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Staking Ledger (r:0 w:1) // Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) // Storage: Staking Payee (r:0 w:1) @@ -454,10 +427,10 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Proof: Staking SpanSlash (max_values: None, max_size: Some(76), added: 2551, mode: MaxEncodedLen) /// The range of component `s` is `[1, 100]`. fn reap_stash(s: u32) -> Weight { - // Minimum execution time: 79_430 nanoseconds. - Weight::from_ref_time(83_274_719) - // Standard Error: 15_369 - .saturating_add(Weight::from_ref_time(1_545_269).saturating_mul(s.into())) + // Minimum execution time: 75_182 nanoseconds. + Weight::from_parts(78_034_699, 0) + // Standard Error: 13_681 + .saturating_add(Weight::from_parts(1_564_606, 0).saturating_mul(s.into())) .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(8)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -482,13 +455,13 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) // Storage: Staking Nominators (r:110 w:0) // Proof: Staking Nominators (max_values: None, max_size: Some(558), added: 3033, mode: MaxEncodedLen) - // Storage: Identity KeyRecords (r:10 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Storage: Identity KeyRecords (r:109 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:20 w:0) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:218 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Staking PermissionedIdentity (r:10 w:0) // Proof Skipped: Staking PermissionedIdentity (max_values: None, max_size: None, mode: Measured) @@ -527,15 +500,15 @@ impl pallet_staking::WeightInfo for SubstrateWeight { /// The range of component `v` is `[1, 10]`. /// The range of component `n` is `[0, 100]`. fn new_era(v: u32, n: u32) -> Weight { - // Minimum execution time: 852_690 nanoseconds. - Weight::from_ref_time(862_584_000) - // Standard Error: 3_049_255 - .saturating_add(Weight::from_ref_time(72_802_433).saturating_mul(v.into())) - // Standard Error: 314_509 - .saturating_add(Weight::from_ref_time(16_351_842).saturating_mul(n.into())) + // Minimum execution time: 837_364 nanoseconds. + Weight::from_parts(838_106_000, 0) + // Standard Error: 2_993_345 + .saturating_add(Weight::from_parts(70_132_293, 0).saturating_mul(v.into())) + // Standard Error: 308_742 + .saturating_add(Weight::from_parts(34_964_910, 0).saturating_mul(n.into())) .saturating_add(DbWeight::get().reads(18)) .saturating_add(DbWeight::get().reads((8_u64).saturating_mul(v.into()))) - .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(n.into()))) + .saturating_add(DbWeight::get().reads((6_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().writes(12)) .saturating_add(DbWeight::get().writes((3_u64).saturating_mul(v.into()))) } @@ -547,13 +520,13 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) // Storage: Staking Nominators (r:201 w:0) // Proof: Staking Nominators (max_values: None, max_size: Some(558), added: 3033, mode: MaxEncodedLen) - // Storage: Identity KeyRecords (r:100 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Storage: Identity KeyRecords (r:200 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:200 w:0) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:400 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Staking PermissionedIdentity (r:100 w:0) // Proof Skipped: Staking PermissionedIdentity (max_values: None, max_size: None, mode: Measured) @@ -570,13 +543,15 @@ impl pallet_staking::WeightInfo for SubstrateWeight { /// The range of component `v` is `[50, 100]`. /// The range of component `n` is `[50, 100]`. fn get_npos_voters(v: u32, n: u32) -> Weight { - // Minimum execution time: 3_798_638 nanoseconds. - Weight::from_ref_time(3_849_676_000) - // Standard Error: 475_063 - .saturating_add(Weight::from_ref_time(23_030_380).saturating_mul(v.into())) + // Minimum execution time: 5_694_021 nanoseconds. + Weight::from_parts(5_725_067_000, 0) + // Standard Error: 703_888 + .saturating_add(Weight::from_parts(12_221_363, 0).saturating_mul(v.into())) + // Standard Error: 703_888 + .saturating_add(Weight::from_parts(3_495_830, 0).saturating_mul(n.into())) .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().reads((8_u64).saturating_mul(v.into()))) - .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(n.into()))) + .saturating_add(DbWeight::get().reads((6_u64).saturating_mul(n.into()))) .saturating_add(DbWeight::get().writes(2)) } // Storage: Staking CounterForValidators (r:1 w:0) @@ -584,11 +559,11 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking Validators (r:101 w:0) // Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) // Storage: Identity KeyRecords (r:100 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity Claims (r:200 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Staking PermissionedIdentity (r:100 w:0) @@ -603,10 +578,10 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Proof: System BlockWeight (max_values: Some(1), max_size: Some(48), added: 543, mode: MaxEncodedLen) /// The range of component `v` is `[50, 100]`. fn get_npos_targets(v: u32) -> Weight { - // Minimum execution time: 2_014_703 nanoseconds. - Weight::from_ref_time(108_451_555) - // Standard Error: 152_719 - .saturating_add(Weight::from_ref_time(38_793_995).saturating_mul(v.into())) + // Minimum execution time: 1_999_726 nanoseconds. + Weight::from_parts(59_228_490, 0) + // Standard Error: 120_461 + .saturating_add(Weight::from_parts(39_021_437, 0).saturating_mul(v.into())) .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().reads((7_u64).saturating_mul(v.into()))) .saturating_add(DbWeight::get().writes(1)) @@ -624,8 +599,8 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking MinNominatorBond (r:0 w:1) // Proof: Staking MinNominatorBond (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) fn set_staking_configs_all_set() -> Weight { - // Minimum execution time: 7_361 nanoseconds. - Weight::from_ref_time(7_872_000).saturating_add(DbWeight::get().writes(6)) + // Minimum execution time: 7_441 nanoseconds. + Weight::from_parts(8_243_000, 0).saturating_add(DbWeight::get().writes(6)) } // Storage: Staking MinCommission (r:0 w:1) // Proof: Staking MinCommission (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) @@ -640,8 +615,8 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking MinNominatorBond (r:0 w:1) // Proof: Staking MinNominatorBond (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) fn set_staking_configs_all_remove() -> Weight { - // Minimum execution time: 7_111 nanoseconds. - Weight::from_ref_time(7_902_000).saturating_add(DbWeight::get().writes(6)) + // Minimum execution time: 6_690 nanoseconds. + Weight::from_parts(15_123_000, 0).saturating_add(DbWeight::get().writes(6)) } // Storage: Staking Ledger (r:1 w:0) // Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) @@ -658,14 +633,14 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking MinValidatorBond (r:1 w:0) // Proof: Staking MinValidatorBond (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Staking PermissionedIdentity (r:1 w:1) // Proof Skipped: Staking PermissionedIdentity (max_values: None, max_size: None, mode: Measured) // Storage: Identity AccountKeyRefCount (r:1 w:1) - // Proof: Identity AccountKeyRefCount (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + // Proof Skipped: Identity AccountKeyRefCount (max_values: None, max_size: None, mode: Measured) fn chill_other() -> Weight { - // Minimum execution time: 71_247 nanoseconds. - Weight::from_ref_time(73_691_000) + // Minimum execution time: 74_131 nanoseconds. + Weight::from_parts(75_763_000, 0) .saturating_add(DbWeight::get().reads(10)) .saturating_add(DbWeight::get().writes(4)) } @@ -674,95 +649,120 @@ impl pallet_staking::WeightInfo for SubstrateWeight { // Storage: Staking Validators (r:1 w:1) // Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) fn force_apply_min_commission() -> Weight { - // Minimum execution time: 17_426 nanoseconds. - Weight::from_ref_time(17_746_000) + // Minimum execution time: 16_385 nanoseconds. + Weight::from_parts(18_157_000, 0) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Staking MinCommission (r:0 w:1) // Proof: Staking MinCommission (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) fn set_min_commission() -> Weight { - // Minimum execution time: 3_406 nanoseconds. - Weight::from_ref_time(4_727_000).saturating_add(DbWeight::get().writes(1)) - } - // Storage: Staking PermissionedIdentity (r:1 w:1) - // Proof Skipped: Staking PermissionedIdentity (max_values: None, max_size: None, mode: Measured) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: Staking ValidatorCount (r:1 w:0) - // Proof: Staking ValidatorCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - fn add_permissioned_validator() -> Weight { - // Minimum execution time: 43_595 nanoseconds. - Weight::from_ref_time(46_881_000) - .saturating_add(DbWeight::get().reads(6)) - .saturating_add(DbWeight::get().writes(1)) - } - // Storage: Staking PermissionedIdentity (r:1 w:1) - // Proof Skipped: Staking PermissionedIdentity (max_values: None, max_size: None, mode: Measured) - fn remove_permissioned_validator() -> Weight { - // Minimum execution time: 22_233 nanoseconds. - Weight::from_ref_time(22_965_000) - .saturating_add(DbWeight::get().reads(1)) - .saturating_add(DbWeight::get().writes(1)) - } - // Storage: Staking SlashingAllowedFor (r:0 w:1) - // Proof: Staking SlashingAllowedFor (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) - fn change_slashing_allowed_for() -> Weight { - // Minimum execution time: 7_831 nanoseconds. - Weight::from_ref_time(9_184_000).saturating_add(DbWeight::get().writes(1)) - } - // Storage: Staking ValidatorCount (r:1 w:0) - // Proof: Staking ValidatorCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - // Storage: Staking PermissionedIdentity (r:1 w:1) - // Proof Skipped: Staking PermissionedIdentity (max_values: None, max_size: None, mode: Measured) - fn update_permissioned_validator_intended_count() -> Weight { - // Minimum execution time: 16_444 nanoseconds. - Weight::from_ref_time(17_467_000) - .saturating_add(DbWeight::get().reads(2)) - .saturating_add(DbWeight::get().writes(1)) - } - // Storage: Identity KeyRecords (r:100 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Identity IsDidFrozen (r:1 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) - // Storage: Staking Validators (r:100 w:100) - // Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) - // Storage: Staking PermissionedIdentity (r:1 w:1) - // Proof Skipped: Staking PermissionedIdentity (max_values: None, max_size: None, mode: Measured) - // Storage: Identity AccountKeyRefCount (r:100 w:100) - // Proof: Identity AccountKeyRefCount (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) - // Storage: Staking CounterForValidators (r:1 w:1) - // Proof: Staking CounterForValidators (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - // Storage: Staking Nominators (r:100 w:0) - // Proof: Staking Nominators (max_values: None, max_size: Some(558), added: 3033, mode: MaxEncodedLen) - /// The range of component `s` is `[1, 100]`. - fn chill_from_governance(s: u32) -> Weight { - // Minimum execution time: 65_999 nanoseconds. - Weight::from_ref_time(35_514_636) - // Standard Error: 33_301 - .saturating_add(Weight::from_ref_time(29_921_456).saturating_mul(s.into())) - .saturating_add(DbWeight::get().reads(3)) - .saturating_add(DbWeight::get().reads((4_u64).saturating_mul(s.into()))) - .saturating_add(DbWeight::get().writes(2)) - .saturating_add(DbWeight::get().writes((2_u64).saturating_mul(s.into()))) - } - // Storage: Staking ValidatorCommissionCap (r:1 w:1) - // Proof: Staking ValidatorCommissionCap (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - // Storage: Staking Validators (r:152 w:151) - // Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) - /// The range of component `m` is `[0, 150]`. - fn set_commission_cap(m: u32) -> Weight { - // Minimum execution time: 25_629 nanoseconds. - Weight::from_ref_time(36_870_733) - // Standard Error: 14_027 - .saturating_add(Weight::from_ref_time(4_557_063).saturating_mul(m.into())) - .saturating_add(DbWeight::get().reads(3)) - .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(m.into()))) - .saturating_add(DbWeight::get().writes(2)) - .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(m.into()))) + // Minimum execution time: 3_144 nanoseconds. + Weight::from_parts(3_806_000, 0).saturating_add(DbWeight::get().writes(1)) + } + /// Storage: `Staking::Ledger` (r:1 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Payee` (r:1 w:1) + /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + fn update_payee() -> Weight { + // Proof Size summary in bytes: + // Measured: `266` + // Estimated: `4556` + // Minimum execution time: 18_991_000 picoseconds. + Weight::from_parts(19_621_000, 4556) + .saturating_add(DbWeight::get().reads(3_u64)) + .saturating_add(DbWeight::get().writes(1_u64)) + } + /// Storage: `Staking::Ledger` (r:11800 w:11800) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:5900 w:5900) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Payee` (r:5900 w:0) + /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// The range of component `u` is `[0, 5900]`. + fn deprecate_controller_batch(u: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `1015 + u * (229 ±0)` + // Estimated: `990 + u * (7132 ±0)` + // Minimum execution time: 4_048_000 picoseconds. + Weight::from_parts(4_168_000, 990) + // Standard Error: 78_180 + .saturating_add(Weight::from_parts(34_730_792, 0).saturating_mul(u.into())) + .saturating_add(DbWeight::get().reads((4_u64).saturating_mul(u.into()))) + .saturating_add(DbWeight::get().writes((3_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 7132).saturating_mul(u.into())) + } + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Staking::VirtualStakers` (r:1 w:0) + /// Proof: `Staking::VirtualStakers` (`max_values`: None, `max_size`: Some(40), added: 2515, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:0) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(427), added: 2902, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:0) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:1) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:1) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + fn restore_ledger() -> Weight { + // Proof Size summary in bytes: + // Measured: `223` + // Estimated: `4764` + // Minimum execution time: 38_029_000 picoseconds. + Weight::from_parts(38_545_000, 4764) + .saturating_add(DbWeight::get().reads(6_u64)) + .saturating_add(DbWeight::get().writes(2_u64)) + } + /// Storage: `Staking::VirtualStakers` (r:1 w:0) + /// Proof: `Staking::VirtualStakers` (`max_values`: None, `max_size`: Some(40), added: 2515, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(427), added: 2902, mode: `MaxEncodedLen`) + fn migrate_currency() -> Weight { + // Proof Size summary in bytes: + // Measured: `389` + // Estimated: `4764` + // Minimum execution time: 77_496_000 picoseconds. + Weight::from_parts(78_353_000, 4764) + .saturating_add(DbWeight::get().reads(6_u64)) + .saturating_add(DbWeight::get().writes(2_u64)) + } + /// Storage: `Staking::CurrentEra` (r:1 w:0) + /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::ErasStartSessionIndex` (r:1 w:0) + /// Proof: `Staking::ErasStartSessionIndex` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `Staking::ActiveEra` (r:1 w:0) + /// Proof: `Staking::ActiveEra` (`max_values`: Some(1), `max_size`: Some(13), added: 508, mode: `MaxEncodedLen`) + /// Storage: `Staking::Invulnerables` (r:1 w:0) + /// Proof: `Staking::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// Storage: `Staking::ErasStakersOverview` (r:1 w:0) + /// Proof: `Staking::ErasStakersOverview` (`max_values`: None, `max_size`: Some(92), added: 2567, mode: `MaxEncodedLen`) + /// Storage: `Session::DisabledValidators` (r:1 w:1) + /// Proof: `Session::DisabledValidators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Session::Validators` (r:1 w:0) + /// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Staking::ValidatorSlashInEra` (r:1 w:1) + /// Proof: `Staking::ValidatorSlashInEra` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::OffenceQueue` (r:1 w:1) + /// Proof: `Staking::OffenceQueue` (`max_values`: None, `max_size`: Some(101), added: 2576, mode: `MaxEncodedLen`) + /// Storage: `Staking::OffenceQueueEras` (r:1 w:1) + /// Proof: `Staking::OffenceQueueEras` (`max_values`: Some(1), `max_size`: Some(2690), added: 3185, mode: `MaxEncodedLen`) + fn manual_slash() -> Weight { + // Proof Size summary in bytes: + // Measured: `514` + // Estimated: `4175` + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(33_000_000, 4175) + .saturating_add(DbWeight::get().reads(10_u64)) + .saturating_add(DbWeight::get().writes(4_u64)) } } diff --git a/pallets/weights/src/pallet_statistics.rs b/pallets/weights/src/pallet_statistics.rs index 4c0d6d8324..95437068ef 100644 --- a/pallets/weights/src/pallet_statistics.rs +++ b/pallets/weights/src/pallet_statistics.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_statistics //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,124 +54,100 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_statistics::WeightInfo for SubstrateWeight { // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Statistics AssetTransferCompliances (r:1 w:0) - // Proof: Statistics AssetTransferCompliances (max_values: None, max_size: Some(246), added: 2721, mode: MaxEncodedLen) + // Proof Skipped: Statistics AssetTransferCompliances (max_values: None, max_size: None, mode: Measured) // Storage: Statistics ActiveAssetStats (r:1 w:1) - // Proof: Statistics ActiveAssetStats (max_values: None, max_size: Some(423), added: 2898, mode: MaxEncodedLen) + // Proof Skipped: Statistics ActiveAssetStats (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[1, 9]`. fn set_active_asset_stats(i: u32) -> Weight { - // Minimum execution time: 54_773 nanoseconds. - Weight::from_ref_time(60_412_581) - // Standard Error: 93_344 - .saturating_add(Weight::from_ref_time(297_243).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 39_780 nanoseconds. + Weight::from_parts(44_031_265, 0) + // Standard Error: 77_955 + .saturating_add(Weight::from_parts(330_085, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Statistics ActiveAssetStats (r:1 w:0) - // Proof: Statistics ActiveAssetStats (max_values: None, max_size: Some(423), added: 2898, mode: MaxEncodedLen) + // Proof Skipped: Statistics ActiveAssetStats (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetStats (r:0 w:250) - // Proof: Statistics AssetStats (max_values: None, max_size: Some(107), added: 2582, mode: MaxEncodedLen) + // Proof Skipped: Statistics AssetStats (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[1, 250]`. fn batch_update_asset_stats(i: u32) -> Weight { - // Minimum execution time: 56_975 nanoseconds. - Weight::from_ref_time(63_445_374) - // Standard Error: 10_644 - .saturating_add(Weight::from_ref_time(2_887_056).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 42_724 nanoseconds. + Weight::from_parts(39_205_484, 0) + // Standard Error: 10_917 + .saturating_add(Weight::from_parts(3_180_085, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Statistics ActiveAssetStats (r:1 w:0) - // Proof: Statistics ActiveAssetStats (max_values: None, max_size: Some(423), added: 2898, mode: MaxEncodedLen) + // Proof Skipped: Statistics ActiveAssetStats (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetTransferCompliances (r:1 w:1) - // Proof: Statistics AssetTransferCompliances (max_values: None, max_size: Some(246), added: 2721, mode: MaxEncodedLen) + // Proof Skipped: Statistics AssetTransferCompliances (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[1, 3]`. fn set_asset_transfer_compliance(i: u32) -> Weight { - // Minimum execution time: 56_575 nanoseconds. - Weight::from_ref_time(60_699_067) - // Standard Error: 475_866 - .saturating_add(Weight::from_ref_time(3_176_895).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 42_233 nanoseconds. + Weight::from_parts(41_799_979, 0) + // Standard Error: 257_984 + .saturating_add(Weight::from_parts(4_691_354, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Statistics TransferConditionExemptEntities (r:0 w:1000) - // Proof: Statistics TransferConditionExemptEntities (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + // Proof Skipped: Statistics TransferConditionExemptEntities (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[0, 1000]`. fn set_entities_exempt(i: u32) -> Weight { - // Minimum execution time: 46_289 nanoseconds. - Weight::from_ref_time(53_881_786) - // Standard Error: 4_804 - .saturating_add(Weight::from_ref_time(2_797_955).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(8)) + // Minimum execution time: 28_813 nanoseconds. + Weight::from_parts(28_545_771, 0) + // Standard Error: 5_396 + .saturating_add(Weight::from_parts(3_090_924, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } // Storage: Statistics AssetStats (r:1 w:0) - // Proof: Statistics AssetStats (max_values: None, max_size: Some(107), added: 2582, mode: MaxEncodedLen) + // Proof Skipped: Statistics AssetStats (max_values: None, max_size: None, mode: Measured) /// The range of component `a` is `[0, 1]`. fn max_investor_count_restriction(a: u32) -> Weight { - // Minimum execution time: 421 nanoseconds. - Weight::from_ref_time(752_702) - // Standard Error: 50_612 - .saturating_add(Weight::from_ref_time(5_369_963).saturating_mul(a.into())) + // Minimum execution time: 541 nanoseconds. + Weight::from_parts(805_566, 0) + // Standard Error: 43_814 + .saturating_add(Weight::from_parts(7_416_767, 0).saturating_mul(a.into())) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(a.into()))) } fn max_investor_ownership_restriction() -> Weight { - // Minimum execution time: 671 nanoseconds. - Weight::from_ref_time(931_000) + // Minimum execution time: 861 nanoseconds. + Weight::from_parts(1_092_000, 0) } // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) @@ -179,10 +155,10 @@ impl pallet_statistics::WeightInfo for SubstrateWeight { // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) /// The range of component `c` is `[0, 1]`. fn claim_count_restriction_no_stats(c: u32) -> Weight { - // Minimum execution time: 510 nanoseconds. - Weight::from_ref_time(924_277) - // Standard Error: 66_047 - .saturating_add(Weight::from_ref_time(15_527_056).saturating_mul(c.into())) + // Minimum execution time: 571 nanoseconds. + Weight::from_parts(912_176, 0) + // Standard Error: 229_762 + .saturating_add(Weight::from_parts(18_293_823, 0).saturating_mul(c.into())) .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(c.into()))) } // Storage: Timestamp Now (r:1 w:0) @@ -190,23 +166,23 @@ impl pallet_statistics::WeightInfo for SubstrateWeight { // Storage: Identity Claims (r:2 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetStats (r:1 w:0) - // Proof: Statistics AssetStats (max_values: None, max_size: Some(107), added: 2582, mode: MaxEncodedLen) + // Proof Skipped: Statistics AssetStats (max_values: None, max_size: None, mode: Measured) fn claim_count_restriction_with_stats() -> Weight { - // Minimum execution time: 19_779 nanoseconds. - Weight::from_ref_time(20_110_000).saturating_add(DbWeight::get().reads(4)) + // Minimum execution time: 21_162 nanoseconds. + Weight::from_parts(22_164_000, 0).saturating_add(DbWeight::get().reads(4)) } // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Identity Claims (r:2 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetStats (r:1 w:0) - // Proof: Statistics AssetStats (max_values: None, max_size: Some(107), added: 2582, mode: MaxEncodedLen) + // Proof Skipped: Statistics AssetStats (max_values: None, max_size: None, mode: Measured) /// The range of component `a` is `[0, 1]`. fn claim_ownership_restriction(a: u32) -> Weight { - // Minimum execution time: 14_401 nanoseconds. - Weight::from_ref_time(16_077_361) - // Standard Error: 358_477 - .saturating_add(Weight::from_ref_time(8_556_638).saturating_mul(a.into())) + // Minimum execution time: 14_992 nanoseconds. + Weight::from_parts(16_782_771, 0) + // Standard Error: 400_993 + .saturating_add(Weight::from_parts(7_463_562, 0).saturating_mul(a.into())) .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(a.into()))) } @@ -215,13 +191,13 @@ impl pallet_statistics::WeightInfo for SubstrateWeight { // Storage: Identity Claims (r:2 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetStats (r:2 w:2) - // Proof: Statistics AssetStats (max_values: None, max_size: Some(107), added: 2582, mode: MaxEncodedLen) + // Proof Skipped: Statistics AssetStats (max_values: None, max_size: None, mode: Measured) /// The range of component `a` is `[0, 2]`. fn update_asset_count_stats(a: u32) -> Weight { - // Minimum execution time: 14_221 nanoseconds. - Weight::from_ref_time(15_655_190) - // Standard Error: 124_036 - .saturating_add(Weight::from_ref_time(6_442_240).saturating_mul(a.into())) + // Minimum execution time: 15_353 nanoseconds. + Weight::from_parts(16_605_847, 0) + // Standard Error: 101_131 + .saturating_add(Weight::from_parts(6_846_034, 0).saturating_mul(a.into())) .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(a.into()))) @@ -231,38 +207,38 @@ impl pallet_statistics::WeightInfo for SubstrateWeight { // Storage: Identity Claims (r:2 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetStats (r:2 w:2) - // Proof: Statistics AssetStats (max_values: None, max_size: Some(107), added: 2582, mode: MaxEncodedLen) + // Proof Skipped: Statistics AssetStats (max_values: None, max_size: None, mode: Measured) /// The range of component `a` is `[0, 2]`. fn update_asset_balance_stats(a: u32) -> Weight { - // Minimum execution time: 14_571 nanoseconds. - Weight::from_ref_time(16_317_347) - // Standard Error: 182_341 - .saturating_add(Weight::from_ref_time(7_302_297).saturating_mul(a.into())) + // Minimum execution time: 15_252 nanoseconds. + Weight::from_parts(16_650_158, 0) + // Standard Error: 90_168 + .saturating_add(Weight::from_parts(7_750_425, 0).saturating_mul(a.into())) .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(a.into()))) } /// The range of component `i` is `[0, 4]`. fn verify_requirements(i: u32) -> Weight { - // Minimum execution time: 311 nanoseconds. - Weight::from_ref_time(623_352) - // Standard Error: 9_519 - .saturating_add(Weight::from_ref_time(130_016).saturating_mul(i.into())) + // Minimum execution time: 421 nanoseconds. + Weight::from_parts(737_345, 0) + // Standard Error: 20_511 + .saturating_add(Weight::from_parts(162_577, 0).saturating_mul(i.into())) } // Storage: Statistics ActiveAssetStats (r:1 w:0) - // Proof: Statistics ActiveAssetStats (max_values: None, max_size: Some(423), added: 2898, mode: MaxEncodedLen) + // Proof Skipped: Statistics ActiveAssetStats (max_values: None, max_size: None, mode: Measured) /// The range of component `a` is `[1, 10]`. fn active_asset_statistics_load(a: u32) -> Weight { - // Minimum execution time: 6_510 nanoseconds. - Weight::from_ref_time(7_441_567) - // Standard Error: 21_090 - .saturating_add(Weight::from_ref_time(33_402).saturating_mul(a.into())) + // Minimum execution time: 7_381 nanoseconds. + Weight::from_parts(8_385_558, 0) + // Standard Error: 24_708 + .saturating_add(Weight::from_parts(23_673, 0).saturating_mul(a.into())) .saturating_add(DbWeight::get().reads(1)) } // Storage: Statistics TransferConditionExemptEntities (r:1 w:0) - // Proof: Statistics TransferConditionExemptEntities (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + // Proof Skipped: Statistics TransferConditionExemptEntities (max_values: None, max_size: None, mode: Measured) fn is_exempt() -> Weight { - // Minimum execution time: 7_501 nanoseconds. - Weight::from_ref_time(8_302_000).saturating_add(DbWeight::get().reads(1)) + // Minimum execution time: 8_683 nanoseconds. + Weight::from_parts(8_954_000, 0).saturating_add(DbWeight::get().reads(1)) } } diff --git a/pallets/weights/src/pallet_sto.rs b/pallets/weights/src/pallet_sto.rs index 864dea8b8e..4c3659ce93 100644 --- a/pallets/weights/src/pallet_sto.rs +++ b/pallets/weights/src/pallet_sto.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_sto //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,56 +54,48 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_sto::WeightInfo for SubstrateWeight { // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Settlement VenueInfo (r:1 w:0) - // Proof: Settlement VenueInfo (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + // Proof Skipped: Settlement VenueInfo (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:2 w:0) - // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioCustodian (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Sto FundraiserCount (r:1 w:1) - // Proof: Sto FundraiserCount (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Sto FundraiserCount (max_values: None, max_size: None, mode: Measured) // Storage: Asset Assets (r:1 w:0) // Proof Skipped: Asset Assets (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioAssetBalances (r:1 w:0) - // Proof: Portfolio PortfolioAssetBalances (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioAssetBalances (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioLockedAssets (r:1 w:1) - // Proof: Portfolio PortfolioLockedAssets (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) + // Proof Skipped: Portfolio PortfolioLockedAssets (max_values: None, max_size: None, mode: Measured) // Storage: Sto FundraiserNames (r:0 w:1) // Proof Skipped: Sto FundraiserNames (max_values: None, max_size: None, mode: Measured) // Storage: Sto Fundraisers (r:0 w:1) // Proof Skipped: Sto Fundraisers (max_values: None, max_size: None, mode: Measured) /// The range of component `i` is `[1, 10]`. fn create_fundraiser(i: u32) -> Weight { - // Minimum execution time: 100_200 nanoseconds. - Weight::from_ref_time(104_033_945) - // Standard Error: 60_435 - .saturating_add(Weight::from_ref_time(189_009).saturating_mul(i.into())) - .saturating_add(DbWeight::get().reads(15)) + // Minimum execution time: 92_389 nanoseconds. + Weight::from_parts(96_229_792, 0) + // Standard Error: 44_701 + .saturating_add(Weight::from_parts(91_319, 0).saturating_mul(i.into())) + .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().writes(4)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:46 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:4 w:0) // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) // Storage: Sto Fundraisers (r:1 w:1) // Proof Skipped: Sto Fundraisers (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Portfolio PortfolioLockedAssets (r:2 w:2) // Proof: Portfolio PortfolioLockedAssets (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) // Storage: Settlement VenueInfo (r:1 w:0) @@ -138,6 +130,10 @@ impl pallet_sto::WeightInfo for SubstrateWeight { // Proof: Asset BalanceOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) // Storage: Asset Frozen (r:2 w:0) // Proof: Asset Frozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Storage: CddServiceProviders ActiveMembers (r:1 w:0) + // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:46 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetTransferCompliances (r:2 w:0) // Proof: Statistics AssetTransferCompliances (max_values: None, max_size: Some(246), added: 2721, mode: MaxEncodedLen) // Storage: Statistics AssetStats (r:28 w:20) @@ -167,23 +163,19 @@ impl pallet_sto::WeightInfo for SubstrateWeight { // Storage: Settlement InstructionLegStatus (r:0 w:2) // Proof: Settlement InstructionLegStatus (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn invest_onchain() -> Weight { - // Minimum execution time: 1_025_889 nanoseconds. - Weight::from_ref_time(1_045_578_000) + // Minimum execution time: 286_101 nanoseconds. + Weight::from_parts(301_972_000, 0) .saturating_add(DbWeight::get().reads(131)) .saturating_add(DbWeight::get().writes(50)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:25 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Portfolio PortfolioCustodian (r:2 w:0) // Proof: Portfolio PortfolioCustodian (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) // Storage: Sto Fundraisers (r:1 w:1) // Proof Skipped: Sto Fundraisers (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) // Storage: Sto FundraiserOffchainAsset (r:1 w:0) // Proof: Sto FundraiserOffchainAsset (max_values: None, max_size: Some(60), added: 2535, mode: MaxEncodedLen) // Storage: Settlement VenueSigners (r:1 w:0) @@ -224,6 +216,10 @@ impl pallet_sto::WeightInfo for SubstrateWeight { // Proof: Asset BalanceOf (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) // Storage: Asset Frozen (r:1 w:0) // Proof: Asset Frozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Storage: CddServiceProviders ActiveMembers (r:1 w:0) + // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:25 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Statistics AssetTransferCompliances (r:1 w:0) // Proof: Statistics AssetTransferCompliances (max_values: None, max_size: Some(246), added: 2721, mode: MaxEncodedLen) // Storage: Statistics AssetStats (r:14 w:10) @@ -253,21 +249,15 @@ impl pallet_sto::WeightInfo for SubstrateWeight { // Storage: Settlement InstructionLegStatus (r:0 w:1) // Proof: Settlement InstructionLegStatus (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) fn invest_offchain() -> Weight { - // Minimum execution time: 698_206 nanoseconds. - Weight::from_ref_time(702_534_000) + // Minimum execution time: 222_178 nanoseconds. + Weight::from_parts(230_675_000, 0) .saturating_add(DbWeight::get().reads(76)) .saturating_add(DbWeight::get().writes(29)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -275,21 +265,15 @@ impl pallet_sto::WeightInfo for SubstrateWeight { // Storage: Sto Fundraisers (r:1 w:1) // Proof Skipped: Sto Fundraisers (max_values: None, max_size: None, mode: Measured) fn freeze_fundraiser() -> Weight { - // Minimum execution time: 65_638 nanoseconds. - Weight::from_ref_time(66_220_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 45_648 nanoseconds. + Weight::from_parts(46_720_000, 0) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) @@ -297,67 +281,53 @@ impl pallet_sto::WeightInfo for SubstrateWeight { // Storage: Sto Fundraisers (r:1 w:1) // Proof Skipped: Sto Fundraisers (max_values: None, max_size: None, mode: Measured) fn unfreeze_fundraiser() -> Weight { - // Minimum execution time: 64_406 nanoseconds. - Weight::from_ref_time(65_198_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 45_308 nanoseconds. + Weight::from_parts(46_350_000, 0) + .saturating_add(DbWeight::get().reads(5)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: ExternalAgents GroupOfAgent (r:1 w:0) - // Proof: ExternalAgents GroupOfAgent (max_values: None, max_size: Some(77), added: 2552, mode: MaxEncodedLen) + // Proof Skipped: ExternalAgents GroupOfAgent (max_values: None, max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:0) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:0) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Sto Fundraisers (r:1 w:1) // Proof Skipped: Sto Fundraisers (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) fn modify_fundraiser_window() -> Weight { - // Minimum execution time: 65_438 nanoseconds. - Weight::from_ref_time(66_710_000) - .saturating_add(DbWeight::get().reads(9)) + // Minimum execution time: 53_299 nanoseconds. + Weight::from_parts(53_841_000, 0) + .saturating_add(DbWeight::get().reads(6)) .saturating_add(DbWeight::get().writes(1)) } // Storage: Sto Fundraisers (r:1 w:1) // Proof Skipped: Sto Fundraisers (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Portfolio PortfolioLockedAssets (r:1 w:1) + // Proof Skipped: Portfolio PortfolioLockedAssets (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: Portfolio PortfolioLockedAssets (r:1 w:1) - // Proof: Portfolio PortfolioLockedAssets (max_values: None, max_size: Some(97), added: 2572, mode: MaxEncodedLen) fn stop() -> Weight { - // Minimum execution time: 65_128 nanoseconds. - Weight::from_ref_time(66_179_000) - .saturating_add(DbWeight::get().reads(7)) + // Minimum execution time: 48_333 nanoseconds. + Weight::from_parts(48_753_000, 0) + .saturating_add(DbWeight::get().reads(4)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:1 w:0) // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: Sto Fundraisers (r:1 w:0) // Proof Skipped: Sto Fundraisers (max_values: None, max_size: None, mode: Measured) // Storage: Sto FundraiserOffchainAsset (r:0 w:1) // Proof: Sto FundraiserOffchainAsset (max_values: None, max_size: Some(60), added: 2535, mode: MaxEncodedLen) fn enable_offchain_funding() -> Weight { - // Minimum execution time: 52_299 nanoseconds. - Weight::from_ref_time(54_763_000) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 9_769 nanoseconds. + Weight::from_parts(10_771_000, 0) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } } diff --git a/pallets/weights/src/pallet_timestamp.rs b/pallets/weights/src/pallet_timestamp.rs index bf5bee8909..a3b023c326 100644 --- a/pallets/weights/src/pallet_timestamp.rs +++ b/pallets/weights/src/pallet_timestamp.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_timestamp //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -58,13 +58,13 @@ impl pallet_timestamp::WeightInfo for SubstrateWeight { // Storage: Babe CurrentSlot (r:1 w:0) // Proof: Babe CurrentSlot (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) fn set() -> Weight { - // Minimum execution time: 10_857 nanoseconds. - Weight::from_ref_time(11_727_000) + // Minimum execution time: 11_897 nanoseconds. + Weight::from_parts(14_401_000, 0) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(1)) } fn on_finalize() -> Weight { - // Minimum execution time: 6_660 nanoseconds. - Weight::from_ref_time(7_100_000) + // Minimum execution time: 6_981 nanoseconds. + Weight::from_parts(7_231_000, 0) } } diff --git a/pallets/weights/src/pallet_treasury.rs b/pallets/weights/src/pallet_treasury.rs index 9090f54af2..a7a8e51e8c 100644 --- a/pallets/weights/src/pallet_treasury.rs +++ b/pallets/weights/src/pallet_treasury.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_treasury //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -54,35 +54,41 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; pub struct SubstrateWeight; impl pallet_treasury::WeightInfo for SubstrateWeight { // Storage: Identity DidRecords (r:128 w:0) - // Proof: Identity DidRecords (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity DidRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:129 w:129) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Identity KeyRecords (r:129 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:256 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) /// The range of component `b` is `[1, 128]`. fn disbursement(b: u32) -> Weight { - // Minimum execution time: 48_413 nanoseconds. - Weight::from_ref_time(1_635_177) - // Standard Error: 40_618 - .saturating_add(Weight::from_ref_time(29_261_008).saturating_mul(b.into())) - .saturating_add(DbWeight::get().reads(2)) - .saturating_add(DbWeight::get().reads((3_u64).saturating_mul(b.into()))) + // Minimum execution time: 74_051 nanoseconds. + Weight::from_parts(74_122_000, 0) + // Standard Error: 52_798 + .saturating_add(Weight::from_parts(43_799_861, 0).saturating_mul(b.into())) + .saturating_add(DbWeight::get().reads(4)) + .saturating_add(DbWeight::get().reads((5_u64).saturating_mul(b.into()))) .saturating_add(DbWeight::get().writes(1)) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(b.into()))) } // Storage: Identity KeyRecords (r:2 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) // Storage: Identity Claims (r:2 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:2 w:2) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn reimbursement() -> Weight { - // Minimum execution time: 60_631 nanoseconds. - Weight::from_ref_time(64_196_000) + // Minimum execution time: 65_007 nanoseconds. + Weight::from_parts(71_107_000, 0) .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(2)) } diff --git a/pallets/weights/src/pallet_utility.rs b/pallets/weights/src/pallet_utility.rs index 5e042db683..8d282536a9 100644 --- a/pallets/weights/src/pallet_utility.rs +++ b/pallets/weights/src/pallet_utility.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for pallet_utility //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -59,10 +59,10 @@ impl pallet_utility::WeightInfo for SubstrateWeight { // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) /// The range of component `c` is `[0, 1000]`. fn batch(c: u32) -> Weight { - // Minimum execution time: 7_120 nanoseconds. - Weight::from_ref_time(40_789_048) - // Standard Error: 6_442 - .saturating_add(Weight::from_ref_time(11_967_780).saturating_mul(c.into())) + // Minimum execution time: 7_891 nanoseconds. + Weight::from_parts(42_204_836, 0) + // Standard Error: 6_633 + .saturating_add(Weight::from_parts(12_620_887, 0).saturating_mul(c.into())) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(2)) } @@ -72,22 +72,22 @@ impl pallet_utility::WeightInfo for SubstrateWeight { // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) /// The range of component `c` is `[0, 1000]`. fn batch_all(c: u32) -> Weight { - // Minimum execution time: 7_411 nanoseconds. - Weight::from_ref_time(30_708_916) - // Standard Error: 7_425 - .saturating_add(Weight::from_ref_time(12_017_560).saturating_mul(c.into())) + // Minimum execution time: 7_631 nanoseconds. + Weight::from_parts(52_382_563, 0) + // Standard Error: 12_704 + .saturating_add(Weight::from_parts(12_660_162, 0).saturating_mul(c.into())) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity CurrentPayer (r:1 w:1) - // Proof: Identity CurrentPayer (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentPayer (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:1) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:1) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) fn dispatch_as() -> Weight { - // Minimum execution time: 22_684 nanoseconds. - Weight::from_ref_time(23_825_000) + // Minimum execution time: 24_366 nanoseconds. + Weight::from_parts(27_251_000, 0) .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(3)) } @@ -97,46 +97,46 @@ impl pallet_utility::WeightInfo for SubstrateWeight { // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) /// The range of component `c` is `[0, 1000]`. fn force_batch(c: u32) -> Weight { - // Minimum execution time: 7_602 nanoseconds. - Weight::from_ref_time(37_888_291) - // Standard Error: 7_863 - .saturating_add(Weight::from_ref_time(12_095_202).saturating_mul(c.into())) + // Minimum execution time: 7_992 nanoseconds. + Weight::from_parts(49_345_801, 0) + // Standard Error: 10_338 + .saturating_add(Weight::from_parts(12_648_281, 0).saturating_mul(c.into())) .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(2)) } // Storage: Identity KeyRecords (r:2 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Utility Nonces (r:1 w:1) + // Proof: Utility Nonces (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) // Storage: Timestamp Now (r:1 w:0) // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:4 w:0) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) - // Storage: Utility Nonces (r:1 w:1) - // Proof: Utility Nonces (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) // Storage: Permissions CurrentPalletName (r:1 w:1) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:1) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) fn relay_tx() -> Weight { - // Minimum execution time: 189_003 nanoseconds. - Weight::from_ref_time(196_184_000) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 128_001 nanoseconds. + Weight::from_parts(138_117_000, 0) + .saturating_add(DbWeight::get().reads(9)) .saturating_add(DbWeight::get().writes(3)) } fn ensure_root() -> Weight { - // Minimum execution time: 671 nanoseconds. - Weight::from_ref_time(841_000) + // Minimum execution time: 631 nanoseconds. + Weight::from_parts(711_000, 0) } // Storage: Identity CurrentPayer (r:1 w:1) - // Proof: Identity CurrentPayer (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentPayer (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:1) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:1) // Proof Skipped: Permissions CurrentDispatchableName (max_values: Some(1), max_size: None, mode: Measured) fn as_derivative() -> Weight { - // Minimum execution time: 19_970 nanoseconds. - Weight::from_ref_time(23_145_000) + // Minimum execution time: 20_030 nanoseconds. + Weight::from_parts(22_474_000, 0) .saturating_add(DbWeight::get().reads(3)) .saturating_add(DbWeight::get().writes(3)) } diff --git a/pallets/weights/src/pallet_validators.rs b/pallets/weights/src/pallet_validators.rs new file mode 100644 index 0000000000..2c291c5cac --- /dev/null +++ b/pallets/weights/src/pallet_validators.rs @@ -0,0 +1,136 @@ +// This file is part of Substrate. + +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for pallet_validators +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2024-12-02, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` + +// Executed Command: +// ./polymesh +// benchmark +// pallet +// -s +// 100 +// -r +// 5 +// -p=pallet_validators +// -e=* +// --heap-pages +// 4096 +// --db-cache +// 512 +// --execution +// wasm +// --wasm-execution +// compiled +// --output +// ./Polymesh/pallets/weights/src/ +// --template +// ./Polymesh/.maintain/frame-weight-template.hbs + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; + +/// Weights for pallet_validators using the Substrate node and recommended hardware. +pub struct SubstrateWeight; +impl pallet_validators::WeightInfo for SubstrateWeight { + // Storage: Staking PermissionedIdentity (r:1 w:1) + // Proof Skipped: Staking PermissionedIdentity (max_values: None, max_size: None, mode: Measured) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Staking ValidatorCount (r:1 w:0) + // Proof: Staking ValidatorCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn add_permissioned_validator() -> Weight { + // Minimum execution time: 41_553 nanoseconds. + Weight::from_parts(46_099_000, 0) + .saturating_add(DbWeight::get().reads(6)) + .saturating_add(DbWeight::get().writes(1)) + } + // Storage: Staking PermissionedIdentity (r:1 w:1) + // Proof Skipped: Staking PermissionedIdentity (max_values: None, max_size: None, mode: Measured) + fn remove_permissioned_validator() -> Weight { + // Minimum execution time: 21_923 nanoseconds. + Weight::from_parts(23_775_000, 0) + .saturating_add(DbWeight::get().reads(1)) + .saturating_add(DbWeight::get().writes(1)) + } + // Storage: Staking SlashingAllowedFor (r:0 w:1) + // Proof: Staking SlashingAllowedFor (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + fn change_slashing_allowed_for() -> Weight { + // Minimum execution time: 8_042 nanoseconds. + Weight::from_parts(8_202_000, 0).saturating_add(DbWeight::get().writes(1)) + } + // Storage: Staking ValidatorCount (r:1 w:0) + // Proof: Staking ValidatorCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: Staking PermissionedIdentity (r:1 w:1) + // Proof Skipped: Staking PermissionedIdentity (max_values: None, max_size: None, mode: Measured) + fn update_permissioned_validator_intended_count() -> Weight { + // Minimum execution time: 15_513 nanoseconds. + Weight::from_parts(16_815_000, 0) + .saturating_add(DbWeight::get().reads(2)) + .saturating_add(DbWeight::get().writes(1)) + } + // Storage: Identity KeyRecords (r:100 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) + // Storage: Identity IsDidFrozen (r:1 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Staking Validators (r:100 w:100) + // Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) + // Storage: Staking PermissionedIdentity (r:1 w:1) + // Proof Skipped: Staking PermissionedIdentity (max_values: None, max_size: None, mode: Measured) + // Storage: Identity AccountKeyRefCount (r:100 w:100) + // Proof Skipped: Identity AccountKeyRefCount (max_values: None, max_size: None, mode: Measured) + // Storage: Staking CounterForValidators (r:1 w:1) + // Proof: Staking CounterForValidators (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: Staking Nominators (r:100 w:0) + // Proof: Staking Nominators (max_values: None, max_size: Some(558), added: 3033, mode: MaxEncodedLen) + /// The range of component `s` is `[1, 100]`. + fn chill_from_governance(s: u32) -> Weight { + // Minimum execution time: 63_263 nanoseconds. + Weight::from_parts(39_954_272, 0) + // Standard Error: 31_787 + .saturating_add(Weight::from_parts(29_199_031, 0).saturating_mul(s.into())) + .saturating_add(DbWeight::get().reads(3)) + .saturating_add(DbWeight::get().reads((4_u64).saturating_mul(s.into()))) + .saturating_add(DbWeight::get().writes(2)) + .saturating_add(DbWeight::get().writes((2_u64).saturating_mul(s.into()))) + } + // Storage: Staking ValidatorCommissionCap (r:1 w:1) + // Proof: Staking ValidatorCommissionCap (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: Staking Validators (r:152 w:151) + // Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) + /// The range of component `m` is `[0, 150]`. + fn set_commission_cap(m: u32) -> Weight { + // Minimum execution time: 26_039 nanoseconds. + Weight::from_parts(36_161_210, 0) + // Standard Error: 11_245 + .saturating_add(Weight::from_parts(4_450_891, 0).saturating_mul(m.into())) + .saturating_add(DbWeight::get().reads(3)) + .saturating_add(DbWeight::get().reads((1_u64).saturating_mul(m.into()))) + .saturating_add(DbWeight::get().writes(2)) + .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(m.into()))) + } +} diff --git a/pallets/weights/src/polymesh_contracts.rs b/pallets/weights/src/polymesh_contracts.rs index 94c1ade9a2..7b94582545 100644 --- a/pallets/weights/src/polymesh_contracts.rs +++ b/pallets/weights/src/polymesh_contracts.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for polymesh_contracts //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2025-06-11, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-11-03, STEPS: `100`, REPEAT: 5, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 -//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC Processor` +//! HOSTNAME: `ubuntu-8gb-nbg1-1-bench2`, CPU: `AMD EPYC-Milan Processor` // Executed Command: // ./polymesh @@ -43,7 +43,7 @@ // --output // ./Polymesh/pallets/weights/src/ // --template -// ./.maintain/frame-weight-template.hbs +// ./Polymesh/.maintain/frame-weight-template.hbs #![allow(unused_parens)] #![allow(unused_imports)] @@ -53,20 +53,22 @@ use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; /// Weights for polymesh_contracts using the Substrate node and recommended hardware. pub struct SubstrateWeight; impl polymesh_contracts::WeightInfo for SubstrateWeight { - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:2 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:1 w:0) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Contracts ContractInfoOf (r:1 w:1) // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) // Storage: Contracts CodeStorage (r:1 w:0) // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity IsDidFrozen (r:1 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: unknown `0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f` (r:1 w:0) // Proof Skipped: unknown `0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f` (r:1 w:0) // Storage: System EventTopics (r:2 w:2) @@ -76,236 +78,252 @@ impl polymesh_contracts::WeightInfo for SubstrateWeight { /// The range of component `k` is `[1, 8192]`. /// The range of component `v` is `[1, 8192]`. fn chain_extension_read_storage(k: u32, v: u32) -> Weight { - // Minimum execution time: 560_641 nanoseconds. - Weight::from_ref_time(568_884_097) - // Standard Error: 295 - .saturating_add(Weight::from_ref_time(5_537).saturating_mul(k.into())) - // Standard Error: 295 - .saturating_add(Weight::from_ref_time(1_239).saturating_mul(v.into())) - .saturating_add(DbWeight::get().reads(11)) + // Minimum execution time: 420_509 nanoseconds. + Weight::from_parts(441_154_010, 0) + // Standard Error: 270 + .saturating_add(Weight::from_parts(4_894, 0).saturating_mul(k.into())) + // Standard Error: 270 + .saturating_add(Weight::from_parts(980, 0).saturating_mul(v.into())) + .saturating_add(DbWeight::get().reads(13)) .saturating_add(DbWeight::get().writes(3)) } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:2 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:1 w:0) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Contracts ContractInfoOf (r:1 w:1) // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) // Storage: Contracts CodeStorage (r:1 w:0) // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity IsDidFrozen (r:1 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: System EventTopics (r:2 w:2) // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) /// The range of component `r` is `[0, 20]`. fn chain_extension_get_version(r: u32) -> Weight { - // Minimum execution time: 547_351 nanoseconds. - Weight::from_ref_time(570_291_478) - // Standard Error: 143_016 - .saturating_add(Weight::from_ref_time(57_355_066).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 404_026 nanoseconds. + Weight::from_parts(430_717_810, 0) + // Standard Error: 116_585 + .saturating_add(Weight::from_parts(57_558_916, 0).saturating_mul(r.into())) + .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().writes(3)) } - // Storage: Identity KeyRecords (r:2001 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:2002 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:1 w:0) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Contracts ContractInfoOf (r:1 w:1) // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) // Storage: Contracts CodeStorage (r:1 w:0) // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) - // Storage: Identity IsDidFrozen (r:2000 w:0) - // Proof: Identity IsDidFrozen (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity IsDidFrozen (r:2001 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: System EventTopics (r:2 w:2) // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) /// The range of component `r` is `[1, 20]`. fn chain_extension_get_key_did(r: u32) -> Weight { - // Minimum execution time: 1_305_758 nanoseconds. - Weight::from_ref_time(193_392_872) - // Standard Error: 2_272_956 - .saturating_add(Weight::from_ref_time(823_214_072).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 1_221_859 nanoseconds. + Weight::from_parts(23_864_904, 0) + // Standard Error: 2_525_338 + .saturating_add(Weight::from_parts(870_955_515, 0).saturating_mul(r.into())) + .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().reads((200_u64).saturating_mul(r.into()))) .saturating_add(DbWeight::get().writes(3)) } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:2 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:1 w:0) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Contracts ContractInfoOf (r:1 w:1) // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) // Storage: Contracts CodeStorage (r:1 w:0) // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity IsDidFrozen (r:1 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: System EventTopics (r:2 w:2) // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) /// The range of component `r` is `[0, 20]`. fn chain_extension_hash_twox_64(r: u32) -> Weight { - // Minimum execution time: 531_227 nanoseconds. - Weight::from_ref_time(574_503_627) - // Standard Error: 130_828 - .saturating_add(Weight::from_ref_time(74_434_324).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 407_721 nanoseconds. + Weight::from_parts(436_149_077, 0) + // Standard Error: 136_925 + .saturating_add(Weight::from_parts(78_627_903, 0).saturating_mul(r.into())) + .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().writes(3)) } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:2 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:1 w:0) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Contracts ContractInfoOf (r:1 w:1) // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) // Storage: Contracts CodeStorage (r:1 w:0) // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity IsDidFrozen (r:1 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: System EventTopics (r:2 w:2) // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[0, 64]`. fn chain_extension_hash_twox_64_per_kb(n: u32) -> Weight { - // Minimum execution time: 626_971 nanoseconds. - Weight::from_ref_time(669_184_963) - // Standard Error: 79_245 - .saturating_add(Weight::from_ref_time(40_113_729).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 493_259 nanoseconds. + Weight::from_parts(545_127_910, 0) + // Standard Error: 65_828 + .saturating_add(Weight::from_parts(27_618_039, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().writes(3)) } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:2 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:1 w:0) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Contracts ContractInfoOf (r:1 w:1) // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) // Storage: Contracts CodeStorage (r:1 w:0) // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity IsDidFrozen (r:1 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: System EventTopics (r:2 w:2) // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) /// The range of component `r` is `[0, 20]`. fn chain_extension_hash_twox_128(r: u32) -> Weight { - // Minimum execution time: 537_786 nanoseconds. - Weight::from_ref_time(569_946_926) - // Standard Error: 134_509 - .saturating_add(Weight::from_ref_time(76_678_500).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 403_573 nanoseconds. + Weight::from_parts(444_653_976, 0) + // Standard Error: 133_724 + .saturating_add(Weight::from_parts(78_972_384, 0).saturating_mul(r.into())) + .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().writes(3)) } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:2 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:1 w:0) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Contracts ContractInfoOf (r:1 w:1) // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) // Storage: Contracts CodeStorage (r:1 w:0) // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity IsDidFrozen (r:1 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: System EventTopics (r:2 w:2) // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[0, 64]`. fn chain_extension_hash_twox_128_per_kb(n: u32) -> Weight { - // Minimum execution time: 625_068 nanoseconds. - Weight::from_ref_time(665_884_874) - // Standard Error: 63_098 - .saturating_add(Weight::from_ref_time(47_295_181).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 490_355 nanoseconds. + Weight::from_parts(549_217_273, 0) + // Standard Error: 60_751 + .saturating_add(Weight::from_parts(34_565_161, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().writes(3)) } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:2 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:1 w:0) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Contracts ContractInfoOf (r:1 w:1) // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) // Storage: Contracts CodeStorage (r:1 w:0) // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity IsDidFrozen (r:1 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: System EventTopics (r:2 w:2) // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) /// The range of component `r` is `[0, 20]`. fn chain_extension_hash_twox_256(r: u32) -> Weight { - // Minimum execution time: 532_639 nanoseconds. - Weight::from_ref_time(572_339_483) - // Standard Error: 152_653 - .saturating_add(Weight::from_ref_time(81_070_860).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 412_718 nanoseconds. + Weight::from_parts(440_860_388, 0) + // Standard Error: 110_188 + .saturating_add(Weight::from_parts(85_042_455, 0).saturating_mul(r.into())) + .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().writes(3)) } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:2 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:1 w:0) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Contracts ContractInfoOf (r:1 w:1) // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) // Storage: Contracts CodeStorage (r:1 w:0) // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity IsDidFrozen (r:1 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: System EventTopics (r:2 w:2) // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[0, 64]`. fn chain_extension_hash_twox_256_per_kb(n: u32) -> Weight { - // Minimum execution time: 630_515 nanoseconds. - Weight::from_ref_time(675_775_349) - // Standard Error: 63_761 - .saturating_add(Weight::from_ref_time(61_308_678).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 498_587 nanoseconds. + Weight::from_parts(553_931_299, 0) + // Standard Error: 63_823 + .saturating_add(Weight::from_parts(48_829_146, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().writes(3)) } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:2 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:1 w:0) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Contracts ContractInfoOf (r:1 w:1) // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) // Storage: Contracts CodeStorage (r:1 w:0) // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity IsDidFrozen (r:1 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: PolymeshContracts CallRuntimeWhitelist (r:1 w:0) - // Proof: PolymeshContracts CallRuntimeWhitelist (max_values: None, max_size: Some(3), added: 2478, mode: MaxEncodedLen) + // Proof Skipped: PolymeshContracts CallRuntimeWhitelist (max_values: None, max_size: None, mode: Measured) // Storage: Identity CurrentPayer (r:1 w:1) - // Proof: Identity CurrentPayer (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + // Proof Skipped: Identity CurrentPayer (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentPalletName (r:1 w:1) // Proof Skipped: Permissions CurrentPalletName (max_values: Some(1), max_size: None, mode: Measured) // Storage: Permissions CurrentDispatchableName (r:1 w:1) @@ -314,83 +332,79 @@ impl polymesh_contracts::WeightInfo for SubstrateWeight { // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) /// The range of component `n` is `[1, 8188]`. fn chain_extension_call_runtime(n: u32) -> Weight { - // Minimum execution time: 569_483 nanoseconds. - Weight::from_ref_time(596_615_721) - // Standard Error: 372 - .saturating_add(Weight::from_ref_time(2_316).saturating_mul(n.into())) - .saturating_add(DbWeight::get().reads(14)) + // Minimum execution time: 445_737 nanoseconds. + Weight::from_parts(480_099_782, 0) + // Standard Error: 375 + .saturating_add(Weight::from_parts(555, 0).saturating_mul(n.into())) + .saturating_add(DbWeight::get().reads(16)) .saturating_add(DbWeight::get().writes(6)) } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:2 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:1 w:0) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Contracts ContractInfoOf (r:1 w:1) // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) // Storage: Contracts CodeStorage (r:1 w:0) // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity IsDidFrozen (r:1 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: System EventTopics (r:2 w:2) // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) fn dummy_contract() -> Weight { - // Minimum execution time: 229_474 nanoseconds. - Weight::from_ref_time(250_526_000) - .saturating_add(DbWeight::get().reads(10)) + // Minimum execution time: 242_023 nanoseconds. + Weight::from_parts(246_270_000, 0) + .saturating_add(DbWeight::get().reads(12)) .saturating_add(DbWeight::get().writes(3)) } /// The range of component `n` is `[1, 8188]`. fn basic_runtime_call(_n: u32) -> Weight { - // Minimum execution time: 2_003 nanoseconds. - Weight::from_ref_time(3_338_377) + // Minimum execution time: 1_963 nanoseconds. + Weight::from_parts(3_024_347, 0) } /// The range of component `i` is `[0, 1048576]`. /// The range of component `s` is `[0, 1048576]`. fn base_weight_with_hash(i: u32, s: u32) -> Weight { - // Minimum execution time: 1_259_419 nanoseconds. - Weight::from_ref_time(49_636_467) - // Standard Error: 4 - .saturating_add(Weight::from_ref_time(1_166).saturating_mul(i.into())) - // Standard Error: 4 - .saturating_add(Weight::from_ref_time(1_246).saturating_mul(s.into())) + // Minimum execution time: 1_154_999 nanoseconds. + Weight::from_parts(73_388_718, 0) + // Standard Error: 10 + .saturating_add(Weight::from_parts(1_019, 0).saturating_mul(i.into())) + // Standard Error: 10 + .saturating_add(Weight::from_parts(1_157, 0).saturating_mul(s.into())) } /// The range of component `c` is `[0, 61717]`. /// The range of component `i` is `[0, 1048576]`. /// The range of component `s` is `[0, 1048576]`. fn base_weight_with_code(c: u32, i: u32, s: u32) -> Weight { - // Minimum execution time: 1_332_498 nanoseconds. - Weight::from_ref_time(22_375_295) - // Standard Error: 70 - .saturating_add(Weight::from_ref_time(1_421).saturating_mul(c.into())) - // Standard Error: 4 - .saturating_add(Weight::from_ref_time(1_163).saturating_mul(i.into())) - // Standard Error: 4 - .saturating_add(Weight::from_ref_time(1_244).saturating_mul(s.into())) + // Minimum execution time: 1_206_667 nanoseconds. + Weight::from_parts(67_372_302, 0) + // Standard Error: 167 + .saturating_add(Weight::from_parts(1_447, 0).saturating_mul(c.into())) + // Standard Error: 9 + .saturating_add(Weight::from_parts(996, 0).saturating_mul(i.into())) + // Standard Error: 9 + .saturating_add(Weight::from_parts(1_137, 0).saturating_mul(s.into())) } // Storage: PolymeshContracts CallRuntimeWhitelist (r:0 w:2000) - // Proof: PolymeshContracts CallRuntimeWhitelist (max_values: None, max_size: Some(3), added: 2478, mode: MaxEncodedLen) + // Proof Skipped: PolymeshContracts CallRuntimeWhitelist (max_values: None, max_size: None, mode: Measured) /// The range of component `u` is `[0, 2000]`. fn update_call_runtime_whitelist(u: u32) -> Weight { - // Minimum execution time: 2_583 nanoseconds. - Weight::from_ref_time(2_614_000) - // Standard Error: 1_438 - .saturating_add(Weight::from_ref_time(1_376_360).saturating_mul(u.into())) + // Minimum execution time: 3_936 nanoseconds. + Weight::from_parts(4_167_000, 0) + // Standard Error: 2_190 + .saturating_add(Weight::from_parts(1_653_031, 0).saturating_mul(u.into())) .saturating_add(DbWeight::get().writes((1_u64).saturating_mul(u.into()))) } // Storage: Identity KeyRecords (r:2 w:1) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidKeys (r:0 w:1) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity DidKeys (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyPortfolioPermissions (r:0 w:1) // Proof Skipped: Identity KeyPortfolioPermissions (max_values: None, max_size: None, mode: Measured) // Storage: Identity KeyExtrinsicPermissions (r:0 w:1) @@ -398,103 +412,101 @@ impl polymesh_contracts::WeightInfo for SubstrateWeight { // Storage: Identity KeyAssetPermissions (r:0 w:1) // Proof Skipped: Identity KeyAssetPermissions (max_values: None, max_size: None, mode: Measured) fn link_contract_as_secondary_key() -> Weight { - // Minimum execution time: 43_004 nanoseconds. - Weight::from_ref_time(45_399_000) - .saturating_add(DbWeight::get().reads(6)) + // Minimum execution time: 26_339 nanoseconds. + Weight::from_parts(28_423_000, 0) + .saturating_add(DbWeight::get().reads(2)) .saturating_add(DbWeight::get().writes(5)) } // Storage: Identity KeyRecords (r:2 w:1) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity ParentDid (r:1 w:1) - // Proof: Identity ParentDid (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) + // Proof Skipped: Identity ParentDid (max_values: None, max_size: None, mode: Measured) // Storage: ProtocolFee Coefficient (r:1 w:0) - // Proof: ProtocolFee Coefficient (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee Coefficient (max_values: Some(1), max_size: None, mode: Measured) // Storage: ProtocolFee BaseFees (r:1 w:0) - // Proof: ProtocolFee BaseFees (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) + // Proof Skipped: ProtocolFee BaseFees (max_values: None, max_size: None, mode: Measured) // Storage: Identity MultiPurposeNonce (r:1 w:1) - // Proof: Identity MultiPurposeNonce (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Proof Skipped: Identity MultiPurposeNonce (max_values: Some(1), max_size: None, mode: Measured) // Storage: System ParentHash (r:1 w:0) // Proof: System ParentHash (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) // Storage: Identity DidRecords (r:1 w:1) - // Proof: Identity DidRecords (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity DidRecords (max_values: None, max_size: None, mode: Measured) // Storage: Identity DidKeys (r:0 w:1) - // Proof: Identity DidKeys (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + // Proof Skipped: Identity DidKeys (max_values: None, max_size: None, mode: Measured) // Storage: Identity ChildDid (r:0 w:1) - // Proof: Identity ChildDid (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + // Proof Skipped: Identity ChildDid (max_values: None, max_size: None, mode: Measured) fn link_contract_as_primary_key() -> Weight { - // Minimum execution time: 64_366 nanoseconds. - Weight::from_ref_time(68_192_000) - .saturating_add(DbWeight::get().reads(12)) + // Minimum execution time: 47_721 nanoseconds. + Weight::from_parts(52_568_000, 0) + .saturating_add(DbWeight::get().reads(8)) .saturating_add(DbWeight::get().writes(6)) } // Storage: PolymeshContracts ApiNextUpgrade (r:0 w:1) - // Proof: PolymeshContracts ApiNextUpgrade (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + // Proof Skipped: PolymeshContracts ApiNextUpgrade (max_values: None, max_size: None, mode: Measured) fn upgrade_api() -> Weight { - // Minimum execution time: 9_955 nanoseconds. - Weight::from_ref_time(11_416_000).saturating_add(DbWeight::get().writes(1)) + // Minimum execution time: 12_098 nanoseconds. + Weight::from_parts(13_571_000, 0).saturating_add(DbWeight::get().writes(1)) } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:2 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:1 w:0) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Contracts ContractInfoOf (r:1 w:1) // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) // Storage: Contracts CodeStorage (r:1 w:0) // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity IsDidFrozen (r:1 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: PolymeshContracts CurrentApiHash (r:1 w:1) - // Proof: PolymeshContracts CurrentApiHash (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + // Proof Skipped: PolymeshContracts CurrentApiHash (max_values: None, max_size: None, mode: Measured) // Storage: PolymeshContracts ApiNextUpgrade (r:1 w:1) - // Proof: PolymeshContracts ApiNextUpgrade (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + // Proof Skipped: PolymeshContracts ApiNextUpgrade (max_values: None, max_size: None, mode: Measured) // Storage: System EventTopics (r:2 w:2) // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) /// The range of component `r` is `[0, 20]`. fn chain_extension_get_latest_api_upgrade(r: u32) -> Weight { - // Minimum execution time: 528_352 nanoseconds. - Weight::from_ref_time(571_012_568) - // Standard Error: 283_679 - .saturating_add(Weight::from_ref_time(342_166_548).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(12)) + // Minimum execution time: 402_874 nanoseconds. + Weight::from_parts(468_862_333, 0) + // Standard Error: 1_989_018 + .saturating_add(Weight::from_parts(376_144_330, 0).saturating_mul(r.into())) + .saturating_add(DbWeight::get().reads(14)) .saturating_add(DbWeight::get().writes(5)) } - // Storage: Identity KeyRecords (r:1 w:0) - // Proof: Identity KeyRecords (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - // Storage: Timestamp Now (r:1 w:0) - // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - // Storage: CddServiceProviders ActiveMembers (r:1 w:0) - // Proof Skipped: CddServiceProviders ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) - // Storage: Identity Claims (r:2 w:0) - // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) + // Storage: Identity KeyRecords (r:2 w:0) + // Proof Skipped: Identity KeyRecords (max_values: None, max_size: None, mode: Measured) // Storage: System Account (r:1 w:0) // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) // Storage: Contracts ContractInfoOf (r:1 w:1) // Proof: Contracts ContractInfoOf (max_values: None, max_size: Some(290), added: 2765, mode: MaxEncodedLen) // Storage: Contracts CodeStorage (r:1 w:0) // Proof: Contracts CodeStorage (max_values: None, max_size: Some(126001), added: 128476, mode: MaxEncodedLen) + // Storage: Timestamp Now (r:1 w:0) + // Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + // Storage: Identity IsDidFrozen (r:1 w:0) + // Proof Skipped: Identity IsDidFrozen (max_values: None, max_size: None, mode: Measured) + // Storage: Instance2Group ActiveMembers (r:1 w:0) + // Proof Skipped: Instance2Group ActiveMembers (max_values: Some(1), max_size: None, mode: Measured) + // Storage: Identity Claims (r:2 w:0) + // Proof Skipped: Identity Claims (max_values: None, max_size: None, mode: Measured) // Storage: System BlockHash (r:1 w:0) // Proof: System BlockHash (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) // Storage: Asset AssetNonce (r:1 w:0) - // Proof: Asset AssetNonce (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + // Proof Skipped: Asset AssetNonce (max_values: None, max_size: None, mode: Measured) // Storage: System EventTopics (r:2 w:2) // Proof Skipped: System EventTopics (max_values: None, max_size: None, mode: Measured) /// The range of component `r` is `[0, 20]`. fn chain_extension_get_next_asset_id(r: u32) -> Weight { - // Minimum execution time: 536_154 nanoseconds. - Weight::from_ref_time(599_143_461) - // Standard Error: 567_627 - .saturating_add(Weight::from_ref_time(401_571_182).saturating_mul(r.into())) - .saturating_add(DbWeight::get().reads(12)) + // Minimum execution time: 413_229 nanoseconds. + Weight::from_parts(437_313_575, 0) + // Standard Error: 863_761 + .saturating_add(Weight::from_parts(428_114_434, 0).saturating_mul(r.into())) + .saturating_add(DbWeight::get().reads(14)) .saturating_add(DbWeight::get().writes(3)) } } diff --git a/pallets/weights/src/polymesh_transaction_payment.rs b/pallets/weights/src/polymesh_transaction_payment.rs new file mode 100644 index 0000000000..d4b1043abd --- /dev/null +++ b/pallets/weights/src/polymesh_transaction_payment.rs @@ -0,0 +1,74 @@ +// This file is part of Substrate. + +// Copyright (C) 2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for polymesh_transaction_payment +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2026-01-02, STEPS: `10`, REPEAT: 3, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 512 +//! HOSTNAME: `trance`, CPU: `AMD Ryzen 9 9950X3D 16-Core Processor` + +// Executed Command: +// target/release/polymesh +// benchmark +// pallet +// -s +// 10 +// -r +// 3 +// -p=polymesh_transaction_payment +// -e=* +// --db-cache +// 512 +// --heap-pages +// 4096 +// --execution +// wasm +// --wasm-execution +// compiled +// --output +// ./ +// --template +// .maintain/frame-weight-template.hbs + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use polymesh_primitives::{RocksDbWeight as DbWeight, Weight}; + +/// Weights for polymesh_transaction_payment using the Substrate node and recommended hardware. +pub struct SubstrateWeight; +impl polymesh_transaction_payment::WeightInfo for SubstrateWeight { + // Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0) + // Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + // Storage: `Relayer::Subsidies` (r:1 w:0) + // Proof: `Relayer::Subsidies` (`max_values`: None, `max_size`: Some(96), added: 2571, mode: `MaxEncodedLen`) + // Storage: `System::Account` (r:1 w:1) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `Authorship::Author` (r:1 w:0) + // Proof: `Authorship::Author` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + // Storage: `System::Digest` (r:1 w:0) + // Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `Identity::CurrentPayer` (r:0 w:1) + // Proof: `Identity::CurrentPayer` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + fn charge_transaction_payment() -> Weight { + // Minimum execution time: 27_252 nanoseconds. + Weight::from_parts(28_203_000, 0) + .saturating_add(DbWeight::get().reads(5)) + .saturating_add(DbWeight::get().writes(2)) + } +} diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index fc9ef09d08..af09489b1a 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -7,10 +7,13 @@ repository = "https://github.com/PolymeshAssociation/Polymesh" description = "Polymesh Primitives" edition = "2021" +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(substrate_runtime)'] } + [dependencies] chrono = { version = "0.4", default-features = false } -serde = { version = "1.0.104", optional = true, default-features = false, features = ["derive"] } -serde_bytes = { version = "0.11.14", optional = true, default-features = false } +serde = { version = "1.0.104", default-features = false, features = ["alloc", "derive"] } +serde_bytes = { version = "0.11.14", default-features = false, features = ["alloc"] } rand_core = { version = "0.6", default-features = false } rand = { version = "0.8", default-features = false, optional = true } rustc-hex = { version = "2.1.0", default-features = false } @@ -25,17 +28,18 @@ schnorrkel = { version = "0.11", default-features = false } # Substrate codec = { workspace = true, default-features = false, features = ["derive"] } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } -scale-info = { version = "2.0", default-features = false, features = ["derive", "decode"] } -sp-application-crypto = { version = "7.0.0", default-features = false, optional = true } -sp-arithmetic = { version = "6.0.0", default-features = false } -sp-core = { version = "7.0.0", default-features = false } -sp-io = { version = "7.0.0", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-runtime-interface = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-version = { version = "5.0.0", default-features = false } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +scale-info = { workspace = true, default-features = false, features = ["derive", "decode"] } +sp-application-crypto = { workspace = true, default-features = false, optional = true } +sp-arithmetic = { workspace = true, default-features = false } +sp-core = { workspace = true, default-features = false } +sp-debug-derive = { workspace = true, default-features = false } +sp-io = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-runtime-interface = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } libsecp256k1 = { version = "0.7", default-features = false, features = ["hmac", "static-context"] } [dev-dependencies] @@ -56,8 +60,8 @@ std = [ "codec/std", "frame-support/std", "frame-system/std", - "serde", - "serde_bytes", + "serde/std", + "serde_bytes/std", "sp-core/std", "sp-io/std", "sp-runtime-interface/std", diff --git a/primitives/src/agent.rs b/primitives/src/agent.rs index 48536de4de..27db09d3d1 100644 --- a/primitives/src/agent.rs +++ b/primitives/src/agent.rs @@ -1,21 +1,20 @@ use crate::impl_checked_inc; -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use scale_info::TypeInfo; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; /// A `Ticker`-local Agent Group ID. /// By *local*, we mean that the same number might be used for a different `Ticker` /// to uniquely identify a different Agent Group. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] +#[derive(Serialize, Deserialize)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, MaxEncodedLen)] #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Default, Debug)] pub struct AGId(pub u32); impl_checked_inc!(AGId); /// The available set of agent groups. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] +#[derive(Serialize, Deserialize)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, MaxEncodedLen)] #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)] pub enum AgentGroup { /// Has all permissions. diff --git a/primitives/src/asset.rs b/primitives/src/asset.rs index 29010ac3f8..44b35dc8ca 100644 --- a/primitives/src/asset.rs +++ b/primitives/src/asset.rs @@ -13,10 +13,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use scale_info::TypeInfo; use sp_io::hashing::blake2_128; use sp_std::prelude::Vec; @@ -27,8 +26,8 @@ use crate::ticker::Ticker; use crate::{impl_checked_inc, AccountId as AccountId32, PortfolioId}; /// An unique asset identifier. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Decode, Encode, TypeInfo, MaxEncodedLen)] +#[derive(Serialize, Deserialize)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, MaxEncodedLen)] #[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] pub struct AssetId([u8; 16]); @@ -61,44 +60,25 @@ impl From for AssetId { } /// A per-asset checkpoint ID. -#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] -#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Copy, Clone, Debug, Default, Eq, Ord, PartialEq, PartialOrd)] pub struct CheckpointId(pub u64); impl_checked_inc!(CheckpointId); /// A wrapper for a token name. -#[derive(Encode, Decode, TypeInfo, VecU8StrongTyped)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, VecU8StrongTyped)] #[derive(Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)] pub struct AssetName(pub Vec); /// The ID of a custom asset type. -#[derive( - Encode, - Decode, - TypeInfo, - MaxEncodedLen, - Copy, - Clone, - Default, - Debug, - PartialEq, - Eq -)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)] pub struct CustomAssetTypeId(pub u32); impl_checked_inc!(CustomAssetTypeId); /// The type of security represented by a token. -#[derive( - Encode, - Decode, - TypeInfo, - MaxEncodedLen, - Copy, - Clone, - Debug, - PartialEq, - Eq -)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum AssetType { /// Common stock - a security that represents ownership in a corporation. EquityCommon, @@ -140,17 +120,8 @@ pub enum AssetType { } /// Defines all non-fungible variants. -#[derive( - Encode, - Decode, - TypeInfo, - MaxEncodedLen, - Copy, - Clone, - Debug, - PartialEq, - Eq -)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum NonFungibleType { /// Derivative contract - a contract between two parties for buying or selling a security at a /// predetermined price within a specific time period. @@ -201,8 +172,8 @@ impl AssetType { } /// A wrapper for a funding round name. -#[derive(Decode, Encode, TypeInfo, VecU8StrongTyped)] -#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Default)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, VecU8StrongTyped)] +#[derive(Clone, Debug, Default, Eq, Hash, PartialEq, PartialOrd, Ord)] pub struct FundingRoundName(pub Vec); /// Represents the holder of an asset, which can be either a portfolio or an account. diff --git a/primitives/src/asset_identifier.rs b/primitives/src/asset_identifier.rs index f1dd83eba9..7541521049 100644 --- a/primitives/src/asset_identifier.rs +++ b/primitives/src/asset_identifier.rs @@ -1,11 +1,12 @@ -use codec::{Decode, Encode}; +use codec::{Decode, DecodeWithMemTracking, Encode}; use core::convert::{TryFrom, TryInto}; use scale_info::TypeInfo; use sp_std::prelude::Vec; /// Implementation of common asset identifiers. /// https://www.cusip.com/identifiers.html. -#[derive(Encode, Decode, TypeInfo, Clone, Debug, PartialEq, Eq)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, PartialEq, Eq)] +#[derive(Clone, Debug)] pub enum AssetIdentifier { /// Universally recognized identifier for financial instruments. /// Example: Amazon.com Inc - Common Stock diff --git a/primitives/src/asset_metadata.rs b/primitives/src/asset_metadata.rs index 9dec799470..1bc68419c3 100644 --- a/primitives/src/asset_metadata.rs +++ b/primitives/src/asset_metadata.rs @@ -13,36 +13,36 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::impl_checked_inc; -use crate::Url; use codec::MaxEncodedLen; -use codec::{Decode, DecodeAll, Encode}; -use polymesh_primitives_derive::VecU8StrongTyped; +use codec::{Decode, DecodeAll, DecodeWithMemTracking, Encode}; use scale_info::{PortableRegistry, TypeInfo}; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; use sp_std::prelude::Vec; +use polymesh_primitives_derive::VecU8StrongTyped; + +use crate::{impl_checked_inc, Url}; + /// Asset Metadata Name. -#[derive(Encode, Decode, TypeInfo, VecU8StrongTyped)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, VecU8StrongTyped)] #[derive(Clone, Debug, Default, Hash, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -pub struct AssetMetadataName(#[cfg_attr(feature = "std", serde(with = "serde_bytes"))] pub Vec); +#[derive(Serialize, Deserialize)] +pub struct AssetMetadataName(#[serde(with = "serde_bytes")] pub Vec); /// Asset Metadata Global Key. -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] +#[derive(Encode, Decode, DecodeWithMemTracking, MaxEncodedLen, TypeInfo)] #[derive(Clone, Copy, Debug, Default, Hash, PartialEq, Eq, Ord, PartialOrd)] pub struct AssetMetadataGlobalKey(pub u64); impl_checked_inc!(AssetMetadataGlobalKey); /// Asset Metadata Local Key. -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] +#[derive(Encode, Decode, DecodeWithMemTracking, MaxEncodedLen, TypeInfo)] #[derive(Clone, Copy, Debug, Default, Hash, PartialEq, Eq, Ord, PartialOrd)] pub struct AssetMetadataLocalKey(pub u64); impl_checked_inc!(AssetMetadataLocalKey); /// Asset Metadata Key. -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] +#[derive(Encode, Decode, DecodeWithMemTracking, MaxEncodedLen, TypeInfo)] #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Ord, PartialOrd)] pub enum AssetMetadataKey { /// Global Metadata Key. @@ -64,13 +64,13 @@ impl From for AssetMetadataKey { } /// Asset Metadata Value. -#[derive(Encode, Decode, TypeInfo, VecU8StrongTyped)] -#[derive(Clone, Debug, Default, PartialEq, Eq)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, VecU8StrongTyped)] +#[derive(Clone, Debug, Default, Eq, PartialEq)] pub struct AssetMetadataValue(pub Vec); /// Asset Metadata Value details. -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] -#[derive(Clone, Debug, Default, PartialEq, Eq)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Clone, Debug, Default, Eq, PartialEq)] pub struct AssetMetadataValueDetail { /// Optional expire date for the value. pub expire: Option, @@ -94,7 +94,7 @@ impl AssetMetadataValueDetail { } /// Asset Metadata Lock Status -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] +#[derive(Encode, Decode, DecodeWithMemTracking, MaxEncodedLen, TypeInfo)] #[derive(Clone, Debug, PartialEq, Eq)] pub enum AssetMetadataLockStatus { /// Can be changed by asset issuer. @@ -123,26 +123,24 @@ impl Default for AssetMetadataLockStatus { } /// Asset Metadata description. -#[derive(Encode, Decode, TypeInfo, VecU8StrongTyped)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, VecU8StrongTyped)] #[derive(Clone, Debug, Default, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -pub struct AssetMetadataDescription( - #[cfg_attr(feature = "std", serde(with = "serde_bytes"))] pub Vec, -); +#[derive(Serialize, Deserialize)] +pub struct AssetMetadataDescription(#[serde(with = "serde_bytes")] pub Vec); /// Asset Metadata Specs. -#[derive(Encode, Decode, TypeInfo)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo)] #[derive(Clone, Debug, Default, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] pub struct AssetMetadataSpec { /// Off-chain specs or documentation. - #[cfg_attr(feature = "std", serde(default))] + #[serde(default)] pub url: Option, /// Description of metadata type. - #[cfg_attr(feature = "std", serde(default))] + #[serde(default)] pub description: Option, /// Optional SCALE encoded `AssetMetadataTypeDef`. - #[cfg_attr(feature = "std", serde(with = "serde_bytes", default))] + #[serde(with = "serde_bytes", default)] pub type_def: Option>, } diff --git a/primitives/src/authorization.rs b/primitives/src/authorization.rs index 99cb2991b6..23d38a4437 100644 --- a/primitives/src/authorization.rs +++ b/primitives/src/authorization.rs @@ -13,9 +13,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use codec::{Decode, Encode}; +use codec::{Decode, DecodeWithMemTracking, Encode}; use scale_info::TypeInfo; -#[cfg(feature = "std")] use serde::{Deserialize, Serialize}; use sp_std::prelude::*; @@ -26,8 +25,8 @@ use crate::secondary_key::Permissions; use crate::{Balance, PortfolioId, Ticker}; /// Authorization data for two step processes. -#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Decode, DecodeWithMemTracking, Encode, PartialEq, Eq)] +#[derive(Clone, Debug, Deserialize, TypeInfo, Serialize)] pub enum AuthorizationData { /// CDD provider's attestation to change primary key AttestPrimaryKeyRotation(IdentityId), @@ -77,8 +76,9 @@ impl AuthorizationData { } /// Type of authorization. -#[derive(Eq, PartialEq, Encode, Decode, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +#[derive(Eq, PartialEq, Encode, Decode, TypeInfo, Clone)] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Serialize, Deserialize)] pub enum AuthorizationType { /// CDD Authorization to rotate primary key. AttestPrimaryKeyRotation, @@ -104,7 +104,7 @@ pub enum AuthorizationType { /// Authorization struct #[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Debug)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] pub struct Authorization { /// Enum that contains authorization type and data pub authorization_data: AuthorizationData, diff --git a/primitives/src/calendar.rs b/primitives/src/calendar.rs index 7eed73a760..9886728213 100644 --- a/primitives/src/calendar.rs +++ b/primitives/src/calendar.rs @@ -1,4 +1,4 @@ -use chrono::{Datelike, NaiveDate, NaiveDateTime}; +use chrono::{DateTime, Datelike, NaiveDate}; use codec::{Decode, Encode}; use core::num::NonZeroU64; use scale_info::TypeInfo; @@ -201,14 +201,13 @@ fn next_checkpoint_secs( } FixedOrVariableCalendarUnit::Variable(variable_unit) => { // The period is of variable length. - let date_time_start = NaiveDateTime::from_timestamp_opt(i64::try_from(start).ok()?, 0)?; - let date_start = date_time_start.date(); + let date_time_start = DateTime::from_timestamp(i64::try_from(start).ok()?, 0)?; + let date_start = date_time_start.date_naive(); let year_start = date_start.year(); let month_start = date_start.month(); let day_start = date_start.day(); - let date_time_now = - NaiveDateTime::from_timestamp_opt(i64::try_from(now_as_secs_utc).ok()?, 0)?; - let date_now = date_time_now.date(); + let date_time_now = DateTime::from_timestamp(i64::try_from(now_as_secs_utc).ok()?, 0)?; + let date_now = date_time_now.date_naive(); let date_next = match variable_unit { VariableCalendarUnit::Month => { // Convert the base unit amount to match the type of month. @@ -261,7 +260,13 @@ fn next_checkpoint_secs( )? } }; - Moment::try_from(date_next.and_time(date_time_start.time()).timestamp()).ok() + Moment::try_from( + date_next + .and_time(date_time_start.time()) + .and_utc() + .timestamp(), + ) + .ok() } } } diff --git a/primitives/src/cdd_id.rs b/primitives/src/cdd_id.rs index b577cb4166..27413d9cd8 100644 --- a/primitives/src/cdd_id.rs +++ b/primitives/src/cdd_id.rs @@ -1,16 +1,12 @@ -use codec::{Decode, Encode}; +use codec::{Decode, DecodeWithMemTracking, Encode}; use polymesh_primitives_derive::SliceU8StrongTyped; -#[cfg(feature = "std")] use polymesh_primitives_derive::{DeserializeU8StrongTyped, SerializeU8StrongTyped}; use scale_info::TypeInfo; /// A CDD ID only has meaning to the CDD provider that issues a CDD claim. -#[derive(Encode, Decode, TypeInfo, SliceU8StrongTyped)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, SliceU8StrongTyped)] #[derive(Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -#[cfg_attr( - feature = "std", - derive(SerializeU8StrongTyped, DeserializeU8StrongTyped) -)] +#[derive(SerializeU8StrongTyped, DeserializeU8StrongTyped)] pub struct CddId([u8; 32]); impl CddId { diff --git a/primitives/src/compliance_manager.rs b/primitives/src/compliance_manager.rs index b196dbed73..c6a0a2c866 100644 --- a/primitives/src/compliance_manager.rs +++ b/primitives/src/compliance_manager.rs @@ -13,17 +13,18 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::condition::{conditions_total_counts, Condition}; -use codec::{Decode, Encode}; +use codec::{Decode, DecodeWithMemTracking, Encode}; use scale_info::TypeInfo; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; use sp_std::prelude::*; +use crate::condition::{conditions_total_counts, Condition}; + /// A compliance requirement. /// All sender and receiver conditions of the same compliance requirement must be true in order to execute the transfer. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, TypeInfo, Default, Clone, PartialEq, Eq, Debug)] + +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, PartialEq, Eq, Debug)] +#[derive(Clone, Default, Deserialize, Serialize)] pub struct ComplianceRequirement { /// List of sender conditions pub sender_conditions: Vec, @@ -62,7 +63,8 @@ impl ComplianceRequirement { } /// A compliance requirement along with its evaluation result -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Serialize, Deserialize)] #[derive(Encode, Decode, Clone, PartialEq, Eq, Hash)] pub struct ComplianceRequirementResult { /// List of sender conditions @@ -88,7 +90,8 @@ impl From for ComplianceRequirementResult { } /// An individual condition along with its evaluation result -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Serialize, Deserialize)] #[derive(Encode, Decode, Clone, PartialEq, Eq, Hash)] pub struct ConditionResult { /// Condition being evaluated @@ -107,7 +110,8 @@ impl From for ConditionResult { } /// List of compliance requirements associated to an asset. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Serialize, Deserialize)] #[derive(Encode, Decode, TypeInfo, Default, Clone, PartialEq, Eq)] pub struct AssetCompliance { /// This flag indicates if asset compliance should be enforced @@ -117,7 +121,8 @@ pub struct AssetCompliance { } /// Asset compliance and it's evaluation result. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Serialize, Deserialize)] #[derive(Encode, Decode, Clone, PartialEq, Eq, Hash)] pub struct AssetComplianceResult { /// This flag indicates if asset compliance should be enforced. @@ -143,8 +148,9 @@ impl From for AssetComplianceResult { } /// Holds detailed information for all asset's requirements. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[derive(Encode, Decode, TypeInfo)] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Serialize, Deserialize)] +#[derive(Clone, Decode, Encode, TypeInfo)] pub struct ComplianceReport { /// Set to `true` if any requirement is satisfied. any_requirement_satisfied: bool, @@ -180,8 +186,9 @@ impl ComplianceReport { } /// Holds the information for an individual asset requirement. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[derive(Encode, Decode, TypeInfo)] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Serialize, Deserialize)] +#[derive(Clone, Decode, Encode, TypeInfo)] pub struct RequirementReport { /// Set to `true` if all conditions are satisfied. requirement_satisfied: bool, @@ -226,8 +233,9 @@ impl RequirementReport { } /// Holds the information for an individual condition. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[derive(Encode, Decode, TypeInfo)] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Serialize, Deserialize)] +#[derive(Clone, Decode, Encode, TypeInfo)] pub struct ConditionReport { /// Set to `true` if the condition is satisfied. pub satisfied: bool, diff --git a/primitives/src/condition.rs b/primitives/src/condition.rs index 25a84acd01..2e15d000cd 100644 --- a/primitives/src/condition.rs +++ b/primitives/src/condition.rs @@ -13,19 +13,20 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::{Claim, ClaimType, IdentityId}; -use codec::{Decode, Encode}; +use codec::{Decode, DecodeWithMemTracking, Encode}; use core::iter; use either::Either; use scale_info::TypeInfo; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; use sp_std::convert::TryInto; use sp_std::prelude::*; +use crate::{Claim, ClaimType, IdentityId}; + /// Defines a static / dynamic identity. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, TypeInfo, Copy, Clone, PartialEq, Eq, Debug, Hash)] +#[derive(Deserialize, Serialize)] +#[derive(Decode, DecodeWithMemTracking, Encode)] +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, TypeInfo)] pub enum TargetIdentity { /// Matches any of the external agents of an asset. Resolved dynamically. ExternalAgent, @@ -35,8 +36,8 @@ pub enum TargetIdentity { /// It defines the type of condition supported, and the filter information we will use to evaluate as a /// predicate. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug, Hash)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, PartialEq, Eq, Hash)] +#[derive(Clone, Debug, Deserialize, Serialize)] pub enum ConditionType { /// Condition to ensure that claim filter produces one claim. IsPresent(Claim), @@ -63,8 +64,8 @@ impl ConditionType { } /// Denotes the set of `ClaimType`s for which an issuer is trusted. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug, Hash)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, PartialEq, Eq, Hash)] +#[derive(Clone, Debug, Deserialize, Serialize)] pub enum TrustedFor { /// Issuer is trusted for any `ClaimType`. Any, @@ -73,8 +74,8 @@ pub enum TrustedFor { } /// A trusted issuer for a certain compliance `Condition` and what `ClaimType`s is trusted for. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug, Hash)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, PartialEq, Eq, Hash)] +#[derive(Clone, Debug, Deserialize, Serialize)] pub struct TrustedIssuer { /// The issuer trusted for the `Condition` or for the `Ticker`, /// depending on where `TrustedClaimIssuer` is included. @@ -125,8 +126,8 @@ impl From for TrustedIssuer { } /// Type of claim requirements that a condition can have -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug, Hash)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, PartialEq, Eq, Hash)] +#[derive(Clone, Debug, Deserialize, Serialize)] pub struct Condition { /// Type of condition. pub condition_type: ConditionType, diff --git a/primitives/src/constants.rs b/primitives/src/constants.rs index 9bf3cbed4e..b42175d365 100644 --- a/primitives/src/constants.rs +++ b/primitives/src/constants.rs @@ -34,8 +34,6 @@ pub mod currency { pub mod did { /// prefix for user dids pub const USER: &[u8; 5] = b"USER:"; - /// prefix for security token dids - pub const SECURITY_TOKEN: &[u8; 15] = b"SECURITY_TOKEN:"; /// Governance Committee DID. It is used in systematic CDD claim for Governance Committee members. pub const GOVERNANCE_COMMITTEE_DID: &[u8; 32] = b"system:governance_committee\0\0\0\0\0"; @@ -181,6 +179,6 @@ pub const TECHNICAL_DID: IdentityId = IdentityId(*did::TECHNICAL_COMMITTEE_DID); pub const UPGRADE_DID: IdentityId = IdentityId(*did::UPGRADE_COMMITTEE_DID); /// Prefixes for scheduled actions -pub const SETTLEMENT_INSTRUCTION_EXECUTION: [u8; 27] = *b"SETTLEMENT_INSTRUCTION_EXEC"; +pub const SETTLEMENT_INSTRUCTION_EXECUTION: [u8; 20] = *b"SETTLEMENT_INST_EXEC"; pub const PIP_EXECUTION: [u8; 8] = *b"PIP_EXEC"; pub const PIP_EXPIRY: [u8; 10] = *b"PIP_EXPIRY"; diff --git a/primitives/src/crypto.rs b/primitives/src/crypto.rs index 2c24914056..fbf82aa9ed 100644 --- a/primitives/src/crypto.rs +++ b/primitives/src/crypto.rs @@ -21,18 +21,24 @@ use sp_core::{ }; use sp_runtime::traits::{IdentifyAccount, Verify}; use sp_runtime::AnySignature; -use sp_runtime_interface::runtime_interface; +use sp_runtime_interface::{ + pass_by::{AllocateAndReturnByCodec, PassFatPointerAndRead}, + runtime_interface, +}; /// Native interface for runtime module to use some Schnorrkel functionality. #[runtime_interface] pub trait NativeSchnorrkel { /// Sign the message `message`, using the given secret key. /// It returns `None` if the secret key cannot be created from the input raw bytes. - fn sign(raw_sk: [u8; 64], message: &[u8]) -> Option { + fn sign( + raw_sk: PassFatPointerAndRead<&[u8]>, + message: PassFatPointerAndRead<&[u8]>, + ) -> AllocateAndReturnByCodec> { use schnorrkel::{keys::SecretKey, signing_context, Keypair}; const SIGNING_CTX: &[u8] = b"substrate"; - SecretKey::from_bytes(&raw_sk[..]) + SecretKey::from_bytes(raw_sk) .map(|sk| { let pair = Keypair::from(sk); let context = signing_context(SIGNING_CTX); diff --git a/primitives/src/document.rs b/primitives/src/document.rs index e8e1a91e63..f29653d3ad 100644 --- a/primitives/src/document.rs +++ b/primitives/src/document.rs @@ -14,42 +14,44 @@ // along with this program. If not, see . //! Document type -use crate::{DocumentHash, Moment}; -use codec::{Decode, Encode, MaxEncodedLen}; -use polymesh_primitives_derive::VecU8StrongTyped; + +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; use sp_std::prelude::Vec; -#[cfg(feature = "std")] -use serde::{Deserialize, Serialize}; +use polymesh_primitives_derive::VecU8StrongTyped; + +use crate::{DocumentHash, Moment}; /// The local, per-ticker, ID of an asset documentation. -#[derive(Decode, Encode, MaxEncodedLen, TypeInfo)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Copy, Clone, Debug, Default, Eq, Hash, PartialEq, PartialOrd, Ord)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Serialize, Deserialize)] pub struct DocumentId(pub u32); /// A wrapper for a document name. -#[derive(Decode, Encode, TypeInfo, VecU8StrongTyped)] -#[derive(Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, VecU8StrongTyped)] +#[derive(Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] +#[derive(Serialize, Deserialize)] pub struct DocumentName(pub Vec); /// A wrapper for a document URI. -#[derive(Decode, Encode, TypeInfo, VecU8StrongTyped)] -#[derive(Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, VecU8StrongTyped)] +#[derive(Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] +#[derive(Serialize, Deserialize)] pub struct DocumentUri(pub Vec); /// A wrapper for a document's type. -#[derive(Decode, Encode, TypeInfo, VecU8StrongTyped)] -#[derive(Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, VecU8StrongTyped)] +#[derive(Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] +#[derive(Serialize, Deserialize)] pub struct DocumentType(pub Vec); /// Represents a document associated with an asset -#[derive(Decode, Encode, TypeInfo, Clone, Debug, Default, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo)] +#[derive(Clone, Debug, Default, Eq, PartialEq)] +#[derive(Serialize, Deserialize)] pub struct Document { /// An URI where more details can be discovered. /// For example, this might link to an external `.pdf`. diff --git a/primitives/src/document_hash.rs b/primitives/src/document_hash.rs index 13f6585969..d6dd1007bb 100644 --- a/primitives/src/document_hash.rs +++ b/primitives/src/document_hash.rs @@ -13,7 +13,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use codec::{Decode, Encode}; +use codec::{Decode, DecodeWithMemTracking, Encode}; use scale_info::TypeInfo; use sp_std::{ convert::{TryFrom, TryInto}, @@ -22,7 +22,8 @@ use sp_std::{ }; /// A wrapper for a document hash. -#[derive(Clone, Copy, PartialEq, Eq, Debug, Encode, Decode, TypeInfo)] +#[derive(Copy, DecodeWithMemTracking, PartialEq, Eq, Encode, Decode, TypeInfo)] +#[derive(Clone, Debug)] pub enum DocumentHash { /// No hash None, @@ -127,10 +128,8 @@ impl AsRef<[u8]> for DocumentHash { // Serde support // ====================== -#[cfg(feature = "std")] use serde::{de::Error as SerdeError, Deserialize, Deserializer, Serialize, Serializer}; -#[cfg(feature = "std")] impl Serialize for DocumentHash { #[inline] fn serialize(&self, serializer: S) -> Result @@ -141,7 +140,6 @@ impl Serialize for DocumentHash { } } -#[cfg(feature = "std")] impl<'de> Deserialize<'de> for DocumentHash { #[inline] fn deserialize(deserializer: D) -> Result diff --git a/primitives/src/event_only.rs b/primitives/src/event_only.rs index 71a4460cac..426c1fdfd9 100644 --- a/primitives/src/event_only.rs +++ b/primitives/src/event_only.rs @@ -15,16 +15,15 @@ //! Provides a for-events-only protector newtype for arbitrary objects. -use codec::{Decode, Encode}; +use codec::{Decode, DecodeWithMemTracking, Encode}; use scale_info::TypeInfo; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; /// A protective newtype around any type, /// signalling that the contained element is only for use by events. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, TypeInfo)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo)] #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Debug)] +#[derive(Deserialize, Serialize)] pub struct EventOnly(T); impl EventOnly { diff --git a/primitives/src/identity.rs b/primitives/src/identity.rs index 849ae4e523..c5268e47bf 100644 --- a/primitives/src/identity.rs +++ b/primitives/src/identity.rs @@ -14,8 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; @@ -53,11 +52,9 @@ pub mod limits { /// Identity record. /// /// Used to check if an identity exists and lookup its primary key. -/// -/// Asset Identities don't have a primary key. #[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] #[derive(Clone, Debug, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] pub struct DidRecord { /// The identity's primary key, if it has one. pub primary_key: Option, diff --git a/primitives/src/identity_claim.rs b/primitives/src/identity_claim.rs index 3b224f01e2..24a22d388c 100644 --- a/primitives/src/identity_claim.rs +++ b/primitives/src/identity_claim.rs @@ -16,23 +16,22 @@ use crate::asset::AssetId; use crate::{identity_id::IdentityId, impl_checked_inc, CddId, Moment}; -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use scale_info::TypeInfo; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; use sp_std::{convert::From, prelude::*}; use super::jurisdiction::CountryCode; /// The ID of a custom claim type. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] +#[derive(Serialize, Deserialize)] +#[derive(Encode, Decode, DecodeWithMemTracking, MaxEncodedLen, TypeInfo)] #[derive(Copy, Default, Clone, PartialEq, Eq, Debug, PartialOrd, Ord, Hash)] pub struct CustomClaimTypeId(pub u32); impl_checked_inc!(CustomClaimTypeId); -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, TypeInfo)] +#[derive(Serialize, Deserialize)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo)] #[derive(Clone, PartialEq, Eq, Debug, PartialOrd, Ord, Hash)] /// The scope of a claim. pub enum Scope { @@ -74,8 +73,9 @@ impl Scope { } /// All possible claims in polymesh -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq, Debug, Hash)] +#[derive(Serialize, Deserialize)] +#[derive(Encode, Decode, DecodeWithMemTracking)] +#[derive(TypeInfo, Clone, PartialEq, Eq, Debug, Hash)] pub enum Claim { /// User is Accredited. Accredited(Scope), @@ -139,8 +139,8 @@ impl Claim { } /// Claim type represent the claim without its data. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] +#[derive(Serialize, Deserialize)] +#[derive(Encode, Decode, DecodeWithMemTracking, MaxEncodedLen, TypeInfo)] #[derive(Copy, Clone, PartialEq, Eq, Debug, PartialOrd, Ord, Hash)] pub enum ClaimType { /// User is Accredited. @@ -166,8 +166,8 @@ pub enum ClaimType { } /// All information of a particular claim -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[derive(Encode, Decode, TypeInfo, Clone, PartialEq, Eq)] +#[derive(Decode, DecodeWithMemTracking, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Clone, Debug, Deserialize, Serialize)] pub struct IdentityClaim { /// Issuer of the claim pub claim_issuer: IdentityId, diff --git a/primitives/src/identity_id.rs b/primitives/src/identity_id.rs index 455fdcc813..9bce34de51 100644 --- a/primitives/src/identity_id.rs +++ b/primitives/src/identity_id.rs @@ -13,13 +13,11 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -#[cfg(feature = "std")] use polymesh_primitives_derive::{DeserializeU8StrongTyped, SerializeU8StrongTyped}; -#[cfg(feature = "std")] use serde::{Deserialize, Serialize}; use alloc::string::ToString; -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use core::fmt::{Display, Formatter}; use core::str; use scale_info::prelude::string::String; @@ -38,7 +36,8 @@ const UUID_LEN: usize = 32usize; /// The record to initialize an identity in the chain spec. #[derive(Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Debug))] +#[derive(Serialize, Deserialize)] pub struct GenesisIdentityRecord { /// Identity primary key. pub primary_key: Option, @@ -88,12 +87,9 @@ impl GenesisIdentityRecord { /// - "did:poly:ab01" /// - "did:poly:1" /// - "DID:poly:..." -#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, MaxEncodedLen)] #[derive(Default, PartialOrd, Ord, PartialEq, Eq, Clone, Copy, Hash)] -#[cfg_attr( - feature = "std", - derive(SerializeU8StrongTyped, DeserializeU8StrongTyped) -)] +#[derive(SerializeU8StrongTyped, DeserializeU8StrongTyped)] pub struct IdentityId(pub [u8; UUID_LEN]); /// Alias for `EventOnly`. @@ -229,15 +225,15 @@ impl Printable for IdentityId { /// A wrapper for a portfolio name. It is used for non-default (aka "user") portfolios only since /// default ones are nameless. -#[derive(Decode, Encode, TypeInfo, VecU8StrongTyped)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, VecU8StrongTyped)] #[derive(Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] pub struct PortfolioName(pub Vec); /// The unique ID of a non-default portfolio. -#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, MaxEncodedLen)] #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] pub struct PortfolioNumber(pub u64); impl Default for PortfolioNumber { @@ -253,16 +249,23 @@ impl From for PortfolioNumber { } /// The kind of a portfolio. It can be either a default portfolio or a user-defined one. -#[derive(Decode, Default, Encode, TypeInfo, MaxEncodedLen)] +#[derive( + Decode, + Default, + DecodeWithMemTracking, + Encode, + TypeInfo, + MaxEncodedLen +)] #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Hash))] +#[derive(Serialize, Deserialize)] pub enum PortfolioKind { /// The default portfolio of a DID. #[default] - #[cfg_attr(feature = "std", serde(alias = "default"))] + #[serde(alias = "default")] Default, /// A user-defined portfolio of a DID. - #[cfg_attr(feature = "std", serde(alias = "user"))] + #[serde(alias = "user")] User(PortfolioNumber), /// A key-based portfolio owned by an account. #[cfg_attr(feature = "std", serde(alias = "account"))] @@ -276,9 +279,9 @@ impl From> for PortfolioKind { } /// The identification of a portfolio. Contains the [`IdentityId`] of the portfolio owner and the [`PortfolioKind`]. -#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, MaxEncodedLen)] #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Hash))] +#[derive(Serialize, Deserialize)] pub struct PortfolioId { /// The DID of the portfolio owner. pub did: IdentityId, @@ -341,7 +344,7 @@ impl PortfolioId { } /// Result of a portfolio validity check. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] #[derive(Decode, Encode, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] pub struct PortfolioValidityResult { /// Receiver portfolio is the same portfolio as the sender. diff --git a/primitives/src/jurisdiction.rs b/primitives/src/jurisdiction.rs index 5e37574919..543c51733a 100644 --- a/primitives/src/jurisdiction.rs +++ b/primitives/src/jurisdiction.rs @@ -15,17 +15,16 @@ //! Data types and definitions of jurisdictions. -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use scale_info::TypeInfo; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; use sp_std::prelude::*; macro_rules! country_codes { ( $([$discr:expr,$alpha2:ident, $alpha3:ident, $un:literal, $($extra:expr),*]),* $(,)? ) => { /// Existing country codes according to ISO-3166-1. - #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Decode, Encode, MaxEncodedLen, TypeInfo, Hash)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo, Hash)] + #[derive(Serialize, Deserialize)] pub enum CountryCode { $( $(#[doc=$extra])* diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index abb7e85c45..d5bfcedee3 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -25,15 +25,15 @@ use alloc::{ format, string::{String, ToString}, }; -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{CompactAs, Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use core::ops::Add; use frame_support::parameter_types; use frame_support::traits::Get; use polymesh_primitives_derive::{SliceU8StrongTyped, StringStrongTyped, VecU8StrongTyped}; use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; +use sp_debug_derive::RuntimeDebug; use sp_runtime::{generic, traits::BlakeTwo256, MultiSignature}; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; use sp_std::prelude::Vec; /// An index to a block. @@ -59,8 +59,8 @@ pub type ChainId = u32; /// A hash of some data used by the relay chain. pub type Hash = sp_core::H256; -/// Index of a transaction in the relay chain. 32-bit should be plenty. -pub type Index = u32; +/// Nonce of a transaction. 32-bit should be plenty. +pub type Nonce = u32; /// Alias for Gas. pub type Gas = Weight; @@ -84,31 +84,16 @@ impl Get for ConstSize { impl GetExtra for ConstSize {} /// Either a block number, or nothing. -#[derive( - Copy, - Clone, - PartialEq, - Eq, - Encode, - Decode, - MaxEncodedLen, - TypeInfo, - Debug -)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Clone, Copy, Debug, Default, Deserialize, MaxEncodedLen, Serialize)] +#[derive(Decode, DecodeWithMemTracking, Encode, Eq, PartialEq, TypeInfo)] pub enum MaybeBlock { /// Has a block number. Some(BlockNumber), /// No block number. + #[default] None, } -impl Default for MaybeBlock { - fn default() -> Self { - Self::None - } -} - impl> Add for MaybeBlock { type Output = Self; fn add(self, rhs: T) -> Self::Output { @@ -120,9 +105,9 @@ impl> Add for MaybeBlock { } /// A positive coefficient: a pair of a numerator and a denominator. Defaults to `(1, 1)`. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, MaxEncodedLen)] #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Serialize, Deserialize)] pub struct PosRatio(pub u32, pub u32); impl Default for PosRatio { @@ -327,7 +312,8 @@ pub enum TransactionError { } /// Represents the target identity and the amount requested by a beneficiary. -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo, Clone, PartialEq, Eq, Debug)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct Beneficiary { /// Beneficiary identity. pub id: IdentityId, @@ -336,20 +322,21 @@ pub struct Beneficiary { } /// A short on-chain memo for POLYX transfer, asset transfer and portfolio moves. -#[derive(Decode, Encode, MaxEncodedLen, TypeInfo, SliceU8StrongTyped)] -#[derive(Clone, Default, Hash, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Hash, PartialEq, Eq, PartialOrd, Ord, SliceU8StrongTyped)] +#[derive(Clone, Default)] pub struct Memo(pub [u8; 32]); /// Url for linking to off-chain resources. -#[derive(Decode, Encode, TypeInfo, VecU8StrongTyped)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo, VecU8StrongTyped)] #[derive(Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -pub struct Url(#[cfg_attr(feature = "std", serde(with = "serde_bytes"))] pub Vec); +#[derive(Serialize, Deserialize)] +pub struct Url(#[serde(with = "serde_bytes")] pub Vec); /// The name of a pallet. -#[derive(Encode, Decode, TypeInfo, StringStrongTyped)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, StringStrongTyped)] #[derive(Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] pub struct PalletName(pub String); impl PalletName { @@ -360,9 +347,9 @@ impl PalletName { } /// The name of an extrinsic within a pallet. -#[derive(Encode, Decode, TypeInfo, StringStrongTyped)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, StringStrongTyped)] #[derive(Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] pub struct ExtrinsicName(pub String); impl ExtrinsicName { @@ -372,11 +359,32 @@ impl ExtrinsicName { } } +/// The old weight type. +/// +/// NOTE: This type exists purely for compatibility purposes! Use [`weight_v2::Weight`] in all other +/// cases. +#[derive( + Decode, + Encode, + CompactAs, + PartialEq, + Eq, + Clone, + Copy, + RuntimeDebug, + Default, + MaxEncodedLen, + TypeInfo +)] +#[derive(Serialize, Deserialize)] +#[serde(transparent)] +pub struct OldWeight(pub u64); + /// Execute the supplied function in a new storage transaction, /// committing on `Ok(_)` and rolling back on `Err(_)`, returning the result. /// /// Transactions can be arbitrarily nested with commits happening to the parent. -pub fn with_transaction>( +pub fn with_transaction>( tx: impl FnOnce() -> Result, ) -> Result { use frame_support::storage::{with_transaction, TransactionOutcome}; @@ -411,7 +419,7 @@ macro_rules! storage_migration_ver { const MAX: u8 = $ver; /// Build const version and do compile-time maximum version check. - const fn new(ver: u8) -> Self { + pub const fn new(ver: u8) -> Self { Self(ver) } diff --git a/primitives/src/migrate.rs b/primitives/src/migrate.rs index 0065590a6a..5dfc63687e 100644 --- a/primitives/src/migrate.rs +++ b/primitives/src/migrate.rs @@ -59,7 +59,7 @@ pub fn frame_v2_migrate( current_version, target_version ); - weight += Weight::from_ref_time(1_000); + weight += Weight::from_parts(1_000, 0); // Update the storage version target_version.put::

(); @@ -87,7 +87,7 @@ pub fn frame_v2_migrate( old_pallet_name.as_bytes(), pallet_name.as_bytes(), ); - weight += Weight::from_ref_time(100_000_000); + weight += Weight::from_parts(100_000_000, 0); } weight diff --git a/primitives/src/nft.rs b/primitives/src/nft.rs index 4668ec5fb0..a6b63686b5 100644 --- a/primitives/src/nft.rs +++ b/primitives/src/nft.rs @@ -1,5 +1,4 @@ -use codec::MaxEncodedLen; -#[cfg(feature = "std")] +use codec::{DecodeWithMemTracking, MaxEncodedLen}; use serde::{Deserialize, Serialize}; use codec::{Decode, Encode}; @@ -16,51 +15,21 @@ use crate::impl_checked_inc; pub type NFTCount = u64; /// Controls the next available id for an NFT collection. -#[derive( - Clone, - Copy, - Debug, - Decode, - MaxEncodedLen, - Default, - Eq, - Encode, - PartialEq, - TypeInfo -)] +#[derive(Decode, DecodeWithMemTracking, Default, Encode, TypeInfo)] +#[derive(Clone, Copy, Debug, Eq, MaxEncodedLen, PartialEq)] pub struct NFTCollectionId(pub u64); impl_checked_inc!(NFTCollectionId); /// Controls the next available id for an NFT within a collection. -#[derive( - Clone, - Copy, - Debug, - Decode, - Default, - Encode, - MaxEncodedLen, - Eq, - Ord, - PartialOrd, - PartialEq, - TypeInfo -)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Decode, DecodeWithMemTracking, Default, Encode, TypeInfo)] +#[derive(Clone, Copy, Debug, MaxEncodedLen, Eq, Ord, PartialOrd, PartialEq)] +#[derive(Serialize, Deserialize)] pub struct NFTId(pub u64); impl_checked_inc!(NFTId); /// Defines an NFT collection. -#[derive( - Clone, - Debug, - Decode, - Default, - Encode, - MaxEncodedLen, - PartialEq, - TypeInfo -)] +#[derive(Decode, Default, Encode, MaxEncodedLen, PartialEq, TypeInfo)] +#[derive(Clone, Debug)] pub struct NFTCollection { id: NFTCollectionId, asset_id: AssetId, @@ -84,8 +53,8 @@ impl NFTCollection { } /// Represent all NFT being transferred for a given [`AssetId`]. -#[derive(Clone, Debug, Decode, Default, Encode, Eq, PartialEq, TypeInfo)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Decode, DecodeWithMemTracking, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Clone, Debug, Default, Deserialize, Serialize)] pub struct NFTs { asset_id: AssetId, ids: Vec, @@ -123,7 +92,8 @@ impl NFTs { } /// The metadata keys for the NFT collection. -#[derive(Clone, Debug, Decode, Default, Encode, PartialEq, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, PartialEq, TypeInfo)] +#[derive(Clone, Debug, Default)] pub struct NFTCollectionKeys(Vec); impl NFTCollectionKeys { @@ -150,7 +120,8 @@ impl From> for NFTCollectionKeys { } /// Defines a metadata attribute which is a composed of a key and a value. -#[derive(Clone, Debug, Decode, Encode, PartialEq, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, PartialEq, TypeInfo)] +#[derive(Clone, Debug)] pub struct NFTMetadataAttribute { /// The metadata key. pub key: AssetMetadataKey, diff --git a/primitives/src/portfolio.rs b/primitives/src/portfolio.rs index f4bb9cbf0d..f16068f470 100644 --- a/primitives/src/portfolio.rs +++ b/primitives/src/portfolio.rs @@ -13,7 +13,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use codec::{Decode, Encode}; +use codec::{Decode, DecodeWithMemTracking, Encode}; use scale_info::TypeInfo; use crate::asset::{AssetId, FundingRoundName}; @@ -21,7 +21,8 @@ use crate::settlement::InstructionId; use crate::{Balance, Memo, NFTs}; /// Describes what should be moved between portfolios. It can be either fungible or non-fungible tokens. -#[derive(Clone, Debug, Decode, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Clone, Debug)] pub struct Fund { /// The type of token being moved. pub description: FundDescription, @@ -30,7 +31,8 @@ pub struct Fund { } /// Defines the types of tokens that can be moved. -#[derive(Clone, Debug, Decode, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Clone, Debug)] pub enum FundDescription { /// Fungible token. Fungible { @@ -44,7 +46,8 @@ pub enum FundDescription { } /// Reason for the portfolio update. -#[derive(Clone, Debug, Decode, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Clone, Debug)] pub enum PortfolioUpdateReason { /// Tokens were issued. Issued { diff --git a/primitives/src/secondary_key.rs b/primitives/src/secondary_key.rs index 5c281159dd..07100dc012 100644 --- a/primitives/src/secondary_key.rs +++ b/primitives/src/secondary_key.rs @@ -15,10 +15,9 @@ use crate::asset::AssetId; use crate::{ExtrinsicName, IdentityId, PalletName, PortfolioId, SubsetRestriction}; -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use scale_info::TypeInfo; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; use sp_std::{ cmp::{Ord, Ordering, PartialOrd}, collections::btree_map::BTreeMap, @@ -54,9 +53,9 @@ pub type ExtrinsicNames = SubsetRestriction; /// A permission to call a set of functions, as described by `extrinsics`, /// within a given pallet `pallet_name`. -#[derive(Decode, Encode, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo)] #[derive(Clone, Debug, Default, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] pub struct PalletPermissions { /// A subset of function names within the pallet. pub extrinsics: ExtrinsicNames, @@ -102,9 +101,9 @@ impl PalletPermissions { } /// Extrinsic permissions. -#[derive(Decode, Encode, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo)] #[derive(Clone, Debug, Default, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] pub enum ExtrinsicPermissions { /// Allow the whole pallet. #[default] @@ -212,9 +211,9 @@ pub type PortfolioPermissions = SubsetRestriction; /// Common cases of permissions: /// - `Permissions::empty()`: no permissions, /// - `Permissions::default()`: full permissions. -#[derive(Decode, Encode, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo)] #[derive(Clone, Debug, Default, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] pub struct Permissions { /// The subset of assets under management. pub asset: AssetPermissions, @@ -284,7 +283,7 @@ impl Permissions { /// Account key record. #[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] #[derive(Clone, Debug, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] pub enum KeyRecord { /// Key is the primary key and has full permissions. /// @@ -339,22 +338,12 @@ impl KeyRecord { /// It supports different elements as a signer. #[allow(missing_docs)] -#[derive( - Encode, - Decode, - MaxEncodedLen, - Copy, - Clone, - PartialEq, - Eq, - Debug, - TypeInfo -)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, PartialEq)] +#[derive(Clone, Copy, Debug, Eq, Deserialize, Serialize, TypeInfo)] pub enum Signatory { - #[cfg_attr(feature = "std", serde(alias = "identity"))] + #[serde(alias = "identity")] Identity(IdentityId), - #[cfg_attr(feature = "std", serde(alias = "account"))] + #[serde(alias = "account")] Account(AccountId), } @@ -437,9 +426,9 @@ where } /// A secondary key and its permissions. -#[derive(Encode, Decode, TypeInfo)] -#[derive(Clone, Debug, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo)] +#[derive(Clone, Debug, Eq, PartialEq)] +#[derive(Deserialize, Serialize)] pub struct SecondaryKey { /// The account key. pub key: AccountId, diff --git a/primitives/src/settlement.rs b/primitives/src/settlement.rs index 777965dfb4..a7947edebb 100644 --- a/primitives/src/settlement.rs +++ b/primitives/src/settlement.rs @@ -15,11 +15,11 @@ //! Shareable types. -#[cfg(feature = "std")] use serde::{Deserialize, Serialize}; use codec::alloc::string::ToString; -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; +use frame_support::traits::schedule::v3::TaskName; use frame_support::weights::Weight; use scale_info::prelude::string::String; use scale_info::TypeInfo; @@ -33,13 +33,13 @@ use crate::constants::SETTLEMENT_INSTRUCTION_EXECUTION; use crate::{impl_checked_inc, Balance, IdentityId, NFTs, PortfolioId, Ticker}; /// A global and unique venue ID. -#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, MaxEncodedLen)] #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Default, Debug)] pub struct VenueId(pub u64); impl_checked_inc!(VenueId); /// A wrapper for VenueDetails -#[derive(Encode, Decode, TypeInfo, VecU8StrongTyped)] +#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo, VecU8StrongTyped)] #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] pub struct VenueDetails(Vec); @@ -63,20 +63,8 @@ pub enum InstructionStatus { } /// Type of the venue. Used for offchain filtering. -#[derive( - Copy, - Clone, - Debug, - Decode, - Default, - Encode, - MaxEncodedLen, - Eq, - Ord, - PartialEq, - PartialOrd, - TypeInfo -)] +#[derive(Clone, Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)] pub enum VenueType { /// Default type - used for mixed and unknown types #[default] @@ -90,20 +78,8 @@ pub enum VenueType { } /// Status of a leg -#[derive( - Copy, - Clone, - Debug, - Decode, - Default, - Encode, - MaxEncodedLen, - Eq, - Ord, - PartialEq, - PartialOrd, - TypeInfo -)] +#[derive(Copy, Clone, Decode, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Debug, Default, Eq, Ord, PartialEq, PartialOrd)] pub enum LegStatus { /// It is waiting for affirmation #[default] @@ -115,19 +91,8 @@ pub enum LegStatus { } /// Status of an affirmation -#[derive( - Clone, - Debug, - Decode, - Default, - Encode, - MaxEncodedLen, - Eq, - Ord, - PartialEq, - PartialOrd, - TypeInfo -)] +#[derive(Clone, Decode, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Debug, Default, Eq, Ord, PartialEq, PartialOrd)] pub enum AffirmationStatus { /// Invalid affirmation #[default] @@ -139,7 +104,7 @@ pub enum AffirmationStatus { } /// Type of settlement -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] #[derive(Copy, Clone, Debug, Default, Eq, Ord, PartialEq, PartialOrd)] pub enum SettlementType { /// Instruction should be settled in the next block as soon as all affirmations are received. @@ -154,22 +119,31 @@ pub enum SettlementType { } /// A per-Instruction leg ID. -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] +#[derive(Encode, Decode, DecodeWithMemTracking, MaxEncodedLen, TypeInfo)] #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Default, Debug)] pub struct LegId(pub u64); impl_checked_inc!(LegId); /// A global and unique instruction ID. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)] +#[derive(Deserialize, Serialize)] pub struct InstructionId(pub u64); impl_checked_inc!(InstructionId); impl InstructionId { - /// Converts an instruction id into a scheduler name. - pub fn execution_name(&self) -> Vec { - (SETTLEMENT_INSTRUCTION_EXECUTION, self.0).encode() + /// Converts an instruction id into [`TaskName`]. + pub fn execution_name(&self) -> Result> { + let mut task_name: TaskName = [0; 32]; + + let encoded_task = (SETTLEMENT_INSTRUCTION_EXECUTION, self.0).encode(); + + if encoded_task.len() >= task_name.len() { + return Err(b"Task name too long".to_vec()); + } + + task_name[..encoded_task.len()].copy_from_slice(&encoded_task[..]); + Ok(task_name) } } @@ -192,8 +166,8 @@ pub struct Instruction { } /// Defines a [`Leg`] (i.e the action of a settlement). -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Clone, Debug, Decode, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, Eq, PartialEq, TypeInfo)] +#[derive(Clone, Debug, Deserialize, Serialize)] pub enum Leg { /// Fungible token Fungible { @@ -258,17 +232,8 @@ pub struct Venue { } /// An offchain transaction receipt. -#[derive( - Encode, - Decode, - MaxEncodedLen, - Clone, - PartialEq, - Eq, - Debug, - PartialOrd, - Ord -)] +#[derive(Decode, DecodeWithMemTracking, Encode, Eq, PartialEq)] +#[derive(Clone, Debug, MaxEncodedLen, Ord, PartialOrd)] pub struct Receipt { /// Unique receipt number set by the signer for their receipts. uid: u64, @@ -310,23 +275,13 @@ impl Receipt { } /// A wrapper of [`[u8; 32]`] that can be used for generic messages. -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo, SliceU8StrongTyped)] -#[derive(Clone, Default, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Decode, DecodeWithMemTracking, MaxEncodedLen, SliceU8StrongTyped)] +#[derive(Clone, Default, Encode, Eq, Ord, PartialEq, PartialOrd, TypeInfo)] pub struct ReceiptMetadata([u8; 32]); /// Details about an offchain transaction receipt. -#[derive( - Encode, - Decode, - MaxEncodedLen, - TypeInfo, - Clone, - PartialEq, - Eq, - Debug, - PartialOrd, - Ord -)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)] pub struct ReceiptDetails { /// Unique receipt number set by the signer for their receipts uid: u64, @@ -394,19 +349,8 @@ impl ReceiptDetails } /// Stores the number of fungible, non fungible and offchain transfers in a set of legs. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive( - Clone, - Copy, - Debug, - Decode, - MaxEncodedLen, - Default, - Encode, - Eq, - PartialEq, - TypeInfo -)] +#[derive(Clone, Copy, Debug, Deserialize, Serialize, MaxEncodedLen, TypeInfo)] +#[derive(Decode, Default, DecodeWithMemTracking, Encode, Eq, PartialEq)] pub struct AssetCount { fungible: u32, non_fungible: u32, @@ -700,19 +644,8 @@ impl FilteredLegs { } /// Holds the [`AssetCount`] for both the sender and receiver side and the number of offchain assets. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive( - Clone, - Copy, - Debug, - Decode, - Default, - Encode, - MaxEncodedLen, - Eq, - PartialEq, - TypeInfo -)] +#[derive(Clone, Copy, Debug, Deserialize, Serialize, MaxEncodedLen, TypeInfo)] +#[derive(Decode, Default, DecodeWithMemTracking, Encode, Eq, PartialEq)] pub struct AffirmationCount { /// The [`AssetCount`] for sender side. sender_asset_count: AssetCount, @@ -761,8 +694,8 @@ impl AffirmationCount { /// Stores the number of fungible, non fungible and offchain assets in an instruction, the consumed weight for executing the instruction, /// and if executing the instruction would fail, the error thrown. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Decode, Encode)] +#[derive(Clone, Decode, Encode, TypeInfo)] +#[derive(Deserialize, Serialize)] pub struct ExecuteInstructionInfo { /// Number of fungible tokens in the instruction. fungible_tokens: u32, @@ -801,17 +734,8 @@ impl ExecuteInstructionInfo { } /// The status of the mediator's affirmation. -#[derive( - Clone, - Debug, - Decode, - Default, - Encode, - MaxEncodedLen, - Eq, - PartialEq, - TypeInfo -)] +#[derive(Clone, Debug, Decode, Default, Encode, Eq)] +#[derive(MaxEncodedLen, PartialEq, TypeInfo)] pub enum MediatorAffirmationStatus { /// Invalid affirmation status #[default] diff --git a/primitives/src/statistics.rs b/primitives/src/statistics.rs index e0e6153430..19a21f341e 100644 --- a/primitives/src/statistics.rs +++ b/primitives/src/statistics.rs @@ -13,20 +13,20 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::asset::AssetId; -use crate::{Claim, ClaimType, CountryCode, IdentityId, Scope}; -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use scale_info::TypeInfo; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; use sp_std::{hash::Hash, hash::Hasher, ops::Deref, ops::DerefMut, prelude::*}; +use crate::asset::AssetId; +use crate::{Claim, ClaimType, CountryCode, IdentityId, Scope}; + /// Transfer manager percentage pub type Percentage = sp_arithmetic::Permill; /// Stats Operation type. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Decode, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Serialize, Deserialize)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum StatOpType { /// Count - Investor count stats. @@ -36,8 +36,8 @@ pub enum StatOpType { } /// The statistic type. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Decode, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Serialize, Deserialize)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] pub struct StatType { /// The [`StatOpType`] of the statistic. @@ -66,7 +66,7 @@ impl StatType { } /// First stats key in double map. -#[derive(Decode, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] #[derive(Copy, Clone, Debug, PartialEq, Eq)] pub struct Stat1stKey { /// The [`AssetId`] of the token. @@ -92,7 +92,7 @@ impl Stat1stKey { } /// Second stats key in double map. -#[derive(Decode, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum Stat2ndKey { /// For `MaxInvestorCount` and `MaxInvestorOwnership` transfer rules. @@ -157,10 +157,9 @@ impl From<&StatClaim> for Stat2ndKey { } /// Stats supported claims. -/// -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Decode, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Serialize, Deserialize)] pub enum StatClaim { /// User is Accredited or non-Accredited. Accredited(bool), @@ -193,7 +192,7 @@ impl StatClaim { } /// Stats update. -#[derive(Encode, Decode, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, TypeInfo)] #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] pub struct StatUpdate { /// Stat key to update. (Claim or NoClaim) @@ -212,7 +211,7 @@ pub mod v1 { pub type Percentage = HashablePermill; /// Wrapper around `sp_arithmetic::Permill` - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[derive(Serialize, Deserialize)] #[derive(Decode, Encode, TypeInfo)] #[derive(Copy, Clone, Debug, Eq, PartialOrd, Ord, Default)] pub struct HashablePermill(pub sp_arithmetic::Permill); @@ -245,7 +244,7 @@ pub mod v1 { } /// Transfer managers that can be attached to a Token for compliance. - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[derive(Serialize, Deserialize)] #[derive(Decode, Encode, TypeInfo)] #[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] pub enum TransferManager { @@ -256,7 +255,7 @@ pub mod v1 { } /// Result of a transfer manager check. - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[derive(Serialize, Deserialize)] #[derive(Decode, Encode, TypeInfo)] #[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] pub struct TransferManagerResult { diff --git a/primitives/src/sto.rs b/primitives/src/sto.rs index bc2a6c9ee1..86e8dc9683 100644 --- a/primitives/src/sto.rs +++ b/primitives/src/sto.rs @@ -13,14 +13,14 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use scale_info::TypeInfo; use crate::settlement::ReceiptMetadata; use crate::{impl_checked_inc, IdentityId, Ticker}; /// The per-AssetId ID of a fundraiser. -#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Default, Debug)] pub struct FundraiserId(pub u64); impl_checked_inc!(FundraiserId); @@ -74,18 +74,8 @@ impl FundraiserReceipt { } /// Details about an offchain transaction receipt. -#[derive( - Encode, - Decode, - MaxEncodedLen, - TypeInfo, - Clone, - PartialEq, - Eq, - Debug, - PartialOrd, - Ord -)] +#[derive(Decode, DecodeWithMemTracking, Encode, Ord, PartialOrd)] +#[derive(Clone, Debug, Eq, MaxEncodedLen, PartialEq, TypeInfo)] pub struct FundraiserReceiptDetails { /// Unique receipt number set by the signer for their receipts pub uid: u64, diff --git a/primitives/src/subset.rs b/primitives/src/subset.rs index ff0d3b1dba..8f9a1ad3c7 100644 --- a/primitives/src/subset.rs +++ b/primitives/src/subset.rs @@ -13,20 +13,18 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; - -use codec::{Decode, Encode}; +use codec::{Decode, DecodeWithMemTracking, Encode}; use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; use sp_std::collections::btree_set::BTreeSet; use sp_std::iter::{self, FromIterator}; /// The type of subsets of an open set of elements of type `A` where the whole set is always /// considered to be bigger than any finite set of its elements. This is true for infinite /// sets. When talking about finite sets, we have to add that they are _open_. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Encode, Decode, Default, TypeInfo)] -#[derive(Clone, Debug, Eq, PartialEq)] +#[derive(Decode, DecodeWithMemTracking, Encode)] +#[derive(Clone, Debug, Default, Eq, PartialEq, TypeInfo)] +#[derive(Serialize, Deserialize)] pub enum SubsetRestriction { /// No restrictions, the whole set. #[default] diff --git a/primitives/src/ticker.rs b/primitives/src/ticker.rs index d0b795bb09..5421816bb3 100644 --- a/primitives/src/ticker.rs +++ b/primitives/src/ticker.rs @@ -14,8 +14,7 @@ // along with this program. If not, see . //! Ticker symbol -use codec::{Decode, Encode, MaxEncodedLen}; -#[cfg(feature = "std")] +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use polymesh_primitives_derive::{DeserializeU8StrongTyped, SerializeU8StrongTyped}; use scale_info::TypeInfo; @@ -29,12 +28,9 @@ pub const TICKER_LEN: usize = 12; /// This type stores fixed-length case-sensitive byte strings. Any value of this type that is /// received by a Substrate module call method has to be converted to canonical uppercase /// representation using [`Ticker::canonize`]. -#[derive(Encode, Decode, MaxEncodedLen, TypeInfo)] +#[derive(Encode, Decode, DecodeWithMemTracking, MaxEncodedLen, TypeInfo)] #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr( - feature = "std", - derive(SerializeU8StrongTyped, DeserializeU8StrongTyped) -)] +#[derive(SerializeU8StrongTyped, DeserializeU8StrongTyped)] pub struct Ticker([u8; TICKER_LEN]); impl Default for Ticker { diff --git a/primitives/src/traits.rs b/primitives/src/traits.rs index 2fb9d377b8..cb321c18d9 100644 --- a/primitives/src/traits.rs +++ b/primitives/src/traits.rs @@ -14,7 +14,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use frame_support::dispatch::{DispatchError, DispatchResult}; +use frame_support::dispatch::DispatchResult; +use frame_support::pallet_prelude::DispatchError; use sp_runtime::transaction_validity::InvalidTransaction; use crate::asset::AssetId; diff --git a/primitives/src/traits/asset.rs b/primitives/src/traits/asset.rs index 38adc0b09b..955295097b 100644 --- a/primitives/src/traits/asset.rs +++ b/primitives/src/traits/asset.rs @@ -1,13 +1,15 @@ +#[cfg(feature = "runtime-benchmarks")] +use sp_std::{collections::btree_set::BTreeSet, prelude::Vec}; + +use frame_support::dispatch::DispatchResult; +use frame_support::pallet_prelude::DispatchError; + #[cfg(feature = "runtime-benchmarks")] use crate::{ asset::{AssetName, AssetType, FundingRoundName}, asset_metadata::{AssetMetadataName, AssetMetadataSpec}, AssetIdentifier, PortfolioKind, Ticker, }; -#[cfg(feature = "runtime-benchmarks")] -use sp_std::{collections::btree_set::BTreeSet, prelude::Vec}; - -use frame_support::dispatch::{DispatchError, DispatchResult}; use crate::{asset::AssetId, AccountId as AccountId32, Balance, IdentityId}; diff --git a/primitives/src/transfer_compliance.rs b/primitives/src/transfer_compliance.rs index fe92f5e08f..75d42567d0 100644 --- a/primitives/src/transfer_compliance.rs +++ b/primitives/src/transfer_compliance.rs @@ -13,19 +13,19 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::asset::AssetId; -use crate::statistics::{v1, Percentage, StatClaim, StatOpType, StatType}; -use crate::{ClaimType, IdentityId}; -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, DecodeWithMemTracking, Encode, MaxEncodedLen}; use frame_support::{pallet_prelude::Get, BoundedBTreeSet}; use scale_info::TypeInfo; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; +use serde::{Deserialize, Serialize}; use sp_std::prelude::*; +use crate::asset::AssetId; +use crate::statistics::{v1, Percentage, StatClaim, StatOpType, StatType}; +use crate::{ClaimType, IdentityId}; + /// Transfer condition. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -#[derive(Decode, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Serialize, Deserialize)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum TransferCondition { /// Maximum investor count. @@ -94,7 +94,7 @@ impl From for TransferCondition { } /// Result of a transfer condition check. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] #[derive(Decode, Encode, TypeInfo)] #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] pub struct TransferConditionResult { @@ -114,7 +114,7 @@ impl From for TransferConditionResult { } /// Transfer Condition Exempt key. -#[derive(Decode, Encode, MaxEncodedLen, TypeInfo)] +#[derive(Decode, DecodeWithMemTracking, Encode, MaxEncodedLen, TypeInfo)] #[derive(Copy, Clone, Debug, PartialEq, Eq)] pub struct TransferConditionExemptKey { /// The [`AssetId`] of the token. diff --git a/primitives/src/weight_meter.rs b/primitives/src/weight_meter.rs index 037942f898..00fff096b9 100644 --- a/primitives/src/weight_meter.rs +++ b/primitives/src/weight_meter.rs @@ -38,19 +38,19 @@ impl WeightMeter { Self { minimum_charge, - meter: FrameWeightMeter::from_limit(limit), + meter: FrameWeightMeter::with_limit(limit), } } /// Creates [`Self`] from a limit for the maximal consumable weight and a minimum charge of `minimum_charge`. - pub fn from_limit(minimum_charge: Weight, limit: Weight) -> Option { + pub fn with_limit(minimum_charge: Weight, limit: Weight) -> Option { if limit.checked_sub(&minimum_charge).is_none() { return None; } Some(Self { minimum_charge, - meter: FrameWeightMeter::from_limit(limit), + meter: FrameWeightMeter::with_limit(limit), }) } @@ -58,7 +58,7 @@ impl WeightMeter { pub fn max_limit(minimum_charge: Weight) -> Self { Self { minimum_charge, - meter: FrameWeightMeter::max_limit(), + meter: FrameWeightMeter::new(), } } @@ -66,36 +66,36 @@ impl WeightMeter { pub fn max_limit_no_minimum() -> Self { Self { minimum_charge: Weight::zero(), - meter: FrameWeightMeter::max_limit(), + meter: FrameWeightMeter::new(), } } /// Returns the minimum charge if the consumed weight is less than the minimum, otherwise returns the consumed weight. pub fn consumed(&self) -> Weight { - if self.meter.consumed.ref_time() < self.minimum_charge.ref_time() { + if self.meter.consumed().ref_time() < self.minimum_charge.ref_time() { return self.minimum_charge; } - self.meter.consumed + self.meter.consumed() } /// Returns the maximum weight limit. pub fn limit(&self) -> Weight { - self.meter.limit + self.meter.limit() } /// Consumes the given weight after checking that it can be consumed. Returns an error otherwise. pub fn check_accrue(&mut self, weight: Weight) -> Result<(), String> { - if !self.meter.check_accrue(weight) { - return Err(String::from("Maximum weight limit exceeded")); - } + self.meter + .try_consume(weight) + .map_err(|_| "Maximum weight limit exceeded")?; Ok(()) } /// Consumes the given `weight`. /// If the new consumed weight is greater than the limit, consumed will be set to limit and an error will be returned. pub fn consume_weight_until_limit(&mut self, weight: Weight) -> Result<(), String> { - if !self.meter.check_accrue(weight) { - self.meter.consumed = self.meter.limit; + if self.check_accrue(weight).is_err() { + self.meter.consume(self.meter.remaining()); return Err(String::from("Maximum weight limit exceeded")); } Ok(()) diff --git a/primitives_derive/src/deserialize_u8_strong_typed.rs b/primitives_derive/src/deserialize_u8_strong_typed.rs index 4b51bd5386..e87ea0b692 100644 --- a/primitives_derive/src/deserialize_u8_strong_typed.rs +++ b/primitives_derive/src/deserialize_u8_strong_typed.rs @@ -12,7 +12,7 @@ pub(crate) fn impl_deserialize_u8_strong_typed(ast: &syn::DeriveInput) -> TokenS { let r = sp_core::bytes::deserialize(deserializer)?; Decode::decode(&mut &r[..]) - .map_err(|e| serde::de::Error::custom(format!("Decode error: {}", e))) + .map_err(|e| serde::de::Error::custom(scale_info::prelude::format!("Decode error: {}", e))) } } }; diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 66929a2d0f..780f846cea 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -9,29 +9,29 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { workspace = true, default-features = false, features = ["derive"] } -jsonrpsee = { version = "0.16.2", features = ["server", "macros"] } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-blockchain = { version = "4.0.0-dev" } -sp-core = { version = "7.0.0", default-features = false } -sp-rpc = { version = "6.0.0" } -sp-runtime = { version = "7.0.0", default-features = false } -sp-std = {version = "5.0.0", default-features = false } -sp-weights = { version = "4.0.0", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } +jsonrpsee = { version = "0.24.9", features = ["server-core", "client-core", "macros"] } +sp-api = { workspace = true, default-features = false } +sp-blockchain = { workspace = true } +sp-core = { workspace = true, default-features = false } +sp-rpc = { workspace = true } +sp-runtime = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-weights = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } -node-rpc-runtime-api = { path = "./runtime-api", default-features = false } +node-rpc-runtime-api = { workspace = true, default-features = false } -pallet-compliance-manager = { path = "../pallets/compliance-manager", default-features = false } -pallet-pips = { path = "../pallets/pips", default-features = false } -polymesh-primitives = { path = "../primitives", default-features = false } +pallet-compliance-manager = { workspace = true, default-features = false } +pallet-pips = { workspace = true, default-features = false } +polymesh-primitives = { workspace = true, default-features = false } -pallet-portfolio = { path = "../pallets/portfolio", default-features = false } -pallet-identity = { path = "../pallets/identity", default-features = false } -pallet-transaction-payment = { path = "../pallets/transaction-payment", default-features = false } +pallet-portfolio = { workspace = true, default-features = false } +pallet-identity = { workspace = true, default-features = false } +pallet-transaction-payment = { workspace = true, default-features = false } # Others -serde = { version = "1.0.104", optional = true, features = ["derive"] } +serde = { version = "1.0.104", default-features = false, features = ["alloc", "derive"] } [features] default = ["std"] @@ -45,7 +45,7 @@ std = [ "pallet-portfolio/std", "pallet-transaction-payment/std", "polymesh-primitives/std", - "serde", + "serde/std", "sp-api/std", "sp-core/std", "sp-runtime/std", diff --git a/rpc/runtime-api/Cargo.toml b/rpc/runtime-api/Cargo.toml index 7f6e55c3a5..fa706507b8 100644 --- a/rpc/runtime-api/Cargo.toml +++ b/rpc/runtime-api/Cargo.toml @@ -9,23 +9,23 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { workspace = true, default-features = false, features = ["derive"] } -sp-api = { version = "4.0.0-dev", default-features = false } -sp-runtime = { version = "7.0.0", default-features = false } -sp-std = { version = "5.0.0", default-features = false } -sp-weights = { version = "4.0.0", default-features = false } -frame-support = { version = "4.0.0-dev", default-features = false } -frame-system = { version = "4.0.0-dev", default-features = false } +sp-api = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-weights = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } # Our pallets -polymesh-primitives = { path = "../../primitives", default-features = false } -pallet-compliance-manager = { path = "../../pallets/compliance-manager", default-features = false } -pallet-pips = { path = "../../pallets/pips", default-features = false } -pallet-portfolio = { path = "../../pallets/portfolio", default-features = false } -pallet-identity = { path = "../../pallets/identity", default-features = false } -pallet-transaction-payment = { path = "../../pallets/transaction-payment", default-features = false } +polymesh-primitives = { workspace = true, default-features = false } +pallet-compliance-manager = { workspace = true, default-features = false } +pallet-pips = { workspace = true, default-features = false } +pallet-portfolio = { workspace = true, default-features = false } +pallet-identity = { workspace = true, default-features = false } +pallet-transaction-payment = { workspace = true, default-features = false } # Other -serde = { version = "1.0.104", optional = true, features = ["derive"] } +serde = { version = "1.0.104", default-features = false, features = ["alloc", "derive"] } [dev-dependencies] serde_json = "1.0.41" @@ -42,7 +42,7 @@ std = [ "pallet-portfolio/std", "pallet-transaction-payment/std", "polymesh-primitives/std", - "serde", + "serde/std", "sp-api/std", "sp-runtime/std", "sp-std/std", diff --git a/rpc/runtime-api/src/compliance.rs b/rpc/runtime-api/src/compliance.rs index e9ce8a4b4f..4a3ef9edd0 100644 --- a/rpc/runtime-api/src/compliance.rs +++ b/rpc/runtime-api/src/compliance.rs @@ -15,7 +15,7 @@ //! Runtime API definition for Compliance module. -use frame_support::dispatch::DispatchError; +use frame_support::pallet_prelude::DispatchError; use polymesh_primitives::asset::AssetId; use polymesh_primitives::compliance_manager::ComplianceReport; diff --git a/rpc/runtime-api/src/nft.rs b/rpc/runtime-api/src/nft.rs index b906acaefd..111d2e28b4 100644 --- a/rpc/runtime-api/src/nft.rs +++ b/rpc/runtime-api/src/nft.rs @@ -15,7 +15,7 @@ //! Runtime API definition for NFT module. -use frame_support::dispatch::DispatchError; +use frame_support::pallet_prelude::DispatchError; use sp_std::vec::Vec; use polymesh_primitives::{NFTs, PortfolioId}; diff --git a/rpc/runtime-api/src/pips.rs b/rpc/runtime-api/src/pips.rs index 8d97279905..599e96bb9e 100644 --- a/rpc/runtime-api/src/pips.rs +++ b/rpc/runtime-api/src/pips.rs @@ -27,12 +27,12 @@ pub mod capped { use codec::{Decode, Encode}; use sp_runtime::traits::SaturatedConversion; - #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; - #[derive(Eq, PartialEq, Encode, Decode)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] + #[derive(Clone, Decode, Encode, Eq, PartialEq)] + #[cfg_attr(feature = "std", derive(Debug))] + #[derive(Serialize, Deserialize)] + #[serde(rename_all = "camelCase")] pub enum VoteCount { /// Proposal was found and has the following votes. ProposalFound { @@ -58,8 +58,9 @@ pub mod capped { } #[derive(Eq, PartialEq)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] + #[cfg_attr(feature = "std", derive(Debug))] + #[derive(Serialize, Deserialize)] + #[serde(rename_all = "camelCase")] pub enum Vote { Yes(u64), No(u64), diff --git a/rpc/runtime-api/src/settlement.rs b/rpc/runtime-api/src/settlement.rs index ab4b400c7e..2d5db14f46 100644 --- a/rpc/runtime-api/src/settlement.rs +++ b/rpc/runtime-api/src/settlement.rs @@ -15,7 +15,7 @@ //! Runtime API definition for Settlement module. -use frame_support::dispatch::DispatchError; +use frame_support::pallet_prelude::DispatchError; use frame_support::weights::Weight; use sp_std::vec::Vec; diff --git a/rpc/runtime-api/src/statistics.rs b/rpc/runtime-api/src/statistics.rs index 7be59a1460..fcc9acebf5 100644 --- a/rpc/runtime-api/src/statistics.rs +++ b/rpc/runtime-api/src/statistics.rs @@ -15,7 +15,7 @@ //! Runtime API definition for the Statistics module. -use frame_support::dispatch::DispatchError; +use frame_support::pallet_prelude::DispatchError; use sp_std::vec::Vec; use polymesh_primitives::asset::AssetId; diff --git a/rpc/runtime-api/src/transaction_payment.rs b/rpc/runtime-api/src/transaction_payment.rs index a14fe1a244..84ace0391e 100644 --- a/rpc/runtime-api/src/transaction_payment.rs +++ b/rpc/runtime-api/src/transaction_payment.rs @@ -8,7 +8,7 @@ sp_api::decl_runtime_apis! { pub trait TransactionPaymentApi { #[changed_in(2)] - fn query_info(uxt: Block::Extrinsic, len: u32) -> RuntimeDispatchInfo; + fn query_info(uxt: Block::Extrinsic, len: u32) -> RuntimeDispatchInfo; fn query_info(uxt: Block::Extrinsic, len: u32) -> RuntimeDispatchInfo; fn query_fee_details(uxt: Block::Extrinsic, len: u32) -> FeeDetails; } diff --git a/rpc/src/asset.rs b/rpc/src/asset.rs index 00766705e7..8d0f993dcc 100644 --- a/rpc/src/asset.rs +++ b/rpc/src/asset.rs @@ -18,8 +18,8 @@ use std::sync::Arc; use frame_support::pallet_prelude::DispatchError; use jsonrpsee::core::RpcResult; use jsonrpsee::proc_macros::rpc; -use jsonrpsee::types::error::{CallError, ErrorObject}; -use sp_api::ProvideRuntimeApi; +use jsonrpsee::types::error::ErrorObject; +use sp_api::{ApiRef, ProvideRuntimeApi}; use sp_blockchain::HeaderBackend; use sp_runtime::traits::Block as BlockT; @@ -27,8 +27,6 @@ pub use node_rpc_runtime_api::asset::AssetApi as AssetRuntimeApi; use polymesh_primitives::asset::AssetId; use polymesh_primitives::{Balance, PortfolioId}; -use crate::Error; - #[rpc(client, server)] pub trait AssetApi { #[method(name = "asset_transferReport")] @@ -74,25 +72,18 @@ where skip_locked_check: bool, at: Option<::Hash>, ) -> RpcResult> { - let api = self.client.runtime_api(); - // If the block hash is not supplied assume the best block. - let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); - - api.transfer_report( - at_hash, - sender_portfolio, - receiver_portfolio, - asset_id, - transfer_value, - skip_locked_check, + rpc_forward_call!( + self, + at, + |api: ApiRef<>::Api>, at| api.transfer_report( + at, + sender_portfolio, + receiver_portfolio, + asset_id, + transfer_value, + skip_locked_check + ), + "Unable to query `transfer_report`." ) - .map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Unable to call asset_transfer_report runtime", - Some(e.to_string()), - )) - .into() - }) } } diff --git a/rpc/src/compliance.rs b/rpc/src/compliance.rs index 131be1e441..3c4d48e013 100644 --- a/rpc/src/compliance.rs +++ b/rpc/src/compliance.rs @@ -15,11 +15,11 @@ use std::sync::Arc; -use frame_support::dispatch::DispatchError; +use frame_support::pallet_prelude::DispatchError; use jsonrpsee::core::RpcResult; use jsonrpsee::proc_macros::rpc; -use jsonrpsee::types::error::{CallError, ErrorObject}; -use sp_api::ProvideRuntimeApi; +use jsonrpsee::types::error::ErrorObject; +use sp_api::{ApiRef, ProvideRuntimeApi}; use sp_blockchain::HeaderBackend; use sp_runtime::traits::Block as BlockT; @@ -28,8 +28,6 @@ use polymesh_primitives::asset::AssetId; use polymesh_primitives::compliance_manager::ComplianceReport; use polymesh_primitives::IdentityId; -use crate::Error; - #[rpc(client, server)] pub trait ComplianceApi { #[method(name = "compliance_complianceReport")] @@ -71,18 +69,16 @@ where receiver_identity: IdentityId, at: Option<::Hash>, ) -> RpcResult> { - let api = self.client.runtime_api(); - // If the block hash is not supplied assume the best block. - let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); - - api.compliance_report(at_hash, &asset_id, &sender_identity, &receiver_identity) - .map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Unable to call compliance_report runtime", - Some(e.to_string()), - )) - .into() - }) + rpc_forward_call!( + self, + at, + |api: ApiRef<>::Api>, at| api.compliance_report( + at, + &asset_id, + &sender_identity, + &receiver_identity, + ), + "Unable to query `compliance_report`." + ) } } diff --git a/rpc/src/identity.rs b/rpc/src/identity.rs index 38bf8e0dc4..721b5671aa 100644 --- a/rpc/src/identity.rs +++ b/rpc/src/identity.rs @@ -3,8 +3,8 @@ use std::{convert::TryInto, sync::Arc}; use codec::Codec; use jsonrpsee::core::RpcResult; use jsonrpsee::proc_macros::rpc; -use jsonrpsee::types::error::{CallError, ErrorCode, ErrorObject}; -use sp_api::{ApiExt, ApiRef, ProvideRuntimeApi}; +use jsonrpsee::types::error::ErrorObject; +use sp_api::{ApiRef, ProvideRuntimeApi}; use sp_blockchain::HeaderBackend; use sp_runtime::traits::{Block as BlockT, Zero}; @@ -12,7 +12,7 @@ pub use node_rpc_runtime_api::identity::IdentityApi as IdentityRuntimeApi; pub use pallet_identity::types::{CddStatus, DidStatus, KeyIdentityData, RpcDidRecords}; use polymesh_primitives::{Authorization, AuthorizationType, IdentityClaim, Signatory}; -use super::Error; +use crate::Error; const MAX_IDENTITIES_ALLOWED_TO_QUERY: u32 = 500; @@ -111,18 +111,16 @@ where buffer_time: Option, at: Option<::Hash>, ) -> RpcResult { - let api = self.client.runtime_api(); - // If the block hash is not supplied assume the best block. - let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); - api.is_identity_has_valid_cdd(at_hash, did, buffer_time) - .map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Either cdd claim not exist or Identity.", - Some(e.to_string()), - )) - .into() - }) + rpc_forward_call!( + self, + at, + |api: ApiRef<>::Api>, at| api.is_identity_has_valid_cdd( + at, + did, + buffer_time, + ), + "Unable to query `is_identity_has_valid_cdd`." + ) } fn get_did_records( @@ -130,39 +128,12 @@ where did: IdentityId, at: Option<::Hash>, ) -> RpcResult> { - let api = self.client.runtime_api(); - let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); - let api_version = api - .api_version::>( - at_hash, - ) - .map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Unable to fetch DID records", - Some(e.to_string()), - )) - })?; - - match api_version { - Some(version) if version >= 2 => api.get_did_records(at_hash, did), - _ => { - return Err(CallError::Custom(ErrorObject::owned( - ErrorCode::MethodNotFound.code(), - format!("Cannot find `IdentityApi` for block {:?}", at), - None::<()>, - )) - .into()); - } - } - .map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Unable to fetch DID records", - Some(e.to_string()), - )) - .into() - }) + rpc_forward_call!( + self, + at, + |api: ApiRef<>::Api>, at| api.get_did_records(at, did), + "Unable to query `get_did_records`." + ) } fn get_filtered_authorizations( @@ -172,18 +143,13 @@ where auth_type: Option, at: Option<::Hash>, ) -> RpcResult>> { - let api = self.client.runtime_api(); - let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); - - api.get_filtered_authorizations(at_hash, signatory, allow_expired, auth_type) - .map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Unable to fetch authorizations data", - Some(e.to_string()), - )) - .into() - }) + rpc_forward_call!( + self, + at, + |api: ApiRef<>::Api>, at| api + .get_filtered_authorizations(at, signatory, allow_expired, auth_type), + "Unable to query `get_filtered_authorizations`." + ) } fn get_did_status( @@ -196,27 +162,22 @@ where .try_into() .unwrap_or_else(|_| Zero::zero()) { - return Err(CallError::Custom(ErrorObject::owned( + return Err(ErrorObject::owned( Error::RuntimeError.into(), "Unable to fetch dids status", Some(format!( "Provided vector length is more than the maximum allowed length i.e {:?}", MAX_IDENTITIES_ALLOWED_TO_QUERY )), - )) - .into()); + )); } - let api = self.client.runtime_api(); - let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); - api.get_did_status(at_hash, dids).map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Unable to fetch dids status", - Some(e.to_string()), - )) - .into() - }) + rpc_forward_call!( + self, + at, + |api: ApiRef<>::Api>, at| api.get_did_status(at, dids), + "Unable to query `get_did_status`." + ) } fn get_key_identity_data( @@ -240,18 +201,15 @@ where cdd_checker_leeway: Option, at: Option<::Hash>, ) -> RpcResult> { - let api = self.client.runtime_api(); - // If the block hash is not supplied assume the best block. - let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); - - api.valid_cdd_claims(at_hash, target_identity, cdd_checker_leeway) - .map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Unable to call valid_cdd_claims runtime", - Some(e.to_string()), - )) - .into() - }) + rpc_forward_call!( + self, + at, + |api: ApiRef<>::Api>, at| api.valid_cdd_claims( + at, + target_identity, + cdd_checker_leeway + ), + "Unable to query `valid_cdd_claims`." + ) } } diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs index f0618a4616..923f63849d 100644 --- a/rpc/src/lib.rs +++ b/rpc/src/lib.rs @@ -38,11 +38,11 @@ macro_rules! rpc_forward_call { let at_hash = $at.unwrap_or_else(|| $self.client.info().best_hash); let result = $f(api, at_hash).map_err(|e| { - CallError::Custom(ErrorObject::owned( + ErrorObject::owned( crate::Error::RuntimeError.into(), $err_msg, Some(e.to_string()), - )) + ) })?; Ok(result) diff --git a/rpc/src/nft.rs b/rpc/src/nft.rs index f0859789cf..16b4c452b5 100644 --- a/rpc/src/nft.rs +++ b/rpc/src/nft.rs @@ -15,19 +15,17 @@ use std::sync::Arc; -use frame_support::dispatch::DispatchError; +use frame_support::pallet_prelude::DispatchError; use jsonrpsee::core::RpcResult; use jsonrpsee::proc_macros::rpc; -use jsonrpsee::types::error::{CallError, ErrorObject}; -use sp_api::ProvideRuntimeApi; +use jsonrpsee::types::error::ErrorObject; +use sp_api::{ApiRef, ProvideRuntimeApi}; use sp_blockchain::HeaderBackend; use sp_runtime::traits::Block as BlockT; pub use node_rpc_runtime_api::nft::NFTApi as NFTRuntimeApi; use polymesh_primitives::{NFTs, PortfolioId}; -use crate::Error; - #[rpc(client, server)] pub trait NFTApi { #[method(name = "nft_transferReport")] @@ -71,24 +69,17 @@ where skip_locked_check: bool, at: Option<::Hash>, ) -> RpcResult> { - let api = self.client.runtime_api(); - // If the block hash is not supplied assume the best block. - let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); - - api.transfer_report( - at_hash, - sender_portfolio, - receiver_portfolio, - nfts, - skip_locked_check, + rpc_forward_call!( + self, + at, + |api: ApiRef<>::Api>, at| api.transfer_report( + at, + sender_portfolio, + receiver_portfolio, + nfts, + skip_locked_check, + ), + "Unable to query `transfer_report`." ) - .map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Unable to call validate_nft_transfer runtime", - Some(e.to_string()), - )) - .into() - }) } } diff --git a/rpc/src/pips.rs b/rpc/src/pips.rs index c1e85d6679..768e44fcb4 100644 --- a/rpc/src/pips.rs +++ b/rpc/src/pips.rs @@ -18,7 +18,7 @@ use std::sync::Arc; use codec::Codec; use jsonrpsee::core::RpcResult; use jsonrpsee::proc_macros::rpc; -use jsonrpsee::types::error::{CallError, ErrorObject}; +use jsonrpsee::types::error::ErrorObject; use sp_api::{ApiRef, ProvideRuntimeApi}; use sp_blockchain::HeaderBackend; use sp_runtime::traits::Block as BlockT; diff --git a/rpc/src/settlement.rs b/rpc/src/settlement.rs index a0432b2039..ceef1a125e 100644 --- a/rpc/src/settlement.rs +++ b/rpc/src/settlement.rs @@ -16,11 +16,11 @@ use sp_std::vec::Vec; use std::sync::Arc; -use frame_support::dispatch::DispatchError; +use frame_support::pallet_prelude::DispatchError; use jsonrpsee::core::RpcResult; use jsonrpsee::proc_macros::rpc; -use jsonrpsee::types::error::{CallError, ErrorObject}; -use sp_api::ProvideRuntimeApi; +use jsonrpsee::types::error::ErrorObject; +use sp_api::{ApiRef, ProvideRuntimeApi}; use sp_blockchain::HeaderBackend; use sp_runtime::traits::Block as BlockT; @@ -29,8 +29,6 @@ use polymesh_primitives::settlement::{AffirmationCount, ExecuteInstructionInfo}; use polymesh_primitives::settlement::{InstructionId, Leg}; use polymesh_primitives::PortfolioId; -use crate::Error; - #[rpc(client, server)] pub trait SettlementApi { #[method(name = "settlement_getExecuteInstructionInfo")] @@ -91,19 +89,13 @@ where instruction_id: InstructionId, at: Option<::Hash>, ) -> RpcResult> { - let api = self.client.runtime_api(); - // If the block hash is not supplied assume the best block. - let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); - - api.get_execute_instruction_info(at_hash, instruction_id) - .map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Unable to call get_execute_instruction_info runtime", - Some(e.to_string()), - )) - .into() - }) + rpc_forward_call!( + self, + at, + |api: ApiRef<>::Api>, at| api + .get_execute_instruction_info(at, instruction_id,), + "Unable to query `get_execute_instruction_info`." + ) } fn get_affirmation_count( @@ -112,19 +104,16 @@ where portfolios: Vec, at: Option<::Hash>, ) -> RpcResult { - let api = self.client.runtime_api(); - // If the block hash is not supplied assume the best block. - let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); - - api.get_affirmation_count(at_hash, instruction_id, portfolios) - .map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Unable to call get_affirmation_count runtime", - Some(e.to_string()), - )) - .into() - }) + rpc_forward_call!( + self, + at, + |api: ApiRef<>::Api>, at| api.get_affirmation_count( + at, + instruction_id, + portfolios, + ), + "Unable to query `get_affirmation_count`." + ) } fn get_transfer_report( @@ -133,19 +122,16 @@ where skip_locked_check: bool, at: Option<::Hash>, ) -> RpcResult> { - let api = self.client.runtime_api(); - // If the block hash is not supplied assume the best block. - let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); - - api.get_transfer_report(at_hash, leg, skip_locked_check) - .map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Unable to call get_transfer_report runtime", - Some(e.to_string()), - )) - .into() - }) + rpc_forward_call!( + self, + at, + |api: ApiRef<>::Api>, at| api.get_transfer_report( + at, + leg, + skip_locked_check, + ), + "Unable to query `get_transfer_report`." + ) } fn get_execute_instruction_report( @@ -153,18 +139,12 @@ where instruction_id: InstructionId, at: Option<::Hash>, ) -> RpcResult> { - let api = self.client.runtime_api(); - // If the block hash is not supplied assume the best block. - let at_hash = at.unwrap_or_else(|| self.client.info().best_hash); - - api.get_execute_instruction_report(at_hash, instruction_id) - .map_err(|e| { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - "Unable to call get_execute_instruction_report runtime", - Some(e.to_string()), - )) - .into() - }) + rpc_forward_call!( + self, + at, + |api: ApiRef<>::Api>, at| api + .get_execute_instruction_report(at, instruction_id,), + "Unable to query `get_execute_instruction_report`." + ) } } diff --git a/rpc/src/transaction_payment.rs b/rpc/src/transaction_payment.rs index ec9d1adfce..74c3d1e1c4 100644 --- a/rpc/src/transaction_payment.rs +++ b/rpc/src/transaction_payment.rs @@ -19,20 +19,21 @@ use std::{convert::TryInto, sync::Arc}; use codec::Decode; -use jsonrpsee::core::{Error as JsonRpseeError, RpcResult}; +use jsonrpsee::core::RpcResult; use jsonrpsee::proc_macros::rpc; -use jsonrpsee::types::error::{CallError, ErrorCode, ErrorObject}; +use jsonrpsee::types::error::{ErrorCode, ErrorObject}; +pub use node_rpc_runtime_api::transaction_payment::{ + FeeDetails, InclusionFee, RuntimeDispatchInfo, + TransactionPaymentApi as TransactionPaymentRuntimeApi, +}; + use sp_api::{ApiExt, ProvideRuntimeApi}; use sp_blockchain::HeaderBackend; use sp_core::Bytes; use sp_rpc::number::NumberOrHex; use sp_runtime::traits::Block as BlockT; -pub use node_rpc_runtime_api::transaction_payment::{ - FeeDetails, InclusionFee, RuntimeDispatchInfo, - TransactionPaymentApi as TransactionPaymentRuntimeApi, -}; -use polymesh_primitives::Balance; +use polymesh_primitives::{Balance, OldWeight}; use super::Error; @@ -67,10 +68,8 @@ impl TransactionPayment { } impl - TransactionPaymentApiServer< - ::Hash, - RuntimeDispatchInfo, - > for TransactionPayment + TransactionPaymentApiServer<::Hash, RuntimeDispatchInfo> + for TransactionPayment where Block: BlockT, C: ProvideRuntimeApi + HeaderBackend + Send + Sync + 'static, @@ -80,7 +79,7 @@ where &self, encoded_xt: Bytes, at: Option<::Hash>, - ) -> RpcResult> { + ) -> RpcResult> { let api = self.client.runtime_api(); let at_hash = at.unwrap_or_else(|| { // If the block hash is not supplied assume the best block. @@ -90,30 +89,26 @@ where let encoded_len = encoded_xt.len() as u32; let uxt: Block::Extrinsic = Decode::decode(&mut &*encoded_xt).map_err(|e| { - CallError::Custom(ErrorObject::owned( + ErrorObject::owned( Error::DecodeError.into(), "Unable to query dispatch info.", Some(format!("{:?}", e)), - )) + ) })?; - fn map_err(error: impl ToString, desc: &'static str) -> CallError { - CallError::Custom(ErrorObject::owned( - Error::RuntimeError.into(), - desc, - Some(error.to_string()), - )) + fn map_err(error: impl ToString, desc: &'static str) -> ErrorObject<'static> { + ErrorObject::owned(Error::RuntimeError.into(), desc, Some(error.to_string())) } let api_version = api .api_version::>(at_hash) .map_err(|e| map_err(e, "Failed to get transaction payment runtime api version"))? .ok_or_else(|| { - CallError::Custom(ErrorObject::owned( + ErrorObject::owned( Error::RuntimeError.into(), "Transaction payment runtime api wasn't found in the runtime", None::, - )) + ) })?; if api_version < 2 { @@ -126,7 +121,7 @@ where .map_err(|e| map_err(e, "Unable to query dispatch info."))?; Ok(RuntimeDispatchInfo { - weight: sp_weights::OldWeight(res.weight.ref_time()), + weight: OldWeight(res.weight.ref_time()), class: res.class, partial_fee: res.partial_fee, }) @@ -146,29 +141,29 @@ where let encoded_len = encoded_xt.len() as u32; let uxt: Block::Extrinsic = Decode::decode(&mut &*encoded_xt).map_err(|e| { - CallError::Custom(ErrorObject::owned( + ErrorObject::owned( Error::DecodeError.into(), "Unable to query fee details.", Some(format!("{:?}", e)), - )) + ) })?; let fee_details = api .query_fee_details(at_hash, uxt, encoded_len) .map_err(|e| { - CallError::Custom(ErrorObject::owned( + ErrorObject::owned( Error::RuntimeError.into(), "Unable to query fee details.", Some(e.to_string()), - )) + ) })?; let try_into_rpc_balance = |value: Balance| { value.try_into().map_err(|_| { - JsonRpseeError::Call(CallError::Custom(ErrorObject::owned( + ErrorObject::owned( ErrorCode::InvalidParams.code(), format!("{} doesn't fit in NumberOrHex representation", value), None::<()>, - ))) + ) }) }; diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 712eb00290..20679c4708 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] -channel = "nightly-2024-11-14" -targets = [ "wasm32-unknown-unknown" ] -components = [ "rustfmt" ] +channel = "nightly-2025-08-01" +targets = [ "wasm32v1-none" ] +components = [ "rustfmt", "rust-src" ] profile = "minimal" diff --git a/scripts/cli/chain_metadata.sh b/scripts/cli/chain_metadata.sh index 3f16a2532f..02fe70b0a5 100755 --- a/scripts/cli/chain_metadata.sh +++ b/scripts/cli/chain_metadata.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash set -e -curl -H "Content-Type: application/json" -d '{"id":"1", "jsonrpc":"2.0", "method": "state_getMetadata", "params":[]}' http://localhost:9933 > polymesh-meta.json +curl -H "Content-Type: application/json" -d '{"id":"1", "jsonrpc":"2.0", "method": "state_getMetadata", "params":[]}' http://localhost:9944 > polymesh-meta.json diff --git a/scripts/cli/index.js b/scripts/cli/index.js index fa50873940..4b2c1a2d41 100644 --- a/scripts/cli/index.js +++ b/scripts/cli/index.js @@ -456,11 +456,9 @@ async function addClaimsBatchToDid(api, accounts, dids, n_claims, fast) { // Holds the batch of claims let claims = []; - const asset_did = reqImports.tickerToDid(reqImports.ticker); - // Stores the value of each claim let claim_record = {target: dids[0], - claim: { Exempted: asset_did }, + claim: { Exempted: dids[0] }, expiry: null}; // This fills the claims array with claim_values up to n_claims amount diff --git a/scripts/cli/polymesh-meta.json b/scripts/cli/polymesh-meta.json index 63b87897fd..2a72bd29b7 100644 --- a/scripts/cli/polymesh-meta.json +++ b/scripts/cli/polymesh-meta.json @@ -1 +1 @@ -{"jsonrpc":"2.0","result":"0x6d6574610e250c000c1c73705f636f72651863727970746f2c4163636f756e7449643332000004000401205b75383b2033325d0000040000032000000008000800000503000c08306672616d655f73797374656d2c4163636f756e74496e666f0814496e64657801102c4163636f756e74446174610114001401146e6f6e6365100114496e646578000124636f6e73756d657273100120526566436f756e7400012470726f766964657273100120526566436f756e7400012c73756666696369656e7473100120526566436f756e740001106461746114012c4163636f756e74446174610000100000050500141064706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573187472616974732062616c616e6365732c4163636f756e744461746100001001106672656518011c42616c616e6365000120726573657276656418011c42616c616e636500012c6d6973635f66726f7a656e18011c42616c616e63650001286665655f66726f7a656e18011c42616c616e636500001800000507001c0c346672616d655f737570706f7274206469737061746368405065724469737061746368436c6173730404540120000c01186e6f726d616c2001045400012c6f7065726174696f6e616c200104540001246d616e6461746f7279200104540000200c2873705f77656967687473247765696768745f76321857656967687400000801207265665f74696d6524010c75363400012870726f6f665f73697a6524010c75363400002400000628002800000506002c083c7072696d69746976655f74797065731048323536000004000401205b75383b2033325d000030000002080034102873705f72756e74696d651c67656e65726963186469676573741844696765737400000401106c6f677338013c5665633c4469676573744974656d3e0000380000023c003c102873705f72756e74696d651c67656e6572696318646967657374284469676573744974656d0001142850726552756e74696d650800400144436f6e73656e737573456e67696e654964000030011c5665633c75383e00060024436f6e73656e7375730800400144436f6e73656e737573456e67696e654964000030011c5665633c75383e000400105365616c0800400144436f6e73656e737573456e67696e654964000030011c5665633c75383e000500144f74686572040030011c5665633c75383e0000006452756e74696d65456e7669726f6e6d656e745570646174656400080000400000030400000008004400000248004808306672616d655f73797374656d2c4576656e745265636f7264080445014c0454012c000c01147068617365bd04011450686173650001146576656e744c010445000118746f70696373c10401185665633c543e00004c0c60706f6c796d6573685f72756e74696d655f646576656c6f701c72756e74696d653052756e74696d654576656e740001ac1853797374656d04005001706672616d655f73797374656d3a3a4576656e743c52756e74696d653e0000001c496e6469636573040074017870616c6c65745f696e64696365733a3a4576656e743c52756e74696d653e0003002042616c616e636573040078017c70616c6c65745f62616c616e6365733a3a4576656e743c52756e74696d653e000500485472616e73616374696f6e5061796d656e7404009001a870616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4576656e743c52756e74696d653e000600204964656e74697479040094017c70616c6c65745f6964656e746974793a3a4576656e743c52756e74696d653e0007004c4364645365727669636550726f76696465727304003d0101d470616c6c65745f67726f75703a3a4576656e743c52756e74696d652c2070616c6c65745f67726f75703a3a496e7374616e6365323e00080044506f6c796d657368436f6d6d69747465650400490101f470616c6c65745f636f6d6d69747465653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6d6d69747465653a3a496e7374616e6365313e0009004c436f6d6d69747465654d656d6265727368697004005d0101d470616c6c65745f67726f75703a3a4576656e743c52756e74696d652c2070616c6c65745f67726f75703a3a496e7374616e6365313e000a0048546563686e6963616c436f6d6d69747465650400650101f470616c6c65745f636f6d6d69747465653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6d6d69747465653a3a496e7374616e6365333e000b0070546563686e6963616c436f6d6d69747465654d656d6265727368697004006d0101d470616c6c65745f67726f75703a3a4576656e743c52756e74696d652c2070616c6c65745f67726f75703a3a496e7374616e6365333e000c004055706772616465436f6d6d69747465650400750101f470616c6c65745f636f6d6d69747465653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6d6d69747465653a3a496e7374616e6365343e000d006855706772616465436f6d6d69747465654d656d6265727368697004007d0101d470616c6c65745f67726f75703a3a4576656e743c52756e74696d652c2070616c6c65745f67726f75703a3a496e7374616e6365343e000e00204d756c746953696704008501017c70616c6c65745f6d756c74697369673a3a4576656e743c52756e74696d653e000f001c5374616b696e6704008d01017870616c6c65745f7374616b696e673a3a4576656e743c52756e74696d653e001100204f6666656e6365730400a501015870616c6c65745f6f6666656e6365733a3a4576656e740012001c53657373696f6e0400a901015470616c6c65745f73657373696f6e3a3a4576656e740013001c4772616e6470610400ad01015470616c6c65745f6772616e6470613a3a4576656e7400150020496d4f6e6c696e650400c101018070616c6c65745f696d5f6f6e6c696e653a3a4576656e743c52756e74696d653e001700105375646f0400e501016c70616c6c65745f7375646f3a3a4576656e743c52756e74696d653e0019001441737365740400e901017070616c6c65745f61737365743a3a4576656e743c52756e74696d653e001a004c4361706974616c446973747269627574696f6e04009102018870616c6c65745f6361706974616c5f646973747269627574696f6e3a3a4576656e74001b0028436865636b706f696e740400a902016070616c6c65745f636865636b706f696e743a3a4576656e74001c0044436f6d706c69616e63654d616e616765720400c102018070616c6c65745f636f6d706c69616e63655f6d616e616765723a3a4576656e74001d003c436f72706f72617465416374696f6e0400f502017c70616c6c65745f636f72706f726174655f616374696f6e733a3a4576656e74001e003c436f72706f7261746542616c6c6f7404002903017870616c6c65745f636f72706f726174655f62616c6c6f743a3a4576656e74001f00105069707304006103016c70616c6c65745f706970733a3a4576656e743c52756e74696d653e00210024506f7274666f6c696f0400a103015c70616c6c65745f706f7274666f6c696f3a3a4576656e740022002c50726f746f636f6c4665650400c103018c70616c6c65745f70726f746f636f6c5f6665653a3a4576656e743c52756e74696d653e002300245363686564756c65720400c903018070616c6c65745f7363686564756c65723a3a4576656e743c52756e74696d653e00240028536574746c656d656e740400d503018470616c6c65745f736574746c656d656e743a3a4576656e743c52756e74696d653e002500285374617469737469637304000504016070616c6c65745f737461746973746963733a3a4576656e740026000c53746f04004504016870616c6c65745f73746f3a3a4576656e743c52756e74696d653e00270020547265617375727904006104017c70616c6c65745f74726561737572793a3a4576656e743c52756e74696d653e0028001c5574696c69747904006504017870616c6c65745f7574696c6974793a3a4576656e743c52756e74696d653e002900104261736504007504014870616c6c65745f626173653a3a4576656e74002a003845787465726e616c4167656e747304007d04017470616c6c65745f65787465726e616c5f6167656e74733a3a4576656e74002b001c52656c6179657204008104017870616c6c65745f72656c617965723a3a4576656e743c52756e74696d653e002c0024436f6e74726163747304008504018070616c6c65745f636f6e7472616374733a3a4576656e743c52756e74696d653e002e0044506f6c796d657368436f6e747261637473040089040188706f6c796d6573685f636f6e7472616374733a3a4576656e743c52756e74696d653e002f0020507265696d61676504009904017c70616c6c65745f707265696d6167653a3a4576656e743c52756e74696d653e0030000c4e667404009d04014470616c6c65745f6e66743a3a4576656e7400310068456c656374696f6e50726f76696465724d756c746950686173650400a50401d070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173653a3a4576656e743c52756e74696d653e00320024546573745574696c730400b904018470616c6c65745f746573745f7574696c733a3a4576656e743c52756e74696d653e00c80000500c306672616d655f73797374656d1870616c6c6574144576656e740404540001184045787472696e7369635375636365737304013464697370617463685f696e666f5401304469737061746368496e666f00000490416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c656408013864697370617463685f6572726f7260013444697370617463684572726f7200013464697370617463685f696e666f5401304469737061746368496e666f00010450416e2065787472696e736963206661696c65642e2c436f64655570646174656400020450603a636f6465602077617320757064617465642e284e65774163636f756e7404011c6163636f756e74000130543a3a4163636f756e7449640003046841206e6577206163636f756e742077617320637265617465642e344b696c6c65644163636f756e7404011c6163636f756e74000130543a3a4163636f756e74496400040458416e206163636f756e7420776173207265617065642e2052656d61726b656408011873656e646572000130543a3a4163636f756e744964000110686173682c011c543a3a48617368000504704f6e206f6e2d636861696e2072656d61726b2068617070656e65642e04704576656e7420666f72207468652053797374656d2070616c6c65742e540c346672616d655f737570706f7274206469737061746368304469737061746368496e666f00000c0118776569676874200118576569676874000114636c6173735801344469737061746368436c617373000120706179735f6665655c0110506179730000580c346672616d655f737570706f7274206469737061746368344469737061746368436c61737300010c184e6f726d616c0000002c4f7065726174696f6e616c000100244d616e6461746f7279000200005c0c346672616d655f737570706f727420646973706174636810506179730001080c596573000000084e6f0001000060082873705f72756e74696d653444697370617463684572726f72000134144f746865720000003043616e6e6f744c6f6f6b7570000100244261644f726967696e000200184d6f64756c65040064012c4d6f64756c654572726f7200030044436f6e73756d657252656d61696e696e670004002c4e6f50726f76696465727300050040546f6f4d616e79436f6e73756d65727300060014546f6b656e0400680128546f6b656e4572726f720007002841726974686d6574696304006c013c41726974686d657469634572726f72000800345472616e73616374696f6e616c04007001485472616e73616374696f6e616c4572726f7200090024457868617573746564000a0028436f7272757074696f6e000b002c556e617661696c61626c65000c000064082873705f72756e74696d652c4d6f64756c654572726f720000080114696e64657808010875380001146572726f7240018c5b75383b204d41585f4d4f44554c455f4552524f525f454e434f4445445f53495a455d000068082873705f72756e74696d6528546f6b656e4572726f7200011c1c4e6f46756e647300000020576f756c644469650001003042656c6f774d696e696d756d0002003043616e6e6f7443726561746500030030556e6b6e6f776e41737365740004001846726f7a656e0005002c556e737570706f72746564000600006c083473705f61726974686d657469633c41726974686d657469634572726f7200010c24556e646572666c6f77000000204f766572666c6f77000100384469766973696f6e42795a65726f0002000070082873705f72756e74696d65485472616e73616374696f6e616c4572726f72000108304c696d6974526561636865640000001c4e6f4c6179657200010000740c3870616c6c65745f696e64696365731870616c6c6574144576656e7404045400010c34496e64657841737369676e656408010c77686f000130543a3a4163636f756e744964000114696e64657810013c543a3a4163636f756e74496e6465780000047441206163636f756e7420696e646578207761732061737369676e65642e28496e6465784672656564040114696e64657810013c543a3a4163636f756e74496e646578000104bc41206163636f756e7420696e64657820686173206265656e2066726565642075702028756e61737369676e6564292e2c496e64657846726f7a656e080114696e64657810013c543a3a4163636f756e74496e64657800010c77686f000130543a3a4163636f756e744964000204e841206163636f756e7420696e64657820686173206265656e2066726f7a656e20746f206974732063757272656e74206163636f756e742049442e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909781064706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573187472616974732062616c616e636573205261774576656e7404244163636f756e7449640100011c1c456e646f7765640c007c01484f7074696f6e3c4964656e7469747949643e00000001244163636f756e744964000018011c42616c616e63650000043101416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e205c5b6469642c206163636f756e742c20667265655f62616c616e63655d205472616e7366657218007c01484f7074696f6e3c4964656e7469747949643e00000001244163636f756e74496400007c01484f7074696f6e3c4964656e7469747949643e00000001244163636f756e744964000018011c42616c616e636500008401304f7074696f6e3c4d656d6f3e000104f45472616e7366657220737563636565646564202866726f6d5f6469642c2066726f6d2c20746f5f6469642c20746f2c2076616c75652c206d656d6f292e2842616c616e636553657410008001284964656e74697479496400000001244163636f756e744964000018011c42616c616e6365000018011c42616c616e6365000204d4412062616c616e6365207761732073657420627920726f6f7420286469642c2077686f2c20667265652c207265736572766564292e504163636f756e7442616c616e63654275726e65640c008001284964656e74697479496400000001244163636f756e744964000018011c42616c616e63650003083d01546865206163636f756e7420616e642074686520616d6f756e74206f6620756e6c6f636b65642062616c616e6365206f662074686174206163636f756e74207468617420776173206275726e65642e8c2863616c6c65722049642c2063616c6c6572206163636f756e742c20616d6f756e742920526573657276656408000001244163636f756e744964000018011c42616c616e63650004041901536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e205c5b77686f2c2076616c75655d28556e726573657276656408000001244163636f756e744964000018011c42616c616e63650005042101536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e205c5b77686f2c2076616c75655d4852657365727665526570617472696174656410000001244163636f756e74496400000001244163636f756e744964000018011c42616c616e636500008c011853746174757300060c4d01536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742ed846696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652ea05c5b66726f6d2c20746f2c2062616c616e63652c2064657374696e6174696f6e5f7374617475735d085c4576656e747320666f722074686973206d6f64756c652e007c04184f7074696f6e04045401800108104e6f6e6500000010536f6d650400800000010000800c4c706f6c796d6573685f7072696d6974697665732c6964656e746974795f6964284964656e746974794964000004000401385b75383b20555549445f4c454e5d00008404184f7074696f6e04045401880108104e6f6e6500000010536f6d65040088000001000088084c706f6c796d6573685f7072696d697469766573104d656d6f000004000401205b75383b2033325d00008c14346672616d655f737570706f72741874726169747318746f6b656e73106d6973633442616c616e636553746174757300010810467265650000002052657365727665640001000090086870616c6c65745f7472616e73616374696f6e5f7061796d656e74205261774576656e74081c42616c616e63650118244163636f756e74496401000104485472616e73616374696f6e466565506169640c010c77686f0001244163636f756e74496400012861637475616c5f66656518011c42616c616e636500010c74697018011c42616c616e6365000008590141207472616e73616374696f6e20666565206061637475616c5f666565602c206f662077686963682060746970602077617320616464656420746f20746865206d696e696d756d20696e636c7573696f6e206665652c5c686173206265656e2070616964206279206077686f602e085c4576656e747320666f722074686973206d6f64756c652e00941064706f6c796d6573685f636f6d6d6f6e5f7574696c697469657318747261697473206964656e74697479205261774576656e7408244163636f756e7449640100184d6f6d656e740128015428446964437265617465640c008001284964656e74697479496400000001244163636f756e74496400009801705665633c5365636f6e646172794b65793c4163636f756e7449643e3e00000c444964656e7469747920637265617465642e0088284449442c207072696d617279206b65792c207365636f6e64617279206b65797329485365636f6e646172794b657973416464656408008001284964656e74697479496400009801705665633c5365636f6e646172794b65793c4163636f756e7449643e3e00010c845365636f6e64617279206b65797320616464656420746f206964656e746974792e003c284449442c206e6577206b65797329505365636f6e646172794b65797352656d6f76656408008001284964656e7469747949640000fc01385665633c4163636f756e7449643e00020c945365636f6e64617279206b6579732072656d6f7665642066726f6d206964656e746974792e0080284449442c20746865206b657973207468617420676f742072656d6f76656429605365636f6e646172794b65794c6566744964656e7469747908008001284964656e74697479496400000001244163636f756e74496400030c9041207365636f6e64617279206b6579206c656674207468656972206964656e746974792e0050284449442c207365636f6e64617279206b657929785365636f6e646172794b65795065726d697373696f6e735570646174656410008001284964656e74697479496400000001244163636f756e7449640000a0012c5065726d697373696f6e730000a0012c5065726d697373696f6e7300040c885365636f6e64617279206b6579207065726d697373696f6e7320757064617465642e000d01284449442c2075706461746564207365636f6e64617279206b65792c2070726576696f7573207065726d697373696f6e732c206e6577207065726d697373696f6e7329445072696d6172794b6579557064617465640c008001284964656e74697479496400000001244163636f756e74496400000001244163636f756e74496400050c805072696d617279206b6579206f66206964656e74697479206368616e6765642e00a4284449442c206f6c64207072696d617279206b6579206163636f756e742049442c206e65772049442928436c61696d416464656408008001284964656e7469747949640000010101344964656e74697479436c61696d00060c60436c61696d20616464656420746f206964656e746974792e0030284449442c20636c61696d2930436c61696d5265766f6b656408008001284964656e7469747949640000010101344964656e74697479436c61696d00070c70436c61696d207265766f6b65642066726f6d206964656e746974792e0030284449442c20636c61696d294841737365744469645265676973746572656408008001284964656e7469747949640000210101185469636b657200080c7041737365742773206964656e7469747920726567697374657265642e004c284173736574204449442c207469636b65722948417574686f72697a6174696f6e416464656418008001284964656e74697479496400007c01484f7074696f6e3c4964656e7469747949643e0000290101444f7074696f6e3c4163636f756e7449643e000028010c75363400002d010170417574686f72697a6174696f6e446174613c4163636f756e7449643e0000050101384f7074696f6e3c4d6f6d656e743e00090c604e657720617574686f72697a6174696f6e2061646465642e00310128617574686f72697365645f62792c207461726765745f6469642c207461726765745f6b65792c20617574685f69642c20617574686f72697a6174696f6e5f646174612c206578706972792950417574686f72697a6174696f6e5265766f6b65640c007c01484f7074696f6e3c4964656e7469747949643e0000290101444f7074696f6e3c4163636f756e7449643e000028010c753634000a0ca0417574686f72697a6174696f6e207265766f6b65642062792074686520617574686f72697a65722e00b828617574686f72697a65645f6964656e746974792c20617574686f72697a65645f6b65792c20617574685f69642954417574686f72697a6174696f6e52656a65637465640c007c01484f7074696f6e3c4964656e7469747949643e0000290101444f7074696f6e3c4163636f756e7449643e000028010c753634000b0cd8417574686f72697a6174696f6e2072656a65637465642062792074686520757365722077686f2077617320617574686f72697a65642e00b828617574686f72697a65645f6964656e746974792c20617574686f72697a65645f6b65792c20617574685f69642954417574686f72697a6174696f6e436f6e73756d65640c007c01484f7074696f6e3c4964656e7469747949643e0000290101444f7074696f6e3c4163636f756e7449643e000028010c753634000c0c5c417574686f72697a6174696f6e20636f6e73756d65642e00b828617574686f72697a65645f6964656e746974792c20617574686f72697a65645f6b65792c20617574685f69642978417574686f72697a6174696f6e52657472794c696d6974526561636865640c007c01484f7074696f6e3c4964656e7469747949643e0000290101444f7074696f6e3c4163636f756e7449643e000028010c753634000d0cb0416363657074696e6720417574686f72697a6174696f6e207265747279206c696d697420726561636865642e00b828617574686f72697a65645f6964656e746974792c20617574686f72697a65645f6b65792c20617574685f69642988436464526571756972656d656e74466f725072696d6172794b657955706461746564040039010110626f6f6c000e0cc443444420726571756972656d656e7420666f72207570646174696e67207072696d617279206b6579206368616e6765642e0044286e65775f726571756972656d656e742950436464436c61696d73496e76616c69646174656408008001284964656e74697479496400002801184d6f6d656e74000f10410143444420636c61696d732067656e65726174656420627920604964656e74697479496460202861204344442050726f7669646572292068617665206265656e20696e76616c6964617465642066726f6d24604d6f6d656e74602e0094284344442070726f7669646572204449442c2064697361626c652066726f6d2064617465294c5365636f6e646172794b65797346726f7a656e04008001284964656e74697479496400100cc4416c6c205365636f6e64617279206b657973206f6620746865206964656e74697479204944206172652066726f7a656e2e00142844494429545365636f6e646172794b657973556e66726f7a656e04008001284964656e74697479496400110ccc416c6c205365636f6e64617279206b657973206f6620746865206964656e746974792049442061726520756e66726f7a656e2e0014284449442950437573746f6d436c61696d5479706541646465640c008001284964656e746974794964000019010144437573746f6d436c61696d547970654964000030011c5665633c75383e00120c8041206e657720437573746f6d436c61696d54797065207761732061646465642e003c284449442c2069642c2054797065293c4368696c64446964437265617465640c008001284964656e74697479496400008001284964656e74697479496400000001244163636f756e74496400130c5c4368696c64206964656e7469747920637265617465642e009028506172656e74204449442c204368696c64204449442c207072696d617279206b657929404368696c64446964556e6c696e6b65640c008001284964656e74697479496400008001284964656e74697479496400008001284964656e74697479496400140cb44368696c64206964656e7469747920756e6c696e6b65642066726f6d20706172656e74206964656e746974792e008c2843616c6c6572204449442c20506172656e74204449442c204368696c642044494429085c4576656e747320666f722074686973206d6f64756c652e00980000029c009c0c4c706f6c796d6573685f7072696d697469766573347365636f6e646172795f6b6579305365636f6e646172794b657904244163636f756e74496401000008010c6b65790001244163636f756e74496400012c7065726d697373696f6e73a0012c5065726d697373696f6e730000a00c4c706f6c796d6573685f7072696d697469766573347365636f6e646172795f6b65792c5065726d697373696f6e7300000c01146173736574a4014041737365745065726d697373696f6e7300012465787472696e736963b8015045787472696e7369635065726d697373696f6e73000124706f7274666f6c696fe40150506f7274666f6c696f5065726d697373696f6e730000a40c4c706f6c796d6573685f7072696d69746976657318737562736574445375627365745265737472696374696f6e04044101a8010c1457686f6c650000001454686573650400b0012c42547265655365743c413e000100184578636570740400b0012c42547265655365743c413e00020000a80c4c706f6c796d6573685f7072696d6974697665731461737365741c4173736574494400000400ac01205b75383b2031365d0000ac000003100000000800b00420425472656553657404045401a8000400b4000000b4000002a800b80c4c706f6c796d6573685f7072696d697469766573347365636f6e646172795f6b65795045787472696e7369635065726d697373696f6e7300010c1457686f6c650000001454686573650400bc019c42547265654d61703c50616c6c65744e616d652c2050616c6c65745065726d697373696f6e733e000100184578636570740400bc019c42547265654d61703c50616c6c65744e616d652c2050616c6c65745065726d697373696f6e733e00020000bc042042547265654d617008044b01c0045601c8000400dc000000c0084c706f6c796d6573685f7072696d6974697665732850616c6c65744e616d6500000400c40118537472696e670000c40000050200c80c4c706f6c796d6573685f7072696d697469766573347365636f6e646172795f6b65794450616c6c65745065726d697373696f6e73000004012865787472696e73696373cc013845787472696e7369634e616d65730000cc0c4c706f6c796d6573685f7072696d69746976657318737562736574445375627365745265737472696374696f6e04044101d0010c1457686f6c650000001454686573650400d4012c42547265655365743c413e000100184578636570740400d4012c42547265655365743c413e00020000d0084c706f6c796d6573685f7072696d6974697665733445787472696e7369634e616d6500000400c40118537472696e670000d40420425472656553657404045401d0000400d8000000d8000002d000dc000002e000e000000408c0c800e40c4c706f6c796d6573685f7072696d69746976657318737562736574445375627365745265737472696374696f6e04044101e8010c1457686f6c650000001454686573650400f4012c42547265655365743c413e000100184578636570740400f4012c42547265655365743c413e00020000e80c4c706f6c796d6573685f7072696d6974697665732c6964656e746974795f69642c506f7274666f6c696f4964000008010c6469648001284964656e7469747949640001106b696e64ec0134506f7274666f6c696f4b696e640000ec0c4c706f6c796d6573685f7072696d6974697665732c6964656e746974795f696434506f7274666f6c696f4b696e640001081c44656661756c7400000010557365720400f0013c506f7274666f6c696f4e756d62657200010000f00c4c706f6c796d6573685f7072696d6974697665732c6964656e746974795f69643c506f7274666f6c696f4e756d6265720000040028010c7536340000f40420425472656553657404045401e8000400f8000000f8000002e800fc000002000001010c4c706f6c796d6573685f7072696d697469766573386964656e746974795f636c61696d344964656e74697479436c61696d0000140130636c61696d5f6973737565728001284964656e74697479496400013469737375616e63655f646174652801184d6f6d656e740001406c6173745f7570646174655f646174652801184d6f6d656e74000118657870697279050101384f7074696f6e3c4d6f6d656e743e000114636c61696d09010114436c61696d0000050104184f7074696f6e04045401280108104e6f6e6500000010536f6d65040028000001000009010c4c706f6c796d6573685f7072696d697469766573386964656e746974795f636c61696d14436c61696d000128284163637265646974656404000d01011453636f706500000024416666696c6961746504000d01011453636f7065000100244275794c6f636b757004000d01011453636f70650002002853656c6c4c6f636b757004000d01011453636f706500030050437573746f6d657244756544696c6967656e63650400110101144364644964000400404b6e6f77596f7572437573746f6d657204000d01011453636f7065000500304a7572697364696374696f6e08001501012c436f756e747279436f646500000d01011453636f7065000600204578656d7074656404000d01011453636f70650007001c426c6f636b656404000d01011453636f706500080018437573746f6d080019010144437573746f6d436c61696d54797065496400001d0101344f7074696f6e3c53636f70653e000900000d010c4c706f6c796d6573685f7072696d697469766573386964656e746974795f636c61696d1453636f706500010c204964656e7469747904008001284964656e7469747949640000001441737365740400a8011c4173736574494400010018437573746f6d040030011c5665633c75383e0002000011010c4c706f6c796d6573685f7072696d697469766573186364645f6964144364644964000004000401205b75383b2033325d000015010c4c706f6c796d6573685f7072696d697469766573306a7572697364696374696f6e2c436f756e747279436f64650001e90308414600000008415800010008414c00020008445a00030008415300040008414400050008414f000600084149000700084151000800084147000900084152000a0008414d000b00084157000c00084155000d00084154000e0008415a000f0008425300100008424800110008424400120008424200130008425900140008424500150008425a00160008424a00170008424d00180008425400190008424f001a00084241001b00084257001c00084256001d00084252001e00085647001f0008494f00200008424e002100084247002200084246002300084249002400084b4800250008434d002600084341002700084356002800084b59002900084346002a00085444002b0008434c002c0008434e002d0008484b002e00084d4f002f0008435800300008434300310008434f003200084b4d00330008434700340008434400350008434b003600084352003700084349003800084852003900084355003a00084359003b0008435a003c0008444b003d0008444a003e0008444d003f0008444f00400008454300410008454700420008535600430008475100440008455200450008454500460008455400470008464b00480008464f00490008464a004a00084649004b00084652004c00084746004d00085046004e00085446004f0008474100500008474d00510008474500520008444500530008474800540008474900550008475200560008474c005700084744005800084750005900084755005a00084754005b00084747005c0008474e005d00084757005e00084759005f0008485400600008484d00610008564100620008484e00630008485500640008495300650008494e006600084944006700084952006800084951006900084945006a0008494d006b0008494c006c00084954006d00084a4d006e00084a50006f00084a45007000084a4f007100084b5a007200084b45007300084b49007400084b50007500084b52007600084b57007700084b47007800084c41007900084c56007a00084c42007b00084c53007c00084c52007d00084c59007e00084c49007f00084c54008000084c55008100084d4b008200084d47008300084d57008400084d59008500084d56008600084d4c008700084d54008800084d48008900084d51008a00084d52008b00084d55008c00085954008d00084d58008e0008464d008f00084d44009000084d43009100084d4e009200084d45009300084d53009400084d41009500084d5a009600084d4d009700084e41009800084e52009900084e50009a00084e4c009b0008414e009c00084e43009d00084e5a009e00084e49009f00084e4500a000084e4700a100084e5500a200084e4600a300084d5000a400084e4f00a500084f4d00a60008504b00a70008505700a80008505300a90008504100aa0008504700ab0008505900ac0008504500ad0008504800ae0008504e00af0008504c00b00008505400b10008505200b20008514100b30008524500b40008524f00b50008525500b60008525700b70008424c00b80008534800b900084b4e00ba00084c4300bb00084d4600bc0008504d00bd0008564300be0008575300bf0008534d00c00008535400c10008534100c20008534e00c30008525300c40008534300c50008534c00c60008534700c70008534b00c80008534900c90008534200ca0008534f00cb00085a4100cc0008475300cd0008535300ce0008455300cf00084c4b00d00008534400d10008535200d20008534a00d30008535a00d40008534500d50008434800d60008535900d70008545700d80008544a00d90008545a00da0008544800db0008544c00dc0008544700dd0008544b00de0008544f00df0008545400e00008544e00e10008545200e20008544d00e30008544300e40008545600e50008554700e60008554100e70008414500e80008474200e90008555300ea0008554d00eb0008555900ec0008555a00ed0008565500ee0008564500ef0008564e00f00008564900f10008574600f20008454800f30008594500f400085a4d00f500085a5700f60008425100f70008435700f80008535800f9000019010c4c706f6c796d6573685f7072696d697469766573386964656e746974795f636c61696d44437573746f6d436c61696d5479706549640000040010010c75333200001d0104184f7074696f6e040454010d010108104e6f6e6500000010536f6d6504000d01000001000021010c4c706f6c796d6573685f7072696d697469766573187469636b6572185469636b657200000400250101405b75383b205449434b45525f4c454e5d000025010000030c0000000800290104184f7074696f6e04045401000108104e6f6e6500000010536f6d6504000000000100002d010c4c706f6c796d6573685f7072696d69746976657334617574686f72697a6174696f6e44417574686f72697a6174696f6e4461746104244163636f756e74496401000128604174746573745072696d6172794b6579526f746174696f6e04008001284964656e74697479496400000040526f746174655072696d6172794b6579000100385472616e736665725469636b65720400210101185469636b6572000200444164644d756c74695369675369676e657204000001244163636f756e744964000300585472616e7366657241737365744f776e6572736869700400a8011c41737365744944000400304a6f696e4964656e746974790400a0012c5065726d697373696f6e7300050040506f7274666f6c696f437573746f64790400e8012c506f7274666f6c696f49640006002c4265636f6d654167656e740800a8011c417373657449440000310101284167656e7447726f75700007004c41646452656c61796572506179696e674b65790c000001244163636f756e74496400000001244163636f756e744964000018011c42616c616e63650008006c526f746174655072696d6172794b6579546f5365636f6e646172790400a0012c5065726d697373696f6e730009000031010c4c706f6c796d6573685f7072696d697469766573146167656e74284167656e7447726f75700001141046756c6c00000018437573746f6d04003501011041474964000100284578636570744d65746100020034506f6c796d657368563143414100030034506f6c796d65736856315049410004000035010c4c706f6c796d6573685f7072696d697469766573146167656e7410414749640000040010010c7533320000390100000500003d011064706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573187472616974731467726f7570205261774576656e740c244163636f756e74496401003052756e74696d654576656e74014c0449014101011c2c4d656d626572416464656408008001284964656e74697479496400008001284964656e746974794964000008e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e6c63616c6c6572204449442c204e6577206d656d626572204449442e344d656d62657252656d6f76656408008001284964656e74697479496400008001284964656e746974794964000108e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2ea063616c6c6572204449442c206d656d626572204449442074686174206765742072656d6f7665642e344d656d6265725265766f6b656408008001284964656e74697479496400008001284964656e746974794964000208e454686520676976656e206d656d62657220686173206265656e207265766f6b65642061742073706563696669632074696d652d7374616d702ea063616c6c6572204449442c206d656d62657220444944207468617420676574207265766f6b65642e384d656d62657273537761707065640c008001284964656e74697479496400008001284964656e74697479496400008001284964656e746974794964000308d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e9463616c6c6572204449442c2052656d6f766564204449442c204e657720616464204449442e304d656d62657273526573657408008001284964656e74697479496400004501013c5665633c4964656e7469747949643e0004081501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e8063616c6c6572204449442c204c697374206f66206e6577206d656d626572732e484163746976654c696d69744368616e6765640c008001284964656e746974794964000010012c4d656d626572436f756e74000010012c4d656d626572436f756e740005042d01546865206c696d6974206f6620686f77206d616e7920616374697665206d656d626572732074686572652063616e20626520636f6e63757272656e746c7920776173206368616e6765642e1444756d6d790006046c5068616e746f6d206d656d6265722c206e6576657220757365642e085c4576656e747320666f722074686973206d6f64756c652e004101083070616c6c65745f67726f757024496e7374616e63653200000000450100000280004901084070616c6c65745f636f6d6d6974746565205261774576656e740c1048617368012c2c426c6f636b4e756d62657201100449014d0101282050726f706f7365640c008001284964656e746974794964000010013450726f706f73616c496e64657800002c011048617368000008890141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292ed8506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20696e6465782c2070726f706f73616c20686173682e14566f7465641c008001284964656e746974794964000010013450726f706f73616c496e64657800002c011048617368000039010110626f6f6c000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400010c050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e674901612074616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e950163616c6c6572204449442c2050726f706f73616c20696e6465782c2050726f706f73616c20686173682c2063757272656e7420766f74652c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e34566f746552657472616374656410008001284964656e746974794964000010013450726f706f73616c496e64657800002c011048617368000039010110626f6f6c000208cc4120766f7465206f6e2061206d6f74696f6e2028676976656e20686173682920686173206265656e207265747261637465642e050163616c6c6572204449442c2050726f706f73616c496e6465782c2050726f706f73616c20686173682c20766f7465207468617420776173207265747261637465642846696e616c566f74657314007c01484f7074696f6e3c4964656e7469747949643e000010013450726f706f73616c496e64657800002c01104861736800004501013c5665633c4964656e7469747949643e00004501013c5665633c4964656e7469747949643e0003089046696e616c20766f746573206f6e2061206d6f74696f6e2028676976656e206861736829f863616c6c6572204449442c2050726f706f73616c496e6465782c2050726f706f73616c20686173682c2079657320766f746572732c206e6f20766f74657220417070726f76656414007c01484f7074696f6e3c4964656e7469747949643e00002c011048617368000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400040c090141206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c6420776974682074686520666f6c6c6f77696e67410174616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e2052656a656374656414007c01484f7074696f6e3c4964656e7469747949643e00002c011048617368000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400050c090141206d6f74696f6e207761732072656a656374656420627920746865207265717569726564207468726573686f6c6420776974682074686520666f6c6c6f77696e67410174616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e2045786563757465640c007c01484f7074696f6e3c4964656e7469747949643e00002c0110486173680000510101384469737061746368526573756c74000608390141206d6f74696f6e207761732065786563757465643b20604469737061746368526573756c746020697320604f6b28282929602069662072657475726e656420776974686f7574206572726f722e0d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c20726573756c74206f662070726f706f73616c2064697370617463682e6452656c65617365436f6f7264696e61746f725570646174656404007c01484f7074696f6e3c4964656e7469747949643e0007089452656c6561736520636f6f7264696e61746f7220686173206265656e20757064617465642eac506172616d65746572733a20444944206f66207468652072656c6561736520636f6f7264696e61746f722e4c4578706972657341667465725570646174656408008001284964656e74697479496400005901015c4d61796265426c6f636b3c426c6f636b4e756d6265723e0008089850726f706f73616c206578706972792074696d6520686173206265656e20757064617465642ec4506172616d65746572733a2063616c6c6572204449442c206e6577206578706972792074696d652028696620616e79292e50566f74655468726573686f6c64557064617465640c008001284964656e746974794964000010010c753332000010010c75333200090884566f74696e67207468726573686f6c6420686173206265656e2075706461746564b8506172616d65746572733a2063616c6c6572204449442c206e756d657261746f722c2064656e6f6d696e61746f72085c4576656e747320666f722074686973206d6f64756c652e004d01084070616c6c65745f636f6d6d697474656524496e7374616e6365310000000051010418526573756c74080454015501044501600108084f6b04005501000000000c45727204006000000100005501000004000059010864706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573284d61796265426c6f636b042c426c6f636b4e756d6265720110010810536f6d65040010012c426c6f636b4e756d626572000000104e6f6e65000100005d011064706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573187472616974731467726f7570205261774576656e740c244163636f756e74496401003052756e74696d654576656e74014c0449016101011c2c4d656d626572416464656408008001284964656e74697479496400008001284964656e746974794964000008e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e6c63616c6c6572204449442c204e6577206d656d626572204449442e344d656d62657252656d6f76656408008001284964656e74697479496400008001284964656e746974794964000108e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2ea063616c6c6572204449442c206d656d626572204449442074686174206765742072656d6f7665642e344d656d6265725265766f6b656408008001284964656e74697479496400008001284964656e746974794964000208e454686520676976656e206d656d62657220686173206265656e207265766f6b65642061742073706563696669632074696d652d7374616d702ea063616c6c6572204449442c206d656d62657220444944207468617420676574207265766f6b65642e384d656d62657273537761707065640c008001284964656e74697479496400008001284964656e74697479496400008001284964656e746974794964000308d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e9463616c6c6572204449442c2052656d6f766564204449442c204e657720616464204449442e304d656d62657273526573657408008001284964656e74697479496400004501013c5665633c4964656e7469747949643e0004081501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e8063616c6c6572204449442c204c697374206f66206e6577206d656d626572732e484163746976654c696d69744368616e6765640c008001284964656e746974794964000010012c4d656d626572436f756e74000010012c4d656d626572436f756e740005042d01546865206c696d6974206f6620686f77206d616e7920616374697665206d656d626572732074686572652063616e20626520636f6e63757272656e746c7920776173206368616e6765642e1444756d6d790006046c5068616e746f6d206d656d6265722c206e6576657220757365642e085c4576656e747320666f722074686973206d6f64756c652e006101083070616c6c65745f67726f757024496e7374616e636531000000006501084070616c6c65745f636f6d6d6974746565205261774576656e740c1048617368012c2c426c6f636b4e756d6265720110044901690101282050726f706f7365640c008001284964656e746974794964000010013450726f706f73616c496e64657800002c011048617368000008890141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292ed8506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20696e6465782c2070726f706f73616c20686173682e14566f7465641c008001284964656e746974794964000010013450726f706f73616c496e64657800002c011048617368000039010110626f6f6c000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400010c050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e674901612074616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e950163616c6c6572204449442c2050726f706f73616c20696e6465782c2050726f706f73616c20686173682c2063757272656e7420766f74652c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e34566f746552657472616374656410008001284964656e746974794964000010013450726f706f73616c496e64657800002c011048617368000039010110626f6f6c000208cc4120766f7465206f6e2061206d6f74696f6e2028676976656e20686173682920686173206265656e207265747261637465642e050163616c6c6572204449442c2050726f706f73616c496e6465782c2050726f706f73616c20686173682c20766f7465207468617420776173207265747261637465642846696e616c566f74657314007c01484f7074696f6e3c4964656e7469747949643e000010013450726f706f73616c496e64657800002c01104861736800004501013c5665633c4964656e7469747949643e00004501013c5665633c4964656e7469747949643e0003089046696e616c20766f746573206f6e2061206d6f74696f6e2028676976656e206861736829f863616c6c6572204449442c2050726f706f73616c496e6465782c2050726f706f73616c20686173682c2079657320766f746572732c206e6f20766f74657220417070726f76656414007c01484f7074696f6e3c4964656e7469747949643e00002c011048617368000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400040c090141206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c6420776974682074686520666f6c6c6f77696e67410174616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e2052656a656374656414007c01484f7074696f6e3c4964656e7469747949643e00002c011048617368000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400050c090141206d6f74696f6e207761732072656a656374656420627920746865207265717569726564207468726573686f6c6420776974682074686520666f6c6c6f77696e67410174616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e2045786563757465640c007c01484f7074696f6e3c4964656e7469747949643e00002c0110486173680000510101384469737061746368526573756c74000608390141206d6f74696f6e207761732065786563757465643b20604469737061746368526573756c746020697320604f6b28282929602069662072657475726e656420776974686f7574206572726f722e0d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c20726573756c74206f662070726f706f73616c2064697370617463682e6452656c65617365436f6f7264696e61746f725570646174656404007c01484f7074696f6e3c4964656e7469747949643e0007089452656c6561736520636f6f7264696e61746f7220686173206265656e20757064617465642eac506172616d65746572733a20444944206f66207468652072656c6561736520636f6f7264696e61746f722e4c4578706972657341667465725570646174656408008001284964656e74697479496400005901015c4d61796265426c6f636b3c426c6f636b4e756d6265723e0008089850726f706f73616c206578706972792074696d6520686173206265656e20757064617465642ec4506172616d65746572733a2063616c6c6572204449442c206e6577206578706972792074696d652028696620616e79292e50566f74655468726573686f6c64557064617465640c008001284964656e746974794964000010010c753332000010010c75333200090884566f74696e67207468726573686f6c6420686173206265656e2075706461746564b8506172616d65746572733a2063616c6c6572204449442c206e756d657261746f722c2064656e6f6d696e61746f72085c4576656e747320666f722074686973206d6f64756c652e006901084070616c6c65745f636f6d6d697474656524496e7374616e636533000000006d011064706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573187472616974731467726f7570205261774576656e740c244163636f756e74496401003052756e74696d654576656e74014c0449017101011c2c4d656d626572416464656408008001284964656e74697479496400008001284964656e746974794964000008e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e6c63616c6c6572204449442c204e6577206d656d626572204449442e344d656d62657252656d6f76656408008001284964656e74697479496400008001284964656e746974794964000108e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2ea063616c6c6572204449442c206d656d626572204449442074686174206765742072656d6f7665642e344d656d6265725265766f6b656408008001284964656e74697479496400008001284964656e746974794964000208e454686520676976656e206d656d62657220686173206265656e207265766f6b65642061742073706563696669632074696d652d7374616d702ea063616c6c6572204449442c206d656d62657220444944207468617420676574207265766f6b65642e384d656d62657273537761707065640c008001284964656e74697479496400008001284964656e74697479496400008001284964656e746974794964000308d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e9463616c6c6572204449442c2052656d6f766564204449442c204e657720616464204449442e304d656d62657273526573657408008001284964656e74697479496400004501013c5665633c4964656e7469747949643e0004081501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e8063616c6c6572204449442c204c697374206f66206e6577206d656d626572732e484163746976654c696d69744368616e6765640c008001284964656e746974794964000010012c4d656d626572436f756e74000010012c4d656d626572436f756e740005042d01546865206c696d6974206f6620686f77206d616e7920616374697665206d656d626572732074686572652063616e20626520636f6e63757272656e746c7920776173206368616e6765642e1444756d6d790006046c5068616e746f6d206d656d6265722c206e6576657220757365642e085c4576656e747320666f722074686973206d6f64756c652e007101083070616c6c65745f67726f757024496e7374616e636533000000007501084070616c6c65745f636f6d6d6974746565205261774576656e740c1048617368012c2c426c6f636b4e756d6265720110044901790101282050726f706f7365640c008001284964656e746974794964000010013450726f706f73616c496e64657800002c011048617368000008890141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292ed8506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20696e6465782c2070726f706f73616c20686173682e14566f7465641c008001284964656e746974794964000010013450726f706f73616c496e64657800002c011048617368000039010110626f6f6c000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400010c050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e674901612074616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e950163616c6c6572204449442c2050726f706f73616c20696e6465782c2050726f706f73616c20686173682c2063757272656e7420766f74652c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e34566f746552657472616374656410008001284964656e746974794964000010013450726f706f73616c496e64657800002c011048617368000039010110626f6f6c000208cc4120766f7465206f6e2061206d6f74696f6e2028676976656e20686173682920686173206265656e207265747261637465642e050163616c6c6572204449442c2050726f706f73616c496e6465782c2050726f706f73616c20686173682c20766f7465207468617420776173207265747261637465642846696e616c566f74657314007c01484f7074696f6e3c4964656e7469747949643e000010013450726f706f73616c496e64657800002c01104861736800004501013c5665633c4964656e7469747949643e00004501013c5665633c4964656e7469747949643e0003089046696e616c20766f746573206f6e2061206d6f74696f6e2028676976656e206861736829f863616c6c6572204449442c2050726f706f73616c496e6465782c2050726f706f73616c20686173682c2079657320766f746572732c206e6f20766f74657220417070726f76656414007c01484f7074696f6e3c4964656e7469747949643e00002c011048617368000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400040c090141206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c6420776974682074686520666f6c6c6f77696e67410174616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e2052656a656374656414007c01484f7074696f6e3c4964656e7469747949643e00002c011048617368000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400050c090141206d6f74696f6e207761732072656a656374656420627920746865207265717569726564207468726573686f6c6420776974682074686520666f6c6c6f77696e67410174616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e2045786563757465640c007c01484f7074696f6e3c4964656e7469747949643e00002c0110486173680000510101384469737061746368526573756c74000608390141206d6f74696f6e207761732065786563757465643b20604469737061746368526573756c746020697320604f6b28282929602069662072657475726e656420776974686f7574206572726f722e0d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c20726573756c74206f662070726f706f73616c2064697370617463682e6452656c65617365436f6f7264696e61746f725570646174656404007c01484f7074696f6e3c4964656e7469747949643e0007089452656c6561736520636f6f7264696e61746f7220686173206265656e20757064617465642eac506172616d65746572733a20444944206f66207468652072656c6561736520636f6f7264696e61746f722e4c4578706972657341667465725570646174656408008001284964656e74697479496400005901015c4d61796265426c6f636b3c426c6f636b4e756d6265723e0008089850726f706f73616c206578706972792074696d6520686173206265656e20757064617465642ec4506172616d65746572733a2063616c6c6572204449442c206e6577206578706972792074696d652028696620616e79292e50566f74655468726573686f6c64557064617465640c008001284964656e746974794964000010010c753332000010010c75333200090884566f74696e67207468726573686f6c6420686173206265656e2075706461746564b8506172616d65746572733a2063616c6c6572204449442c206e756d657261746f722c2064656e6f6d696e61746f72085c4576656e747320666f722074686973206d6f64756c652e007901084070616c6c65745f636f6d6d697474656524496e7374616e636534000000007d011064706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573187472616974731467726f7570205261774576656e740c244163636f756e74496401003052756e74696d654576656e74014c0449018101011c2c4d656d626572416464656408008001284964656e74697479496400008001284964656e746974794964000008e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e6c63616c6c6572204449442c204e6577206d656d626572204449442e344d656d62657252656d6f76656408008001284964656e74697479496400008001284964656e746974794964000108e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2ea063616c6c6572204449442c206d656d626572204449442074686174206765742072656d6f7665642e344d656d6265725265766f6b656408008001284964656e74697479496400008001284964656e746974794964000208e454686520676976656e206d656d62657220686173206265656e207265766f6b65642061742073706563696669632074696d652d7374616d702ea063616c6c6572204449442c206d656d62657220444944207468617420676574207265766f6b65642e384d656d62657273537761707065640c008001284964656e74697479496400008001284964656e74697479496400008001284964656e746974794964000308d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e9463616c6c6572204449442c2052656d6f766564204449442c204e657720616464204449442e304d656d62657273526573657408008001284964656e74697479496400004501013c5665633c4964656e7469747949643e0004081501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e8063616c6c6572204449442c204c697374206f66206e6577206d656d626572732e484163746976654c696d69744368616e6765640c008001284964656e746974794964000010012c4d656d626572436f756e74000010012c4d656d626572436f756e740005042d01546865206c696d6974206f6620686f77206d616e7920616374697665206d656d626572732074686572652063616e20626520636f6e63757272656e746c7920776173206368616e6765642e1444756d6d790006046c5068616e746f6d206d656d6265722c206e6576657220757365642e085c4576656e747320666f722074686973206d6f64756c652e008101083070616c6c65745f67726f757024496e7374616e6365340000000085010c3c70616c6c65745f6d756c74697369671870616c6c6574144576656e740404540001383c4d756c74695369674372656174656414012863616c6c65725f6469648001284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e74496400011863616c6c6572000130543a3a4163636f756e74496400011c7369676e6572738901019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e000134736967735f726571756972656428010c7536340000047041204d756c746973696720686173206265656e20637265617465642e3450726f706f73616c41646465640c012863616c6c65725f6469647c01484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e74496400012c70726f706f73616c5f696428010c7536340001049441204d756c74697369672070726f706f73616c20686173206265656e20637265617465642e4050726f706f73616c457865637574656410012863616c6c65725f6469647c01484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e74496400012c70726f706f73616c5f696428010c753634000118726573756c74510101384469737061746368526573756c740002049841204d756c74697369672070726f706f73616c20686173206265656e2065786563757465642e4c4d756c74695369675369676e657241646465640c012863616c6c65725f6469648001284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e7449640001187369676e6572000130543a3a4163636f756e744964000304a841206e6577207369676e657220686173206265656e20616464656420746f2061204d756c74697369672e644d756c74695369675369676e657273417574686f72697a65640c012863616c6c65725f6469648001284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e74496400011c7369676e6572738901019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e000404e84e6577206b6579732068617665206265656e20617574686f72697a656420746f206265207369676e657273206f6e2061204d756c74697369672e584d756c74695369675369676e65727352656d6f7665640c012863616c6c65725f6469648001284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e74496400011c7369676e6572738901019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e000504a85369676e6572732068617665206265656e2072656d6f7665642066726f6d2061204d756c74697369672e784d756c74695369675369676e65727352657175697265644368616e6765640c012863616c6c65725f6469647c01484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e744964000134736967735f726571756972656428010c753634000604e041204d756c746973696720686173206368616e67656420697473207265717569726564206e756d626572206f6620617070726f76616c732e5050726f706f73616c417070726f76616c566f746510012863616c6c65725f6469647c01484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e7449640001187369676e6572000130543a3a4163636f756e74496400012c70726f706f73616c5f696428010c753634000704c841207369676e65722068617320766f74656420746f20617070726f76652061204d756c74697369672070726f706f73616c2e5450726f706f73616c52656a656374696f6e566f746510012863616c6c65725f6469647c01484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e7449640001187369676e6572000130543a3a4163636f756e74496400012c70726f706f73616c5f696428010c753634000804c441207369676e65722068617320766f74656420746f2072656a6563742061204d756c74697369672070726f706f73616c2e4050726f706f73616c417070726f7665640c012863616c6c65725f6469647c01484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e74496400012c70726f706f73616c5f696428010c7536340009049841204d756c74697369672070726f706f73616c20686173206265656e20617070726f7665642e4050726f706f73616c52656a65637465640c012863616c6c65725f6469647c01484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e74496400012c70726f706f73616c5f696428010c753634000a049841204d756c74697369672070726f706f73616c20686173206265656e2072656a65637465642e484d756c7469536967416464656441646d696e0c012863616c6c65725f6469648001284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e74496400012461646d696e5f6469648001284964656e746974794964000b048841204d756c74697369672068617320616464656420616e2061646d696e204449442e504d756c746953696752656d6f76656441646d696e0c012863616c6c65725f6469648001284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e74496400012461646d696e5f6469648001284964656e746974794964000c049841204d756c7469736967206861732072656d6f76656420697427732061646d696e204449442e604d756c746953696752656d6f766564506179696e674469640c012863616c6c65725f6469648001284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e744964000128706179696e675f6469648001284964656e746974794964000d049c41204d756c7469736967206861732072656d6f766564206974277320706179696e67204449442e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090989010c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e6465645665630804540100045300000400fc01185665633c543e00008d01103870616c6c65745f7374616b696e671870616c6c65741870616c6c6574144576656e740404540001581c457261506169640c01246572615f696e646578100120457261496e64657800014076616c696461746f725f7061796f757418013042616c616e63654f663c543e00012472656d61696e64657218013042616c616e63654f663c543e000008550154686520657261207061796f757420686173206265656e207365743b207468652066697273742062616c616e6365206973207468652076616c696461746f722d7061796f75743b20746865207365636f6e64206973c07468652072656d61696e6465722066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642e2052657761726465640c01206964656e746974798001284964656e7469747949640001147374617368000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000104bc546865206e6f6d696e61746f7220686173206265656e207265776172646564206279207468697320616d6f756e742e1c536c61736865640801187374616b6572000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e0002041d0141207374616b6572202876616c696461746f72206f72206e6f6d696e61746f722920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e34536c6173685265706f727465640c012476616c696461746f72000130543a3a4163636f756e7449640001206672616374696f6e9101011c50657262696c6c000124736c6173685f657261100120457261496e64657800030859014120736c61736820666f722074686520676976656e2076616c696461746f722c20666f722074686520676976656e2070657263656e74616765206f66207468656972207374616b652c2061742074686520676976656e54657261206173206265656e207265706f727465642e684f6c64536c617368696e675265706f727444697363617264656404013473657373696f6e5f696e64657810013053657373696f6e496e6465780004081901416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c64446e6f742062652070726f6365737365642e385374616b657273456c65637465640005048441206e657720736574206f66207374616b6572732077617320656c65637465642e18426f6e6465640c01206964656e746974798001284964656e7469747949640001147374617368000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000610d0416e206163636f756e742068617320626f6e646564207468697320616d6f756e742e205c5b73746173682c20616d6f756e745c5d004d014e4f54453a2054686973206576656e74206973206f6e6c7920656d6974746564207768656e2066756e64732061726520626f6e64656420766961206120646973706174636861626c652e204e6f7461626c792c210169742077696c6c206e6f7420626520656d697474656420666f72207374616b696e672072657761726473207768656e20746865792061726520616464656420746f207374616b652e20556e626f6e6465640c01206964656e746974798001284964656e7469747949640001147374617368000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e00070490416e206163636f756e742068617320756e626f6e646564207468697320616d6f756e742e2457697468647261776e0801147374617368000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e0008085901416e206163636f756e74206861732063616c6c6564206077697468647261775f756e626f6e6465646020616e642072656d6f76656420756e626f6e64696e67206368756e6b7320776f727468206042616c616e6365606466726f6d2074686520756e6c6f636b696e672071756575652e184b69636b65640801246e6f6d696e61746f72000130543a3a4163636f756e7449640001147374617368000130543a3a4163636f756e744964000904b441206e6f6d696e61746f7220686173206265656e206b69636b65642066726f6d20612076616c696461746f722e545374616b696e67456c656374696f6e4661696c6564000a04ac54686520656c656374696f6e206661696c65642e204e6f206e65772065726120697320706c616e6e65642e1c4368696c6c65640401147374617368000130543a3a4163636f756e744964000b042101416e206163636f756e74206861732073746f707065642070617274696369706174696e672061732065697468657220612076616c696461746f72206f72206e6f6d696e61746f722e345061796f7574537461727465640801246572615f696e646578100120457261496e64657800013c76616c696461746f725f7374617368000130543a3a4163636f756e744964000c0498546865207374616b657273272072657761726473206172652067657474696e6720706169642e4456616c696461746f7250726566735365740801147374617368000130543a3a4163636f756e74496400011470726566739501013856616c696461746f725072656673000d0498412076616c696461746f72206861732073657420746865697220707265666572656e6365732e20466f7263654572610401106d6f64659d01011c466f7263696e67000e047441206e657720666f72636520657261206d6f646520776173207365742e244e6f6d696e617465640c01486e6f6d696e61746f725f6964656e746974798001284964656e7469747949640001147374617368000130543a3a4163636f756e74496400011c74617267657473fc01445665633c543a3a4163636f756e7449643e000f048c55736572206861732075706461746564207468656972206e6f6d696e6174696f6e732e645065726d697373696f6e65644964656e74697479416464656408015c676f7665726e616e63655f636f756e63696c6c5f6469648001284964656e74697479496400014c76616c696461746f72735f6964656e746974798001284964656e746974794964001004f0416e206964656e74697479206861732069737375656420612063616e64696461637920666f72206265636f6d696e6720612076616c696461746f722e6c5065726d697373696f6e65644964656e7469747952656d6f76656408015c676f7665726e616e63655f636f756e63696c6c5f6469648001284964656e74697479496400014c76616c696461746f72735f6964656e746974798001284964656e7469747949640011040d01416e206964656e7469747920686173206265656e2072656d6f7665642066726f6d20746865207065726d697373696f6e6564206964656e74697469657320706f6f6c2e54496e76616c6964617465644e6f6d696e61746f72730c015c676f7665726e616e63655f636f756e63696c6c5f6469648001284964656e74697479496400016c676f7665726e616e63655f636f756e63696c6c5f6163636f756e748001284964656e746974794964000148657870697265645f6e6f6d696e61746f7273fc01445665633c543a3a4163636f756e7449643e0012041d0152656d6f766520746865206e6f6d696e61746f72732066726f6d207468652076616c6964206e6f6d696e61746f7273207768656e2074686572652043444420657870697265642e64536c617368696e67416c6c6f776564466f724368616e67656404013c736c617368696e675f737769746368a1010138536c617368696e6753776974636800130488536c617368696e6720616c6c6f77656420686173206265656e20757064617465642e885265776172645061796d656e745363686564756c696e67496e7465727275707465640c01286163636f756e745f6964000130543a3a4163636f756e74496400010c657261100120457261496e6465780001146572726f7260013444697370617463684572726f7200140478526577617264207363686564756c696e6720696e7465727275707465642e50436f6d6d697373696f6e436170557064617465640c015c676f7665726e616e63655f636f756e63696c6c5f6469648001284964656e7469747949640001486f6c645f636f6d6d697373696f6e5f6361709101011c50657262696c6c0001486e65775f636f6d6d697373696f6e5f6361709101011c50657262696c6c00150480436f6d6d697373696f6e2063617020686173206265656e20757064617465642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090991010c3473705f61726974686d65746963287065725f7468696e67731c50657262696c6c0000040010010c75333200009501083870616c6c65745f7374616b696e673856616c696461746f7250726566730000080128636f6d6d697373696f6e9901011c50657262696c6c00011c626c6f636b656439010110626f6f6c000099010000069101009d01083870616c6c65745f7374616b696e671c466f7263696e67000110284e6f74466f7263696e6700000020466f7263654e657700010024466f7263654e6f6e650002002c466f726365416c7761797300030000a1010c3870616c6c65745f7374616b696e6714747970657338536c617368696e6753776974636800010c2456616c696461746f720000005456616c696461746f72416e644e6f6d696e61746f72000100104e6f6e6500020000a5010c3c70616c6c65745f6f6666656e6365731870616c6c6574144576656e740001041c4f6666656e63650801106b696e64ac01104b696e6400012074696d65736c6f743001384f706171756554696d65536c6f7400000c5101546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e643501286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e4c5c5b6b696e642c2074696d65736c6f745c5d2e04304576656e747320747970652ea9010c3870616c6c65745f73657373696f6e1870616c6c6574144576656e74000104284e657753657373696f6e04013473657373696f6e5f696e64657810013053657373696f6e496e64657800000839014e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f74207468659c626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909ad010c3870616c6c65745f6772616e6470611870616c6c6574144576656e7400010c384e6577417574686f726974696573040134617574686f726974795f736574b1010134417574686f726974794c6973740000048c4e657720617574686f726974792073657420686173206265656e206170706c6965642e185061757365640001049843757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640002049c43757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909b101000002b50100b50100000408b9012800b9010c5073705f636f6e73656e7375735f6772616e6470610c617070185075626c696300000400bd01013c656432353531393a3a5075626c69630000bd010c1c73705f636f72651c65643235353139185075626c6963000004000401205b75383b2033325d0000c1010c4070616c6c65745f696d5f6f6e6c696e651870616c6c6574144576656e7404045400010c444865617274626561745265636569766564040130617574686f726974795f6964c5010138543a3a417574686f726974794964000004c041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f726974794964602e1c416c6c476f6f64000104d041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504011c6f66666c696e65cd01016c5665633c4964656e74696669636174696f6e5475706c653c543e3e000204290141742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e652076616c696461746f722077617320666f756e6420746f206265206f66666c696e652e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909c501104070616c6c65745f696d5f6f6e6c696e651c737232353531392c6170705f73723235353139185075626c696300000400c901013c737232353531393a3a5075626c69630000c9010c1c73705f636f72651c73723235353139185075626c6963000004000401205b75383b2033325d0000cd01000002d10100d1010000040800d50100d501083870616c6c65745f7374616b696e67204578706f7375726508244163636f756e74496401001c42616c616e63650118000c0114746f74616cd901011c42616c616e636500010c6f776ed901011c42616c616e63650001186f7468657273dd0101ac5665633c496e646976696475616c4578706f737572653c4163636f756e7449642c2042616c616e63653e3e0000d9010000061800dd01000002e10100e101083870616c6c65745f7374616b696e6748496e646976696475616c4578706f7375726508244163636f756e74496401001c42616c616e636501180008010c77686f0001244163636f756e74496400011476616c7565d901011c42616c616e63650000e501082c70616c6c65745f7375646f205261774576656e7404244163636f756e7449640100010c1453756469640400510101384469737061746368526573756c740000048841207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d284b65794368616e6765640400290101444f7074696f6e3c4163636f756e7449643e000104fc546865205c5b7375646f65725c5d206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e285375646f4173446f6e650400510101384469737061746368526573756c740002048841207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d085c4576656e747320666f722074686973206d6f64756c652e00e9011064706f6c796d6573685f636f6d6d6f6e5f7574696c697469657318747261697473146173736574205261774576656e7404184d6f6d656e74012801783041737365744372656174656420008001284964656e7469747949640000a8011c41737365744944000039010110626f6f6c0000ed01012441737365745479706500008001284964656e7469747949640000f901012441737365744e616d650000fd0101505665633c41737365744964656e7469666965723e00000d0201604f7074696f6e3c46756e64696e67526f756e644e616d653e000008804576656e7420666f72206372656174696f6e206f66207468652061737365742ec50163616c6c6572204449442f206f776e6572204449442c20417373657449442c2064697669736962696c6974792c20617373657420747970652c2062656e6566696369617279204449442c206173736574206e616d652c206964656e746966696572732c2066756e64696e6720726f756e64484964656e74696669657273557064617465640c008001284964656e7469747949640000a8011c417373657449440000fd0101505665633c41737365744964656e7469666965723e000108d44576656e7420656d6974746564207768656e20616e7920746f6b656e206964656e746966696572732061726520757064617465642e110163616c6c6572204449442c20417373657449442c206120766563746f72206f6620286964656e74696669657220747970652c206964656e7469666965722076616c7565294c44697669736962696c6974794368616e6765640c008001284964656e7469747949640000a8011c41737365744944000039010110626f6f6c000208844576656e7420666f72206368616e676520696e2064697669736962696c6974792e8463616c6c6572204449442c20417373657449442c2064697669736962696c697479405469636b6572526567697374657265640c008001284964656e7469747949640000210101185469636b65720000050101384f7074696f6e3c4d6f6d656e743e0003087c456d6974207768656e207469636b657220697320726567697374657265642eec63616c6c657220444944202f207469636b6572206f776e6572206469642c207469636b65722c207469636b6572206f776e65722c20657870697279445469636b65725472616e736665727265640c008001284964656e7469747949640000210101185469636b657200008001284964656e74697479496400040880456d6974207768656e207469636b6572206973207472616e736665727265642ed063616c6c657220444944202f207469636b6572207472616e7366657272656420746f204449442c207469636b65722c2066726f6d6441737365744f776e6572736869705472616e736665727265640c008001284964656e7469747949640000a8011c4173736574494400008001284964656e746974794964000508a4456d6974207768656e20746f6b656e206f776e657273686970206973207472616e736665727265642ef863616c6c657220444944202f20746f6b656e206f776e657273686970207472616e7366657272656420746f204449442c20417373657449442c2066726f6d2c417373657446726f7a656e08008001284964656e7469747949640000a8011c41737365744944000608a4416e206576656e7420656d6974746564207768656e20616e2061737365742069732066726f7a656e2e7c506172616d657465723a2063616c6c6572204449442c20417373657449442e344173736574556e66726f7a656e08008001284964656e7469747949640000a8011c41737365744944000708ac416e206576656e7420656d6974746564207768656e20616e20617373657420697320756e66726f7a656e2e7c506172616d657465723a2063616c6c6572204449442c20417373657449442e30417373657452656e616d65640c008001284964656e7469747949640000a8011c417373657449440000f901012441737365744e616d65000808a4416e206576656e7420656d6974746564207768656e206120746f6b656e2069732072656e616d65642ec0506172616d65746572733a2063616c6c6572204449442c20417373657449442c206e657720746f6b656e206e616d652e3c46756e64696e67526f756e645365740c008001284964656e7469747949640000a8011c4173736574494400001102014046756e64696e67526f756e644e616d650009081101416e206576656e74206361727279696e6720746865206e616d65206f66207468652063757272656e742066756e64696e6720726f756e64206f6620616e2061737365742ed0506172616d65746572733a2063616c6c6572204449442c20417373657449442c2066756e64696e6720726f756e64206e616d652e34446f63756d656e74416464656410008001284964656e7469747949640000a8011c41737365744944000015020128446f63756d656e744964000019020120446f63756d656e74000a048c41206e657720646f63756d656e7420617474616368656420746f20616e2061737365743c446f63756d656e7452656d6f7665640c008001284964656e7469747949640000a8011c41737365744944000015020128446f63756d656e744964000b04804120646f63756d656e742072656d6f7665642066726f6d20616e20617373657448436f6e74726f6c6c65725472616e7366657210008001284964656e7469747949640000a8011c417373657449440000e8012c506f7274666f6c696f4964000018011c42616c616e6365000c08b44576656e7420666f72207768656e206120666f72636564207472616e736665722074616b657320706c6163652e3d0163616c6c6572204449442f20636f6e74726f6c6c6572204449442c20457874656e73696f6e52656d6f7665642c20506f7274666f6c696f206f6620746f6b656e20686f6c6465722c2076616c75652e54437573746f6d4173736574547970654578697374730c008001284964656e7469747949640000f1010144437573746f6d4173736574547970654964000030011c5665633c75383e000d08b04120637573746f6d206173736574207479706520616c726561647920657869737473206f6e2d636861696e2e310163616c6c6572204449442c20746865204944206f662074686520637573746f6d20617373657420747970652c2074686520737472696e6720636f6e74656e747320726567697374657265642e64437573746f6d417373657454797065526567697374657265640c008001284964656e7469747949640000f1010144437573746f6d4173736574547970654964000030011c5665633c75383e000e08b04120637573746f6d2061737365742074797065207761732072656769737465726564206f6e2d636861696e2e310163616c6c6572204449442c20746865204944206f662074686520637573746f6d20617373657420747970652c2074686520737472696e6720636f6e74656e747320726567697374657265642e5453657441737365744d6574616461746156616c756510008001284964656e7469747949640000a8011c4173736574494400004502014841737365744d6574616461746156616c75650000490201a04f7074696f6e3c41737365744d6574616461746156616c756544657461696c3c4d6f6d656e743e3e000f0864536574206173736574206d657461646174612076616c75652ef42843616c6c6572204449442c20417373657449442c206d657461646174612076616c75652c206f7074696f6e616c2076616c75652064657461696c73297053657441737365744d6574616461746156616c756544657461696c730c008001284964656e7469747949640000a8011c4173736574494400004d02018041737365744d6574616461746156616c756544657461696c3c4d6f6d656e743e001008dc536574206173736574206d657461646174612076616c75652064657461696c7320286578706972652c206c6f636b20737461747573292e902843616c6c6572204449442c20417373657449442c2076616c75652064657461696c732978526567697374657241737365744d657461646174614c6f63616c5479706514008001284964656e7469747949640000a8011c4173736574494400005502014441737365744d657461646174614e616d6500005902015441737365744d657461646174614c6f63616c4b657900005d02014441737365744d65746164617461537065630011088c5265676973746572206173736574206d65746164617461206c6f63616c20747970652e09012843616c6c6572204449442c20417373657449442c204c6f63616c2074797065206e616d652c204c6f63616c2074797065206b65792c2074797065207370656373297c526567697374657241737365744d65746164617461476c6f62616c547970650c005502014441737365744d657461646174614e616d6500007502015841737365744d65746164617461476c6f62616c4b657900005d02014441737365744d6574616461746153706563001208905265676973746572206173736574206d6574616461746120676c6f62616c20747970652ebc28476c6f62616c2074797065206e616d652c20476c6f62616c2074797065206b65792c207479706520737065637329404173736574547970654368616e6765640c008001284964656e7469747949640000a8011c417373657449440000ed010124417373657454797065001308cc416e206576656e7420656d6974746564207768656e207468652074797065206f6620616e206173736574206368616e6765642ec0506172616d65746572733a2063616c6c6572204449442c20417373657449442c206e657720746f6b656e20747970652e5c4c6f63616c4d657461646174614b657944656c657465640c008001284964656e7469747949640000a8011c4173736574494400005902015441737365744d657461646174614c6f63616c4b6579001408f0416e206576656e7420656d6974746564207768656e2061206c6f63616c206d65746164617461206b657920686173206265656e2072656d6f7665642eac506172616d65746572733a2063616c6c657220417373657449442c204c6f63616c2074797065206e616d65504d6574616461746156616c756544656c657465640c008001284964656e7469747949640000a8011c4173736574494400007902014041737365744d657461646174614b6579001508f8416e206576656e7420656d6974746564207768656e2061206c6f63616c206d657461646174612076616c756520686173206265656e2072656d6f7665642eac506172616d65746572733a2063616c6c657220417373657449442c204c6f63616c2074797065206e616d654c417373657442616c616e63655570646174656418008001284964656e7469747949640000a8011c41737365744944000018011c42616c616e636500007d02014c4f7074696f6e3c506f7274666f6c696f49643e00007d02014c4f7074696f6e3c506f7274666f6c696f49643e000081020154506f7274666f6c696f557064617465526561736f6e00160ce4456d6974746564207768656e20546f6b656e732077657265206973737565642c2072656465656d6564206f72207472616e736665727265642e3502436f6e7461696e7320746865205b604964656e746974794964605d206f66207468652072656365697665722f6973737565722f72656465656d65722c20746865205b6041737365744944605d20666f722074686520746f6b656e2c207468652062616c616e6365207468617420776173206973737565642f7472616e736665727265642f72656465656d65642cb101746865205b60506f7274666f6c696f4964605d206f662074686520736f757263652c20746865205b60506f7274666f6c696f4964605d206f66207468652064657374696e6174696f6e20616e6420746865205b60506f7274666f6c696f557064617465526561736f6e605d2e64417373657441666669726d6174696f6e4578656d7074696f6e0400a8011c417373657449440017086d01416e20617373657420686173206265656e20616464656420746f20746865206c697374206f662070726520617072726f76656420726563656976656d656e74202876616c696420666f7220616c6c206964656e746974696573292ec8506172616d65746572733a205b6041737365744944605d206f66207468652070726520617070726f7665642061737365742e7c52656d6f7665417373657441666669726d6174696f6e4578656d7074696f6e0400a8011c417373657449440018087d01416e20617373657420686173206265656e2072656d6f7665642066726f6d20746865206c697374206f662070726520617072726f76656420726563656976656d656e74202876616c696420666f7220616c6c206964656e746974696573292e94506172616d65746572733a205b6041737365744944605d206f66207468652061737365742e40507265417070726f766564417373657408008001284964656e7469747949640000a8011c417373657449440019081d01416e206964656e746974792068617320616464656420616e20617373657420746f20746865206c697374206f662070726520617072726f76656420726563656976656d656e742e3101506172616d65746572733a205b604964656e746974794964605d206f662063616c6c65722c205b6041737365744944605d206f66207468652070726520617070726f7665642061737365742e5852656d6f7665507265417070726f766564417373657408008001284964656e7469747949640000a8011c41737365744944001a082501416e206964656e74697479206861732072656d6f76656420616e20617373657420746f20746865206c697374206f662070726520617072726f76656420726563656976656d656e742efc506172616d65746572733a205b604964656e746974794964605d206f662063616c6c65722c205b6041737365744944605d206f66207468652061737365742e4c41737365744d65646961746f727341646465640c008001284964656e7469747949640000a8011c4173736574494400008d02015042547265655365743c4964656e7469747949643e001b08d8416e206964656e7469747920686173206164646564206d616e6461746f7279206d65646961746f727320746f20616e2061737365742e9101506172616d65746572733a205b604964656e746974794964605d206f662063616c6c65722c205b6041737365744944605d206f66207468652061737365742c20746865206964656e74697479206f6620616c6c206d65646961746f72732061646465642e5441737365744d65646961746f727352656d6f7665640c008001284964656e7469747949640000a8011c4173736574494400008d02015042547265655365743c4964656e7469747949643e001c08c0416e206964656e74697479206861732072656d6f766564206d65646961746f72732066726f6d20616e2061737365742e9901506172616d65746572733a205b604964656e746974794964605d206f662063616c6c65722c205b6041737365744944605d206f66207468652061737365742c20746865206964656e74697479206f6620616c6c206d65646961746f72732072656d6f7665642e4c5469636b65724c696e6b6564546f41737365740c008001284964656e7469747949640000210101185469636b65720000a8011c41737365744944001d08b0416e206964656e7469747920686173206c696e6b65642061207469636b657220746f20616e2061737365742e8101506172616d65746572733a205b604964656e746974794964605d206f662063616c6c65722c205b605469636b6572605d206f66207468652061737365742c20746865206173736574206964656e746966696572205b6041737365744944605d2e085c4576656e747320666f722074686973206d6f64756c652e00ed010c4c706f6c796d6573685f7072696d6974697665731461737365742441737365745479706500013030457175697479436f6d6d6f6e0000003c45717569747950726566657272656400010024436f6d6d6f646974790002002c4669786564496e636f6d6500030010524549540004001046756e6400050054526576656e7565536861726541677265656d656e74000600445374727563747572656450726f64756374000700284465726976617469766500080018437573746f6d0400f1010144437573746f6d417373657454797065496400090028537461626c65436f696e000a002c4e6f6e46756e6769626c650400f501013c4e6f6e46756e6769626c6554797065000b0000f1010c4c706f6c796d6573685f7072696d69746976657314617373657444437573746f6d41737365745479706549640000040010010c7533320000f5010c4c706f6c796d6573685f7072696d6974697665731461737365743c4e6f6e46756e6769626c655479706500011028446572697661746976650000002c4669786564496e636f6d650001001c496e766f69636500020018437573746f6d0400f1010144437573746f6d417373657454797065496400030000f9010c4c706f6c796d6573685f7072696d6974697665731461737365742441737365744e616d650000040030011c5665633c75383e0000fd0100000201020001020c4c706f6c796d6573685f7072696d6974697665734061737365745f6964656e7469666965723c41737365744964656e74696669657200011414435553495004000502011c5b75383b20395d0000001043494e5304000502011c5b75383b20395d000100104953494e0400250101205b75383b2031325d0002000c4c45490400090201205b75383b2032305d00030010464947490400250101205b75383b2031325d00040000050200000309000000080009020000031400000008000d0204184f7074696f6e0404540111020108104e6f6e6500000010536f6d6504001102000001000011020c4c706f6c796d6573685f7072696d6974697665731461737365744046756e64696e67526f756e644e616d650000040030011c5665633c75383e000015020c4c706f6c796d6573685f7072696d69746976657320646f63756d656e7428446f63756d656e7449640000040010010c753332000019020c4c706f6c796d6573685f7072696d69746976657320646f63756d656e7420446f63756d656e74000014010c7572691d02012c446f63756d656e74557269000130636f6e74656e745f6861736821020130446f63756d656e74486173680001106e616d6539020130446f63756d656e744e616d65000120646f635f747970653d0201504f7074696f6e3c446f63756d656e74547970653e00012c66696c696e675f64617465050101384f7074696f6e3c4d6f6d656e743e00001d020c4c706f6c796d6573685f7072696d69746976657320646f63756d656e742c446f63756d656e745572690000040030011c5665633c75383e000021020c4c706f6c796d6573685f7072696d69746976657334646f63756d656e745f6861736830446f63756d656e7448617368000124104e6f6e6500000010483531320400250201205b75383b2036345d00010010483338340400290201205b75383b2034385d000200104833323004002d0201205b75383b2034305d000300104832353604000401205b75383b2033325d00040010483232340400310201205b75383b2032385d00050010483139320400350201205b75383b2032345d00060010483136300400090201205b75383b2032305d00070010483132380400ac01205b75383b2031365d00080000250200000340000000080029020000033000000008002d0200000328000000080031020000031c0000000800350200000318000000080039020c4c706f6c796d6573685f7072696d69746976657320646f63756d656e7430446f63756d656e744e616d650000040030011c5665633c75383e00003d0204184f7074696f6e0404540141020108104e6f6e6500000010536f6d6504004102000001000041020c4c706f6c796d6573685f7072696d69746976657320646f63756d656e7430446f63756d656e74547970650000040030011c5665633c75383e000045020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174614841737365744d6574616461746156616c75650000040030011c5665633c75383e0000490204184f7074696f6e040454014d020108104e6f6e6500000010536f6d6504004d0200000100004d020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174616041737365744d6574616461746156616c756544657461696c04184d6f6d656e74012800080118657870697265050101384f7074696f6e3c4d6f6d656e743e00012c6c6f636b5f7374617475735102017c41737365744d657461646174614c6f636b5374617475733c4d6f6d656e743e000051020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174615c41737365744d657461646174614c6f636b53746174757304184d6f6d656e740128010c20556e6c6f636b6564000000184c6f636b65640001002c4c6f636b6564556e74696c04002801184d6f6d656e740002000055020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174614441737365744d657461646174614e616d650000040030011c5665633c75383e000059020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174615441737365744d657461646174614c6f63616c4b65790000040028010c75363400005d020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174614441737365744d657461646174615370656300000c010c75726c6102012c4f7074696f6e3c55726c3e00012c6465736372697074696f6e690201804f7074696f6e3c41737365744d657461646174614465736372697074696f6e3e000120747970655f6465667102013c4f7074696f6e3c5665633c75383e3e0000610204184f7074696f6e0404540165020108104e6f6e6500000010536f6d650400650200000100006502084c706f6c796d6573685f7072696d6974697665730c55726c0000040030011c5665633c75383e0000690204184f7074696f6e040454016d020108104e6f6e6500000010536f6d6504006d0200000100006d020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174616041737365744d657461646174614465736372697074696f6e0000040030011c5665633c75383e0000710204184f7074696f6e04045401300108104e6f6e6500000010536f6d65040030000001000075020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174615841737365744d65746164617461476c6f62616c4b65790000040028010c753634000079020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174614041737365744d657461646174614b657900010818476c6f62616c04007502015841737365744d65746164617461476c6f62616c4b6579000000144c6f63616c04005902015441737365744d657461646174614c6f63616c4b6579000100007d0204184f7074696f6e04045401e80108104e6f6e6500000010536f6d650400e8000001000081020c4c706f6c796d6573685f7072696d69746976657324706f7274666f6c696f54506f7274666f6c696f557064617465526561736f6e0001101849737375656404014866756e64696e675f726f756e645f6e616d650d0201604f7074696f6e3c46756e64696e67526f756e644e616d653e0000002052656465656d65640001002c5472616e73666572726564080138696e737472756374696f6e5f6964850201544f7074696f6e3c496e737472756374696f6e49643e000140696e737472756374696f6e5f6d656d6f8401304f7074696f6e3c4d656d6f3e00020048436f6e74726f6c6c65725472616e7366657200030000850204184f7074696f6e0404540189020108104e6f6e6500000010536f6d6504008902000001000089020c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e7434496e737472756374696f6e49640000040028010c75363400008d02042042547265655365740404540180000400450100000091020c6070616c6c65745f636f72706f726174655f616374696f6e7330646973747269627574696f6e144576656e740001101c437265617465640c00950201204576656e74446964000099020110434149640000a1020130446973747269627574696f6e000010b841206361706974616c20646973747269627574696f6e2c20776974682064657461696c7320696e636c756465642c31017761732063726561746564206279207468652044494420287065726d697373696f6e6564206167656e742920666f7220746865204341206964656e746966696564206279206043414964602e00a8284167656e74204449442c20434127732049442c20646973747269627574696f6e2064657461696c73293842656e65666974436c61696d65641800950201204576656e744469640000950201204576656e74446964000099020110434149640000a1020130446973747269627574696f6e000018011c42616c616e63650000a502010c54617800010c51014120746f6b656e20686f6c64657227732062656e65666974206f662061206361706974616c20646973747269627574696f6e20666f722074686520676976656e206043414964602077617320636c61696d65642e0091012843616c6c6572204449442c20486f6c6465722f436c61696d616e74204449442c20434127732049442c207570646174656420646973747269627574696f6e2064657461696c732c2044494427732062656e656669742c20444944277320746178202529245265636c61696d65640c00950201204576656e7444696400009902011043414964000018011c42616c616e636500020c9853746174732066726f6d2060707573685f62656e65666974602077617320656d69747465642e001501284167656e74204449442c20434127732049442c206d61782072657175657374656420444944732c2070726f63657373656420444944732c206661696c65642044494473291c52656d6f7665640800950201204576656e744469640000990201104341496400030c8c41206361706974616c20646973747269627574696f6e207761732072656d6f7665642e0050284167656e74204449442c204341277320494429085c4576656e747320666f722074686973206d6f64756c652e0095020c4c706f6c796d6573685f7072696d697469766573286576656e745f6f6e6c79244576656e744f6e6c7904045401800004008001045400009902086070616c6c65745f636f72706f726174655f616374696f6e731043414964000008012061737365745f6964a8011c417373657449440001206c6f63616c5f69649d0201244c6f63616c4341496400009d02086070616c6c65745f636f72706f726174655f616374696f6e73244c6f63616c434149640000040010010c7533320000a1020c6070616c6c65745f636f72706f726174655f616374696f6e7330646973747269627574696f6e30446973747269627574696f6e000020011066726f6de8012c506f7274666f6c696f496400012063757272656e6379a8011c417373657449440001247065725f736861726518011c42616c616e6365000118616d6f756e7418011c42616c616e636500012472656d61696e696e6718011c42616c616e63650001247265636c61696d656439010110626f6f6c0001287061796d656e745f61742801184d6f6d656e74000128657870697265735f6174050101384f7074696f6e3c4d6f6d656e743e0000a5020c3473705f61726974686d65746963287065725f7468696e67731c5065726d696c6c0000040010010c7533320000a9021064706f6c796d6573685f636f6d6d6f6e5f7574696c69746965731874726169747328636865636b706f696e74144576656e7400011044436865636b706f696e744372656174656414007c01484f7074696f6e3c4964656e7469747949643e0000a8011c417373657449440000ad020130436865636b706f696e744964000018011c42616c616e636500002801184d6f6d656e7400000c644120636865636b706f696e742077617320637265617465642e0021012863616c6c6572204449442c20417373657449442c20636865636b706f696e742049442c20746f74616c20737570706c792c20636865636b706f696e742074696d657374616d7029844d6178696d756d5363686564756c6573436f6d706c65786974794368616e67656408008001284964656e746974794964000028010c75363400010c2501546865206d6178696d756d20636f6d706c657869747920666f7220616e206172626974726172792061737365742773207363686564756c652073657420776173206368616e6765642e0064284743204449442c20746865206e6577206d6178696d756d293c5363686564756c654372656174656410008001284964656e7469747949640000a8011c417373657449440000b10201285363686564756c6549640000b502014c5363686564756c65436865636b706f696e747300020c884120636865636b706f696e74207363686564756c652077617320637265617465642e00b02863616c6c6572204449442c20417373657449442c207363686564756c652069642c207363686564756c65293c5363686564756c6552656d6f76656410008001284964656e7469747949640000a8011c417373657449440000b10201285363686564756c6549640000b502014c5363686564756c65436865636b706f696e747300030c884120636865636b706f696e74207363686564756c65207761732072656d6f7665642e00b02863616c6c6572204449442c20417373657449442c207363686564756c652069642c207363686564756c6529085c4576656e747320666f722074686973206d6f64756c652e00ad020c4c706f6c796d6573685f7072696d69746976657314617373657430436865636b706f696e7449640000040028010c7536340000b1021064706f6c796d6573685f636f6d6d6f6e5f7574696c69746965731874726169747328636865636b706f696e74285363686564756c6549640000040028010c7536340000b5021064706f6c796d6573685f636f6d6d6f6e5f7574696c69746965731874726169747328636865636b706f696e744c5363686564756c65436865636b706f696e7473000004011c70656e64696e67b902014042547265655365743c4d6f6d656e743e0000b902042042547265655365740404540128000400bd02000000bd020000022800c1021064706f6c796d6573685f636f6d6d6f6e5f7574696c69746965731874726169747348636f6d706c69616e63655f6d616e61676572144576656e7400012470436f6d706c69616e6365526571756972656d656e74437265617465640c008001284964656e7469747949640000a8011c417373657449440000c5020154436f6d706c69616e6365526571756972656d656e74000008cc456d6974746564207768656e206e657720636f6d706c69616e636520726571756972656d656e7420697320637265617465642eb42863616c6c6572204449442c20417373657449442c20436f6d706c69616e6365526571756972656d656e74292e70436f6d706c69616e6365526571756972656d656e7452656d6f7665640c008001284964656e7469747949640000a8011c41737365744944000010010c753332000108c4456d6974746564207768656e206120636f6d706c69616e636520726571756972656d656e742069732072656d6f7665642e982863616c6c6572204449442c20417373657449442c20726571756972656d656e745f6964292e5c4173736574436f6d706c69616e63655265706c616365640c008001284964656e7469747949640000a8011c417373657449440000f10201685665633c436f6d706c69616e6365526571756972656d656e743e000208b4456d6974746564207768656e20616e20617373657420636f6d706c69616e6365206973207265706c616365642ed8506172616d65746572733a2063616c6c6572204449442c20417373657449442c206e657720617373657420636f6d706c69616e63652e504173736574436f6d706c69616e6365526573657408008001284964656e7469747949640000a8011c41737365744944000308e0456d6974746564207768656e20616e20617373657420636f6d706c69616e6365206f6620612061737365745f69642069732072657365742e582863616c6c6572204449442c2041737365744944292e584173736574436f6d706c69616e6365526573756d656408008001284964656e7469747949640000a8011c417373657449440004080901456d6974746564207768656e20616e20617373657420636f6d706c69616e636520666f72206120676976656e2061737365745f6964206765747320726573756d652e582863616c6c6572204449442c2041737365744944292e544173736574436f6d706c69616e636550617573656408008001284964656e7469747949640000a8011c417373657449440005080901456d6974746564207768656e20616e20617373657420636f6d706c69616e636520666f72206120676976656e2061737365745f69642067657473207061757365642e582863616c6c6572204449442c2041737365744944292e70436f6d706c69616e6365526571756972656d656e744368616e6765640c008001284964656e7469747949640000a8011c417373657449440000c5020154436f6d706c69616e6365526571756972656d656e74000608e0456d6974746564207768656e20636f6d706c69616e636520726571756972656d656e7420676574206d6f6469666965642f6368616e67652eb42863616c6c6572204449442c20417373657449442c20436f6d706c69616e6365526571756972656d656e74292e785472757374656444656661756c74436c61696d49737375657241646465640c008001284964656e7469747949640000a8011c417373657449440000e1020134547275737465644973737565720007081d01456d6974746564207768656e2064656661756c7420636c61696d20697373756572206c69737420666f72206120676976656e2061737365745f696420676574732061646465642eac2863616c6c6572204449442c20417373657449442c2041646465642054727573746564497373756572292e805472757374656444656661756c74436c61696d49737375657252656d6f7665640c008001284964656e7469747949640000a8011c4173736574494400008001284964656e7469747949640008082101456d6974746564207768656e2064656661756c7420636c61696d20697373756572206c69737420666f72206120676976656e2061737365745f6964206765742072656d6f7665642eb42863616c6c6572204449442c20417373657449442c2052656d6f7665642054727573746564497373756572292e085c4576656e747320666f722074686973206d6f64756c652e00c5020c4c706f6c796d6573685f7072696d69746976657348636f6d706c69616e63655f6d616e6167657254436f6d706c69616e6365526571756972656d656e7400000c014473656e6465725f636f6e646974696f6e73c90201385665633c436f6e646974696f6e3e00014c72656365697665725f636f6e646974696f6e73c90201385665633c436f6e646974696f6e3e000108696410010c7533320000c902000002cd0200cd020c4c706f6c796d6573685f7072696d69746976657324636f6e646974696f6e24436f6e646974696f6e0000080138636f6e646974696f6e5f74797065d1020134436f6e646974696f6e5479706500011c69737375657273dd0201485665633c547275737465644973737565723e0000d1020c4c706f6c796d6573685f7072696d69746976657324636f6e646974696f6e34436f6e646974696f6e5479706500011424497350726573656e74040009010114436c61696d000000204973416273656e74040009010114436c61696d0001001c4973416e794f660400d50201285665633c436c61696d3e0002002049734e6f6e654f660400d50201285665633c436c61696d3e0003002849734964656e746974790400d90201385461726765744964656e7469747900040000d502000002090100d9020c4c706f6c796d6573685f7072696d69746976657324636f6e646974696f6e385461726765744964656e746974790001083445787465726e616c4167656e7400000020537065636966696304008001284964656e74697479496400010000dd02000002e10200e1020c4c706f6c796d6573685f7072696d69746976657324636f6e646974696f6e345472757374656449737375657200000801186973737565728001284964656e74697479496400012c747275737465645f666f72e502012854727573746564466f720000e5020c4c706f6c796d6573685f7072696d69746976657324636f6e646974696f6e2854727573746564466f720001080c416e790000002053706563696669630400e90201385665633c436c61696d547970653e00010000e902000002ed0200ed020c4c706f6c796d6573685f7072696d697469766573386964656e746974795f636c61696d24436c61696d54797065000128284163637265646974656400000024416666696c69617465000100244275794c6f636b75700002002853656c6c4c6f636b757000030050437573746f6d657244756544696c6967656e6365000400404b6e6f77596f7572437573746f6d6572000500304a7572697364696374696f6e000600204578656d707465640007001c426c6f636b656400080018437573746f6d040019010144437573746f6d436c61696d54797065496400090000f102000002c50200f502086070616c6c65745f636f72706f726174655f616374696f6e73144576656e740001205c4d617844657461696c734c656e6774684368616e67656408008001284964656e746974794964000010010c753332000008d4546865206d6178696d756d206c656e677468206f66206064657461696c736020696e20627974657320776173206368616e6765642e50284743204449442c206e6577206c656e677468297844656661756c745461726765744964656e7469746965734368616e6765640c008001284964656e7469747949640000a8011c417373657449440000f90201405461726765744964656e746974696573000108f054686520736574206f662064656661756c7420605461726765744964656e7469746965736020666f7220746865206173736574206368616e6765642ea8284167656e74204449442c20417373657449442c204e6577205461726765744964656e746974696573297044656661756c7457697468686f6c64696e675461784368616e6765640c008001284964656e7469747949640000a8011c417373657449440000a502010c546178000208c85468652064656661756c742077697468686f6c64696e672074617820666f7220746865206173736574206368616e6765642e78284167656e74204449442c20417373657449442c204e657720546178292e6044696457697468686f6c64696e675461784368616e67656410008001284964656e7469747949640000a8011c4173736574494400008001284964656e74697479496400000103012c4f7074696f6e3c5461783e000308f05468652077697468686f6c64696e672074617820737065636966696320746f20612044494420666f7220746865206173736574206368616e6765642ea4284167656e74204449442c20417373657449442c205461786564204449442c204e657720546178292e2c4341496e697469617465641000950201204576656e744469640000990201104341496400000503013c436f72706f72617465416374696f6e000021030124434144657461696c730004084c412043412077617320696e697469617465642ea8284167656e74204449442c2043412069642c207468652043412c207468652043412064657461696c73293443414c696e6b6564546f446f630c008001284964656e7469747949640000990201104341496400002503013c5665633c446f63756d656e7449643e000508844120434120776173206c696e6b656420746f206120736574206f6620646f63732eac284167656e74204449442c2043412049642c204c697374206f6620646f63206964656e746966696572732924434152656d6f7665640800950201204576656e74446964000099020110434149640006084441204341207761732072656d6f7665642e48284167656e74204449442c20434120496429445265636f7264446174654368616e6765640c00950201204576656e744469640000990201104341496400000503013c436f72706f72617465416374696f6e0007046c412043412773207265636f72642064617465206368616e6765642e085c4576656e747320666f722074686973206d6f64756c652e00f902086070616c6c65745f636f72706f726174655f616374696f6e73405461726765744964656e74697469657300000801286964656e7469746965734501013c5665633c4964656e7469747949643e00012474726561746d656e74fd02013c54617267657454726561746d656e740000fd02086070616c6c65745f636f72706f726174655f616374696f6e733c54617267657454726561746d656e740001081c496e636c7564650000001c4578636c75646500010000010304184f7074696f6e04045401a5020108104e6f6e6500000010536f6d650400a50200000100000503086070616c6c65745f636f72706f726174655f616374696f6e733c436f72706f72617465416374696f6e00001801106b696e640903011843414b696e640001246465636c5f646174652801184d6f6d656e7400012c7265636f72645f646174650d0301484f7074696f6e3c5265636f7264446174653e00011c74617267657473f90201405461726765744964656e74697469657300015c64656661756c745f77697468686f6c64696e675f746178a502010c54617800013c77697468686f6c64696e675f746178190301585665633c284964656e7469747949642c20546178293e00000903086070616c6c65745f636f72706f726174655f616374696f6e731843414b696e64000114485072656469637461626c6542656e6566697400000050556e7072656469637461626c6542656e65666974000100304973737565724e6f746963650002003852656f7267616e697a6174696f6e000300144f74686572000400000d0304184f7074696f6e0404540111030108104e6f6e6500000010536f6d650400110300000100001103086070616c6c65745f636f72706f726174655f616374696f6e73285265636f7264446174650000080110646174652801184d6f6d656e74000128636865636b706f696e74150301304341436865636b706f696e7400001503086070616c6c65745f636f72706f726174655f616374696f6e73304341436865636b706f696e74000108245363686564756c65640800b10201285363686564756c654964000028010c753634000000204578697374696e670400ad020130436865636b706f696e7449640001000019030000021d03001d030000040880a502002103086070616c6c65745f636f72706f726174655f616374696f6e7324434144657461696c730000040030011c5665633c75383e0000250300000215020029030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f74144576656e740001181c4372656174656414008001284964656e7469747949640000990201104341496400002d03013c42616c6c6f7454696d6552616e676500003103012842616c6c6f744d657461000039010110626f6f6c00000c7c4120636f72706f726174652062616c6c6f742077617320637265617465642e001501284167656e74204449442c20434127732049442c20566f74696e672073746172742f656e642c2042616c6c6f74206d657461646174612c2052435620656e61626c65643f2920566f7465436173740c008001284964656e7469747949640000990201104341496400005103013c5665633c42616c6c6f74566f74653e00010c984120766f746520776173206361737420696e206120636f72706f726174652062616c6c6f742e006028766f746572204449442c20434149642c20566f746573293052616e67654368616e6765640c008001284964656e7469747949640000990201104341496400002d03013c42616c6c6f7454696d6552616e676500020cd04120636f72706f726174652062616c6c6f74206368616e676564206974732073746172742f656e6420646174652072616e67652e0098284167656e74204449442c20434127732049442c20566f74696e672073746172742f656e64292c4d6574614368616e6765640c008001284964656e7469747949640000990201104341496400003103012842616c6c6f744d65746100030ca04120636f72706f726174652062616c6c6f74206368616e67656420697473206d657461646174612e0088284167656e74204449442c20434127732049442c204e6577206d6574616461746129285243564368616e6765640c008001284964656e74697479496400009902011043414964000039010110626f6f6c00040cac4120636f72706f726174652062616c6c6f74206368616e676564206974732052435620737570706f72742e0084284167656e74204449442c20434127732049442c204e657720737570706f7274291c52656d6f7665640800950201204576656e744469640000990201104341496400050c7c4120636f72706f726174652062616c6c6f74207761732072656d6f7665642e0050284167656e74204449442c204341277320494429085c4576656e747320666f722074686973206d6f64756c652e002d030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f743c42616c6c6f7454696d6552616e6765000008011473746172742801184d6f6d656e7400010c656e642801184d6f6d656e74000031030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f742842616c6c6f744d65746100000801147469746c653503012c42616c6c6f745469746c6500011c6d6f74696f6e733903012c5665633c4d6f74696f6e3e000035030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f742c42616c6c6f745469746c650000040030011c5665633c75383e000039030000023d03003d030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f74184d6f74696f6e00000c01147469746c654103012c4d6f74696f6e5469746c65000124696e666f5f6c696e6b450301384d6f74696f6e496e666f4c696e6b00011c63686f69636573490301405665633c43686f6963655469746c653e000041030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f742c4d6f74696f6e5469746c650000040030011c5665633c75383e000045030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f74384d6f74696f6e496e666f4c696e6b0000040030011c5665633c75383e000049030000024d03004d030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f742c43686f6963655469746c650000040030011c5665633c75383e0000510300000255030055030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f742842616c6c6f74566f74650000080114706f77657218011c42616c616e636500012066616c6c6261636b5903012c4f7074696f6e3c7531363e0000590304184f7074696f6e040454015d030108104e6f6e6500000010536f6d6504005d0300000100005d0300000504006103082c70616c6c65745f70697073205261774576656e7408244163636f756e74496401002c426c6f636b4e756d6265720110015050486973746f726963616c506970735072756e65640c008001284964656e746974794964000039010110626f6f6c000039010110626f6f6c00000445015072756e696e6720486973746f726963616c205049507320697320656e61626c6564206f722064697361626c6564202863616c6c6572204449442c206f6c642076616c75652c206e65772076616c7565293c50726f706f73616c4372656174656420008001284964656e74697479496400006503014c50726f706f7365723c4163636f756e7449643e00006d0301145069704964000018011c42616c616e636500006102012c4f7074696f6e3c55726c3e0000710301584f7074696f6e3c5069704465736372697074696f6e3e00005901015c4d61796265426c6f636b3c426c6f636b4e756d6265723e00007903013050726f706f73616c4461746100011498412050495020776173206d61646520776974682061206042616c616e636560207374616b652e00342320506172616d65746572733a00510143616c6c6572204449442c2050726f706f7365722c205049502049442c206465706f7369742c2055524c2c206465736372697074696f6e2c206578706972792074696d652c2070726f706f73616c20646174612e5050726f706f73616c5374617465557064617465640c008001284964656e74697479496400006d030114506970496400007d03013450726f706f73616c5374617465000204d854726967676572656420656163682074696d6520746865207374617465206f6620612070726f706f73616c20697320616d656e64656414566f74656414008001284964656e74697479496400000001244163636f756e74496400006d0301145069704964000039010110626f6f6c000018011c42616c616e6365000304f8604163636f756e7449646020766f7465642060626f6f6c60206f6e207468652070726f706f73616c207265666572656e636564206279206050697049646024506970436c6f7365640c008001284964656e74697479496400006d0301145069704964000039010110626f6f6c000404e850697020686173206265656e20636c6f7365642c20626f6f6c20696e6469636174657320776865746865722064617461206973207072756e656448457865637574696f6e5363686564756c65640c008001284964656e74697479496400006d0301145069704964000010012c426c6f636b4e756d626572000504e0457865637574696f6e206f6620612050495020686173206265656e207363686564756c656420617420737065636966696320626c6f636b2e7444656661756c74456e6163746d656e74506572696f644368616e6765640c008001284964656e746974794964000010012c426c6f636b4e756d626572000010012c426c6f636b4e756d626572000608d844656661756c7420656e6163746d656e7420706572696f642028696e20626c6f636b732920686173206265656e206368616e6765642e902863616c6c6572204449442c206f6c6420706572696f642c206e657720706572696f6429744d696e696d756d50726f706f73616c4465706f7369744368616e6765640c008001284964656e746974794964000018011c42616c616e6365000018011c42616c616e63650007087c4d696e696d756d206465706f73697420616d6f756e74206d6f646966696564902863616c6c6572204449442c206f6c6420616d6f756e742c206e657720616d6f756e74295c50656e64696e675069704578706972794368616e6765640c008001284964656e74697479496400005901015c4d61796265426c6f636b3c426c6f636b4e756d6265723e00005901015c4d61796265426c6f636b3c426c6f636b4e756d6265723e000808cc416d6f756e74206f6620626c6f636b7320616674657220776869636820612070656e64696e672050495020657870697265732e902863616c6c6572204449442c206f6c64206578706972792c206e65772065787069727929584d6178506970536b6970436f756e744368616e6765640c008001284964656e7469747949640000080130536b6970706564436f756e740000080130536b6970706564436f756e74000908cc546865206d6178696d756d2074696d65732061205049502063616e20626520736b697070656420776173206368616e6765642e882863616c6c6572204449442c206f6c642076616c75652c206e65772076616c756529544163746976655069704c696d69744368616e6765640c008001284964656e746974794964000010010c753332000010010c753332000a08b8546865206d6178696d756d206e756d626572206f6620616374697665205049507320776173206368616e6765642e882863616c6c6572204449442c206f6c642076616c75652c206e65772076616c7565293850726f706f73616c526566756e640c008001284964656e74697479496400006d0301145069704964000018011c42616c616e6365000b083c526566756e642070726f706f73616c482869642c20746f74616c20616d6f756e74293c536e617073686f74436c656172656408008001284964656e746974794964000081030128536e617073686f744964000c046454686520736e617073686f742077617320636c65617265642e34536e617073686f7454616b656e0c008001284964656e746974794964000081030128536e617073686f74496400008503014c5665633c536e617073686f747465645069703e000d046441206e657720736e617073686f74207761732074616b656e2e28506970536b69707065640c008001284964656e74697479496400006d03011450697049640000080130536b6970706564436f756e74000e08a0412050495020696e2074686520736e617073686f742071756575652077617320736b69707065642e802867635f6469642c207069705f69642c206e65775f736b69705f636f756e742958536e617073686f74526573756c7473456e616374656414008001284964656e7469747949640000910301484f7074696f6e3c536e617073686f7449643e0000950301685665633c2850697049642c20536b6970706564436f756e74293e00009d0301285665633c50697049643e00009d0301285665633c50697049643e000f083101526573756c74732028652e672e2c20617070726f7665642c2072656a65637465642c20616e6420736b6970706564292c207765726520656e616374656420666f7220736f6d6520504950732e51012867635f6469642c20736e617073686f745f69645f6f70742c20736b69707065645f706970735f776974685f6e65775f636f756e742c2072656a65637465645f706970732c20617070726f7665645f706970732964457865637574696f6e5363686564756c696e674661696c65640c008001284964656e74697479496400006d0301145069704964000010012c426c6f636b4e756d6265720010040d015363686564756c696e67206f66207468652050495020666f7220657865637574696f6e206661696c656420696e20746865207363686564756c65722070616c6c65742e3c4578706972795363686564756c65640c008001284964656e74697479496400006d0301145069704964000010012c426c6f636b4e756d626572001104985468652050495020686173206265656e207363686564756c656420666f72206578706972792e584578706972795363686564756c696e674661696c65640c008001284964656e74697479496400006d0301145069704964000010012c426c6f636b4e756d62657200120401015363686564756c696e67206f66207468652050495020666f7220657870697279206661696c656420696e20746865207363686564756c65722070616c6c65742e64457865637574696f6e43616e63656c6c696e674661696c656404006d0301145069704964001304f043616e63656c6c696e67207468652050495020657865637574696f6e206661696c656420696e20746865207363686564756c65722070616c6c65742e085c4576656e747320666f722074686973206d6f64756c652e006503082c70616c6c65745f706970732050726f706f73657204244163636f756e7449640100010824436f6d6d756e69747904000001244163636f756e74496400000024436f6d6d6974746565040069030124436f6d6d6974746565000100006903082c70616c6c65745f7069707324436f6d6d697474656500010824546563686e6963616c0000001c55706772616465000100006d03082c70616c6c65745f706970731450697049640000040010010c7533320000710304184f7074696f6e0404540175030108104e6f6e6500000010536f6d650400750300000100007503082c70616c6c65745f70697073385069704465736372697074696f6e0000040030011c5665633c75383e00007903082c70616c6c65745f706970733050726f706f73616c44617461000108104861736804002c0110483235360000002050726f706f73616c040030011c5665633c75383e000100007d03082c70616c6c65745f706970733450726f706f73616c53746174650001181c50656e64696e670000002052656a6563746564000100245363686564756c6564000200184661696c65640003002045786563757465640004001c45787069726564000500008103082c70616c6c65745f7069707328536e617073686f7449640000040010010c753332000085030000028903008903082c70616c6c65745f7069707338536e617073686f74746564506970000008010869646d03011450697049640001187765696768748d03013c28626f6f6c2c2042616c616e63652900008d030000040839011800910304184f7074696f6e0404540181030108104e6f6e6500000010536f6d6504008103000001000095030000029903009903000004086d0308009d030000026d0300a1031064706f6c796d6573685f636f6d6d6f6e5f7574696c69746965731874726169747324706f7274666f6c696f144576656e7400012040506f7274666f6c696f437265617465640c008001284964656e7469747949640000f0013c506f7274666f6c696f4e756d6265720000a5030134506f7274666f6c696f4e616d65000018b054686520706f7274666f6c696f20686173206265656e207375636365737366756c6c7920637265617465642e00302320506172616d6574657273302a206f726967696e20444944482a20706f7274666f6c696f206e756d626572402a20706f7274666f6c696f206e616d6540506f7274666f6c696f44656c6574656408008001284964656e7469747949640000f0013c506f7274666f6c696f4e756d626572000114b054686520706f7274666f6c696f20686173206265656e207375636365737366756c6c792072656d6f7665642e00302320506172616d6574657273302a206f726967696e20444944482a20706f7274666f6c696f206e756d62657240506f7274666f6c696f52656e616d65640c008001284964656e7469747949640000f0013c506f7274666f6c696f4e756d6265720000a5030134506f7274666f6c696f4e616d65000218fc54686520706f7274666f6c696f206964656e746966696564207769746820606e756d6020686173206265656e2072656e616d656420746f20606e616d65602e00302320506172616d6574657273302a206f726967696e20444944482a20706f7274666f6c696f206e756d626572402a20706f7274666f6c696f206e616d653855736572506f7274666f6c696f7308008001284964656e7469747949640000a90301945665633c28506f7274666f6c696f4e756d6265722c20506f7274666f6c696f4e616d65293e000314d4416c6c206e6f6e2d64656661756c7420706f7274666f6c696f206e756d6265727320616e64206e616d6573206f662061204449442e00302320506172616d6574657273302a206f726967696e20444944742a20766563746f72206f66206e756d6265722d6e616d6520706169727364506f7274666f6c696f437573746f6469616e4368616e6765640c008001284964656e7469747949640000e8012c506f7274666f6c696f496400008001284964656e746974794964000418f4437573746f6479206f66206120706f7274666f6c696f20686173206265656e20676976656e20746f206120646966666572656e74206964656e7469747900302320506172616d6574657273302a206f726967696e20444944382a20706f7274666f6c696f206964642a20706f7274666f6c696f20637573746f6469616e206469646c46756e64734d6f7665644265747765656e506f7274666f6c696f7314008001284964656e7469747949640000e8012c506f7274666f6c696f49640000e8012c506f7274666f6c696f49640000b103013c46756e644465736372697074696f6e00008401304f7074696f6e3c4d656d6f3e0005208c46756e64732068617665206d6f766564206265747765656e20706f7274666f6c696f7300302320506172616d6574657273342a204f726967696e204449442e4c2a20536f7572636520706f7274666f6c696f2e602a2044657374696e6174696f6e20706f7274666f6c696f2e882a205468652074797065206f662066756e64207468617420776173206d6f7665642e742a204f7074696f6e616c206d656d6f20666f7220746865206d6f76652e50507265417070726f766564506f7274666f6c696f0c008001284964656e7469747949640000e8012c506f7274666f6c696f49640000a8011c41737365744944000618e44120706f7274666f6c696f206861732070726520617070726f7665642074686520726563656976656d656e74206f6620616e2061737365742e00302320506172616d65746572737c2a205b604964656e746974794964605d206f66207468652063616c6c65722e21012a205b60506f7274666f6c696f4964605d20746861742077696c6c20726563656976652061737365747320776974686f7574206578706c696369742061666669726d6174696f6e2e29012a205b6041737365744944605d206f6620746865206173736574207468617420686173206265656e206578656d70742066726f6d206578706c696369742061666669726d6174696f6e2e685265766f6b65507265417070726f766564506f7274666f6c696f0c008001284964656e7469747949640000e8012c506f7274666f6c696f49640000a8011c41737365744944000718c44120706f7274666f6c696f206861732072656d6f7665642074686520617070726f76616c206f6620616e2061737365742e00302320506172616d65746572737c2a205b604964656e746974794964605d206f66207468652063616c6c65722ed02a205b60506f7274666f6c696f4964605d207468617420686164206974732070726520617070726f76616c207265766f6b65642ef42a205b6041737365744944605d206f6620746865206173736574207468617420686164206974732070726520617070726f76616c207265766f6b65642e085c4576656e747320666f722074686973206d6f64756c652e00a5030c4c706f6c796d6573685f7072696d6974697665732c6964656e746974795f696434506f7274666f6c696f4e616d650000040030011c5665633c75383e0000a903000002ad0300ad0300000408f0a50300b1030c4c706f6c796d6573685f7072696d69746976657324706f7274666f6c696f3c46756e644465736372697074696f6e0001082046756e6769626c6508012061737365745f6964a8011c41737365744944000118616d6f756e7418011c42616c616e63650000002c4e6f6e46756e6769626c650400b50301104e46547300010000b5030c4c706f6c796d6573685f7072696d6974697665730c6e6674104e465473000008012061737365745f6964a8011c4173736574494400010c696473b90301285665633c4e465449643e0000b903000002bd0300bd030c4c706f6c796d6573685f7072696d6974697665730c6e6674144e465449640000040028010c7536340000c103084c70616c6c65745f70726f746f636f6c5f666565205261774576656e7404244163636f756e7449640100010c1846656553657408008001284964656e746974794964000018011c42616c616e6365000004845468652070726f746f636f6c20666565206f6620616e206f7065726174696f6e2e38436f656666696369656e7453657408008001284964656e7469747949640000c5030120506f73526174696f000104505468652066656520636f656666696369656e742e284665654368617267656408000001244163636f756e744964000018011c42616c616e63650002043046656520636861726765642e085c4576656e747320666f722074686973206d6f64756c652e00c503084c706f6c796d6573685f7072696d69746976657320506f73526174696f0000080010010c753332000010010c7533320000c9030c4070616c6c65745f7363686564756c65721870616c6c6574144576656e74040454000118245363686564756c65640801107768656e100138543a3a426c6f636b4e756d626572000114696e64657810010c753332000004505363686564756c656420736f6d65207461736b2e2043616e63656c65640801107768656e100138543a3a426c6f636b4e756d626572000114696e64657810010c7533320001044c43616e63656c656420736f6d65207461736b2e28446973706174636865640c01107461736bcd03016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964d10301404f7074696f6e3c5461736b4e616d653e000118726573756c74510101384469737061746368526573756c74000204544469737061746368656420736f6d65207461736b2e3c43616c6c556e617661696c61626c650801107461736bcd03016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964d10301404f7074696f6e3c5461736b4e616d653e00030429015468652063616c6c20666f72207468652070726f7669646564206861736820776173206e6f7420666f756e6420736f20746865207461736b20686173206265656e2061626f727465642e38506572696f6469634661696c65640801107461736bcd03016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964d10301404f7074696f6e3c5461736b4e616d653e0004043d0154686520676976656e207461736b2077617320756e61626c6520746f2062652072656e657765642073696e636520746865206167656e64612069732066756c6c206174207468617420626c6f636b2e545065726d616e656e746c794f7665727765696768740801107461736bcd03016c5461736b416464726573733c543a3a426c6f636b4e756d6265723e0001086964d10301404f7074696f6e3c5461736b4e616d653e000504f054686520676976656e207461736b2063616e206e657665722062652065786563757465642073696e6365206974206973206f7665727765696768742e04304576656e747320747970652ecd0300000408101000d10304184f7074696f6e04045401040108104e6f6e6500000010536f6d650400040000010000d5031064706f6c796d6573685f636f6d6d6f6e5f7574696c69746965731874726169747328736574746c656d656e74205261774576656e740c184d6f6d656e7401282c426c6f636b4e756d6265720110244163636f756e744964010001603056656e75654372656174656410008001284964656e7469747949640000d903011c56656e756549640000dd03013056656e756544657461696c730000e103012456656e756554797065000004ec41206e65772076656e756520686173206265656e206372656174656420286469642c2076656e75655f69642c2064657461696c732c2074797065294c56656e756544657461696c73557064617465640c008001284964656e7469747949640000d903011c56656e756549640000dd03013056656e756544657461696c730001041501416e206578697374696e672076656e756527732064657461696c7320686173206265656e207570646174656420286469642c2076656e75655f69642c2064657461696c73294056656e756554797065557064617465640c008001284964656e7469747949640000d903011c56656e756549640000e103012456656e756554797065000204fc416e206578697374696e672076656e75652773207479706520686173206265656e207570646174656420286469642c2076656e75655f69642c2074797065294c496e737472756374696f6e41666669726d65640c008001284964656e7469747949640000e8012c506f7274666f6c696f4964000089020134496e737472756374696f6e49640003040501416e20696e737472756374696f6e20686173206265656e2061666669726d656420286469642c20706f7274666f6c696f2c20696e737472756374696f6e5f6964295041666669726d6174696f6e57697468647261776e0c008001284964656e7469747949640000e8012c506f7274666f6c696f4964000089020134496e737472756374696f6e49640004040901416e2061666669726d6174696f6e20686173206265656e2077697468647261776e20286469642c20706f7274666f6c696f2c20696e737472756374696f6e5f6964294c496e737472756374696f6e52656a656374656408008001284964656e746974794964000089020134496e737472756374696f6e4964000504d8416e20696e737472756374696f6e20686173206265656e2072656a656374656420286469642c20696e737472756374696f6e5f6964293852656365697074436c61696d656418008001284964656e746974794964000089020134496e737472756374696f6e49640000e50301144c65674964000028010c75363400000001244163636f756e7449640000e903015c4f7074696f6e3c526563656970744d657461646174613e0006047d0141207265636569707420686173206265656e20636c61696d656420286469642c20696e737472756374696f6e5f69642c206c65675f69642c20726563656970745f7569642c207369676e65722c2072656365697074206d65746164617461293856656e756546696c746572696e670c008001284964656e7469747949640000a8011c41737365744944000039010110626f6f6c0007046d0156656e75652066696c746572696e6720686173206265656e20656e61626c6564206f722064697361626c656420666f7220616e20617373657420286469642c20417373657449442c2066696c746572696e675f656e61626c6564293456656e756573416c6c6f7765640c008001284964656e7469747949640000a8011c417373657449440000f10301305665633c56656e756549643e000804e056656e75657320616464656420746f20616c6c6f77206c69737420286469642c20417373657449442c207665633c76656e75655f69643e293456656e756573426c6f636b65640c008001284964656e7469747949640000a8011c417373657449440000f10301305665633c56656e756549643e000904e056656e75657320616464656420746f20626c6f636b206c69737420286469642c20417373657449442c207665633c76656e75655f69643e29484c65674661696c6564457865637574696f6e0c008001284964656e746974794964000089020134496e737472756374696f6e49640000e50301144c65674964000a04dc457865637574696f6e206f662061206c6567206661696c656420286469642c20696e737472756374696f6e5f69642c206c65675f69642944496e737472756374696f6e4661696c656408008001284964656e746974794964000089020134496e737472756374696f6e4964000b04c8496e737472756374696f6e206661696c656420657865637574696f6e20286469642c20696e737472756374696f6e5f6964294c496e737472756374696f6e457865637574656408008001284964656e746974794964000089020134496e737472756374696f6e4964000c04d8496e737472756374696f6e206578656375746564207375636365737366756c6c79286469642c20696e737472756374696f6e5f6964294456656e7565556e617574686f72697a65640c008001284964656e7469747949640000a8011c417373657449440000d903011c56656e75654964000d04050156656e7565206e6f742070617274206f662074686520746f6b656e277320616c6c6f77206c69737420286469642c20417373657449442c2076656e75655f696429405363686564756c696e674661696c6564080089020134496e737472756374696f6e4964000060013444697370617463684572726f72000e04805363686564756c696e67206f6620696e737472756374696f6e206661696c732e58496e737472756374696f6e52657363686564756c656408008001284964656e746974794964000089020134496e737472756374696f6e4964000f086c496e737472756374696f6e2069732072657363686564756c65642e702863616c6c6572204449442c20696e737472756374696f6e5f6964294c56656e75655369676e6572735570646174656410008001284964656e7469747949640000d903011c56656e756549640000fc01385665633c4163636f756e7449643e000039010110626f6f6c0010044901416e206578697374696e672076656e75652773207369676e65727320686173206265656e207570646174656420286469642c2076656e75655f69642c207369676e6572732c207570646174655f747970652968536574746c656d656e744d616e75616c6c79457865637574656408008001284964656e746974794964000089020134496e737472756374696f6e496400110498536574746c656d656e74206d616e75616c6c7920657865637574656420286469642c2069642948496e737472756374696f6e4372656174656420008001284964656e7469747949640000f503013c4f7074696f6e3c56656e756549643e000089020134496e737472756374696f6e49640000f903016c536574746c656d656e74547970653c426c6f636b4e756d6265723e0000050101384f7074696f6e3c4d6f6d656e743e0000050101384f7074696f6e3c4d6f6d656e743e0000fd0301205665633c4c65673e00008401304f7074696f6e3c4d656d6f3e0012088841206e657720696e737472756374696f6e20686173206265656e20637265617465645101286469642c2076656e75655f69642c20696e737472756374696f6e5f69642c20736574746c656d656e745f747970652c2074726164655f646174652c2076616c75655f646174652c206c6567732c206d656d6f29684661696c6564546f45786563757465496e737472756374696f6e080089020134496e737472756374696f6e4964000060013444697370617463684572726f72001304784661696c656420746f206578656375746520696e737472756374696f6e2e80496e737472756374696f6e4175746f6d61746963616c6c7941666669726d65640c008001284964656e7469747949640000e8012c506f7274666f6c696f4964000089020134496e737472756374696f6e4964001408bc416e20696e737472756374696f6e20686173206265656e206175746f6d61746963616c6c792061666669726d65642ed101506172616d65746572733a205b604964656e746974794964605d206f66207468652063616c6c65722c205b60506f7274666f6c696f4964605d206f66207468652072656365697665722c20616e64205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e2e6c4d65646961746f7241666669726d6174696f6e52656365697665640c008001284964656e746974794964000089020134496e737472756374696f6e49640000050101384f7074696f6e3c4d6f6d656e743e001508a8416e20696e737472756374696f6e206861732061666669726d65642062792061206d65646961746f722e5101506172616d65746572733a205b604964656e746974794964605d206f6620746865206d65646961746f7220616e64205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e2e704d65646961746f7241666669726d6174696f6e57697468647261776e08008001284964656e746974794964000089020134496e737472756374696f6e4964001608f0416e20696e737472756374696f6e2061666669726d6174696f6e20686173206265656e2077697468647261776e2062792061206d65646961746f722e5101506172616d65746572733a205b604964656e746974794964605d206f6620746865206d65646961746f7220616e64205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e2e50496e737472756374696f6e4d65646961746f7273080089020134496e737472756374696f6e496400008d02015042547265655365743c4964656e7469747949643e001708bc416e20696e737472756374696f6e2077697468206d65646961746f727320686173206265656e20637265617465642e6501506172616d65746572733a205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e20616e6420746865205b604964656e746974794964605d206f6620616c6c206d65646961746f72732e085c4576656e747320666f722074686973206d6f64756c652e00d9030c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e741c56656e756549640000040028010c7536340000dd030c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e743056656e756544657461696c730000040030011c5665633c75383e0000e1030c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e742456656e756554797065000110144f7468657200000030446973747269627574696f6e0001000c53746f0002002045786368616e676500030000e5030c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e74144c656749640000040028010c7536340000e90304184f7074696f6e04045401ed030108104e6f6e6500000010536f6d650400ed030000010000ed030c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e743c526563656970744d65746164617461000004000401205b75383b2033325d0000f103000002d90300f50304184f7074696f6e04045401d9030108104e6f6e6500000010536f6d650400d9030000010000f9030c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e7438536574746c656d656e7454797065042c426c6f636b4e756d6265720110010c4c536574746c654f6e41666669726d6174696f6e00000034536574746c654f6e426c6f636b040010012c426c6f636b4e756d62657200010030536574746c654d616e75616c040010012c426c6f636b4e756d62657200020000fd0300000201040001040c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e740c4c656700010c2046756e6769626c6510011873656e646572e8012c506f7274666f6c696f49640001207265636569766572e8012c506f7274666f6c696f496400012061737365745f6964a8011c41737365744944000118616d6f756e7418011c42616c616e63650000002c4e6f6e46756e6769626c650c011873656e646572e8012c506f7274666f6c696f49640001207265636569766572e8012c506f7274666f6c696f49640001106e667473b50301104e465473000100204f6666436861696e10013c73656e6465725f6964656e746974798001284964656e74697479496400014472656365697665725f6964656e746974798001284964656e7469747949640001187469636b6572210101185469636b6572000118616d6f756e7418011c42616c616e63650002000005041064706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573187472616974732873746174697374696373144576656e740001183853746174547970657341646465640c008001284964656e7469747949640000a8011c417373657449440000090401345665633c53746174547970653e00000c685374617420747970657320616464656420746f2061737365742e00842843616c6c6572204449442c20417373657449442c2053746174207479706573294053746174547970657352656d6f7665640c008001284964656e7469747949640000a8011c417373657449440000090401345665633c53746174547970653e00010c78537461742074797065732072656d6f7665642066726f6d2061737365742e00842843616c6c6572204449442c20417373657449442c20537461742074797065732944417373657453746174735570646174656410008001284964656e7469747949640000a8011c4173736574494400000d040120537461745479706500001d04013c5665633c537461745570646174653e00020c50417373657420737461747320757064617465642e00a42843616c6c6572204449442c20417373657449442c205374617420747970652c2055706461746573296853657441737365745472616e73666572436f6d706c69616e63650c008001284964656e7469747949640000a8011c417373657449440000350401585665633c5472616e73666572436f6e646974696f6e3e00030ca0536574205472616e7366657220636f6d706c69616e63652072756c657320666f722061737365742e00a82843616c6c6572204449442c20417373657449442c205472616e7366657220636f6e646974696f6e7329805472616e73666572436f6e646974696f6e4578656d7074696f6e7341646465640c008001284964656e74697479496400003d0401685472616e73666572436f6e646974696f6e4578656d70744b657900004501013c5665633c4964656e7469747949643e00040c150141646420604964656e7469747949646073206578656d707420666f72207472616e7366657220636f6e646974696f6e73206d61746368696e67206578656d7074206b65792e00882843616c6c6572204449442c204578656d7074206b65792c20456e74697469657329885472616e73666572436f6e646974696f6e4578656d7074696f6e7352656d6f7665640c008001284964656e74697479496400003d0401685472616e73666572436f6e646974696f6e4578656d70744b657900004501013c5665633c4964656e7469747949643e00050c210152656d6f766520604964656e7469747949646073206578656d707420666f72207472616e7366657220636f6e646974696f6e73206d61746368696e67206578656d7074206b65792e00882843616c6c6572204449442c204578656d7074206b65792c20456e74697469657329085c4576656e747320666f722074686973206d6f64756c652e0009040000020d04000d040c4c706f6c796d6573685f7072696d697469766573287374617469737469637320537461745479706500000801386f7065726174696f6e5f7479706511040128537461744f7054797065000130636c61696d5f6973737565721504017c4f7074696f6e3c28436c61696d547970652c204964656e746974794964293e000011040c4c706f6c796d6573685f7072696d697469766573287374617469737469637328537461744f705479706500010814436f756e740000001c42616c616e636500010000150404184f7074696f6e0404540119040108104e6f6e6500000010536f6d65040019040000010000190400000408ed0280001d0400000221040021040c4c706f6c796d6573685f7072696d6974697665732873746174697374696373285374617455706461746500000801106b6579322504012853746174326e644b657900011476616c7565310401304f7074696f6e3c753132383e000025040c4c706f6c796d6573685f7072696d69746976657328737461746973746963732853746174326e644b65790001082c4e6f436c61696d5374617400000014436c61696d04002904012453746174436c61696d0001000029040c4c706f6c796d6573685f7072696d69746976657328737461746973746963732453746174436c61696d00010c2841636372656469746564040039010110626f6f6c00000024416666696c69617465040039010110626f6f6c000100304a7572697364696374696f6e04002d04014c4f7074696f6e3c436f756e747279436f64653e000200002d0404184f7074696f6e0404540115010108104e6f6e6500000010536f6d65040015010000010000310404184f7074696f6e04045401180108104e6f6e6500000010536f6d650400180000010000350400000239040039040c4c706f6c796d6573685f7072696d6974697665734c7472616e736665725f636f6d706c69616e6365445472616e73666572436f6e646974696f6e000110404d6178496e766573746f72436f756e74040028010c753634000000504d6178496e766573746f724f776e6572736869700400a502012850657263656e7461676500010028436c61696d436f756e7410002904012453746174436c61696d00008001284964656e746974794964000028010c75363400000501012c4f7074696f6e3c7536343e00020038436c61696d4f776e65727368697010002904012453746174436c61696d00008001284964656e7469747949640000a502012850657263656e746167650000a502012850657263656e74616765000300003d040c4c706f6c796d6573685f7072696d6974697665734c7472616e736665725f636f6d706c69616e6365685472616e73666572436f6e646974696f6e4578656d70744b657900000c012061737365745f6964a8011c417373657449440001086f7011040128537461744f7054797065000128636c61696d5f74797065410401444f7074696f6e3c436c61696d547970653e0000410404184f7074696f6e04045401ed020108104e6f6e6500000010536f6d650400ed0200000100004504082870616c6c65745f73746f205261774576656e7404184d6f6d656e74012801184446756e647261697365724372656174656410008001284964656e74697479496400004904013046756e64726169736572496400004d04013846756e647261697365724e616d6500005104014846756e647261697365723c4d6f6d656e743e0000088841206e65772066756e6472616973657220686173206265656e20637265617465642efc284167656e74204449442c2066756e647261697365722069642c2066756e64726169736572206e616d652c2066756e647261697365722064657461696c732920496e76657374656418008001284964656e74697479496400004904013046756e6472616973657249640000a8011c417373657449440000a8011c41737365744944000018011c42616c616e6365000018011c42616c616e63650001089c416e20696e766573746f7220696e76657374656420696e207468652066756e647261697365722e850128496e766573746f722c2066756e647261697365725f69642c206f66666572696e6720746f6b656e2c20726169736520746f6b656e2c206f66666572696e675f746f6b656e5f616d6f756e742c2072616973655f746f6b656e5f616d6f756e74294046756e6472616973657246726f7a656e08008001284964656e74697479496400004904013046756e64726169736572496400020874412066756e6472616973657220686173206265656e2066726f7a656e2e68284167656e74204449442c2066756e64726169736572206964294846756e64726169736572556e66726f7a656e08008001284964656e74697479496400004904013046756e6472616973657249640003087c412066756e6472616973657220686173206265656e20756e66726f7a656e2e68284167656e74204449442c2066756e64726169736572206964296046756e6472616973657257696e646f774d6f6469666965641800950201204576656e7444696400004904013046756e64726169736572496400002801184d6f6d656e740000050101384f7074696f6e3c4d6f6d656e743e00002801184d6f6d656e740000050101384f7074696f6e3c4d6f6d656e743e00040898412066756e647261697365722077696e646f7720686173206265656e206d6f6469666965642e0901284167656e74204449442c2066756e647261697365722069642c206f6c645f73746172742c206f6c645f656e642c206e65775f73746172742c206e65775f656e64294046756e64726169736572436c6f73656408008001284964656e74697479496400004904013046756e64726169736572496400050878412066756e6472616973657220686173206265656e2073746f707065642e68284167656e74204449442c2066756e6472616973657220696429085c4576656e747320666f722074686973206d6f64756c652e004904082870616c6c65745f73746f3046756e6472616973657249640000040028010c75363400004d04082870616c6c65745f73746f3846756e647261697365724e616d650000040030011c5665633c75383e00005104082870616c6c65745f73746f2846756e6472616973657204184d6f6d656e740128002c011c63726561746f728001284964656e7469747949640001486f66666572696e675f706f7274666f6c696fe8012c506f7274666f6c696f49640001386f66666572696e675f6173736574a8011c4173736574494400014472616973696e675f706f7274666f6c696fe8012c506f7274666f6c696f496400013472616973696e675f6173736574a8011c4173736574494400011474696572735504014c5665633c46756e64726169736572546965723e00012076656e75655f6964d903011c56656e7565496400011473746172742801184d6f6d656e7400010c656e64050101384f7074696f6e3c4d6f6d656e743e0001187374617475735d04014046756e647261697365725374617475730001486d696e696d756d5f696e766573746d656e7418011c42616c616e6365000055040000025904005904082870616c6c65745f73746f3846756e647261697365725469657200000c0114746f74616c18011c42616c616e6365000114707269636518011c42616c616e636500012472656d61696e696e6718011c42616c616e636500005d04082870616c6c65745f73746f4046756e64726169736572537461747573000110104c6976650000001846726f7a656e00010018436c6f7365640002002c436c6f7365644561726c79000300006104083c70616c6c65745f7472656173757279205261774576656e74081c42616c616e63650118244163636f756e7449640100010c50547265617375727944697362757273656d656e7410008001284964656e74697479496400008001284964656e74697479496400000001244163636f756e744964000018011c42616c616e636500000c8844697362757273656d656e7420746f206120746172676574204964656e746974792e000101287472656173757279206964656e746974792c20746172676574206964656e746974792c20746172676574207072696d617279206b65792c20616d6f756e742968547265617375727944697362757273656d656e744661696c656410008001284964656e74697479496400008001284964656e74697479496400000001244163636f756e744964000018011c42616c616e636500010ca444697362757273656d656e7420746f206120746172676574204964656e74697479206661696c65642e000101287472656173757279206964656e746974792c20746172676574206964656e746974792c20746172676574207072696d617279206b65792c20616d6f756e74295454726561737572795265696d62757273656d656e7408008001284964656e746974794964000018011c42616c616e636500020c5c5472656173757279207265696d62757273656d656e742e006428736f75726365206964656e746974792c20616d6f756e7429085c4576656e747320666f722074686973206d6f64756c652e0065040c3870616c6c65745f7574696c6974791870616c6c6574144576656e74040454000128404261746368496e746572727570746564080114696e64657810010c7533320001146572726f7260013444697370617463684572726f7200000855014261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061734877656c6c20617320746865206572726f722e384261746368436f6d706c65746564000104c84261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e604261746368436f6d706c65746564576974684572726f7273000204b44261746368206f66206469737061746368657320636f6d706c657465642062757420686173206572726f72732e344974656d436f6d706c657465640003041d01412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206e6f206572726f722e284974656d4661696c65640401146572726f7260013444697370617463684572726f720004041101412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206572726f722e30446973706174636865644173040118726573756c74510101384469737061746368526573756c7400050458412063616c6c2077617320646973706174636865642e2452656c6179656454780c012863616c6c65725f6469648001284964656e746974794964000118746172676574000130543a3a4163636f756e744964000118726573756c74510101384469737061746368526573756c740006085052656c61796564207472616e73616374696f6e2e40504f4c594d4553483a206576656e742e4c4261746368496e7465727275707465644f6c6408006904012c4576656e74436f756e747300006d04011c4572726f724174000710ac4261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792edc496e636c75646573206120766563746f72206f66206576656e7420636f756e747320666f72206561636820646973706174636820616e64f474686520696e646578206f6620746865206669727374206661696c696e672064697370617463682061732077656c6c20617320746865206572726f722e6c504f4c594d4553483a206576656e7420646570726563617465642e5442617463684f7074696d69737469634661696c656408006904012c4576656e74436f756e74730000710401305665633c4572726f7241743e000810ac4261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792ecc496e636c75646573206120766563746f72206f66206576656e7420636f756e747320666f7220656163682063616c6c20616e6429016120766563746f72206f6620616e79206661696c65642064697370617463686573207769746820746865697220696e646963657320616e64206173736f636961746564206572726f722e6c504f4c594d4553483a206576656e7420646570726563617465642e444261746368436f6d706c657465644f6c6404006904012c4576656e74436f756e747300090cc84261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722ed0496e636c75646573206120766563746f72206f66206576656e7420636f756e747320666f7220656163682064697370617463682e6c504f4c594d4553483a206576656e7420646570726563617465642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909690400000210006d040000040810600071040000026d040075041064706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573187472616974731062617365144576656e740001043c556e65787065637465644572726f720400790401544f7074696f6e3c44697370617463684572726f723e000004e4416e20756e6578706563746564206572726f722068617070656e656420746861742073686f756c6420626520696e766573746967617465642e085c4576656e747320666f722074686973206d6f64756c652e00790404184f7074696f6e04045401600108104e6f6e6500000010536f6d6504006000000100007d041064706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573187472616974733c65787465726e616c5f6167656e7473144576656e740001143047726f7570437265617465641000950201204576656e744469640000a8011c41737365744944000035010110414749640000b8015045787472696e7369635065726d697373696f6e7300000c6c416e204167656e742047726f75702077617320637265617465642e00d42843616c6c6572204449442c204147277320417373657449442c20414727732049442c2041472773207065726d697373696f6e73295c47726f75705065726d697373696f6e73557064617465641000950201204576656e744469640000a8011c41737365744944000035010110414749640000b8015045787472696e7369635065726d697373696f6e7300010ca4416e204167656e742047726f75702773207065726d697373696f6e732077617320757064617465642e00e42843616c6c6572204449442c204147277320417373657449442c20414727732049442c2041472773206e6577207065726d697373696f6e7329284167656e7441646465640c00950201204576656e744469640000a8011c417373657449440000310101284167656e7447726f757000020c4c416e206167656e74207761732061646465642e00c82843616c6c65722f4167656e74204449442c204167656e74277320417373657449442c204167656e7427732067726f757029304167656e7452656d6f7665640c00950201204576656e744469640000a8011c4173736574494400008001284964656e74697479496400030c54416e206167656e74207761732072656d6f7665642e00a82843616c6c6572204449442c204167656e74277320417373657449442c204167656e74277320444944293047726f75704368616e6765641000950201204576656e744469640000a8011c4173736574494400008001284964656e7469747949640000310101284167656e7447726f757000040c74416e206167656e7427732067726f757020776173206368616e6765642e0019012843616c6c6572204449442c204167656e74277320417373657449442c204167656e742773204449442c20546865206e65772067726f7570206f6620746865206167656e7429085c4576656e747320666f722074686973206d6f64756c652e0081041064706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573187472616974731c72656c61796572205261774576656e7404244163636f756e744964010001104c417574686f72697a6564506179696e674b65791400950201204576656e7444696400000001244163636f756e74496400000001244163636f756e744964000018011c42616c616e6365000028010c75363400000ccc417574686f72697a6174696f6e20676976656e20666f722060706179696e675f6b65796020746f2060757365725f6b6579602e0001012843616c6c6572204449442c2055736572204b65792c20506179696e67204b65792c20496e697469616c20504f4c5958206c696d69742c204175746820494429444163636570746564506179696e674b65790c00950201204576656e7444696400000001244163636f756e74496400000001244163636f756e74496400010c50416363657074656420706179696e67206b65792e00882843616c6c6572204449442c2055736572204b65792c20506179696e67204b6579294052656d6f766564506179696e674b65790c00950201204576656e7444696400000001244163636f756e74496400000001244163636f756e74496400020c4c52656d6f76656420706179696e67206b65792e00882843616c6c6572204449442c2055736572204b65792c20506179696e67204b6579294455706461746564506f6c79784c696d69741400950201204576656e7444696400000001244163636f756e74496400000001244163636f756e744964000018011c42616c616e6365000018011c42616c616e636500030c505570646174656420706f6c7978206c696d69742e0011012843616c6c6572204449442c2055736572204b65792c20506179696e67204b65792c20504f4c5958206c696d69742c206f6c642072656d61696e696e6720504f4c595829085c4576656e747320666f722074686973206d6f64756c652e0085040c4070616c6c65745f636f6e7472616374731870616c6c6574144576656e7404045400012030496e7374616e7469617465640801206465706c6f796572000130543a3a4163636f756e744964000120636f6e7472616374000130543a3a4163636f756e744964000004d8436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e285465726d696e61746564080120636f6e7472616374000130543a3a4163636f756e744964048454686520636f6e7472616374207468617420776173207465726d696e617465642e012c62656e6566696369617279000130543a3a4163636f756e74496404e4546865206163636f756e7420746861742072656365697665642074686520636f6e7472616374732072656d61696e696e672062616c616e6365011868436f6e747261637420686173206265656e2072656d6f7665642e001823204e6f7465003d01546865206f6e6c792077617920666f72206120636f6e747261637420746f2062652072656d6f76656420616e6420656d697474696e672074686973206576656e742069732062792063616c6c696e6744607365616c5f7465726d696e617465602e28436f646553746f726564040124636f64655f686173682c011c543a3a48617368000204b4436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e3c436f6e7472616374456d6974746564080120636f6e7472616374000130543a3a4163636f756e744964049054686520636f6e7472616374207468617420656d697474656420746865206576656e742e01106461746130011c5665633c75383e0835014461746120737570706c6965642062792074686520636f6e74726163742e204d657461646174612067656e65726174656420647572696e6720636f6e747261637420636f6d70696c6174696f6e5c6973206e656564656420746f206465636f64652069742e03049c4120637573746f6d206576656e7420656d69747465642062792074686520636f6e74726163742e2c436f646552656d6f766564040124636f64655f686173682c011c543a3a48617368000404ac4120636f6465207769746820746865207370656369666965642068617368207761732072656d6f7665642e4c436f6e7472616374436f6465557064617465640c0120636f6e7472616374000130543a3a4163636f756e744964048c54686520636f6e7472616374207468617420686173206265656e20757064617465642e01346e65775f636f64655f686173682c011c543a3a4861736804b04e657720636f646520686173682074686174207761732073657420666f722074686520636f6e74726163742e01346f6c645f636f64655f686173682c011c543a3a48617368048c50726576696f757320636f64652068617368206f662074686520636f6e74726163742e0504784120636f6e7472616374277320636f64652077617320757064617465642e1843616c6c656408011863616c6c6572000130543a3a4163636f756e744964049c546865206163636f756e7420746861742063616c6c6564207468652060636f6e7472616374602e0120636f6e7472616374000130543a3a4163636f756e744964047454686520636f6e74726163742074686174207761732063616c6c65642e061c11014120636f6e7472616374207761732063616c6c656420656974686572206279206120706c61696e206163636f756e74206f7220616e6f7468657220636f6e74726163742e001823204e6f7465003101506c65617365206b65657020696e206d696e642074686174206c696b6520616c6c206576656e74732074686973206973206f6e6c7920656d697474656420666f72207375636365737366756c290163616c6c732e20546869732069732062656361757365206f6e206661696c75726520616c6c2073746f72616765206368616e67657320696e636c7564696e67206576656e74732061726530726f6c6c6564206261636b2e3844656c656761746543616c6c6564080120636f6e7472616374000130543a3a4163636f756e74496408210154686520636f6e7472616374207468617420706572666f726d6564207468652064656c65676174652063616c6c20616e642068656e636520696e2077686f736520636f6e74657874707468652060636f64655f68617368602069732065786563757465642e0124636f64655f686173682c012c436f6465486173683c543e049c54686520636f646520686173682074686174207761732064656c65676174652063616c6c65642e071c9c4120636f6e74726163742064656c65676174652063616c6c6564206120636f646520686173682e001823204e6f7465003101506c65617365206b65657020696e206d696e642074686174206c696b6520616c6c206576656e74732074686973206973206f6e6c7920656d697474656420666f72207375636365737366756c290163616c6c732e20546869732069732062656361757365206f6e206661696c75726520616c6c2073746f72616765206368616e67657320696e636c7564696e67206576656e74732061726530726f6c6c6564206261636b2e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a09090989040848706f6c796d6573685f636f6e747261637473205261774576656e74081048617368012c244163636f756e744964010001083841706948617368557064617465640c008d04010c417069000091040130436861696e56657273696f6e00002c011048617368000008f0456d6974746564207768656e206120636f6e74726163742073746172747320737570706f7274696e672061206e65772041504920757067726164652e2101436f6e7461696e7320746865205b60417069605d2c205b60436861696e56657273696f6e605d2c20616e642074686520627974657320666f722074686520636f646520686173682e34534352756e74696d6543616c6c08000001244163636f756e74496400009504012c45787472696e7369634964000108bc456d6974746564207768656e206120636f6e74726163742063616c6c7320696e746f207468652072756e74696d652e2901436f6e7461696e7320746865206163636f756e74206964207365742062792074686520636f6e7472616374206f776e657220616e6420746865205b6045787472696e7369634964605d2e085c4576656e747320666f722074686973206d6f64756c652e008d040848706f6c796d6573685f636f6e7472616374730c41706900000801106465736340011c5b75383b20345d0001146d616a6f7210010c753332000091040848706f6c796d6573685f636f6e74726163747330436861696e56657273696f6e0000080130737065635f76657273696f6e10010c75333200012874785f76657273696f6e10010c753332000095040c48706f6c796d6573685f636f6e7472616374733c636861696e5f657874656e73696f6e2c45787472696e736963496400000800080108753800000801087538000099040c3c70616c6c65745f707265696d6167651870616c6c6574144576656e7404045400010c144e6f746564040110686173682c011c543a3a48617368000004684120707265696d61676520686173206265656e206e6f7465642e24526571756573746564040110686173682c011c543a3a48617368000104784120707265696d61676520686173206265656e207265717565737465642e1c436c6561726564040110686173682c011c543a3a486173680002046c4120707265696d616765206861732062656e20636c65617265642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a0909099d041064706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573187472616974730c6e6674144576656e74000108504e6674436f6c6c656374696f6e437265617465640c008001284964656e7469747949640000a8011c417373657449440000a104013c4e4654436f6c6c656374696f6e4964000004b4456d6974746564207768656e2061206e6577206e667420636f6c6c656374696f6e20697320637265617465642e4c4e4654506f7274666f6c696f5570646174656414008001284964656e7469747949640000b50301104e46547300007d02014c4f7074696f6e3c506f7274666f6c696f49643e00007d02014c4f7074696f6e3c506f7274666f6c696f49643e000081020154506f7274666f6c696f557064617465526561736f6e00010cdc456d6974746564207768656e204e4654732077657265206973737565642c2072656465656d6564206f72207472616e736665727265642e0502436f6e7461696e7320746865205b604964656e746974794964605d206f66207468652072656365697665722f6973737565722f72656465656d65722c20746865205b604e465473605d2c20746865205b60506f7274666f6c696f4964605d206f662074686520736f757263652c20746865205b60506f7274666f6c696f4964605dd46f66207468652064657374696e6174696f6e20616e6420746865205b60506f7274666f6c696f557064617465526561736f6e605d2e085c4576656e747320666f722074686973206d6f64756c652e00a1040c4c706f6c796d6573685f7072696d6974697665730c6e66743c4e4654436f6c6c656374696f6e49640000040028010c7536340000a5040c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c6574144576656e7404045400011838536f6c7574696f6e53746f7265640c011c636f6d70757465a904013c456c656374696f6e436f6d707574650001186f726967696e290101504f7074696f6e3c543a3a4163636f756e7449643e000130707265765f656a656374656439010110626f6f6c00001cb44120736f6c7574696f6e207761732073746f72656420776974682074686520676976656e20636f6d707574652e00510154686520606f726967696e6020696e6469636174657320746865206f726967696e206f662074686520736f6c7574696f6e2e20496620606f726967696e602069732060536f6d65284163636f756e74496429602c55017468652073746f72656420736f6c7574696f6e20776173207375626d6974656420696e20746865207369676e65642070686173652062792061206d696e657220776974682074686520604163636f756e744964602e25014f74686572776973652c2074686520736f6c7574696f6e207761732073746f7265642065697468657220647572696e672074686520756e7369676e6564207068617365206f722062794d0160543a3a466f7263654f726967696e602e205468652060626f6f6c6020697320607472756560207768656e20612070726576696f757320736f6c7574696f6e2077617320656a656374656420746f206d616b6548726f6f6d20666f722074686973206f6e652e44456c656374696f6e46696e616c697a656408011c636f6d70757465a904013c456c656374696f6e436f6d7075746500011473636f7265ad040134456c656374696f6e53636f7265000104190154686520656c656374696f6e20686173206265656e2066696e616c697a65642c20776974682074686520676976656e20636f6d7075746174696f6e20616e642073636f72652e38456c656374696f6e4661696c656400020c4c416e20656c656374696f6e206661696c65642e0001014e6f74206d7563682063616e20626520736169642061626f757420776869636820636f6d7075746573206661696c656420696e207468652070726f636573732e20526577617264656408011c6163636f756e740001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e74496400011476616c756518013042616c616e63654f663c543e0003042501416e206163636f756e7420686173206265656e20726577617264656420666f72207468656972207369676e6564207375626d697373696f6e206265696e672066696e616c697a65642e1c536c617368656408011c6163636f756e740001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e74496400011476616c756518013042616c616e63654f663c543e0004042101416e206163636f756e7420686173206265656e20736c617368656420666f72207375626d697474696e6720616e20696e76616c6964207369676e6564207375626d697373696f6e2e4450686173655472616e736974696f6e65640c011066726f6db104015450686173653c543a3a426c6f636b4e756d6265723e000108746fb104015450686173653c543a3a426c6f636b4e756d6265723e000114726f756e6410010c753332000504b85468657265207761732061207068617365207472616e736974696f6e20696e206120676976656e20726f756e642e04a1010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f2920656d69747465640a090909627920746869732070616c6c65742e0a090909a904089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173653c456c656374696f6e436f6d707574650001141c4f6e436861696e000000185369676e656400010020556e7369676e65640002002046616c6c6261636b00030024456d657267656e637900040000ad04084473705f6e706f735f656c656374696f6e7334456c656374696f6e53636f726500000c01346d696e696d616c5f7374616b6518013c457874656e64656442616c616e636500012473756d5f7374616b6518013c457874656e64656442616c616e636500014473756d5f7374616b655f7371756172656418013c457874656e64656442616c616e63650000b104089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651450686173650408426e011001100c4f6666000000185369676e656400010020556e7369676e65640400b504012828626f6f6c2c20426e2900020024456d657267656e637900030000b5040000040839011000b904084470616c6c65745f746573745f7574696c73205261774576656e7404244163636f756e744964010001082444696453746174757308008001284964656e74697479496400000001244163636f756e744964000008e4456d6974732074686520604964656e7469747949646020616e642074686520604163636f756e74496460206f66207468652063616c6c65722e702843616c6c6572204449442c2043616c6c6572206163636f756e7429244364645374617475730c007c01484f7074696f6e3c4964656e7469747949643e00000001244163636f756e744964000039010110626f6f6c00010c550153686f777320746865206044494460206173736f63696174656420746f2074686520604163636f756e744964602c20616e64206120666c616720696e646963617465732069662074686174204449442068617320614076616c69642043444420636c61696d2ed828546172676574204449442c20546172676574204163636f756e742c20612076616c69642043444420636c61696d2065786973747329085c4576656e747320666f722074686973206d6f64756c652e00bd0408306672616d655f73797374656d14506861736500010c384170706c7945787472696e736963040010010c7533320000003046696e616c697a6174696f6e00010038496e697469616c697a6174696f6e00020000c1040000022c00c504000002cd0300c90408306672616d655f73797374656d584c61737452756e74696d6555706772616465496e666f0000080130737065635f76657273696f6ecd04014c636f6465633a3a436f6d706163743c7533323e000124737065635f6e616d65c4016473705f72756e74696d653a3a52756e74696d65537472696e670000cd040000061000d1040c306672616d655f73797374656d1870616c6c65741043616c6c0404540001201872656d61726b04011872656d61726b30011c5665633c75383e000010684d616b6520736f6d65206f6e2d636861696e2072656d61726b2e0034232320436f6d706c6578697479202d20604f28312960387365745f686561705f7061676573040114706167657328010c753634000104f853657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040110636f646530011c5665633c75383e0002106453657420746865206e65772072756e74696d6520636f64652e0034232320436f6d706c657869747931012d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f6465605c7365745f636f64655f776974686f75745f636865636b73040110636f646530011c5665633c75383e000310190153657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e0034232320436f6d706c65786974798c2d20604f2843296020776865726520604360206c656e677468206f662060636f6465602c7365745f73746f726167650401146974656d73d50401345665633c4b657956616c75653e0004046853657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f726167650401106b657973dd0401205665633c4b65793e000504744b696c6c20736f6d65206974656d732066726f6d2073746f726167652e2c6b696c6c5f70726566697808011870726566697830010c4b657900011c7375626b65797310010c75333200061011014b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e0039012a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e6465723d0174686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e4472656d61726b5f776974685f6576656e7404011872656d61726b30011c5665633c75383e000704a44d616b6520736f6d65206f6e2d636861696e2072656d61726b20616e6420656d6974206576656e742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed504000002d90400d90400000408303000dd040000023000e1040c306672616d655f73797374656d186c696d69747330426c6f636b5765696768747300000c0128626173655f626c6f636b2001185765696768740001246d61785f626c6f636b2001185765696768740001247065725f636c617373e50401845065724469737061746368436c6173733c57656967687473506572436c6173733e0000e5040c346672616d655f737570706f7274206469737061746368405065724469737061746368436c61737304045401e904000c01186e6f726d616ce90401045400012c6f7065726174696f6e616ce9040104540001246d616e6461746f7279e9040104540000e9040c306672616d655f73797374656d186c696d6974733c57656967687473506572436c6173730000100138626173655f65787472696e7369632001185765696768740001346d61785f65787472696e736963ed0401384f7074696f6e3c5765696768743e0001246d61785f746f74616ced0401384f7074696f6e3c5765696768743e0001207265736572766564ed0401384f7074696f6e3c5765696768743e0000ed0404184f7074696f6e04045401200108104e6f6e6500000010536f6d650400200000010000f1040c306672616d655f73797374656d186c696d6974732c426c6f636b4c656e677468000004010c6d6178f50401545065724469737061746368436c6173733c7533323e0000f5040c346672616d655f737570706f7274206469737061746368405065724469737061746368436c6173730404540110000c01186e6f726d616c1001045400012c6f7065726174696f6e616c100104540001246d616e6461746f7279100104540000f904082873705f776569676874733c52756e74696d65446257656967687400000801107265616428010c753634000114777269746528010c7536340000fd04082873705f76657273696f6e3852756e74696d6556657273696f6e0000200124737065635f6e616d65c4013452756e74696d65537472696e67000124696d706c5f6e616d65c4013452756e74696d65537472696e67000144617574686f72696e675f76657273696f6e10010c753332000130737065635f76657273696f6e10010c753332000130696d706c5f76657273696f6e10010c753332000110617069730105011c4170697356656300014c7472616e73616374696f6e5f76657273696f6e10010c75333200013473746174655f76657273696f6e080108753800000105040c436f77040454010505000400050500000005050000020905000905000004080d0510000d0500000308000000080011050c306672616d655f73797374656d1870616c6c6574144572726f720404540001183c496e76616c6964537065634e616d650000081101546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e685370656356657273696f6e4e65656473546f496e63726561736500010841015468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e744661696c6564546f4578747261637452756e74696d6556657273696f6e00020cec4661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e0009014569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e4c4e6f6e44656661756c74436f6d706f73697465000304fc537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e3c4e6f6e5a65726f526566436f756e74000404350154686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e3043616c6c46696c7465726564000504d0546865206f726967696e2066696c7465722070726576656e74207468652063616c6c20746f20626520646973706174636865642e046c4572726f7220666f72207468652053797374656d2070616c6c657415050c4c626f756e6465645f636f6c6c656374696f6e73407765616b5f626f756e6465645f766563385765616b426f756e646564566563080454011905045300000400210501185665633c543e00001905000004081d0528001d050c4473705f636f6e73656e7375735f626162650c617070185075626c696300000400c901013c737232353531393a3a5075626c6963000021050000021905002505084873705f636f6e73656e7375735f736c6f747310536c6f740000040028010c753634000029050c4473705f636f6e73656e7375735f626162651c64696765737473504e657874436f6e66696744657363726970746f72000104085631080104632d050128287536342c2075363429000134616c6c6f7765645f736c6f747331050130416c6c6f776564536c6f7473000100002d05000004082828003105084473705f636f6e73656e7375735f6261626530416c6c6f776564536c6f747300010c305072696d617279536c6f7473000000745072696d617279416e645365636f6e64617279506c61696e536c6f74730001006c5072696d617279416e645365636f6e64617279565246536c6f74730002000035050c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e6465645665630804540104045300000400390501185665633c543e0000390500000204003d0504184f7074696f6e0404540141050108104e6f6e6500000010536f6d6504004105000001000041050c4473705f636f6e73656e7375735f626162651c646967657374732450726544696765737400010c1c5072696d6172790400450501405072696d617279507265446967657374000100385365636f6e64617279506c61696e04004905015c5365636f6e64617279506c61696e507265446967657374000200305365636f6e6461727956524604004d0501545365636f6e646172795652465072654469676573740003000045050c4473705f636f6e73656e7375735f626162651c64696765737473405072696d617279507265446967657374000010013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f7425050110536c6f740001287672665f6f75747075740401245652464f75747075740001247672665f70726f6f662502012056524650726f6f66000049050c4473705f636f6e73656e7375735f626162651c646967657374735c5365636f6e64617279506c61696e507265446967657374000008013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f7425050110536c6f7400004d050c4473705f636f6e73656e7375735f626162651c64696765737473545365636f6e64617279565246507265446967657374000010013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f7425050110536c6f740001287672665f6f75747075740401245652464f75747075740001247672665f70726f6f662502012056524650726f6f6600005105084473705f636f6e73656e7375735f62616265584261626545706f6368436f6e66696775726174696f6e0000080104632d050128287536342c2075363429000134616c6c6f7765645f736c6f747331050130416c6c6f776564536c6f7473000055050c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e6465645665630804540159050453000004005d0501185665633c543e00005905000004082810005d0500000259050061050c2c70616c6c65745f626162651870616c6c65741043616c6c04045400010c4c7265706f72745f65717569766f636174696f6e08014865717569766f636174696f6e5f70726f6f6665050184426f783c45717569766f636174696f6e50726f6f663c543a3a4865616465723e3e00013c6b65795f6f776e65725f70726f6f6671050140543a3a4b65794f776e657250726f6f6600001009015265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667905017468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f660d01616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c306265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e656408014865717569766f636174696f6e5f70726f6f6665050184426f783c45717569766f636174696f6e50726f6f663c543a3a4865616465723e3e00013c6b65795f6f776e65725f70726f6f6671050140543a3a4b65794f776e657250726f6f6600012009015265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667905017468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f660d01616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c306265207265706f727465642e0d01546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c791501626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c2061732073756368150169662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e247265706f727465722e48706c616e5f636f6e6669675f6368616e6765040118636f6e666967290501504e657874436f6e66696744657363726970746f720002105d01506c616e20616e2065706f636820636f6e666967206368616e67652e205468652065706f636820636f6e666967206368616e6765206973207265636f7264656420616e642077696c6c20626520656e6163746564206f6e5101746865206e6578742063616c6c20746f2060656e6163745f65706f63685f6368616e6765602e2054686520636f6e6669672077696c6c20626520616374697661746564206f6e652065706f63682061667465722e59014d756c7469706c652063616c6c7320746f2074686973206d6574686f642077696c6c207265706c61636520616e79206578697374696e6720706c616e6e656420636f6e666967206368616e6765207468617420686164546e6f74206265656e20656e6163746564207965742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e6505084873705f636f6e73656e7375735f736c6f74734445717569766f636174696f6e50726f6f660818486561646572016905084964011d05001001206f6666656e6465721d0501084964000110736c6f7425050110536c6f7400013066697273745f686561646572690501184865616465720001347365636f6e645f6865616465726905011848656164657200006905102873705f72756e74696d651c67656e65726963186865616465721848656164657208184e756d62657201101048617368016d050014012c706172656e745f686173682c0130486173683a3a4f75747075740001186e756d626572cd0401184e756d62657200012873746174655f726f6f742c0130486173683a3a4f757470757400013c65787472696e736963735f726f6f742c0130486173683a3a4f757470757400011864696765737434011844696765737400006d050c2873705f72756e74696d65187472616974732c426c616b6554776f323536000000007105082873705f73657373696f6e3c4d656d6265727368697050726f6f6600000c011c73657373696f6e10013053657373696f6e496e646578000128747269655f6e6f646573dd0401305665633c5665633c75383e3e00013c76616c696461746f725f636f756e7410013856616c696461746f72436f756e74000075050c2c70616c6c65745f626162651870616c6c6574144572726f7204045400011060496e76616c696445717569766f636174696f6e50726f6f660000043101416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c69644b65794f776e65727368697050726f6f66000104310141206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f727400020415014120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e50496e76616c6964436f6e66696775726174696f6e0003048c5375626d697474656420636f6e66696775726174696f6e20697320696e76616c69642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a09090979050c4070616c6c65745f74696d657374616d701870616c6c65741043616c6c0404540001040c73657404010c6e6f77240124543a3a4d6f6d656e7400003c54536574207468652063757272656e742074696d652e005501546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed470686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e0041015468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627940604d696e696d756d506572696f64602e00d4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e0034232320436f6d706c657869747931012d20604f2831296020284e6f7465207468617420696d706c656d656e746174696f6e73206f6620604f6e54696d657374616d7053657460206d75737420616c736f20626520604f283129602961012d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e402020606f6e5f66696e616c697a656029d42d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f736574602e204d75737420626520604f283129602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e7d050000040c001839010081050c3870616c6c65745f696e64696365731870616c6c65741043616c6c04045400011414636c61696d040114696e64657810013c543a3a4163636f756e74496e6465780000309841737369676e20616e2070726576696f75736c7920756e61737369676e656420696e6465782e00dc5061796d656e743a20604465706f736974602069732072657365727665642066726f6d207468652073656e646572206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00f02d2060696e646578603a2074686520696e64657820746f20626520636c61696d65642e2054686973206d757374206e6f7420626520696e207573652e0090456d6974732060496e64657841737369676e656460206966207375636365737366756c2e0034232320436f6d706c6578697479242d20604f283129602e207472616e7366657208010c6e6577850501504163636f756e7449644c6f6f6b75704f663c543e000114696e64657810013c543a3a4163636f756e74496e6465780001305d0141737369676e20616e20696e64657820616c7265616479206f776e6564206279207468652073656e64657220746f20616e6f74686572206163636f756e742e205468652062616c616e6365207265736572766174696f6eb86973206566666563746976656c79207472616e7366657272656420746f20746865206e6577206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0025012d2060696e646578603a2074686520696e64657820746f2062652072652d61737369676e65642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e5d012d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e0090456d6974732060496e64657841737369676e656460206966207375636365737366756c2e0034232320436f6d706c6578697479242d20604f283129602e1066726565040114696e64657810013c543a3a4163636f756e74496e646578000230944672656520757020616e20696e646578206f776e6564206279207468652073656e6465722e005d015061796d656e743a20416e792070726576696f7573206465706f73697420706c6163656420666f722074686520696e64657820697320756e726573657276656420696e207468652073656e646572206163636f756e742e005501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206f776e2074686520696e6465782e000d012d2060696e646578603a2074686520696e64657820746f2062652066726565642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e0084456d6974732060496e646578467265656460206966207375636365737366756c2e0034232320436f6d706c6578697479242d20604f283129602e38666f7263655f7472616e736665720c010c6e6577850501504163636f756e7449644c6f6f6b75704f663c543e000114696e64657810013c543a3a4163636f756e74496e646578000118667265657a6539010110626f6f6c0003345501466f72636520616e20696e64657820746f20616e206163636f756e742e205468697320646f65736e277420726571756972652061206465706f7369742e2049662074686520696e64657820697320616c7265616479e868656c642c207468656e20616e79206465706f736974206973207265696d62757273656420746f206974732063757272656e74206f776e65722e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00a42d2060696e646578603a2074686520696e64657820746f206265202872652d2961737369676e65642e5d012d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e41012d2060667265657a65603a2069662073657420746f206074727565602c2077696c6c20667265657a652074686520696e64657820736f2069742063616e6e6f74206265207472616e736665727265642e0090456d6974732060496e64657841737369676e656460206966207375636365737366756c2e0034232320436f6d706c6578697479242d20604f283129602e18667265657a65040114696e64657810013c543a3a4163636f756e74496e6465780004304101467265657a6520616e20696e64657820736f2069742077696c6c20616c7761797320706f696e7420746f207468652073656e646572206163636f756e742e205468697320636f6e73756d657320746865206465706f7369742e005901546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206861766520616c6e6f6e2d66726f7a656e206163636f756e742060696e646578602e00ac2d2060696e646578603a2074686520696e64657820746f2062652066726f7a656e20696e20706c6163652e0088456d6974732060496e64657846726f7a656e60206966207375636365737366756c2e0034232320436f6d706c6578697479242d20604f283129602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e85050c2873705f72756e74696d65306d756c746961646472657373304d756c74694164647265737308244163636f756e7449640100304163636f756e74496e6465780110011408496404000001244163636f756e74496400000014496e6465780400cd0401304163636f756e74496e6465780001000c526177040030011c5665633c75383e0002002441646472657373333204000401205b75383b2033325d000300244164647265737332300400090201205b75383b2032305d0004000089050c3870616c6c65745f696e64696365731870616c6c6574144572726f720404540001142c4e6f7441737369676e65640000048c54686520696e64657820776173206e6f7420616c72656164792061737369676e65642e204e6f744f776e6572000104a454686520696e6465782069732061737369676e656420746f20616e6f74686572206163636f756e742e14496e5573650002047054686520696e64657820776173206e6f7420617661696c61626c652e2c4e6f745472616e73666572000304c854686520736f7572636520616e642064657374696e6174696f6e206163636f756e747320617265206964656e746963616c2e245065726d616e656e74000404d054686520696e646578206973207065726d616e656e7420616e64206d6179206e6f742062652066726565642f6368616e6765642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a0909098d050000029105009105083c70616c6c65745f62616c616e6365732c42616c616e63654c6f636b041c42616c616e63650118000c010869640d0501384c6f636b4964656e746966696572000118616d6f756e7418011c42616c616e636500011c726561736f6e739505011c526561736f6e73000095051064706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573187472616974732062616c616e6365731c526561736f6e7300010c0c466565000000104d6973630001000c416c6c000200009905083c70616c6c65745f62616c616e6365731043616c6c040454000118207472616e73666572080110646573748505018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011476616c7565d901011c42616c616e6365000058d45472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e000501607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e1d0149742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e001501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002823203c7765696768743e2d012d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72c82020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e65012d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e004852656c617465642066756e6374696f6e733a004d0120202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e290120202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365d0202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e842d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d41012d2042617365205765696768743a2037332e363420c2b5732c20776f7273742063617365207363656e6172696f20286163636f756e7420637265617465642c206163636f756e742072656d6f76656429dc2d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374696e6174696f6e206163636f756e742e11012d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e2c23203c2f7765696768743e487472616e736665725f776974685f6d656d6f0c0110646573748505018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011476616c7565d901011c42616c616e63650001106d656d6f8401304f7074696f6e3c4d656d6f3e000120fc5472616e7366657220746865206e61746976652063757272656e63792077697468207468652068656c70206f66206964656e74696669657220737472696e67ec746869732066756e6374696f6e616c6974792063616e2068656c7020746f20646966666572656e746961746520746865207472616e73666572732e002823203c7765696768743e41012d2042617365205765696768743a2037332e363420c2b5732c20776f7273742063617365207363656e6172696f20286163636f756e7420637265617465642c206163636f756e742072656d6f76656429dc2d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374696e6174696f6e206163636f756e742e11012d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e2c23203c2f7765696768743e906465706f7369745f626c6f636b5f7265776172645f726573657276655f62616c616e636504011476616c7565d901011c42616c616e6365000204dc4d6f766520736f6d6520504f4c59582066726f6d2062616c616e6365206f662073656c6620746f2062616c616e6365206f66204252522e2c7365745f62616c616e63650c010c77686f8505018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001206e65775f66726565d901011c42616c616e63650001306e65775f7265736572766564d901011c42616c616e636500031890536574207468652062616c616e636573206f66206120676976656e206163636f756e742e001d01546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c0501616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e00b0546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e38666f7263655f7472616e736665720c0118736f757263658505018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000110646573748505018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011476616c7565d901011c42616c616e636500041c4d0145786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d6179206265287370656369666965642e002823203c7765696768743e3d012d2053616d65206173207472616e736665722c20627574206164646974696f6e616c207265616420616e6420777269746520626563617573652074686520736f75726365206163636f756e742069738c20206e6f7420617373756d656420746f20626520696e20746865206f7665726c61792e2c23203c2f7765696768743e506275726e5f6163636f756e745f62616c616e6365040118616d6f756e7418011c42616c616e636500050429014275726e732074686520676976656e20616d6f756e74206f6620746f6b656e732066726f6d207468652063616c6c6572277320667265652c20756e6c6f636b65642062616c616e63652e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e9d05083c70616c6c65745f62616c616e636573144572726f72040454000114544c69717569646974795265737472696374696f6e73000004c44163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c204f766572666c6f7700010470476f7420616e206f766572666c6f7720616674657220616464696e674c496e73756666696369656e7442616c616e63650002047442616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f736974000304e856616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f7369744852656365697665724364644d697373696e6700040488526563656976657220646f6573206e6f74206861766520612076616c69642043444400a1050c3473705f61726974686d657469632c66697865645f706f696e742446697865645531323800000400180110753132380000a505086870616c6c65745f7472616e73616374696f6e5f7061796d656e742052656c6561736573000108245631416e6369656e7400000008563200010000a905000002ad0500ad05082873705f7765696768747358576569676874546f466565436f656666696369656e74041c42616c616e6365011800100134636f6566665f696e746567657218011c42616c616e6365000128636f6566665f667261639101011c50657262696c6c0001206e6567617469766539010110626f6f6c00011864656772656508010875380000b1050c4c706f6c796d6573685f7072696d697469766573206964656e74697479244469645265636f726404244163636f756e74496401000004012c7072696d6172795f6b6579290101444f7074696f6e3c4163636f756e7449643e0000b50500000408b905bd0500b9050c3c70616c6c65745f6964656e746974791474797065732c436c61696d3173744b657900000801187461726765748001284964656e746974794964000128636c61696d5f74797065ed020124436c61696d547970650000bd050c3c70616c6c65745f6964656e746974791474797065732c436c61696d326e644b657900000801186973737565728001284964656e74697479496400011473636f70651d0101344f7074696f6e3c53636f70653e0000c1050c4c706f6c796d6573685f7072696d697469766573347365636f6e646172795f6b6579244b65795265636f726404244163636f756e7449640100010c285072696d6172794b657904008001284964656e746974794964000000305365636f6e646172794b657904008001284964656e746974794964000100444d756c74695369675369676e65724b657904000001244163636f756e74496400020000c50500000408800000c90500000408cd052800cd050c4c706f6c796d6573685f7072696d697469766573347365636f6e646172795f6b6579245369676e61746f727904244163636f756e74496401000108204964656e7469747904008001284964656e7469747949640000001c4163636f756e7404000001244163636f756e74496400010000d1050c4c706f6c796d6573685f7072696d69746976657334617574686f72697a6174696f6e34417574686f72697a6174696f6e08244163636f756e7449640100184d6f6d656e74012800140148617574686f72697a6174696f6e5f646174612d010170417574686f72697a6174696f6e446174613c4163636f756e7449643e000134617574686f72697a65645f62798001284964656e746974794964000118657870697279050101384f7074696f6e3c4d6f6d656e743e00011c617574685f696428010c753634000114636f756e7410010c7533320000d50500000408802800d905083c70616c6c65745f6964656e746974791c56657273696f6e0000040008010875380000dd0500000408808000e105083c70616c6c65745f6964656e746974791043616c6c040454000160406364645f72656769737465725f6469640801387461726765745f6163636f756e74000130543a3a4163636f756e7449640001387365636f6e646172795f6b65797398017c5665633c5365636f6e646172794b65793c543a3a4163636f756e7449643e3e000020b8526567697374657220607461726765745f6163636f756e746020776974682061206e6577204964656e746974792e002423204661696c75726545012d20606f726967696e602068617320746f206265206120616374697665204344442070726f76696465722e20496e616374697665204344442070726f7669646572732063616e6e6f7420616464206e65771c636c61696d732e5d012d20607461726765745f6163636f756e746020287072696d617279206b6579206f6620746865206e6577204964656e74697479292063616e206265206c696e6b656420746f206a757374206f6e6520616e64206f6e6c79346f6e65206964656e746974792ef42d2045787465726e616c207365636f6e64617279206b6579732063616e206265206c696e6b656420746f206a757374206f6e65206964656e746974792e54696e76616c69646174655f6364645f636c61696d730c010c6364648001284964656e74697479496400013064697361626c655f66726f6d280124543a3a4d6f6d656e74000118657870697279050101444f7074696f6e3c543a3a4d6f6d656e743e0001102101496e76616c69646174657320616e7920636c61696d2067656e6572617465642062792060636464602066726f6d206064697361626c655f66726f6d602074696d657374616d70732e009c596f752063616e20616c736f20646566696e6520616e2065787069726174696f6e2074696d652c6d0177686963682077696c6c20696e76616c696461746520616c6c20636c61696d732067656e657261746564206279207468617420606364646020616e642072656d6f766520697420617320434444206d656d6265722067726f75702e486163636570745f7072696d6172795f6b6579080140726f746174696f6e5f617574685f696428010c7536340001506f7074696f6e616c5f6364645f617574685f69640501012c4f7074696f6e3c7536343e000234650143616c6c2074686973207769746820746865206e6577207072696d617279206b65792e20427920696e766f6b696e672074686973206d6574686f642c2063616c6c6572206163636570747320617574686f72697a6174696f6e6501746f206265636f6d6520746865206e6577207072696d617279206b6579206f66207468652069737375696e67206964656e746974792e20496620612043444420736572766963652070726f766964657220617070726f766564250174686973206368616e676520286f722074686973206973206e6f74207265717569726564292c207072696d617279206b6579206f66207468652044494420697320757064617465642e005d015468652063616c6c657220286e6577207072696d617279206b657929206d757374206265206569746865722061207365636f6e64617279206b6579206f66207468652069737375696e67206964656e746974792c206f7264756e6c696e6b656420746f20616e79206964656e746974792e005d01446966666572732066726f6d20726f746174655f7072696d6172795f6b65795f746f5f7365636f6e6461727920696e20746861742069742077696c6c20756e6c696e6b20746865206f6c64207072696d617279206b6579a4696e7374656164206f66206c656176696e672069742061732061207365636f6e64617279206b65792e002c2320417267756d656e74731d012a20606f776e65725f617574685f69646020417574686f72697a6174696f6e2066726f6d20746865206f776e65722077686f20696e6974696174656420746865206368616e6765e42a20606364645f617574685f69646020417574686f72697a6174696f6e2066726f6d20612043444420736572766963652070726f7669646572986368616e67655f6364645f726571756972656d656e745f666f725f6d6b5f726f746174696f6e040134617574685f726571756972656439010110626f6f6c00031435015365742069662043444420617574686f72697a6174696f6e20697320726571756972656420666f72207570646174696e67207072696d617279206b6579206f6620616e206964656e746974792e7843616c6c61626c652076696120726f6f742028676f7665726e616e636529002c2320417267756d656e7473cc2a2060617574685f7265717569726564602043444420417574686f72697a6174696f6e207265717569726564206f72206e6f74506a6f696e5f6964656e746974795f61735f6b657904011c617574685f696428010c753634000404904a6f696e20616e206964656e746974792061732061207365636f6e64617279206b65792e546c656176655f6964656e746974795f61735f6b65790005048c4c6561766520746865207365636f6e64617279206b65792773206964656e746974792e246164645f636c61696d0c01187461726765748001284964656e746974794964000114636c61696d09010114436c61696d000118657870697279050101444f7074696f6e3c543a3a4d6f6d656e743e00060cc4416464732061206e657720636c61696d207265636f7264206f7220656469747320616e206578697374696e67206f6e652e00a84f6e6c792063616c6c6564206279206469645f6973737565722773207365636f6e64617279206b65792e307265766f6b655f636c61696d0801187461726765748001284964656e746974794964000114636c61696d09010114436c61696d000704944d61726b73207468652073706563696669656420636c61696d206173207265766f6b65642e54667265657a655f7365636f6e646172795f6b657973000810c449742064697361626c657320616c6c207365636f6e64617279206b657973206174206064696460206964656e746974792e002023204572726f7273005c756e667265657a655f7365636f6e646172795f6b657973000904dc52652d656e61626c657320616c6c207365636f6e64617279206b657973206f66207468652063616c6c65722773206964656e746974792e446164645f617574686f72697a6174696f6e0c0118746172676574cd05015c5369676e61746f72793c543a3a4163636f756e7449643e000110646174612d01017c417574686f72697a6174696f6e446174613c543a3a4163636f756e7449643e000118657870697279050101444f7074696f6e3c543a3a4d6f6d656e743e000a04584164647320616e20617574686f72697a6174696f6e2e5072656d6f76655f617574686f72697a6174696f6e0c0118746172676574cd05015c5369676e61746f72793c543a3a4163636f756e7449643e00011c617574685f696428010c7536340001445f617574685f6973737565725f7061797339010110626f6f6c000b086452656d6f76657320616e20617574686f72697a6174696f6e2e75015f617574685f6973737565725f706179732064657465726d696e657320776865746865722074686520697373756572206f662074686520617574686f7269736174696f6e207061797320746865207472616e73616374696f6e206665654067635f6164645f6364645f636c61696d0401187461726765748001284964656e746974794964000c044501417373756d696e6720746869732069732065786563757465642062792074686520474320766f74696e67206d616a6f726974792c20616464732061206e65772063646420636c61696d207265636f72642e4c67635f7265766f6b655f6364645f636c61696d0401187461726765748001284964656e746974794964000d046901417373756d696e6720746869732069732065786563757465642062792074686520474320766f74696e67206d616a6f726974792c2072656d6f76657320616e206578697374696e672063646420636c61696d207265636f72642e547265766f6b655f636c61696d5f62795f696e6465780c01187461726765748001284964656e746974794964000128636c61696d5f74797065ed020124436c61696d5479706500011473636f70651d0101344f7074696f6e3c53636f70653e000e10f5015265766f6b6573206120737065636966696320636c61696d207573696e6720697473205b436c61696d20556e6971756520496e6465785d282f70616c6c65745f6964656e746974792f696e6465782e68746d6c23636c61696d2d756e697175652d696e6465782920636f6d706f7365642062792060746172676574602c6860636c61696d5f74797065602c20616e64206073636f7065602e000501506c65617365206e6f7465207468617420606f726967696e60206d7573742062652074686520697373756572206f66207468652074617267657420636c61696d2e7c726f746174655f7072696d6172795f6b65795f746f5f7365636f6e6461727908011c617574685f696428010c7536340001506f7074696f6e616c5f6364645f617574685f69640501012c4f7074696f6e3c7536343e000f38650143616c6c2074686973207769746820746865206e6577207072696d617279206b65792e20427920696e766f6b696e672074686973206d6574686f642c2063616c6c6572206163636570747320617574686f72697a6174696f6e6501746f206265636f6d6520746865206e6577207072696d617279206b6579206f66207468652069737375696e67206964656e746974792e20496620612043444420736572766963652070726f766964657220617070726f766564290174686973206368616e67652c20286f722074686973206973206e6f74207265717569726564292c207072696d617279206b6579206f66207468652044494420697320757064617465642e005d015468652063616c6c657220286e6577207072696d617279206b657929206d757374206265206569746865722061207365636f6e64617279206b6579206f66207468652069737375696e67206964656e746974792c206f7264756e6c696e6b656420746f20616e79206964656e746974792e006101446966666572732066726f6d206163636570745f7072696d6172795f6b657920696e20746861742069742077696c6c206c6561766520746865206f6c64207072696d617279206b65792061732061207365636f6e6461727985016b6579207769746820746865207065726d697373696f6e732073706563696669656420696e2074686520636f72726573706f6e64696e6720526f746174655072696d6172794b6579546f5365636f6e6461727920617574686f72697a6174696f6ea4696e7374656164206f6620756e6c696e6b696e6720746865206f6c64207072696d617279206b65792e002c2320417267756d656e74731d012a20606f776e65725f617574685f69646020417574686f72697a6174696f6e2066726f6d20746865206f776e65722077686f20696e6974696174656420746865206368616e6765e42a20606364645f617574685f69646020417574686f72697a6174696f6e2066726f6d20612043444420736572766963652070726f7669646572946164645f7365636f6e646172795f6b6579735f776974685f617574686f72697a6174696f6e08013c6164646974696f6e616c5f6b657973e505019c5665633c5365636f6e646172794b657957697468417574683c543a3a4163636f756e7449643e3e000128657870697265735f6174280124543a3a4d6f6d656e74001034b041646473207365636f6e64617279206b65797320746f20746172676574206964656e7469747920606964602e0039014b65797320617265206469726563746c7920616464656420746f206964656e7469747920626563617573652065616368206f66207468656d2068617320616e20617574686f72697a6174696f6e2e00302320417267756d656e74733a0901202020202d20606f726967696e60207768696368206d75737420626520746865207072696d617279206b6579206f6620746865206964656e7469747920606964602ed4202020202d206069646020746f207768696368206e6577207365636f6e64617279206b6579732077696c6c2062652061646465642ed8202020202d20606164646974696f6e616c5f6b6579736020776869636820696e636c75646573207365636f6e64617279206b6579732c090120202020202020636f75706c6564207769746820617574686f72697a6174696f6e20646174612c20746f2061646420746f20746172676574206964656e746974792e002023204572726f7273ac202020202d2043616e206f6e6c792063616c6c6564206279207072696d617279206b6579206f776e65722ed0202020202d204b6579732073686f756c642062652061626c6520746f206c696e6b656420746f20616e79206964656e746974792e747365745f7365636f6e646172795f6b65795f7065726d697373696f6e7308010c6b6579000130543a3a4163636f756e7449640001147065726d73a0012c5065726d697373696f6e7300110cc853657473207065726d697373696f6e7320666f7220616e20737065636966696320607461726765745f6b657960206b65792e0035014f6e6c7920746865207072696d617279206b6579206f6620616e206964656e746974792069732061626c6520746f20736574207365636f6e64617279206b6579207065726d697373696f6e732e5472656d6f76655f7365636f6e646172795f6b6579730401386b6579735f746f5f72656d6f7665fc01445665633c543a3a4163636f756e7449643e001214d452656d6f76657320737065636966696564207365636f6e64617279206b657973206f662061204449442069662070726573656e742e002023204572726f727300cc5468652065787472696e7369632063616e206f6e6c792063616c6c6564206279207072696d617279206b6579206f776e65722e6872656769737465725f637573746f6d5f636c61696d5f74797065040108747930011c5665633c75383e0013186c526567697374657220637573746f6d20636c61696d20747970652e002023204572726f727349012a2060437573746f6d436c61696d54797065416c7265616479457869737473602054686520747970652074686174206973206265696e67207265676973746572656420616c7265616479206578697374732ed42a2060436f756e7465724f766572666c6f776020437573746f6d436c61696d54797065496420686173206f766572666c6f7765642ec82a2060546f6f4c6f6e6760205468652074797065206265696e67207265676973746572656420697320746f6f206c616e672e646364645f72656769737465725f6469645f776974685f6364640c01387461726765745f6163636f756e74000130543a3a4163636f756e7449640001387365636f6e646172795f6b65797398017c5665633c5365636f6e646172794b65793c543a3a4163636f756e7449643e3e000118657870697279050101444f7074696f6e3c543a3a4d6f6d656e743e0014205901526567697374657220607461726765745f6163636f756e746020776974682061206e6577204964656e7469747920616e6420697373756520612043444420636c61696d2077697468206120626c616e6b204364644964002423204661696c75726545012d20606f726967696e602068617320746f206265206120616374697665204344442070726f76696465722e20496e616374697665204344442070726f7669646572732063616e6e6f7420616464206e65771c636c61696d732e5d012d20607461726765745f6163636f756e746020287072696d617279206b6579206f6620746865206e6577204964656e74697479292063616e206265206c696e6b656420746f206a757374206f6e6520616e64206f6e6c79346f6e65206964656e746974792ef42d2045787465726e616c207365636f6e64617279206b6579732063616e206265206c696e6b656420746f206a757374206f6e65206964656e746974792e546372656174655f6368696c645f6964656e746974790401347365636f6e646172795f6b6579000130543a3a4163636f756e74496400153019014372656174652061206368696c64206964656e7469747920616e64206d616b652074686520607365636f6e646172795f6b6579602069742773207072696d617279206b65792e00c44f6e6c7920746865207072696d617279206b65792063616e20637265617465206368696c64206964656e7469746965732e002c2320417267756d656e747365012d20607365636f6e646172795f6b65796020746865207365636f6e64617279206b657920746861742077696c6c206265636f6d6520746865207072696d617279206b6579206f6620746865206e6577206964656e746974792e002023204572726f727305012d20604b65794e6f74416c6c6f77656460206f6e6c7920746865207072696d617279206b65792063616e206372656174652061206e6577206964656e746974792e4d012d20604e6f74415369676e6572602074686520607365636f6e646172795f6b657960206973206e6f742061207365636f6e64617279206b6579206f66207468652063616c6c65722773206964656e746974792e6d012d20604163636f756e744b657949734265696e6755736564602074686520607365636f6e646172795f6b6579602063616e277420626520756e6c696e6b65642066726f6d20697427732063757272656e74206964656e746974792ea1012d206049734368696c644964656e7469747960207468652063616c6c65722773206964656e7469747920697320616c72656164792061206368696c64206964656e7469747920616e642063616e277420637265617465206368696c64206964656e7469746965732e5c6372656174655f6368696c645f6964656e7469746965730801286368696c645f6b657973f10501b85665633c4372656174654368696c644964656e7469747957697468417574683c543a3a4163636f756e7449643e3e000128657870697265735f6174280124543a3a4d6f6d656e7400163c684372656174652061206368696c64206964656e7469746965732e002501546865206e6577207072696d617279206b657920666f722065616368206368696c64206964656e746974792077696c6c206e65656420746f207369676e20286f66662d636861696e2944616e20617574686f72697a6174696f6e2e00c44f6e6c7920746865207072696d617279206b65792063616e20637265617465206368696c64206964656e7469746965732e002c2320417267756d656e747349012d20606368696c645f6b6579736020746865206b65797320746861742077696c6c206265636f6d65207072696d617279206b657973206f66207468656972206f776e206368696c64206964656e746974792e002023204572726f727305012d20604b65794e6f74416c6c6f77656460206f6e6c7920746865207072696d617279206b65792063616e206372656174652061206e6577206964656e746974792e0d012d2060416c72656164794c696e6b656460206f6e65206f6620746865206b65797320697320616c7265616479206c696e6b656420746f20616e206964656e746974792ef02d20604475706c69636174654b657960206f6e65206f6620746865206b65797320697320696e636c75646564206d756c7469706c652074696d65732ea1012d206049734368696c644964656e7469747960207468652063616c6c65722773206964656e7469747920697320616c72656164792061206368696c64206964656e7469747920616e642063616e277420637265617465206368696c64206964656e7469746965732e54756e6c696e6b5f6368696c645f6964656e746974790401246368696c645f6469648001284964656e74697479496400172cc8556e6c696e6b2061206368696c64206964656e746974792066726f6d206974277320706172656e74206964656e746974792e0045014f6e6c7920746865207072696d617279206b6579206f662074686520706172656e74206f72206368696c64206964656e7469746965732063616e20756e6c696e6b20746865206964656e7469746965732e002c2320417267756d656e747311012d20606368696c645f6469646020746865206368696c64206964656e7469747920746f20756e6c696e6b2066726f6d2069747320706172656e74206964656e746974792e002023204572726f7273a1012d20604b65794e6f74416c6c6f77656460206f6e6c7920746865207072696d617279206b6579206f66206569746865722074686520706172656e74206f72206368696c64206964656e746974792063616e20756e6c696e6b20746865206964656e7469746965732e35012d20604e6f506172656e744964656e746974796020746865206964656e7469747920606368696c645f6469646020646f65736e27742068617665206120706172656e74206964656e746974792e59012d20604e6f74506172656e744f724368696c644964656e7469747960207468652063616c6c65722773206964656e746974792069736e27742074686520706172656e74206f72206368696c64206964656e746974792e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652ee505000002e90500e9051064706f6c796d6573685f636f6d6d6f6e5f7574696c697469657318747261697473206964656e74697479505365636f6e646172794b6579576974684175746804244163636f756e7449640100000801347365636f6e646172795f6b65799c015c5365636f6e646172794b65793c4163636f756e7449643e000138617574685f7369676e6174757265ed050110483531320000ed05083c7072696d69746976655f7479706573104835313200000400250201205b75383b2036345d0000f105000002f50500f5051064706f6c796d6573685f636f6d6d6f6e5f7574696c697469657318747261697473206964656e746974796c4372656174654368696c644964656e74697479576974684175746804244163636f756e74496401000008010c6b65790001244163636f756e744964000138617574685f7369676e6174757265ed050110483531320000f905083c70616c6c65745f6964656e74697479144572726f7204045400018834416c72656164794c696e6b6564000004dc4f6e65207365636f6e64617279206f72207072696d617279206b65792063616e206f6e6c792062656c6f6e6720746f206f6e65204449443c4d697373696e674964656e746974790001047843616c6c6572206973206d697373696e6720616e206964656e746974792e30556e617574686f72697a6564000204bc5369676e61746f7279206973206e6f742070726520617574686f72697a656420627920746865206964656e7469747944496e76616c69644163636f756e744b6579000304a84163636f756e742049642063616e6e6f74206265206578747261637465642066726f6d207369676e65725c556e417574686f72697a656443646450726f76696465720004049c4f6e6c792043444420736572766963652070726f7669646572732061726520616c6c6f7765642e74496e76616c6964417574686f72697a6174696f6e46726f6d4f776e6572000504a0416e20696e76616c696420617574686f72697a6174696f6e2066726f6d20746865206f776e65722e8c496e76616c6964417574686f72697a6174696f6e46726f6d43646450726f7669646572000604bc416e20696e76616c696420617574686f72697a6174696f6e2066726f6d20746865204344442070726f76696465722e644e6f7443646450726f76696465724174746573746174696f6e000704b84174746573746174696f6e20776173206e6f7420627920612043444420736572766963652070726f76696465722e70417574686f72697a6174696f6e734e6f74466f7253616d6544696473000804a0417574686f72697a6174696f6e7320617265206e6f7420666f72207468652073616d65204449442e4c4469644d757374416c726561647945786973740009046c54686520444944206d75737420616c72656164792065786973742e50417574686f72697a6174696f6e45787069726564000a049c546865206f6666636861696e20617574686f72697a6174696f6e2068617320657870697265642e385461726765744861734e6f436464000b0480546865207461726765742044494420686173206e6f2076616c6964204344442e6c417574686f72697a6174696f6e4861734265656e5265766f6b6564000c04a8417574686f72697a6174696f6e20686173206265656e206578706c696369746c79207265766f6b65642e74496e76616c6964417574686f72697a6174696f6e5369676e6174757265000d048c416e20696e76616c696420617574686f72697a6174696f6e207369676e61747572652e344b65794e6f74416c6c6f776564000e04d454686973206b6579206973206e6f7420616c6c6f77656420746f2065786563757465206120676976656e206f7065726174696f6e2e344e6f745072696d6172794b6579000f0461014f6e6c7920746865207072696d617279206b657920697320616c6c6f77656420746f207265766f6b6520616e204964656e74697479205369676e61746f7279206f66662d636861696e20617574686f72697a6174696f6e2e3c446964446f65734e6f7445786973740010045c5468652044494420646f6573206e6f742065786973742e40446964416c72656164794578697374730011045c5468652044494420616c7265616479206578697374732e785365636f6e646172794b657973436f6e7461696e5072696d6172794b6579001204ac546865207365636f6e64617279206b65797320636f6e7461696e20746865207072696d617279206b65792e444661696c6564546f436861726765466565001304a0436f756c646e2774206368617267652066656520666f7220746865207472616e73616374696f6e2e284e6f74415369676e6572001404d85369676e6572206973206e6f742061207365636f6e64617279206b6579206f66207468652070726f7669646564206964656e746974796c43616e6e6f744465636f64655369676e65724163636f756e744964001504150143616e6e6f7420636f6e7665727420612060543a3a4163636f756e7449646020746f2060416e795369676e61747572653a3a5369676e65723a3a4163636f756e744964602e484d756c746953696748617342616c616e636500160421014d756c74697369672063616e206e6f7420626520756e6c696e6b65642066726f6d20616e206964656e74697479207768696c65206974207374696c6c20686f6c647320504f4c5958544163636f756e744b657949734265696e6755736564001704d0546865206163636f756e74206b6579206973206265696e6720757365642c2069742063616e277420626520756e6c696e6b65642e48437573746f6d53636f7065546f6f4c6f6e670018086c4120637573746f6d2073636f706520697320746f6f206c6f6e672e9c49742063616e206174206d6f737420626520603332602063686172616374657273206c6f6e672e70437573746f6d436c61696d54797065416c7265616479457869737473001904f454686520637573746f6d20636c61696d207479706520747279696e6720746f206265207265676973746572656420616c7265616479206578697374732e6c437573746f6d436c61696d54797065446f65734e6f744578697374001a049454686520637573746f6d20636c61696d207479706520646f6573206e6f742065786973742e44436c61696d446f65734e6f744578697374001b0454436c61696d20646f6573206e6f742065786973742e3c49734368696c644964656e74697479001c0451014964656e7469747920697320616c72656164792061206368696c64206f6620616e206f74686572206964656e746974792c2063616e277420637265617465206772616e642d6368696c64206964656e746974792e404e6f506172656e744964656e74697479001d04b0546865204964656e7469747920646f65736e27742068617665206120706172656e74206964656e746974792e604e6f74506172656e744f724368696c644964656e74697479001e04bc5468652063616c6c6572206973206e6f742074686520706172656e74206f72206368696c64206964656e746974792e304475706c69636174654b6579001f04a45468652073616d65206b65792077617320696e636c75646564206d756c7469706c652074696d65732e744578636570744e6f74416c6c6f776564466f7245787472696e73696373002004e043616e6e6f742075736520457863657074207768656e2073706563696679696e672065787472696e736963207065726d697373696f6e732e6845786365656465644e756d6265724f66476976656e4175746873002104d04d6178696d756d206e756d626572206f6620676976656e20617574686f72697a6174696f6e73207761732065786365656465642e00fd0500000201060001061064706f6c796d6573685f636f6d6d6f6e5f7574696c6974696573187472616974731467726f757038496e6163746976654d656d62657204184d6f6d656e740128000c010869648001284964656e74697479496400013864656163746976617465645f61742801184d6f6d656e74000118657870697279050101384f7074696f6e3c4d6f6d656e743e00000506083070616c6c65745f67726f75701043616c6c08045400044900011c607365745f6163746976655f6d656d626572735f6c696d69740401146c696d697410012c4d656d626572436f756e7400001035014368616e676520746869732067726f75702773206c696d697420666f7220686f77206d616e7920636f6e63757272656e7420616374697665206d656d626572732074686579206d61792062652e002c2320417267756d656e74730d012a20606c696d697460202d20746865206e756d626572206f6620616374697665206d656d62657273207468657265206d617920626520636f6e63757272656e746c792e3864697361626c655f6d656d6265720c010c77686f8001284964656e746974794964000118657870697279050101444f7074696f6e3c543a3a4d6f6d656e743e0001086174050101444f7074696f6e3c543a3a4d6f6d656e743e0001409444697361626c65732061206d656d626572206174207370656369666963206d6f6d656e742e004101506c65617365206e6f74652074686174206966206d656d62657220697320616c7265616479207265766f6b6564202861202276616c6964206d656d62657222292c20697473207265766f636174696f6e6c74696d652d7374616d702077696c6c20626520757064617465642e004d01416e792064697361626c6564206d656d6265722073686f756c64204e4f5420616c6c6f7720746f20616374206c696b6520616e20616374697665206d656d626572206f66207468652067726f75702e20466f725d01696e7374616e63652c20612064697361626c656420434444206d656d6265722073686f756c64204e4f542062652061626c6520746f2067656e657261746520612043444420636c61696d2e20486f776576657220616e79190167656e65726174656420636c61696d20697373756564206265666f7265206061746020776f756c6420626520636f6e7369646572656420617320612076616c6964206f6e652e005101496620796f752077616e7420746f20696e76616c696461746520616e792067656e65726174656420636c61696d2c20796f752073686f756c6420757365206053656c663a3a72656d6f76655f6d656d626572602e002c2320417267756d656e74737c2a2060617460202d205265766f636174696f6e2074696d652d7374616d702e942a206077686f60202d20546172676574206d656d626572206f66207468652067726f75702e55012a206065787069727960202d2054696d652d7374616d70207768656e206077686f602069732072656d6f7665642066726f6d204344442e20417320736f6f6e20617320697420697320657870697265642c20746865510167656e65726174656420636c61696d732077696c6c2062652022696e76616c696422206173206077686f60206973206e6f7420636f6e736964657265642061206d656d626572206f66207468652067726f75702e286164645f6d656d62657204010c77686f8001284964656e7469747949640002143901416464732061206d656d626572206077686f6020746f207468652067726f75702e204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e002c2320417267756d656e7473d02a20606f726967696e60202d204f726967696e20726570726573656e74696e6720604164644f726967696e60206f7220726f6f74b82a206077686f60202d204964656e74697479496420746f20626520616464656420746f207468652067726f75702e3472656d6f76655f6d656d62657204010c77686f8001284964656e746974794964000328510152656d6f7665732061206d656d626572206077686f602066726f6d20746865207365742e204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e004101416e7920636c61696d2070726576696f75736c792067656e6572617465642062792074686973206d656d626572206973206e6f742076616c696420617320612067726f757020636c61696d2e20466f725901696e7374616e63652c206966206120434444206d656d6265722067726f75702067656e657261746564206120636c61696d20666f72206120746172676574206964656e7469747920616e64207468656e206974206973610172656d6f7665642c207468617420636c61696d2077696c6c20626520696e76616c69642e2020496e206361736520796f752077616e7420746f206b656570207468652076616c6964697479206f662067656e657261746564dc636c61696d732c20796f75206861766520746f20757365206053656c663a3a64697361626c655f6d656d626572602066756e6374696f6e002c2320417267756d656e7473dc2a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052656d6f76654f726967696e60206f7220726f6f74c82a206077686f60202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702e2c737761705f6d656d62657208011872656d6f76658001284964656e74697479496400010c6164648001284964656e746974794964000420dc5377617073206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f74686572206d656d6265722060616464602e00b44d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e002c2320417267756d656e7473d42a20606f726967696e60202d204f726967696e20726570726573656e74696e672060537761704f726967696e60206f7220726f6f74d42a206072656d6f766560202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702ed82a206061646460202d204964656e74697479496420746f20626520616464656420696e20706c616365206f66206072656d6f7665602e3472657365745f6d656d6265727304011c6d656d626572734501013c5665633c4964656e7469747949643e00051829014368616e67657320746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702eb84d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e002c2320417267756d656e7473d82a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052657365744f726967696e60206f7220726f6f748c2a20606d656d6265727360202d204e657720736574206f66206964656e7469746965734c61626469636174655f6d656d626572736869700006284d01416c6c6f7773207468652063616c6c696e67206d656d62657220746f202a756e696c61746572616c6c7920717569742a20776974686f75742074686973206265696e67207375626a65637420746f206120474314766f74652e002c2320417267756d656e7473cc2a20606f726967696e60202d204d656d626572206f6620636f6d6d69747465652077686f2077616e747320746f20717569742e001c23204572726f7200802a204f6e6c79207072696d617279206b65792063616e2061626469636174652ea42a204c617374206d656d626572206f6620612067726f75702063616e6e6f742061626469636174652e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e0906083070616c6c65745f67726f7570144572726f72080454000449000118544f6e6c795072696d6172794b6579416c6c6f776564000004b04f6e6c79207072696d617279206b6579206f6620746865206964656e7469747920697320616c6c6f7765642e3c4475706c69636174654d656d6265720001047c47726f7570206d656d6265722077617320616464656420616c72656164792e304e6f537563684d656d626572000204a443616e27742072656d6f76652061206d656d626572207468617420646f65736e27742065786973742e504c6173744d656d62657243616e6e6f7451756974000304a84c617374206d656d626572206f662074686520636f6d6d69747465652063616e206e6f7420717569742e684163746976654d656d626572734c696d697445786365656465640004045d01546865206c696d697420666f7220746865206e756d626572206f6620636f6e63757272656e7420616374697665206d656d6265727320666f7220746869732067726f757020686173206265656e2065786365656465642e684163746976654d656d626572734c696d69744f766572666c6f770005041501416374697665206d656d626572206c696d6974207761732067726561746572207468616e206d6178696d756d20636f6d6d6974746565206d656d62657273206c696d69742e000d060c60706f6c796d6573685f72756e74696d655f646576656c6f701c72756e74696d652c52756e74696d6543616c6c0001ac1853797374656d0400d10401ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53797374656d2c2052756e74696d653e00000010426162650400610501a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c426162652c2052756e74696d653e0001002454696d657374616d700400790501b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c54696d657374616d702c2052756e74696d653e0002001c496e64696365730400810501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c496e64696365732c2052756e74696d653e0003002042616c616e6365730400990501b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c42616c616e6365732c2052756e74696d653e000500204964656e746974790400e10501b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4964656e746974792c2052756e74696d653e0007004c4364645365727669636550726f7669646572730400050601e10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4364645365727669636550726f7669646572732c2052756e74696d653e00080044506f6c796d657368436f6d6d69747465650400110601d90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c506f6c796d657368436f6d6d69747465652c2052756e74696d653e0009004c436f6d6d69747465654d656d626572736869700400150601e10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f6d6d69747465654d656d626572736869702c2052756e74696d653e000a0048546563686e6963616c436f6d6d69747465650400190601dd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c436f6d6d69747465652c2052756e74696d653e000b0070546563686e6963616c436f6d6d69747465654d656d6265727368697004001d0601050273656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c436f6d6d69747465654d656d626572736869702c2052756e74696d653e000c004055706772616465436f6d6d69747465650400210601d50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c55706772616465436f6d6d69747465652c2052756e74696d653e000d006855706772616465436f6d6d69747465654d656d626572736869700400250601fd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c55706772616465436f6d6d69747465654d656d626572736869702c2052756e74696d653e000e00204d756c74695369670400290601b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4d756c74695369672c2052756e74696d653e000f001c5374616b696e670400310601b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5374616b696e672c2052756e74696d653e0011001c53657373696f6e0400550601b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53657373696f6e2c2052756e74696d653e0013001c4772616e6470610400610601b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4772616e6470612c2052756e74696d653e00150020496d4f6e6c696e6504008d0601b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c496d4f6e6c696e652c2052756e74696d653e001700105375646f0400ad0601a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5375646f2c2052756e74696d653e0019001441737365740400b10601a90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c41737365742c2052756e74696d653e001a004c4361706974616c446973747269627574696f6e0400bd0601e10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4361706974616c446973747269627574696f6e2c2052756e74696d653e001b0028436865636b706f696e740400c50601bd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436865636b706f696e742c2052756e74696d653e001c0044436f6d706c69616e63654d616e616765720400c90601d90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f6d706c69616e63654d616e616765722c2052756e74696d653e001d003c436f72706f72617465416374696f6e0400cd0601d10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f72706f72617465416374696f6e2c2052756e74696d653e001e003c436f72706f7261746542616c6c6f740400e50601d10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f72706f7261746542616c6c6f742c2052756e74696d653e001f0010506970730400e90601a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c506970732c2052756e74696d653e00210024506f7274666f6c696f0400f90601b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c506f7274666f6c696f2c2052756e74696d653e0022002c50726f746f636f6c4665650400050701c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50726f746f636f6c4665652c2052756e74696d653e002300245363686564756c657204000d0701b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5363686564756c65722c2052756e74696d653e00240028536574746c656d656e740400150701bd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c536574746c656d656e742c2052756e74696d653e00250028537461746973746963730400410701bd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c537461746973746963732c2052756e74696d653e0026000c53746f0400510701a10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53746f2c2052756e74696d653e0027002054726561737572790400610701b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c54726561737572792c2052756e74696d653e0028001c5574696c69747904006d0701b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5574696c6974792c2052756e74696d653e00290010426173650400910701a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c426173652c2052756e74696d653e002a003845787465726e616c4167656e74730400950701cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c45787465726e616c4167656e74732c2052756e74696d653e002b001c52656c617965720400990701b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c52656c617965722c2052756e74696d653e002c0024436f6e74726163747304009d0701b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f6e7472616374732c2052756e74696d653e002e0044506f6c796d657368436f6e7472616374730400b10701d90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c506f6c796d657368436f6e7472616374732c2052756e74696d653e002f0020507265696d6167650400c50701b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c507265696d6167652c2052756e74696d653e0030000c4e66740400c90701a10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4e66742c2052756e74696d653e00310068456c656374696f6e50726f76696465724d756c746950686173650400e50701fd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c456c656374696f6e50726f76696465724d756c746950686173652c2052756e74696d653e00320024546573745574696c730400d50801b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546573745574696c732c2052756e74696d653e00c800001106084070616c6c65745f636f6d6d69747465651043616c6c080454000449000114487365745f766f74655f7468726573686f6c640801046e10010c7533320001046410010c753332000018f84368616e67652074686520766f7465207468726573686f6c64207468652064657465726d696e6573207468652077696e6e696e672070726f706f73616c2e5501466f7220652e672e2c20666f7220612073696d706c65206d616a6f72697479207573652028312c20322920776869636820726570726573656e74732074686520696e2d6571756174696f6e20223e3d20312f32222e002c2320417267756d656e7473f82a20606e60202d204e756d657261746f72206f6620746865206672616374696f6e20726570726573656e74696e6720766f7465207468726573686f6c642e01012a20606460202d2044656e6f6d696e61746f72206f6620746865206672616374696f6e20726570726573656e74696e6720766f7465207468726573686f6c642e5c7365745f72656c656173655f636f6f7264696e61746f7204010869648001284964656e74697479496400011c804368616e676573207468652072656c6561736520636f6f7264696e61746f722e002c2320417267756d656e7473c02a2060696460202d2054686520444944206f6620746865206e65772072656c6561736520636f6f7264696e61746f722e002023204572726f727325012a20604e6f74414d656d626572602c20496620746865206e657720636f6f7264696e61746f722060696460206973206e6f742070617274206f662074686520636f6d6d69747465652e447365745f657870697265735f6166746572040118657870697279590101684d61796265426c6f636b3c543a3a426c6f636b4e756d6265723e000210c04368616e676573207468652074696d6520616674657220776869636820612070726f706f73616c20657870697265732e002c2320417267756d656e7473842a206065787069727960202d20546865206e6577206578706972792074696d652e3c766f74655f6f725f70726f706f736508011c617070726f766539010110626f6f6c00011063616c6c0d06017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e000344150150726f706f73657320746f2074686520636f6d6d69747465652074686174206063616c6c602073686f756c6420626520657865637574656420696e20697473206e616d652e5d01416c7465726e61746976656c792c206966207468652068617368206f66206063616c6c602068617320616c7265616479206265656e207265636f726465642c20692e652e2c20616c72656164792070726f706f7365642c1d017468656e20746869732063616c6c20636f756e7473206173206120766f74652c20692e652e2c2061732069662060766f74655f62795f6861736860207761732063616c6c65642e00202320576569676874002d0154686520776569676874206f66207468697320646973706174636861626c652069732074686174206f66206063616c6c602061732077656c6c2061732074686520636f6d706c657869747978666f72207265636f7264696e672074686520766f746520697473656c662e002c2320417267756d656e7473a02a2060617070726f766560202d206973207468697320616e20617070726f76696e6720766f74653f610120204966207468652070726f706f73616c20646f65736e27742065786973742c2070617373696e67206066616c7365602077696c6c20726573756c7420696e206572726f7220604669727374566f746552656a656374602eb42a206063616c6c60202d207468652063616c6c20746f2070726f706f736520666f7220657865637574696f6e2e002023204572726f72732d012a20604669727374566f746552656a656374602c206966206063616c6c60206861736e2774206265656e2070726f706f73656420616e642060617070726f7665203d3d2066616c7365602e09012a20604e6f74414d656d626572602c2069662074686520606f726967696e60206973206e6f742061206d656d626572206f66207468697320636f6d6d69747465652e10766f74650c012070726f706f73616c2c011c543a3a48617368000114696e64657810013450726f706f73616c496e64657800011c617070726f766539010110626f6f6c000428a4566f7465732060617070726f766560696e676c7920286f72206e6f742c206966206066616c73656029d46f6e20616e206578697374696e67206070726f706f73616c6020676976656e2062792069747320686173682c2060696e646578602e002c2320417267756d656e7473d42a206070726f706f73616c60202d20412068617368206f66207468652070726f706f73616c20746f20626520766f746564206f6e2e7c2a2060696e64657860202d205468652070726f706f73616c20696e6465782e2d012a2060617070726f766560202d20496620607472756560207468616e207468697320697320612060666f726020766f74652c20616e642060616761696e737460206f74686572776973652e002023204572726f727309012a20604e6f74414d656d626572602c2069662074686520606f726967696e60206973206e6f742061206d656d626572206f66207468697320636f6d6d69747465652e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e1506083070616c6c65745f67726f75701043616c6c08045400044900011c607365745f6163746976655f6d656d626572735f6c696d69740401146c696d697410012c4d656d626572436f756e7400001035014368616e676520746869732067726f75702773206c696d697420666f7220686f77206d616e7920636f6e63757272656e7420616374697665206d656d626572732074686579206d61792062652e002c2320417267756d656e74730d012a20606c696d697460202d20746865206e756d626572206f6620616374697665206d656d62657273207468657265206d617920626520636f6e63757272656e746c792e3864697361626c655f6d656d6265720c010c77686f8001284964656e746974794964000118657870697279050101444f7074696f6e3c543a3a4d6f6d656e743e0001086174050101444f7074696f6e3c543a3a4d6f6d656e743e0001409444697361626c65732061206d656d626572206174207370656369666963206d6f6d656e742e004101506c65617365206e6f74652074686174206966206d656d62657220697320616c7265616479207265766f6b6564202861202276616c6964206d656d62657222292c20697473207265766f636174696f6e6c74696d652d7374616d702077696c6c20626520757064617465642e004d01416e792064697361626c6564206d656d6265722073686f756c64204e4f5420616c6c6f7720746f20616374206c696b6520616e20616374697665206d656d626572206f66207468652067726f75702e20466f725d01696e7374616e63652c20612064697361626c656420434444206d656d6265722073686f756c64204e4f542062652061626c6520746f2067656e657261746520612043444420636c61696d2e20486f776576657220616e79190167656e65726174656420636c61696d20697373756564206265666f7265206061746020776f756c6420626520636f6e7369646572656420617320612076616c6964206f6e652e005101496620796f752077616e7420746f20696e76616c696461746520616e792067656e65726174656420636c61696d2c20796f752073686f756c6420757365206053656c663a3a72656d6f76655f6d656d626572602e002c2320417267756d656e74737c2a2060617460202d205265766f636174696f6e2074696d652d7374616d702e942a206077686f60202d20546172676574206d656d626572206f66207468652067726f75702e55012a206065787069727960202d2054696d652d7374616d70207768656e206077686f602069732072656d6f7665642066726f6d204344442e20417320736f6f6e20617320697420697320657870697265642c20746865510167656e65726174656420636c61696d732077696c6c2062652022696e76616c696422206173206077686f60206973206e6f7420636f6e736964657265642061206d656d626572206f66207468652067726f75702e286164645f6d656d62657204010c77686f8001284964656e7469747949640002143901416464732061206d656d626572206077686f6020746f207468652067726f75702e204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e002c2320417267756d656e7473d02a20606f726967696e60202d204f726967696e20726570726573656e74696e6720604164644f726967696e60206f7220726f6f74b82a206077686f60202d204964656e74697479496420746f20626520616464656420746f207468652067726f75702e3472656d6f76655f6d656d62657204010c77686f8001284964656e746974794964000328510152656d6f7665732061206d656d626572206077686f602066726f6d20746865207365742e204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e004101416e7920636c61696d2070726576696f75736c792067656e6572617465642062792074686973206d656d626572206973206e6f742076616c696420617320612067726f757020636c61696d2e20466f725901696e7374616e63652c206966206120434444206d656d6265722067726f75702067656e657261746564206120636c61696d20666f72206120746172676574206964656e7469747920616e64207468656e206974206973610172656d6f7665642c207468617420636c61696d2077696c6c20626520696e76616c69642e2020496e206361736520796f752077616e7420746f206b656570207468652076616c6964697479206f662067656e657261746564dc636c61696d732c20796f75206861766520746f20757365206053656c663a3a64697361626c655f6d656d626572602066756e6374696f6e002c2320417267756d656e7473dc2a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052656d6f76654f726967696e60206f7220726f6f74c82a206077686f60202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702e2c737761705f6d656d62657208011872656d6f76658001284964656e74697479496400010c6164648001284964656e746974794964000420dc5377617073206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f74686572206d656d6265722060616464602e00b44d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e002c2320417267756d656e7473d42a20606f726967696e60202d204f726967696e20726570726573656e74696e672060537761704f726967696e60206f7220726f6f74d42a206072656d6f766560202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702ed82a206061646460202d204964656e74697479496420746f20626520616464656420696e20706c616365206f66206072656d6f7665602e3472657365745f6d656d6265727304011c6d656d626572734501013c5665633c4964656e7469747949643e00051829014368616e67657320746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702eb84d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e002c2320417267756d656e7473d82a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052657365744f726967696e60206f7220726f6f748c2a20606d656d6265727360202d204e657720736574206f66206964656e7469746965734c61626469636174655f6d656d626572736869700006284d01416c6c6f7773207468652063616c6c696e67206d656d62657220746f202a756e696c61746572616c6c7920717569742a20776974686f75742074686973206265696e67207375626a65637420746f206120474314766f74652e002c2320417267756d656e7473cc2a20606f726967696e60202d204d656d626572206f6620636f6d6d69747465652077686f2077616e747320746f20717569742e001c23204572726f7200802a204f6e6c79207072696d617279206b65792063616e2061626469636174652ea42a204c617374206d656d626572206f6620612067726f75702063616e6e6f742061626469636174652e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e1906084070616c6c65745f636f6d6d69747465651043616c6c080454000449000114487365745f766f74655f7468726573686f6c640801046e10010c7533320001046410010c753332000018f84368616e67652074686520766f7465207468726573686f6c64207468652064657465726d696e6573207468652077696e6e696e672070726f706f73616c2e5501466f7220652e672e2c20666f7220612073696d706c65206d616a6f72697479207573652028312c20322920776869636820726570726573656e74732074686520696e2d6571756174696f6e20223e3d20312f32222e002c2320417267756d656e7473f82a20606e60202d204e756d657261746f72206f6620746865206672616374696f6e20726570726573656e74696e6720766f7465207468726573686f6c642e01012a20606460202d2044656e6f6d696e61746f72206f6620746865206672616374696f6e20726570726573656e74696e6720766f7465207468726573686f6c642e5c7365745f72656c656173655f636f6f7264696e61746f7204010869648001284964656e74697479496400011c804368616e676573207468652072656c6561736520636f6f7264696e61746f722e002c2320417267756d656e7473c02a2060696460202d2054686520444944206f6620746865206e65772072656c6561736520636f6f7264696e61746f722e002023204572726f727325012a20604e6f74414d656d626572602c20496620746865206e657720636f6f7264696e61746f722060696460206973206e6f742070617274206f662074686520636f6d6d69747465652e447365745f657870697265735f6166746572040118657870697279590101684d61796265426c6f636b3c543a3a426c6f636b4e756d6265723e000210c04368616e676573207468652074696d6520616674657220776869636820612070726f706f73616c20657870697265732e002c2320417267756d656e7473842a206065787069727960202d20546865206e6577206578706972792074696d652e3c766f74655f6f725f70726f706f736508011c617070726f766539010110626f6f6c00011063616c6c0d06017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e000344150150726f706f73657320746f2074686520636f6d6d69747465652074686174206063616c6c602073686f756c6420626520657865637574656420696e20697473206e616d652e5d01416c7465726e61746976656c792c206966207468652068617368206f66206063616c6c602068617320616c7265616479206265656e207265636f726465642c20692e652e2c20616c72656164792070726f706f7365642c1d017468656e20746869732063616c6c20636f756e7473206173206120766f74652c20692e652e2c2061732069662060766f74655f62795f6861736860207761732063616c6c65642e00202320576569676874002d0154686520776569676874206f66207468697320646973706174636861626c652069732074686174206f66206063616c6c602061732077656c6c2061732074686520636f6d706c657869747978666f72207265636f7264696e672074686520766f746520697473656c662e002c2320417267756d656e7473a02a2060617070726f766560202d206973207468697320616e20617070726f76696e6720766f74653f610120204966207468652070726f706f73616c20646f65736e27742065786973742c2070617373696e67206066616c7365602077696c6c20726573756c7420696e206572726f7220604669727374566f746552656a656374602eb42a206063616c6c60202d207468652063616c6c20746f2070726f706f736520666f7220657865637574696f6e2e002023204572726f72732d012a20604669727374566f746552656a656374602c206966206063616c6c60206861736e2774206265656e2070726f706f73656420616e642060617070726f7665203d3d2066616c7365602e09012a20604e6f74414d656d626572602c2069662074686520606f726967696e60206973206e6f742061206d656d626572206f66207468697320636f6d6d69747465652e10766f74650c012070726f706f73616c2c011c543a3a48617368000114696e64657810013450726f706f73616c496e64657800011c617070726f766539010110626f6f6c000428a4566f7465732060617070726f766560696e676c7920286f72206e6f742c206966206066616c73656029d46f6e20616e206578697374696e67206070726f706f73616c6020676976656e2062792069747320686173682c2060696e646578602e002c2320417267756d656e7473d42a206070726f706f73616c60202d20412068617368206f66207468652070726f706f73616c20746f20626520766f746564206f6e2e7c2a2060696e64657860202d205468652070726f706f73616c20696e6465782e2d012a2060617070726f766560202d20496620607472756560207468616e207468697320697320612060666f726020766f74652c20616e642060616761696e737460206f74686572776973652e002023204572726f727309012a20604e6f74414d656d626572602c2069662074686520606f726967696e60206973206e6f742061206d656d626572206f66207468697320636f6d6d69747465652e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e1d06083070616c6c65745f67726f75701043616c6c08045400044900011c607365745f6163746976655f6d656d626572735f6c696d69740401146c696d697410012c4d656d626572436f756e7400001035014368616e676520746869732067726f75702773206c696d697420666f7220686f77206d616e7920636f6e63757272656e7420616374697665206d656d626572732074686579206d61792062652e002c2320417267756d656e74730d012a20606c696d697460202d20746865206e756d626572206f6620616374697665206d656d62657273207468657265206d617920626520636f6e63757272656e746c792e3864697361626c655f6d656d6265720c010c77686f8001284964656e746974794964000118657870697279050101444f7074696f6e3c543a3a4d6f6d656e743e0001086174050101444f7074696f6e3c543a3a4d6f6d656e743e0001409444697361626c65732061206d656d626572206174207370656369666963206d6f6d656e742e004101506c65617365206e6f74652074686174206966206d656d62657220697320616c7265616479207265766f6b6564202861202276616c6964206d656d62657222292c20697473207265766f636174696f6e6c74696d652d7374616d702077696c6c20626520757064617465642e004d01416e792064697361626c6564206d656d6265722073686f756c64204e4f5420616c6c6f7720746f20616374206c696b6520616e20616374697665206d656d626572206f66207468652067726f75702e20466f725d01696e7374616e63652c20612064697361626c656420434444206d656d6265722073686f756c64204e4f542062652061626c6520746f2067656e657261746520612043444420636c61696d2e20486f776576657220616e79190167656e65726174656420636c61696d20697373756564206265666f7265206061746020776f756c6420626520636f6e7369646572656420617320612076616c6964206f6e652e005101496620796f752077616e7420746f20696e76616c696461746520616e792067656e65726174656420636c61696d2c20796f752073686f756c6420757365206053656c663a3a72656d6f76655f6d656d626572602e002c2320417267756d656e74737c2a2060617460202d205265766f636174696f6e2074696d652d7374616d702e942a206077686f60202d20546172676574206d656d626572206f66207468652067726f75702e55012a206065787069727960202d2054696d652d7374616d70207768656e206077686f602069732072656d6f7665642066726f6d204344442e20417320736f6f6e20617320697420697320657870697265642c20746865510167656e65726174656420636c61696d732077696c6c2062652022696e76616c696422206173206077686f60206973206e6f7420636f6e736964657265642061206d656d626572206f66207468652067726f75702e286164645f6d656d62657204010c77686f8001284964656e7469747949640002143901416464732061206d656d626572206077686f6020746f207468652067726f75702e204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e002c2320417267756d656e7473d02a20606f726967696e60202d204f726967696e20726570726573656e74696e6720604164644f726967696e60206f7220726f6f74b82a206077686f60202d204964656e74697479496420746f20626520616464656420746f207468652067726f75702e3472656d6f76655f6d656d62657204010c77686f8001284964656e746974794964000328510152656d6f7665732061206d656d626572206077686f602066726f6d20746865207365742e204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e004101416e7920636c61696d2070726576696f75736c792067656e6572617465642062792074686973206d656d626572206973206e6f742076616c696420617320612067726f757020636c61696d2e20466f725901696e7374616e63652c206966206120434444206d656d6265722067726f75702067656e657261746564206120636c61696d20666f72206120746172676574206964656e7469747920616e64207468656e206974206973610172656d6f7665642c207468617420636c61696d2077696c6c20626520696e76616c69642e2020496e206361736520796f752077616e7420746f206b656570207468652076616c6964697479206f662067656e657261746564dc636c61696d732c20796f75206861766520746f20757365206053656c663a3a64697361626c655f6d656d626572602066756e6374696f6e002c2320417267756d656e7473dc2a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052656d6f76654f726967696e60206f7220726f6f74c82a206077686f60202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702e2c737761705f6d656d62657208011872656d6f76658001284964656e74697479496400010c6164648001284964656e746974794964000420dc5377617073206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f74686572206d656d6265722060616464602e00b44d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e002c2320417267756d656e7473d42a20606f726967696e60202d204f726967696e20726570726573656e74696e672060537761704f726967696e60206f7220726f6f74d42a206072656d6f766560202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702ed82a206061646460202d204964656e74697479496420746f20626520616464656420696e20706c616365206f66206072656d6f7665602e3472657365745f6d656d6265727304011c6d656d626572734501013c5665633c4964656e7469747949643e00051829014368616e67657320746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702eb84d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e002c2320417267756d656e7473d82a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052657365744f726967696e60206f7220726f6f748c2a20606d656d6265727360202d204e657720736574206f66206964656e7469746965734c61626469636174655f6d656d626572736869700006284d01416c6c6f7773207468652063616c6c696e67206d656d62657220746f202a756e696c61746572616c6c7920717569742a20776974686f75742074686973206265696e67207375626a65637420746f206120474314766f74652e002c2320417267756d656e7473cc2a20606f726967696e60202d204d656d626572206f6620636f6d6d69747465652077686f2077616e747320746f20717569742e001c23204572726f7200802a204f6e6c79207072696d617279206b65792063616e2061626469636174652ea42a204c617374206d656d626572206f6620612067726f75702063616e6e6f742061626469636174652e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e2106084070616c6c65745f636f6d6d69747465651043616c6c080454000449000114487365745f766f74655f7468726573686f6c640801046e10010c7533320001046410010c753332000018f84368616e67652074686520766f7465207468726573686f6c64207468652064657465726d696e6573207468652077696e6e696e672070726f706f73616c2e5501466f7220652e672e2c20666f7220612073696d706c65206d616a6f72697479207573652028312c20322920776869636820726570726573656e74732074686520696e2d6571756174696f6e20223e3d20312f32222e002c2320417267756d656e7473f82a20606e60202d204e756d657261746f72206f6620746865206672616374696f6e20726570726573656e74696e6720766f7465207468726573686f6c642e01012a20606460202d2044656e6f6d696e61746f72206f6620746865206672616374696f6e20726570726573656e74696e6720766f7465207468726573686f6c642e5c7365745f72656c656173655f636f6f7264696e61746f7204010869648001284964656e74697479496400011c804368616e676573207468652072656c6561736520636f6f7264696e61746f722e002c2320417267756d656e7473c02a2060696460202d2054686520444944206f6620746865206e65772072656c6561736520636f6f7264696e61746f722e002023204572726f727325012a20604e6f74414d656d626572602c20496620746865206e657720636f6f7264696e61746f722060696460206973206e6f742070617274206f662074686520636f6d6d69747465652e447365745f657870697265735f6166746572040118657870697279590101684d61796265426c6f636b3c543a3a426c6f636b4e756d6265723e000210c04368616e676573207468652074696d6520616674657220776869636820612070726f706f73616c20657870697265732e002c2320417267756d656e7473842a206065787069727960202d20546865206e6577206578706972792074696d652e3c766f74655f6f725f70726f706f736508011c617070726f766539010110626f6f6c00011063616c6c0d06017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e000344150150726f706f73657320746f2074686520636f6d6d69747465652074686174206063616c6c602073686f756c6420626520657865637574656420696e20697473206e616d652e5d01416c7465726e61746976656c792c206966207468652068617368206f66206063616c6c602068617320616c7265616479206265656e207265636f726465642c20692e652e2c20616c72656164792070726f706f7365642c1d017468656e20746869732063616c6c20636f756e7473206173206120766f74652c20692e652e2c2061732069662060766f74655f62795f6861736860207761732063616c6c65642e00202320576569676874002d0154686520776569676874206f66207468697320646973706174636861626c652069732074686174206f66206063616c6c602061732077656c6c2061732074686520636f6d706c657869747978666f72207265636f7264696e672074686520766f746520697473656c662e002c2320417267756d656e7473a02a2060617070726f766560202d206973207468697320616e20617070726f76696e6720766f74653f610120204966207468652070726f706f73616c20646f65736e27742065786973742c2070617373696e67206066616c7365602077696c6c20726573756c7420696e206572726f7220604669727374566f746552656a656374602eb42a206063616c6c60202d207468652063616c6c20746f2070726f706f736520666f7220657865637574696f6e2e002023204572726f72732d012a20604669727374566f746552656a656374602c206966206063616c6c60206861736e2774206265656e2070726f706f73656420616e642060617070726f7665203d3d2066616c7365602e09012a20604e6f74414d656d626572602c2069662074686520606f726967696e60206973206e6f742061206d656d626572206f66207468697320636f6d6d69747465652e10766f74650c012070726f706f73616c2c011c543a3a48617368000114696e64657810013450726f706f73616c496e64657800011c617070726f766539010110626f6f6c000428a4566f7465732060617070726f766560696e676c7920286f72206e6f742c206966206066616c73656029d46f6e20616e206578697374696e67206070726f706f73616c6020676976656e2062792069747320686173682c2060696e646578602e002c2320417267756d656e7473d42a206070726f706f73616c60202d20412068617368206f66207468652070726f706f73616c20746f20626520766f746564206f6e2e7c2a2060696e64657860202d205468652070726f706f73616c20696e6465782e2d012a2060617070726f766560202d20496620607472756560207468616e207468697320697320612060666f726020766f74652c20616e642060616761696e737460206f74686572776973652e002023204572726f727309012a20604e6f74414d656d626572602c2069662074686520606f726967696e60206973206e6f742061206d656d626572206f66207468697320636f6d6d69747465652e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e2506083070616c6c65745f67726f75701043616c6c08045400044900011c607365745f6163746976655f6d656d626572735f6c696d69740401146c696d697410012c4d656d626572436f756e7400001035014368616e676520746869732067726f75702773206c696d697420666f7220686f77206d616e7920636f6e63757272656e7420616374697665206d656d626572732074686579206d61792062652e002c2320417267756d656e74730d012a20606c696d697460202d20746865206e756d626572206f6620616374697665206d656d62657273207468657265206d617920626520636f6e63757272656e746c792e3864697361626c655f6d656d6265720c010c77686f8001284964656e746974794964000118657870697279050101444f7074696f6e3c543a3a4d6f6d656e743e0001086174050101444f7074696f6e3c543a3a4d6f6d656e743e0001409444697361626c65732061206d656d626572206174207370656369666963206d6f6d656e742e004101506c65617365206e6f74652074686174206966206d656d62657220697320616c7265616479207265766f6b6564202861202276616c6964206d656d62657222292c20697473207265766f636174696f6e6c74696d652d7374616d702077696c6c20626520757064617465642e004d01416e792064697361626c6564206d656d6265722073686f756c64204e4f5420616c6c6f7720746f20616374206c696b6520616e20616374697665206d656d626572206f66207468652067726f75702e20466f725d01696e7374616e63652c20612064697361626c656420434444206d656d6265722073686f756c64204e4f542062652061626c6520746f2067656e657261746520612043444420636c61696d2e20486f776576657220616e79190167656e65726174656420636c61696d20697373756564206265666f7265206061746020776f756c6420626520636f6e7369646572656420617320612076616c6964206f6e652e005101496620796f752077616e7420746f20696e76616c696461746520616e792067656e65726174656420636c61696d2c20796f752073686f756c6420757365206053656c663a3a72656d6f76655f6d656d626572602e002c2320417267756d656e74737c2a2060617460202d205265766f636174696f6e2074696d652d7374616d702e942a206077686f60202d20546172676574206d656d626572206f66207468652067726f75702e55012a206065787069727960202d2054696d652d7374616d70207768656e206077686f602069732072656d6f7665642066726f6d204344442e20417320736f6f6e20617320697420697320657870697265642c20746865510167656e65726174656420636c61696d732077696c6c2062652022696e76616c696422206173206077686f60206973206e6f7420636f6e736964657265642061206d656d626572206f66207468652067726f75702e286164645f6d656d62657204010c77686f8001284964656e7469747949640002143901416464732061206d656d626572206077686f6020746f207468652067726f75702e204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e002c2320417267756d656e7473d02a20606f726967696e60202d204f726967696e20726570726573656e74696e6720604164644f726967696e60206f7220726f6f74b82a206077686f60202d204964656e74697479496420746f20626520616464656420746f207468652067726f75702e3472656d6f76655f6d656d62657204010c77686f8001284964656e746974794964000328510152656d6f7665732061206d656d626572206077686f602066726f6d20746865207365742e204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e004101416e7920636c61696d2070726576696f75736c792067656e6572617465642062792074686973206d656d626572206973206e6f742076616c696420617320612067726f757020636c61696d2e20466f725901696e7374616e63652c206966206120434444206d656d6265722067726f75702067656e657261746564206120636c61696d20666f72206120746172676574206964656e7469747920616e64207468656e206974206973610172656d6f7665642c207468617420636c61696d2077696c6c20626520696e76616c69642e2020496e206361736520796f752077616e7420746f206b656570207468652076616c6964697479206f662067656e657261746564dc636c61696d732c20796f75206861766520746f20757365206053656c663a3a64697361626c655f6d656d626572602066756e6374696f6e002c2320417267756d656e7473dc2a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052656d6f76654f726967696e60206f7220726f6f74c82a206077686f60202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702e2c737761705f6d656d62657208011872656d6f76658001284964656e74697479496400010c6164648001284964656e746974794964000420dc5377617073206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f74686572206d656d6265722060616464602e00b44d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e002c2320417267756d656e7473d42a20606f726967696e60202d204f726967696e20726570726573656e74696e672060537761704f726967696e60206f7220726f6f74d42a206072656d6f766560202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702ed82a206061646460202d204964656e74697479496420746f20626520616464656420696e20706c616365206f66206072656d6f7665602e3472657365745f6d656d6265727304011c6d656d626572734501013c5665633c4964656e7469747949643e00051829014368616e67657320746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702eb84d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e002c2320417267756d656e7473d82a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052657365744f726967696e60206f7220726f6f748c2a20606d656d6265727360202d204e657720736574206f66206964656e7469746965734c61626469636174655f6d656d626572736869700006284d01416c6c6f7773207468652063616c6c696e67206d656d62657220746f202a756e696c61746572616c6c7920717569742a20776974686f75742074686973206265696e67207375626a65637420746f206120474314766f74652e002c2320417267756d656e7473cc2a20606f726967696e60202d204d656d626572206f6620636f6d6d69747465652077686f2077616e747320746f20717569742e001c23204572726f7200802a204f6e6c79207072696d617279206b65792063616e2061626469636174652ea42a204c617374206d656d626572206f6620612067726f75702063616e6e6f742061626469636174652e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e29060c3c70616c6c65745f6d756c74697369671870616c6c65741043616c6c0404540001443c6372656174655f6d756c74697369670c011c7369676e6572738901019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e000134736967735f726571756972656428010c75363400012c7065726d697373696f6e732d06014c4f7074696f6e3c5065726d697373696f6e733e00001848437265617465732061206d756c7469736967002c2320417267756d656e7473a5012a20607369676e65727360202d205369676e657273206f6620746865206d756c7469736967202854686579206e65656420746f2061636365707420617574686f72697a6174696f6e206265666f72652074686579206172652061637475616c6c79206164646564292e19012a2060736967735f726571756972656460202d204e756d626572206f66207369677320726571756972656420746f2070726f636573732061206d756c74692d7369672074782e91012a20607065726d697373696f6e7360202d206f7074696f6e616c20637573746f6d207065726d697373696f6e732e20204f6e6c7920746865207072696d617279206b65792063616e2070726f7669646520637573746f6d207065726d697373696f6e732e3c6372656174655f70726f706f73616c0c01206d756c7469736967000130543a3a4163636f756e74496400012070726f706f73616c0d060170426f783c3c5420617320436f6e6669673e3a3a50726f706f73616c3e000118657870697279050101444f7074696f6e3c543a3a4d6f6d656e743e0001206c437265617465732061206d756c74697369672070726f706f73616c002c2320417267756d656e7473802a20606d756c746973696760202d204d756c746953696720616464726573732e9c2a206070726f706f73616c60202d2050726f706f73616c20746f20626520766f746564206f6e2eac2a206065787069727960202d204f7074696f6e616c2070726f706f73616c206578706972792074696d652e003101496620746869732069732031206f7574206f6620606d60206d756c74697369672c207468652070726f706f73616c2077696c6c20626520696d6d6564696174656c792065786563757465642e1c617070726f76650c01206d756c7469736967000130543a3a4163636f756e74496400012c70726f706f73616c5f696428010c7536340001286d61785f7765696768742001185765696768740002203101417070726f7665732061206d756c74697369672070726f706f73616c207573696e67207468652063616c6c65722773207365636f6e64617279206b65792028604163636f756e74496460292e002c2320417267756d656e7473802a20606d756c746973696760202d204d756c746953696720616464726573732ea42a206070726f706f73616c5f696460202d2050726f706f73616c20696420746f20617070726f76652ef02a20606d61785f77656967687460202d20546865206d6178696d756d2077656967687420746f2065786563757465207468652070726f706f73616c2e00010149662071756f72756d20697320726561636865642c207468652070726f706f73616c2077696c6c20626520696d6d6564696174656c792065786563757465642e1872656a6563740801206d756c7469736967000130543a3a4163636f756e74496400012c70726f706f73616c5f696428010c7536340003182d0152656a656374732061206d756c74697369672070726f706f73616c207573696e67207468652063616c6c65722773207365636f6e64617279206b65792028604163636f756e74496460292e002c2320417267756d656e7473802a20606d756c746973696760202d204d756c746953696720616464726573732ea02a206070726f706f73616c5f696460202d2050726f706f73616c20696420746f2072656a6563742e010149662071756f72756d20697320726561636865642c207468652070726f706f73616c2077696c6c20626520696d6d6564696174656c792065786563757465642e586163636570745f6d756c74697369675f7369676e657204011c617574685f696428010c7536340004102901416363657074732061206d756c7469736967207369676e657220617574686f72697a6174696f6e20676976656e20746f207369676e65722773206b657920284163636f756e744964292e002c2320417267756d656e7473ac2a2060617574685f696460202d2041757468206964206f662074686520617574686f72697a6174696f6e2e506164645f6d756c74697369675f7369676e65727304011c7369676e6572738901019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e000510290141646473207369676e65727320746f20746865206d756c74697369672e202054686973206d7573742062652063616c6c656420627920746865206d756c746973696720697473656c662e002c2320417267756d656e7473742a20607369676e65727360202d205369676e65727320746f206164642e5c72656d6f76655f6d756c74697369675f7369676e65727304011c7369676e6572738901019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e0006103d0152656d6f766573207369676e6572732066726f6d20746865206d756c74697369672e202054686973206d7573742062652063616c6c656420627920746865206d756c746973696720697473656c662e002c2320417267756d656e7473802a20607369676e65727360202d205369676e65727320746f2072656d6f76652e786164645f6d756c74697369675f7369676e6572735f7669615f61646d696e0801206d756c7469736967000130543a3a4163636f756e74496400011c7369676e6572738901019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e00071c4101416464732061207369676e657220746f20746865206d756c74697369672e202054686973206d7573742062652063616c6c6564206279207468652061646d696e206964656e74697479206f6620746865246d756c74697369672e002c2320417267756d656e74739c2a20606d756c746973696760202d2041646472657373206f6620746865206d756c746920736967742a20607369676e65727360202d205369676e65727320746f206164642e008472656d6f76655f6d756c74697369675f7369676e6572735f7669615f61646d696e0801206d756c7469736967000130543a3a4163636f756e74496400011c7369676e6572738901019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e00081c8c52656d6f7665732061207369676e65722066726f6d20746865206d756c74697369672ee854686973206d7573742062652063616c6c6564206279207468652061646d696e206964656e74697479206f6620746865206d756c74697369672e002c2320417267756d656e74739c2a20606d756c746973696760202d2041646472657373206f6620746865206d756c74697369672e802a20607369676e65727360202d205369676e65727320746f2072656d6f76652e00506368616e67655f736967735f7265717569726564040134736967735f726571756972656428010c75363400091451014368616e67657320746865206e756d626572206f66207369676e6174757265732072657175697265642062792061206d756c74697369672e202054686973206d7573742062652063616c6c656420627920746865406d756c746973696720697473656c662e002c2320417267756d656e7473d82a2060736967735f726571756972656460202d204e6577206e756d626572206f66207265717569726564207369676e6174757265732e786368616e67655f736967735f72657175697265645f7669615f61646d696e0801206d756c7469736967000130543a3a4163636f756e74496400014c7369676e6174757265735f726571756972656428010c753634000a14ad014368616e67657320746865206e756d626572206f66207369676e6174757265732072657175697265642062792061206d756c74697369672e202054686973206d7573742062652063616c6c6564206279207468652061646d696e206f6620746865206d756c74697369672e002c2320417267756d656e747359012a20606d756c746973696760202d20546865206163636f756e74206964656e74696669657220285b604163636f756e744964605d2920666f7220746865206d756c7469207369676e6174757265206163636f756e742ef02a20607369676e6174757265735f726571756972656460202d20546865206e756d626572206f66207265717569726564207369676e6174757265732e246164645f61646d696e04012461646d696e5f6469648001284964656e746974794964000b044d0141646420616e2061646d696e206964656e7469747920746f20746865206d756c74697369672e202054686973206d7573742062652063616c6c656420627920746865206d756c746973696720697473656c662e5872656d6f76655f61646d696e5f7669615f61646d696e0401206d756c7469736967000130543a3a4163636f756e744964000c04890152656d6f766573207468652061646d696e206964656e746974792066726f6d2074686520606d756c7469736967602e202054686973206d7573742062652063616c6c6564206279207468652061646d696e206f6620746865206d756c74697369672e3072656d6f76655f7061796572000d04750152656d6f7665732074686520706179696e67206964656e746974792066726f6d2074686520606d756c7469736967602e202054686973206d7573742062652063616c6c656420627920746865206d756c746973696720697473656c662e5872656d6f76655f70617965725f7669615f70617965720401206d756c7469736967000130543a3a4163636f756e744964000e04b50152656d6f7665732074686520706179696e67206964656e746974792066726f6d2074686520606d756c7469736967602e202054686973206d7573742062652063616c6c65642062792074686520706179696e67206964656e74697479206f6620746865206d756c74697369672e54617070726f76655f6a6f696e5f6964656e746974790801206d756c7469736967000130543a3a4163636f756e74496400011c617574685f696428010c753634000f1cac417070726f7665732061206d756c7469736967206a6f696e206964656e746974792070726f706f73616c2e002c2320417267756d656e7473802a20606d756c746973696760202d204d756c746953696720616464726573732ee42a2060617574685f696460202d20546865206a6f696e206964656e7469747920617574686f72697a6174696f6e20746f20617070726f76652e00390149662071756f72756d20697320726561636865642c20746865206a6f696e206964656e746974792070726f706f73616c2077696c6c20626520696d6d6564696174656c792065786563757465642e346a6f696e5f6964656e7469747904011c617574685f696428010c7536340010048d014163636570742061204a6f696e4964656e7469747920617574686f72697a6174696f6e20666f722074686973206d756c74697369672e202054686973206d7573742062652063616c6c656420627920746865206d756c746973696720697473656c662e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e2d0604184f7074696f6e04045401a00108104e6f6e6500000010536f6d650400a000000100003106103870616c6c65745f7374616b696e671870616c6c65741870616c6c65741043616c6c04045400018810626f6e640c0128636f6e74726f6c6c6572850501504163636f756e7449644c6f6f6b75704f663c543e00011476616c7565d901013042616c616e63654f663c543e00011470617965653506017c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e00003c610154616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c80626520746865206163636f756e74207468617420636f6e74726f6c732069742e002d016076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e002101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e003c456d6974732060426f6e646564602e34232320436f6d706c6578697479d02d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e1c2d204f2831292e642d20546872656520657874726120444220656e74726965732e004d014e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e65643d01756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e28626f6e645f65787472610401386d61785f6164646974696f6e616cd901013042616c616e63654f663c543e000138610141646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757030666f72207374616b696e672e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e004d01557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e5501556e6c696b65205b60626f6e64605d2853656c663a3a626f6e6429206f72205b60756e626f6e64605d2853656c663a3a756e626f6e642920746869732066756e6374696f6e20646f6573206e6f7420696d706f7365bc616e79206c696d69746174696f6e206f6e2074686520616d6f756e7420746861742063616e2062652061646465642e003c456d6974732060426f6e646564602e0034232320436f6d706c6578697479e42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e1c2d204f2831292e18756e626f6e6404011476616c7565d901013042616c616e63654f663c543e00024c51015363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64fc706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e2101543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0045014f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665bc7468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e0031014e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d6178556e6c6f636b696e674368756e6b736029410163616e20636f2d657869737473206174207468652073616d652074696d652e20496620746865726520617265206e6f20756e6c6f636b696e67206368756e6b7320736c6f747320617661696c61626c6545015b6043616c6c3a3a77697468647261775f756e626f6e646564605d2069732063616c6c656420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00390149662061207573657220656e636f756e74657273207468652060496e73756666696369656e74426f6e6460206572726f72207768656e2063616c6c696e6720746869732065787472696e7369632c1901746865792073686f756c642063616c6c20606368696c6c6020666972737420696e206f7264657220746f206672656520757020746865697220626f6e6465642066756e64732e0044456d6974732060556e626f6e646564602e009453656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e4477697468647261775f756e626f6e6465640401486e756d5f736c617368696e675f7370616e7310010c753332000338290152656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e0031015468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4877686174657665722069742077616e74732e001501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722e0048456d697473206057697468647261776e602e006853656520616c736f205b6043616c6c3a3a756e626f6e64605d2e0034232320436f6d706c6578697479d84f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2072656d6f766509014e4f54453a2057656967687420616e6e6f746174696f6e20697320746865206b696c6c207363656e6172696f2c20776520726566756e64206f74686572776973652e2076616c696461746504011470726566739501013856616c696461746f725072656673000414e44465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e206e6f6d696e61746504011c74617267657473390601645665633c4163636f756e7449644c6f6f6b75704f663c543e3e0005280d014465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0034232320436f6d706c65786974792d012d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f662060746172676574736020284e29050177686963682069732063617070656420617420436f6d7061637441737369676e6d656e74733a3a4c494d49542028543a3a4d61784e6f6d696e6174696f6e73292ed42d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e146368696c6c000628c44465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0034232320436f6d706c6578697479e42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e502d20436f6e7461696e73206f6e6520726561642ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e247365745f706179656504011470617965653506017c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e000730b42852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e005101456666656374732077696c6c2062652066656c7420696e7374616e746c792028617320736f6f6e20617320746869732066756e6374696f6e20697320636f6d706c65746564207375636365737366756c6c79292e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0034232320436f6d706c6578697479182d204f283129e42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e942d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e242d2d2d2d2d2d2d2d2d387365745f636f6e74726f6c6c6572040128636f6e74726f6c6c6572850501504163636f756e7449644c6f6f6b75704f663c543e00082c8c2852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e005101456666656374732077696c6c2062652066656c7420696e7374616e746c792028617320736f6f6e20617320746869732066756e6374696f6e20697320636f6d706c65746564207375636365737366756c6c79292e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e0034232320436f6d706c6578697479104f283129e42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e942d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e4c7365745f76616c696461746f725f636f756e7404010c6e6577cd04010c75333200091890536574732074686520696465616c206e756d626572206f662076616c696461746f72732e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0034232320436f6d706c6578697479104f28312960696e6372656173655f76616c696461746f725f636f756e740401286164646974696f6e616ccd04010c753332000a1ce4496e6372656d656e74732074686520696465616c206e756d626572206f662076616c696461746f7273207570746f206d6178696d756d206f668c60456c656374696f6e50726f7669646572426173653a3a4d617857696e6e657273602e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0034232320436f6d706c65786974799853616d65206173205b6053656c663a3a7365745f76616c696461746f725f636f756e74605d2e547363616c655f76616c696461746f725f636f756e74040118666163746f723d06011c50657263656e74000b1c0d015363616c652075702074686520696465616c206e756d626572206f662076616c696461746f7273206279206120666163746f72207570746f206d6178696d756d206f668c60456c656374696f6e50726f7669646572426173653a3a4d617857696e6e657273602e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0034232320436f6d706c65786974799853616d65206173205b6053656c663a3a7365745f76616c696461746f725f636f756e74605d2e34666f7263655f6e6f5f65726173000c34ac466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e3901546875732074686520656c656374696f6e2070726f63657373206d6179206265206f6e676f696e67207768656e20746869732069732063616c6c65642e20496e2074686973206361736520746865dc656c656374696f6e2077696c6c20636f6e74696e756520756e74696c20746865206e65787420657261206973207472696767657265642e0034232320436f6d706c65786974793c2d204e6f20617267756d656e74732e382d205765696768743a204f28312934666f7263655f6e65775f657261000d384901466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c2062659c726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e4901496620746869732069732063616c6c6564206a757374206265666f72652061206e657720657261206973207472696767657265642c2074686520656c656374696f6e2070726f63657373206d6179206e6f748c6861766520656e6f75676820626c6f636b7320746f20676574206120726573756c742e0034232320436f6d706c65786974793c2d204e6f20617267756d656e74732e382d205765696768743a204f283129447365745f696e76756c6e657261626c6573040134696e76756c6e657261626c6573fc01445665633c543a3a4163636f756e7449643e000e0cc8536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e34666f7263655f756e7374616b650801147374617368000130543a3a4163636f756e7449640001486e756d5f736c617368696e675f7370616e7310010c753332000f0c0901466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e50666f7263655f6e65775f6572615f616c776179730010240101466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e4901496620746869732069732063616c6c6564206a757374206265666f72652061206e657720657261206973207472696767657265642c2074686520656c656374696f6e2070726f63657373206d6179206e6f748c6861766520656e6f75676820626c6f636b7320746f20676574206120726573756c742e5463616e63656c5f64656665727265645f736c61736808010c657261100120457261496e646578000134736c6173685f696e6469636573690401205665633c7533323e0011149443616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e009843616e2062652063616c6c6564206279207468652060543a3a41646d696e4f726967696e602e000101506172616d65746572733a2065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e387061796f75745f7374616b65727308013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400010c657261100120457261496e64657800122c0d01506179206f757420616c6c20746865207374616b65727320626568696e6420612073696e676c652076616c696461746f7220666f7220612073696e676c65206572612e0049012d206076616c696461746f725f73746173686020697320746865207374617368206163636f756e74206f66207468652076616c696461746f722e205468656972206e6f6d696e61746f72732c20757020746f2501202060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602c2077696c6c20616c736f207265636569766520746865697220726577617264732e31012d206065726160206d617920626520616e7920657261206265747765656e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e005501546865206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e20416e79206163636f756e742063616e2063616c6c20746869732066756e6374696f6e2c206576656e206966746974206973206e6f74206f6e65206f6620746865207374616b6572732e0034232320436f6d706c6578697479b82d204174206d6f7374204f284d61784e6f6d696e61746f72526577617264656450657256616c696461746f72292e187265626f6e6404011476616c7565d901013042616c616e63654f663c543e00131cdc5265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e00d4546865206469737061746368206f726967696e206d757374206265207369676e65642062792074686520636f6e74726f6c6c65722e0034232320436f6d706c6578697479d02d2054696d6520636f6d706c65786974793a204f284c292c207768657265204c20697320756e6c6f636b696e67206368756e6b73882d20426f756e64656420627920604d6178556e6c6f636b696e674368756e6b73602e28726561705f73746173680801147374617368000130543a3a4163636f756e7449640001486e756d5f736c617368696e675f7370616e7310010c7533320014305d0152656d6f766520616c6c2064617461207374727563747572657320636f6e6365726e696e672061207374616b65722f7374617368206f6e636520697420697320617420612073746174652077686572652069742063616e0501626520636f6e736964657265642060647573746020696e20746865207374616b696e672073797374656d2e2054686520726571756972656d656e7473206172653a000501312e207468652060746f74616c5f62616c616e636560206f66207468652073746173682069732062656c6f77206578697374656e7469616c206465706f7369742e1101322e206f722c2074686520606c65646765722e746f74616c60206f66207468652073746173682069732062656c6f77206578697374656e7469616c206465706f7369742e00550154686520666f726d65722063616e2068617070656e20696e206361736573206c696b65206120736c6173683b20746865206c6174746572207768656e20612066756c6c7920756e626f6e646564206163636f756e7409016973207374696c6c20726563656976696e67207374616b696e67207265776172647320696e206052657761726444657374696e6174696f6e3a3a5374616b6564602e00310149742063616e2062652063616c6c656420627920616e796f6e652c206173206c6f6e672061732060737461736860206d65657473207468652061626f766520726571756972656d656e74732e00dc526566756e647320746865207472616e73616374696f6e20666565732075706f6e207375636365737366756c20657865637574696f6e2e106b69636b04010c77686f390601645665633c4163636f756e7449644c6f6f6b75704f663c543e3e00152ce052656d6f76652074686520676976656e206e6f6d696e6174696f6e732066726f6d207468652063616c6c696e672076616c696461746f722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e004d012d206077686f603a2041206c697374206f66206e6f6d696e61746f72207374617368206163636f756e74732077686f20617265206e6f6d696e6174696e6720746869732076616c696461746f72207768696368c0202073686f756c64206e6f206c6f6e676572206265206e6f6d696e6174696e6720746869732076616c696461746f722e0055014e6f74653a204d616b696e6720746869732063616c6c206f6e6c79206d616b65732073656e736520696620796f7520666972737420736574207468652076616c696461746f7220707265666572656e63657320746f78626c6f636b20616e792066757274686572206e6f6d696e6174696f6e732e4c7365745f7374616b696e675f636f6e666967731801486d696e5f6e6f6d696e61746f725f626f6e6441060158436f6e6669674f703c42616c616e63654f663c543e3e0001486d696e5f76616c696461746f725f626f6e6441060158436f6e6669674f703c42616c616e63654f663c543e3e00014c6d61785f6e6f6d696e61746f725f636f756e7445060134436f6e6669674f703c7533323e00014c6d61785f76616c696461746f725f636f756e7445060134436f6e6669674f703c7533323e00013c6368696c6c5f7468726573686f6c6449060144436f6e6669674f703c50657263656e743e0001386d696e5f636f6d6d697373696f6e4d060144436f6e6669674f703c50657262696c6c3e001644ac5570646174652074686520766172696f7573207374616b696e6720636f6e66696775726174696f6e73202e0025012a20606d696e5f6e6f6d696e61746f725f626f6e64603a20546865206d696e696d756d2061637469766520626f6e64206e656564656420746f2062652061206e6f6d696e61746f722e25012a20606d696e5f76616c696461746f725f626f6e64603a20546865206d696e696d756d2061637469766520626f6e64206e656564656420746f20626520612076616c696461746f722e55012a20606d61785f6e6f6d696e61746f725f636f756e74603a20546865206d6178206e756d626572206f662075736572732077686f2063616e2062652061206e6f6d696e61746f72206174206f6e63652e205768656e98202073657420746f20604e6f6e65602c206e6f206c696d697420697320656e666f726365642e55012a20606d61785f76616c696461746f725f636f756e74603a20546865206d6178206e756d626572206f662075736572732077686f2063616e20626520612076616c696461746f72206174206f6e63652e205768656e98202073657420746f20604e6f6e65602c206e6f206c696d697420697320656e666f726365642e59012a20606368696c6c5f7468726573686f6c64603a2054686520726174696f206f6620606d61785f6e6f6d696e61746f725f636f756e7460206f7220606d61785f76616c696461746f725f636f756e74602077686963681901202073686f756c642062652066696c6c656420696e206f7264657220666f722074686520606368696c6c5f6f7468657260207472616e73616374696f6e20746f20776f726b2e61012a20606d696e5f636f6d6d697373696f6e603a20546865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e207468617420656163682076616c696461746f7273206d757374206d61696e7461696e2e550120205468697320697320636865636b6564206f6e6c792075706f6e2063616c6c696e67206076616c6964617465602e204578697374696e672076616c696461746f727320617265206e6f742061666665637465642e00c452756e74696d654f726967696e206d75737420626520526f6f7420746f2063616c6c20746869732066756e6374696f6e2e0035014e4f54453a204578697374696e67206e6f6d696e61746f727320616e642076616c696461746f72732077696c6c206e6f742062652061666665637465642062792074686973207570646174652e1101746f206b69636b2070656f706c6520756e64657220746865206e6577206c696d6974732c20606368696c6c5f6f74686572602073686f756c642062652063616c6c65642e2c6368696c6c5f6f74686572040128636f6e74726f6c6c6572000130543a3a4163636f756e74496400176841014465636c61726520612060636f6e74726f6c6c65726020746f2073746f702070617274696369706174696e672061732065697468657220612076616c696461746f72206f72206e6f6d696e61746f722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e004101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2c206275742063616e2062652063616c6c656420627920616e796f6e652e0059014966207468652063616c6c6572206973207468652073616d652061732074686520636f6e74726f6c6c6572206265696e672074617267657465642c207468656e206e6f206675727468657220636865636b7320617265d8656e666f726365642c20616e6420746869732066756e6374696f6e2062656861766573206a757374206c696b6520606368696c6c602e005d014966207468652063616c6c657220697320646966666572656e74207468616e2074686520636f6e74726f6c6c6572206265696e672074617267657465642c2074686520666f6c6c6f77696e6720636f6e646974696f6e73306d757374206265206d65743a001d012a2060636f6e74726f6c6c657260206d7573742062656c6f6e6720746f2061206e6f6d696e61746f722077686f20686173206265636f6d65206e6f6e2d6465636f6461626c652c000c4f723a003d012a204120604368696c6c5468726573686f6c6460206d7573742062652073657420616e6420636865636b656420776869636820646566696e657320686f7720636c6f736520746f20746865206d6178550120206e6f6d696e61746f7273206f722076616c696461746f7273207765206d757374207265616368206265666f72652075736572732063616e207374617274206368696c6c696e67206f6e652d616e6f746865722e59012a204120604d61784e6f6d696e61746f72436f756e746020616e6420604d617856616c696461746f72436f756e7460206d75737420626520736574207768696368206973207573656420746f2064657465726d696e65902020686f7720636c6f73652077652061726520746f20746865207468726573686f6c642e5d012a204120604d696e4e6f6d696e61746f72426f6e646020616e6420604d696e56616c696461746f72426f6e6460206d7573742062652073657420616e6420636865636b65642c2077686963682064657465726d696e65735101202069662074686973206973206120706572736f6e20746861742073686f756c64206265206368696c6c6564206265636175736520746865792068617665206e6f74206d657420746865207468726573686f6c64402020626f6e642072657175697265642e005501546869732063616e2062652068656c7066756c20696620626f6e6420726571756972656d656e74732061726520757064617465642c20616e64207765206e65656420746f2072656d6f7665206f6c642075736572739877686f20646f206e6f74207361746973667920746865736520726571756972656d656e74732e68666f7263655f6170706c795f6d696e5f636f6d6d697373696f6e04013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400180c4501466f72636520612076616c696461746f7220746f2068617665206174206c6561737420746865206d696e696d756d20636f6d6d697373696f6e2e20546869732077696c6c206e6f74206166666563742061610176616c696461746f722077686f20616c726561647920686173206120636f6d6d697373696f6e2067726561746572207468616e206f7220657175616c20746f20746865206d696e696d756d2e20416e79206163636f756e743863616e2063616c6c20746869732e487365745f6d696e5f636f6d6d697373696f6e04010c6e65779101011c50657262696c6c00191025015365747320746865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e207468617420656163682076616c696461746f7273206d757374206d61696e7461696e2e005901546869732063616c6c20686173206c6f7765722070726976696c65676520726571756972656d656e7473207468616e20607365745f7374616b696e675f636f6e6669676020616e642063616e2062652063616c6c6564cc6279207468652060543a3a41646d696e4f726967696e602e20526f6f742063616e20616c776179732063616c6c20746869732e686164645f7065726d697373696f6e65645f76616c696461746f720801206964656e746974798001284964656e746974794964000138696e74656e6465645f636f756e745106012c4f7074696f6e3c7533323e001a0cd8416464732061207065726d697373696f6e6564206964656e7469747920616e6420736574732069747320707265666572656e6365732e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e7472656d6f76655f7065726d697373696f6e65645f76616c696461746f720401206964656e746974798001284964656e746974794964001b1ca90152656d6f766520616e206964656e746974792066726f6d2074686520706f6f6c206f66202877616e6e616265292076616c696461746f72206964656e7469746965732e204566666563747320617265206b6e6f776e20696e20746865206e6578742073657373696f6e2e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2320417267756d656e7473f02a206f726967696e205265717569726564206f726967696e20666f722072656d6f76696e67206120706f74656e7469616c2076616c696461746f722e882a206964656e746974792056616c696461746f722773204964656e7469747949642e7876616c69646174655f6364645f6578706972795f6e6f6d696e61746f727304011c74617267657473fc01445665633c543a3a4163636f756e7449643e001c14a056616c696461746520746865206e6f6d696e61746f727320434444206578706972792074696d652e005901496620616e206163636f756e742066726f6d206120676976656e20736574206f662061646472657373206973206e6f6d696e6174696e67207468656e20636865636b2074686520434444206578706972792074696d654d016f6620697420616e642069662069742069732065787069726564207468656e20746865206163636f756e742073686f756c6420626520756e626f6e64656420616e642072656d6f7665642066726f6d207468654c6e6f6d696e6174696e672070726f636573732e607061796f75745f7374616b6572735f62795f73797374656d08013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400010c657261100120457261496e646578001d006c6368616e67655f736c617368696e675f616c6c6f7765645f666f7204013c736c617368696e675f737769746368a1010138536c617368696e67537769746368001e046d0153776974636820736c617368696e6720737461747573206f6e20746865206261736973206f6620676976656e2060736c617368696e675f737769746368602e2043616e206f6e6c792062652063616c6c656420627920726f6f742eb07570646174655f7065726d697373696f6e65645f76616c696461746f725f696e74656e6465645f636f756e740801206964656e746974798001284964656e7469747949640001486e65775f696e74656e6465645f636f756e7410010c753332001f042501536574732074686520696e74656e64656420636f756e7420746f20606e65775f696e74656e6465645f636f756e746020666f722074686520676976656e20606964656e74697479602e546368696c6c5f66726f6d5f676f7665726e616e63650801206964656e746974798001284964656e74697479496400012873746173685f6b657973fc01445665633c543a3a4163636f756e7449643e002004a101476f7665726e616e636520636f756e63696c20666f72636566756c6c79206368696c6c7320612076616c696461746f722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e487365745f636f6d6d697373696f6e5f63617004011c6e65775f6361709101011c50657262696c6c00211421014368616e67657320636f6d6d697373696f6e2072617465207768696368206170706c69657320746f20616c6c2076616c696461746f72732e204f6e6c7920476f7665726e616e6365a8636f6d6d697474656520697320616c6c6f77656420746f206368616e676520746869732076616c75652e002c2320417267756d656e74738c2a20606e65775f6361706020746865206e657720636f6d6d697373696f6e206361702e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e3506083870616c6c65745f7374616b696e674452657761726444657374696e6174696f6e04244163636f756e74496401000114185374616b656400000014537461736800010028436f6e74726f6c6c65720002001c4163636f756e7404000001244163636f756e744964000300104e6f6e650004000039060000028505003d060c3473705f61726974686d65746963287065725f7468696e67731c50657263656e7400000400080108753800004106103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f700404540118010c104e6f6f700000000c5365740400180104540001001852656d6f7665000200004506103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f700404540110010c104e6f6f700000000c5365740400100104540001001852656d6f7665000200004906103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f70040454013d06010c104e6f6f700000000c53657404003d060104540001001852656d6f7665000200004d06103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f70040454019101010c104e6f6f700000000c536574040091010104540001001852656d6f766500020000510604184f7074696f6e04045401100108104e6f6e6500000010536f6d65040010000001000055060c3870616c6c65745f73657373696f6e1870616c6c65741043616c6c040454000108207365745f6b6579730801106b6579735906011c543a3a4b65797300011470726f6f6630011c5665633c75383e000024e453657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e1d01416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d0546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e0034232320436f6d706c657869747959012d20604f283129602e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f69647328296020776869636820697320202066697865642e2870757267655f6b657973000130c852656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722e00c05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e005501546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265205369676e656420616e6420746865206163636f756e74206d757374206265206569746865722062655d01636f6e7665727469626c6520746f20612076616c696461746f72204944207573696e672074686520636861696e2773207479706963616c2061646472657373696e672073797374656d20287468697320757375616c6c7951016d65616e73206265696e67206120636f6e74726f6c6c6572206163636f756e7429206f72206469726563746c7920636f6e7665727469626c6520696e746f20612076616c696461746f722049442028776869636894757375616c6c79206d65616e73206265696e672061207374617368206163636f756e74292e0034232320436f6d706c65786974793d012d20604f2831296020696e206e756d626572206f66206b65792074797065732e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f6698202060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e59060c60706f6c796d6573685f72756e74696d655f646576656c6f701c72756e74696d652c53657373696f6e4b657973000010011c6772616e647061b90101d03c4772616e647061206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c6963000110626162651d0501c43c42616265206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c6963000124696d5f6f6e6c696e65c50101d43c496d4f6e6c696e65206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c696300014c617574686f726974795f646973636f766572795d0601fc3c417574686f72697479446973636f76657279206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c696300005d060c5873705f617574686f726974795f646973636f766572790c617070185075626c696300000400c901013c737232353531393a3a5075626c6963000061060c3870616c6c65745f6772616e6470611870616c6c65741043616c6c04045400010c4c7265706f72745f65717569766f636174696f6e08014865717569766f636174696f6e5f70726f6f66650601bc426f783c45717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3e00013c6b65795f6f776e65725f70726f6f6671050140543a3a4b65794f776e657250726f6f6600001009015265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f465717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66f8616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63654477696c6c206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e656408014865717569766f636174696f6e5f70726f6f66650601bc426f783c45717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3e00013c6b65795f6f776e65725f70726f6f6671050140543a3a4b65794f776e657250726f6f6600012409015265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f465717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66f8616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63654477696c6c206265207265706f727465642e000d01546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c791501626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c2061732073756368150169662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e247265706f727465722e306e6f74655f7374616c6c656408011464656c6179100138543a3a426c6f636b4e756d62657200016c626573745f66696e616c697a65645f626c6f636b5f6e756d626572100138543a3a426c6f636b4e756d6265720002303d014e6f74652074686174207468652063757272656e7420617574686f7269747920736574206f6620746865204752414e4450412066696e616c6974792067616467657420686173207374616c6c65642e006101546869732077696c6c2074726967676572206120666f7263656420617574686f7269747920736574206368616e67652061742074686520626567696e6e696e67206f6620746865206e6578742073657373696f6e2c20746f6101626520656e6163746564206064656c61796020626c6f636b7320616674657220746861742e20546865206064656c6179602073686f756c64206265206869676820656e6f75676820746f20736166656c7920617373756d654901746861742074686520626c6f636b207369676e616c6c696e672074686520666f72636564206368616e67652077696c6c206e6f742062652072652d6f7267656420652e672e203130303020626c6f636b732e5d0154686520626c6f636b2070726f64756374696f6e207261746520287768696368206d617920626520736c6f77656420646f776e2062656361757365206f662066696e616c697479206c616767696e67292073686f756c64510162652074616b656e20696e746f206163636f756e74207768656e2063686f6f73696e6720746865206064656c6179602e20546865204752414e44504120766f74657273206261736564206f6e20746865206e65775501617574686f726974792077696c6c20737461727420766f74696e67206f6e20746f70206f662060626573745f66696e616c697a65645f626c6f636b5f6e756d6265726020666f72206e65772066696e616c697a65644d01626c6f636b732e2060626573745f66696e616c697a65645f626c6f636b5f6e756d626572602073686f756c64206265207468652068696768657374206f6620746865206c61746573742066696e616c697a6564c4626c6f636b206f6620616c6c2076616c696461746f7273206f6620746865206e657720617574686f72697479207365742e00584f6e6c792063616c6c61626c6520627920726f6f742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e6506085073705f636f6e73656e7375735f6772616e6470614445717569766f636174696f6e50726f6f66080448012c044e0110000801187365745f6964280114536574496400013065717569766f636174696f6e6906014845717569766f636174696f6e3c482c204e3e00006906085073705f636f6e73656e7375735f6772616e6470613045717569766f636174696f6e080448012c044e011001081c507265766f746504006d060139016772616e6470613a3a45717569766f636174696f6e3c417574686f7269747949642c206772616e6470613a3a507265766f74653c482c204e3e2c0a417574686f726974795369676e61747572653e00000024507265636f6d6d6974040081060141016772616e6470613a3a45717569766f636174696f6e3c417574686f7269747949642c206772616e6470613a3a507265636f6d6d69743c482c204e3e2c0a417574686f726974795369676e61747572653e000100006d06084066696e616c6974795f6772616e6470613045717569766f636174696f6e0c08496401b9010456017106045301750600100130726f756e645f6e756d62657228010c7536340001206964656e74697479b9010108496400011466697273747d06011828562c2053290001187365636f6e647d06011828562c20532900007106084066696e616c6974795f6772616e6470611c507265766f7465080448012c044e01100008012c7461726765745f686173682c0104480001347461726765745f6e756d6265721001044e000075060c5073705f636f6e73656e7375735f6772616e6470610c617070245369676e61747572650000040079060148656432353531393a3a5369676e6174757265000079060c1c73705f636f72651c65643235353139245369676e617475726500000400250201205b75383b2036345d00007d060000040871067506008106084066696e616c6974795f6772616e6470613045717569766f636174696f6e0c08496401b9010456018506045301750600100130726f756e645f6e756d62657228010c7536340001206964656e74697479b9010108496400011466697273748906011828562c2053290001187365636f6e648906011828562c20532900008506084066696e616c6974795f6772616e64706124507265636f6d6d6974080448012c044e01100008012c7461726765745f686173682c0104480001347461726765745f6e756d6265721001044e000089060000040885067506008d060c4070616c6c65745f696d5f6f6e6c696e651870616c6c65741043616c6c04045400010424686561727462656174080124686561727462656174910601644865617274626561743c543a3a426c6f636b4e756d6265723e0001247369676e6174757265a50601bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e617475726500001438232320436f6d706c65786974793a59012d20604f284b202b20452960207768657265204b206973206c656e677468206f6620604b6579736020286865617274626561742e76616c696461746f72735f6c656e2920616e642045206973206c656e677468206f66b02020606865617274626561742e6e6574776f726b5f73746174652e65787465726e616c5f61646472657373608820202d20604f284b29603a206465636f64696e67206f66206c656e67746820604b60ac20202d20604f284529603a206465636f64696e672f656e636f64696e67206f66206c656e67746820604560042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e9106084070616c6c65745f696d5f6f6e6c696e6524486561727462656174042c426c6f636b4e756d626572011000140130626c6f636b5f6e756d62657210012c426c6f636b4e756d6265720001346e6574776f726b5f7374617465950601484f70617175654e6574776f726b537461746500013473657373696f6e5f696e64657810013053657373696f6e496e64657800013c617574686f726974795f696e64657810012441757468496e64657800013876616c696461746f72735f6c656e10010c753332000095060c1c73705f636f7265206f6666636861696e484f70617175654e6574776f726b5374617465000008011c706565725f6964990601304f706171756550656572496400014865787465726e616c5f6164647265737365739d0601505665633c4f70617175654d756c7469616464723e00009906081c73705f636f7265304f70617175655065657249640000040030011c5665633c75383e00009d06000002a10600a1060c1c73705f636f7265206f6666636861696e3c4f70617175654d756c7469616464720000040030011c5665633c75383e0000a506104070616c6c65745f696d5f6f6e6c696e651c737232353531392c6170705f73723235353139245369676e617475726500000400a9060148737232353531393a3a5369676e61747572650000a9060c1c73705f636f72651c73723235353139245369676e617475726500000400250201205b75383b2036345d0000ad06082c70616c6c65745f7375646f1043616c6c040454000110107375646f04011063616c6c0d06017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000028350141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e5c2d204f6e6520444220777269746520286576656e74292ec42d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e2c23203c2f7765696768743e547375646f5f756e636865636b65645f77656967687408011063616c6c0d06017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00011c5f776569676874200118576569676874000128350141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e2d01546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b05375646f207573657220746f20737065636966792074686520776569676874206f66207468652063616c6c2e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292ecc2d2054686520776569676874206f6620746869732063616c6c20697320646566696e6564206279207468652063616c6c65722e2c23203c2f7765696768743e1c7365745f6b657904010c6e65778505018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000224710141757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e402d204f6e65204442206368616e67652e2c23203c2f7765696768743e1c7375646f5f617308010c77686f8505018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011063616c6c0d06017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00032c4d0141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d406120676976656e206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e5c2d204f6e6520444220777269746520286576656e74292ec42d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e2c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652eb106083070616c6c65745f61737365741043616c6c0404540001805872656769737465725f756e697175655f7469636b65720401187469636b6572210101185469636b65720000241101526567697374657273206120756e69717565207469636b6572206f7220657874656e64732076616c6964697479206f6620616e206578697374696e67207469636b65722e11014e423a205469636b65722076616c696469747920646f6573206e6f742067657420636172727920666f7277617264207768656e2072656e6577696e67207469636b65722e002c2320417267756d656e7473cd012a20606f726967696e603a20697420636f6e7461696e7320746865207365636f6e64617279206b6579206f66207468652063616c6c65722028692e652e2077686f207369676e656420746865207472616e73616374696f6e20746f206578656375746520746869732066756e6374696f6e292e8c2a20607469636b6572603a205b605469636b6572605d20746f2072656769737465722e003423205065726d697373696f6e731c2a204173736574586163636570745f7469636b65725f7472616e7366657204011c617574685f696428010c75363400012068416363657074732061207469636b6572207472616e736665722e002d01436f6e73756d65732074686520617574686f72697a6174696f6e2060617574685f6964602028736565206070616c6c65745f6964656e746974793a3a636f6e73756d655f6175746860292e25014e423a20546f2072656a65637420746865207472616e736665722c2063616c6c2072656d6f766520617574682066756e6374696f6e20696e206964656e74697479206d6f64756c652e002c2320417267756d656e7473cd012a20606f726967696e603a20697420636f6e7461696e7320746865207365636f6e64617279206b6579206f66207468652063616c6c65722028692e652e2077686f207369676e656420746865207472616e73616374696f6e20746f206578656375746520746869732066756e6374696f6e292efc2a2060617574685f6964603a20617574686f72697a6174696f6e204944206f66207469636b6572207472616e7366657220617574686f72697a6174696f6e2e7c6163636570745f61737365745f6f776e6572736869705f7472616e7366657204011c617574685f696428010c753634000218ec546869732066756e6374696f6e206973207573656420746f20616363657074206120746f6b656e206f776e657273686970207472616e736665722e25014e423a20546f2072656a65637420746865207472616e736665722c2063616c6c2072656d6f766520617574682066756e6374696f6e20696e206964656e74697479206d6f64756c652e002c2320417267756d656e7473cd012a20606f726967696e603a20697420636f6e7461696e7320746865207365636f6e64617279206b6579206f66207468652063616c6c65722028692e652e2077686f207369676e656420746865207472616e73616374696f6e20746f206578656375746520746869732066756e6374696f6e292e31012a2060617574685f6964603a20617574686f72697a6174696f6e204944206f662074686520746f6b656e206f776e657273686970207472616e7366657220617574686f72697a6174696f6e2e306372656174655f617373657414012861737365745f6e616d65f901012441737365744e616d65000124646976697369626c6539010110626f6f6c00012861737365745f74797065ed01012441737365745479706500014461737365745f6964656e74696669657273fd0101505665633c41737365744964656e7469666965723e00014866756e64696e675f726f756e645f6e616d650d0201604f7074696f6e3c46756e64696e67526f756e644e616d653e0003343501496e697469616c697a65732061206e6577205b60417373657444657461696c73605d2c20776974682074686520696e6974696174696e67206163636f756e7420617320697473206f776e65722e3d0154686520746f74616c20737570706c792077696c6c20696e697469616c6c79206265207a65726f2e20546f206d696e7420746f6b656e732c20757365205b604d6f64756c653a3a6973737565605d2e002c2320417267756d656e7473c1012a20606f726967696e603a20636f6e7461696e7320746865207365636f6e64617279206b6579206f66207468652063616c6c65722028692e652e2077686f207369676e656420746865207472616e73616374696f6e20746f206578656375746520746869732066756e6374696f6e292e0d012a206061737365745f6e616d65603a20746865205b6041737365744e616d65605d206173736f63696174656420746f2074686520736563757269747920746f6b656e2e6d012a2060646976697369626c65603a2073657473205b60417373657444657461696c733a3a646976697369626c65605d2c20776865726520607472756560206d65616e732074686520746f6b656e20697320646976697369626c652e71012a206061737365745f74797065603a20746865205b60417373657454797065605d207468617420726570726573656e7473207468652073656375726974792074797065206f6620746865205b60417373657444657461696c73605d2edc2a206061737365745f6964656e74696669657273603a206120766563746f72206f66205b6041737365744964656e746966696572605d2e35012a206066756e64696e675f726f756e645f6e616d65603a20746865206e616d65206f66207468652066756e64696e6720726f756e6420285b6046756e64696e67526f756e644e616d65605d292e00382323205065726d697373696f6e732c2a20506f7274666f6c696f18667265657a6504012061737365745f6964a8011c417373657449440004208c467265657a6573207472616e7366657273206f66206120676976656e20746f6b656e2e002c2320417267756d656e7473b02a20606f726967696e603a20746865207365636f6e64617279206b6579206f66207468652073656e6465722ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2e003423205065726d697373696f6e731c2a20417373657420756e667265657a6504012061737365745f6964a8011c4173736574494400052094556e667265657a6573207472616e7366657273206f66206120676976656e20746f6b656e2e002c2320417267756d656e7473b02a20606f726967696e603a20746865207365636f6e64617279206b6579206f66207468652073656e6465722ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2e003423205065726d697373696f6e731c2a2041737365743072656e616d655f617373657408012061737365745f6964a8011c4173736574494400012861737365745f6e616d65f901012441737365744e616d65000624e45570646174657320746865205b6041737365744e616d65605d206173736f63696174656420746f206120736563757269747920746f6b656e2e002c2320417267756d656e7473b02a20606f726967696e603a20746865207365636f6e64617279206b6579206f66207468652073656e6465722ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2e1d012a206061737365745f6e616d65603a20746865205b6041737365744e616d65605d20746861742077696c6c206265206173736f63696174656420746f2074686520746f6b656e2e003423205065726d697373696f6e731c2a2041737365741469737375650c012061737365745f6964a8011c41737365744944000118616d6f756e7418011c42616c616e6365000138706f7274666f6c696f5f6b696e64ec0134506f7274666f6c696f4b696e6400072c590149737375652028692e65206d696e7429206e657720746f6b656e7320746f207468652063616c6c65722c207768696368206d75737420626520616e20617574686f72697a65642065787465726e616c206167656e742e002c2320417267756d656e747325012a20606f726967696e603a2041207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f6620607469636b6572602ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2ed42a2060616d6f756e74603a2054686520616d6f756e74206f6620746f6b656e7320746861742077696c6c206265206973737565642e7d012a2060706f7274666f6c696f5f6b696e64603a20546865205b60506f7274666f6c696f4b696e64605d206f662074686520706f7274666f6c696f20746861742077696c6c207265636569766520746865206d696e74656420746f6b656e732e003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f1872656465656d0c012061737365745f6964a8011c4173736574494400011476616c756518011c42616c616e6365000138706f7274666f6c696f5f6b696e64ec0134506f7274666f6c696f4b696e6400082ce10152656465656d732028692e65206275726e7329206578697374696e6720746f6b656e73206279207265647563696e67207468652062616c616e6365206f66207468652063616c6c6572277320706f7274666f6c696f20616e642074686520746f74616c20737570706c79206f662074686520746f6b656e2e002c2320417267756d656e747339012a20606f726967696e603a2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2e982a206076616c7565603a20616d6f756e74206f6620746f6b656e7320746f2072656465656d2e35012a2060706f7274666f6c696f5f6b696e64603a20746865205b60506f7274666f6c696f4b696e64605d20746861742077696c6c2068617665206974732062616c616e636520726564756365642e003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f386d616b655f646976697369626c6504012061737365745f6964a8011c417373657449440009207d0149662074686520746f6b656e206173736f63696174656420746f206061737365745f69646020697320696e646976697369626c652c2073657473205b60417373657444657461696c733a3a646976697369626c65605d20746f20747275652e002c2320417267756d656e747331012a20606f726967696e603a2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f6620607469636b6572602ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2e003423205065726d697373696f6e731c2a204173736574346164645f646f63756d656e7473080110646f6373b50601345665633c446f63756d656e743e00012061737365745f6964a8011c41737365744944000a248041646420646f63756d656e747320666f72206120676976656e20746f6b656e2e002c2320417267756d656e747339012a20606f726967696e603a2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2ec02a2060646f6373603a20646f63756d656e747320746f20626520617474616368656420746f2074686520746f6b656e2e003423205065726d697373696f6e731c2a2041737365744072656d6f76655f646f63756d656e747308011c646f63735f69642503013c5665633c446f63756d656e7449643e00012061737365745f6964a8011c41737365744944000b248c52656d6f766520646f63756d656e747320666f72206120676976656e20746f6b656e2e002c2320417267756d656e747339012a20606f726967696e603a2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2e41012a2060646f63735f6964603a206120766563746f72206f6620616c6c205b60446f63756d656e744964605d20746861742077696c6c2062652072656d6f7665642066726f6d2074686520746f6b656e2e003423205065726d697373696f6e731c2a204173736574447365745f66756e64696e675f726f756e6408012061737365745f6964a8011c4173736574494400014c666f756e64696e675f726f756e645f6e616d651102014046756e64696e67526f756e644e616d65000c24ac5365747320746865206e616d65206f66207468652063757272656e742066756e64696e6720726f756e642e002c2320417267756d656e747331012a20606f726967696e603a202061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2e41012a2060666f756e64696e675f726f756e645f6e616d65603a20746865205b60466f756e64696e67526f756e644e616d65605d206f66207468652063757272656e742066756e64696e6720726f756e642e003423205065726d697373696f6e731c2a204173736574487570646174655f6964656e7469666965727308012061737365745f6964a8011c4173736574494400014461737365745f6964656e74696669657273fd0101505665633c41737365744964656e7469666965723e000d24d85570646174657320746865206173736574206964656e74696669657273206173736f63696174656420746f2074686520746f6b656e2e002c2320417267756d656e74732d012a20606f726967696e603a2061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2e71012a206061737365745f6964656e74696669657273603a206120766563746f72206f66205b6041737365744964656e746966696572605d20746861742077696c6c206265206173736f63696174656420746f2074686520746f6b656e2e003423205065726d697373696f6e731c2a2041737365744c636f6e74726f6c6c65725f7472616e736665720c012061737365745f6964a8011c4173736574494400011476616c756518011c42616c616e636500013866726f6d5f706f7274666f6c696fe8012c506f7274666f6c696f4964000e2c4d01466f726365732061207472616e73666572206f6620746f6b656e2066726f6d206066726f6d5f706f7274666f6c696f6020746f207468652063616c6c657227732064656661756c7420706f7274666f6c696f2e002c2320417267756d656e74732d012a20606f726967696e603a2061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2efc2a206076616c7565603a2020746865205b6042616c616e6365605d206f6620746f6b656e7320746861742077696c6c206265207472616e736665727265642e2d012a206066726f6d5f706f7274666f6c696f603a20746865205b60506f7274666f6c696f4964605d20746861742077696c6c2068617665206974732062616c616e636520726564756365642e003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f6872656769737465725f637573746f6d5f61737365745f74797065040108747930011c5665633c75383e000f2478526567697374657273206120637573746f6d20617373657420747970652e00d05468652070726f766964656420607479602077696c6c20626520626f756e6420746f20616e20494420696e2073746f726167652ebc5468652049442063616e207468656e206265207573656420696e20604173736574547970653a3a437573746f6d602e250153686f756c6420746865206074796020616c726561647920657869737420696e2073746f726167652c206e6f207365636f6e642049442069732061737369676e656420746f2069742e002c2320417267756d656e7473942a20606f726967696e603a2077686f2063616c6c6564207468652065787472696e7369632ef42a20607479603a20636f6e7461696e732074686520737472696e6720726570726573656e746174696f6e206f662074686520617373657420747970652e746372656174655f61737365745f776974685f637573746f6d5f7479706514012861737365745f6e616d65f901012441737365744e616d65000124646976697369626c6539010110626f6f6c000144637573746f6d5f61737365745f7479706530011c5665633c75383e00014461737365745f6964656e74696669657273fd0101505665633c41737365744964656e7469666965723e00014866756e64696e675f726f756e645f6e616d650d0201604f7074696f6e3c46756e64696e67526f756e644e616d653e0010383501496e697469616c697a65732061206e6577205b60417373657444657461696c73605d2c20776974682074686520696e6974696174696e67206163636f756e7420617320697473206f776e65722e3d0154686520746f74616c20737570706c792077696c6c20696e697469616c6c79206265207a65726f2e20546f206d696e7420746f6b656e732c20757365205b604d6f64756c653a3a6973737565605d2e95014e6f74653a205574696c6974792065787472696e73696320746f206261746368205b604d6f64756c653a3a6372656174655f6173736574605d20616e64205b604d6f64756c653a3a72656769737465725f637573746f6d5f61737365745f74797065605d2e002c2320417267756d656e7473c1012a20606f726967696e603a20636f6e7461696e7320746865207365636f6e64617279206b6579206f66207468652063616c6c65722028692e652e2077686f207369676e656420746865207472616e73616374696f6e20746f206578656375746520746869732066756e6374696f6e292e0d012a206061737365745f6e616d65603a20746865205b6041737365744e616d65605d206173736f63696174656420746f2074686520736563757269747920746f6b656e2e6d012a2060646976697369626c65603a2073657473205b60417373657444657461696c733a3a646976697369626c65605d2c20776865726520607472756560206d65616e732074686520746f6b656e20697320646976697369626c652ee82a2060637573746f6d5f61737365745f74797065603a2074686520637573746f6d2061737365742074797065206f662074686520746f6b656e2edc2a206061737365745f6964656e74696669657273603a206120766563746f72206f66205b6041737365744964656e746966696572605d2e35012a206066756e64696e675f726f756e645f6e616d65603a20746865206e616d65206f66207468652066756e64696e6720726f756e6420285b6046756e64696e67526f756e644e616d65605d292e00382323205065726d697373696f6e732c2a20506f7274666f6c696f487365745f61737365745f6d6574616461746110012061737365745f6964a8011c4173736574494400010c6b65797902014041737365744d657461646174614b657900011476616c75654502014841737365744d6574616461746156616c756500011864657461696c490201ac4f7074696f6e3c41737365744d6574616461746156616c756544657461696c3c543a3a4d6f6d656e743e3e00113064536574206173736574206d657461646174612076616c75652e002c2320417267756d656e747339012a20606f726967696e603a2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2ee82a20606b6579603a20746865205b6041737365744d657461646174614b6579605d206173736f63696174656420746f2074686520746f6b656e2e01012a206076616c7565603a20746865205b6041737365744d6574616461746156616c7565605d206f662074686520676976656e206d65746164617461206b65792e25012a206064657461696c73603a206f7074696f6e616c205b6041737365744d6574616461746156616c756544657461696c605d20286578706972652c206c6f636b20737461747573292e003423205065726d697373696f6e731c2a204167656e741c2a204173736574687365745f61737365745f6d657461646174615f64657461696c730c012061737365745f6964a8011c4173736574494400010c6b65797902014041737365744d657461646174614b657900011864657461696c4d02018c41737365744d6574616461746156616c756544657461696c3c543a3a4d6f6d656e743e00122cdc536574206173736574206d657461646174612076616c75652064657461696c7320286578706972652c206c6f636b20737461747573292e002c2320417267756d656e747339012a20606f726967696e603a2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2ee82a20606b6579603a20746865205b6041737365744d657461646174614b6579605d206173736f63696174656420746f2074686520746f6b656e2ea5012a206064657461696c73603a20746865205b6041737365744d6574616461746156616c756544657461696c605d20286578706972652c206c6f636b207374617475732920746861742077696c6c206265206173736f63696174656420746f2074686520746f6b656e2e003423205065726d697373696f6e731c2a204167656e741c2a2041737365749472656769737465725f616e645f7365745f6c6f63616c5f61737365745f6d6574616461746114012061737365745f6964a8011c417373657449440001106e616d655502014441737365744d657461646174614e616d65000110737065635d02014441737365744d657461646174615370656300011476616c75654502014841737365744d6574616461746156616c756500011864657461696c490201ac4f7074696f6e3c41737365744d6574616461746156616c756544657461696c3c543a3a4d6f6d656e743e3e0013349c52656769737465727320616e6420736574206c6f63616c206173736574206d657461646174612e002c2320417267756d656e747339012a20606f726967696e603a2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2e902a20606e616d65603a20746865205b6041737365744d657461646174614e616d65605d2e11012a206073706563603a20746865206173736574206d657461646174612073706563696669636174696f6e7320285b6041737365744d6574616461746153706563605d292e01012a206076616c7565603a20746865205b6041737365744d6574616461746156616c7565605d206f662074686520676976656e206d65746164617461206b65792e25012a206064657461696c73603a206f7074696f6e616c205b6041737365744d6574616461746156616c756544657461696c605d20286578706972652c206c6f636b20737461747573292e003423205065726d697373696f6e731c2a204167656e741c2a2041737365748872656769737465725f61737365745f6d657461646174615f6c6f63616c5f747970650c012061737365745f6964a8011c417373657449440001106e616d655502014441737365744d657461646174614e616d65000110737065635d02014441737365744d657461646174615370656300142c90526567697374657273206173736574206d65746164617461206c6f63616c20747970652e002c2320417267756d656e747339012a20606f726967696e603a2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2e902a20606e616d65603a20746865205b6041737365744d657461646174614e616d65605d2e11012a206073706563603a20746865206173736574206d657461646174612073706563696669636174696f6e7320285b6041737365744d6574616461746153706563605d292e003423205065726d697373696f6e731c2a204167656e741c2a2041737365748c72656769737465725f61737365745f6d657461646174615f676c6f62616c5f747970650801106e616d655502014441737365744d657461646174614e616d65000110737065635d02014441737365744d657461646174615370656300151894526567697374657273206173736574206d6574616461746120676c6f62616c20747970652e002c2320417267756d656e747339012a20606f726967696e603a2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602e902a20606e616d65603a20746865205b6041737365744d657461646174614e616d65605d2e11012a206073706563603a20746865206173736574206d657461646174612073706563696669636174696f6e7320285b6041737365744d6574616461746153706563605d292e447570646174655f61737365745f7479706508012061737365745f6964a8011c4173736574494400012861737365745f74797065ed0101244173736574547970650016247455706461746573207468652074797065206f6620616e2061737365742e002c2320417267756d656e7473dc2a20606f726967696e603a20697420636f6e7461696e7320746865207365636f6e64617279206b6579206f66207468652073656e646572d82a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f2074686520746f6b656e2ecc2a206061737365745f74797065603a20746865206e6577205b60417373657454797065605d206f662074686520746f6b656e2e003423205065726d697373696f6e731c2a2041737365746472656d6f76655f6c6f63616c5f6d657461646174615f6b657908012061737365745f6964a8011c417373657449440001246c6f63616c5f6b65795902015441737365744d657461646174614c6f63616c4b6579001724e052656d6f76657320746865206173736574206d65746164617461206b657920616e642076616c7565206f662061206c6f63616c206b65792e002c2320417267756d656e7473b02a20606f726967696e603a20746865207365636f6e64617279206b6579206f66207468652073656e6465722e0d012a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f20746865206c6f63616c206d65746164617461206b65792e09012a20606c6f63616c5f6b6579603a20746865205b6041737365744d657461646174614c6f63616c4b6579605d20746861742077696c6c2062652072656d6f7665642e003423205065726d697373696f6e731c2a2041737365745472656d6f76655f6d657461646174615f76616c756508012061737365745f6964a8011c417373657449440001306d657461646174615f6b65797902014041737365744d657461646174614b6579001824cc52656d6f76657320746865206173736574206d657461646174612076616c7565206f662061206d65746164617461206b65792e002c2320417267756d656e7473b02a20606f726967696e603a20746865207365636f6e64617279206b6579206f66207468652073656e6465722ef42a206061737365745f6964603a20746865205b6041737365744944605d206173736f63696174656420746f20746865206d65746164617461206b65792e31012a20606d657461646174615f6b6579603a20746865205b6041737365744d657461646174614b6579605d20746861742077696c6c2068617665206974732076616c75652064656c657465642e003423205065726d697373696f6e731c2a204173736574606578656d70745f61737365745f61666669726d6174696f6e04012061737365745f6964a8011c41737365744944001920f45072652d617070726f7665732074686520726563656976656d656e74206f662074686520617373657420666f7220616c6c206964656e7469746965732e002c2320417267756d656e7473b02a20606f726967696e603a20746865207365636f6e64617279206b6579206f66207468652073656e6465722e0d012a206061737365745f6964603a20746865205b6041737365744944605d20746861742077696c6c206265206578656d70742066726f6d2061666669726d6174696f6e2e003423205065726d697373696f6e73182a20526f6f748872656d6f76655f61737365745f61666669726d6174696f6e5f6578656d7074696f6e04012061737365745f6964a8011c41737365744944001a20e452656d6f76657320746865207072652d617070726f76616c206f662074686520617373657420666f7220616c6c206964656e7469746965732e002c2320417267756d656e7473b02a20606f726967696e603a20746865207365636f6e64617279206b6579206f66207468652073656e6465722e0d012a206061737365745f6964603a20746865205b6041737365744944605d20746861742077696c6c206861766520697473206578656d7074696f6e2072656d6f7665642e003423205065726d697373696f6e73182a20526f6f74447072655f617070726f76655f617373657404012061737365745f6964a8011c41737365744944001b20a45072652d617070726f7665732074686520726563656976656d656e74206f6620616e2061737365742e002c2320417267756d656e7473b02a20606f726967696e603a20746865207365636f6e64617279206b6579206f66207468652073656e6465722e0d012a206061737365745f6964603a20746865205b6041737365744944605d20746861742077696c6c206265206578656d70742066726f6d2061666669726d6174696f6e2e003423205065726d697373696f6e731c2a2041737365746472656d6f76655f61737365745f7072655f617070726f76616c04012061737365745f6964a8011c41737365744944001c209452656d6f766573207468652070726520617070726f76616c206f6620616e2061737365742e002c2320417267756d656e7473b42a20606f726967696e60202d20746865207365636f6e64617279206b6579206f66207468652073656e6465722e0d012a206061737365745f6964603a20746865205b6041737365744944605d20746861742077696c6c206861766520697473206578656d7074696f6e2072656d6f7665642e003423205065726d697373696f6e731c2a2041737365745c6164645f6d616e6461746f72795f6d65646961746f727308012061737365745f6964a8011c417373657449440001246d65646961746f7273b90601c4426f756e64656442547265655365743c4964656e7469747949642c20543a3a4d617841737365744d65646961746f72733e001d24b5015365747320616c6c206964656e74697469657320696e2074686520606d65646961746f72736020736574206173206d616e6461746f7279206d65646961746f727320666f7220616e7920696e737472756374696f6e207472616e73666572696e67206061737365745f6964602e002c2320417267756d656e7473b02a20606f726967696e603a20546865207365636f6e64617279206b6579206f66207468652073656e6465722e2d012a206061737365745f6964603a20746865205b6041737365744944605d206f662074686520617373657420746861742077696c6c207265717569726520746865206d65646961746f72732e6d012a20606d65646961746f7273603a204120736574206f66205b604964656e746974794964605d206f6620616c6c20746865206d616e6461746f7279206d65646961746f727320666f722074686520676976656e207469636b65722e003423205065726d697373696f6e731c2a2041737365746872656d6f76655f6d616e6461746f72795f6d65646961746f727308012061737365745f6964a8011c417373657449440001246d65646961746f7273b90601c4426f756e64656442547265655365743c4964656e7469747949642c20543a3a4d617841737365744d65646961746f72733e001e24a50152656d6f76657320616c6c206964656e74697469657320696e2074686520606d65646961746f727360207365742066726f6d20746865206d616e6461746f7279206d65646961746f7273206c69737420666f722074686520676976656e206061737365745f6964602e002c2320417267756d656e7473b02a20606f726967696e603a20746865207365636f6e64617279206b6579206f66207468652073656e6465722e31012a206061737365745f6964603a20746865205b6041737365744944605d206f662074686520617373657420746861742077696c6c2068617665206d65646961746f72732072656d6f7665642ecd012a20606d65646961746f7273603a204120736574206f66205b604964656e746974794964605d206f6620616c6c20746865206d65646961746f727320746861742077696c6c2062652072656d6f7665642066726f6d20746865206d616e6461746f7279206d65646961746f7273206c6973742e003423205065726d697373696f6e731c2a2041737365745c6c696e6b5f7469636b65725f746f5f61737365745f69640801187469636b6572210101185469636b657200012061737365745f6964a8011c41737365744944001f24e445737461626c6973686573206120636f6e6e656374696f6e206265747765656e2061207469636b657220616e6420616e20417373657449442e002c2320417267756d656e7473b02a20606f726967696e603a20746865207365636f6e64617279206b6579206f66207468652073656e6465722e1d012a20607469636b6572603a20746865205b605469636b6572605d20746861742077696c6c206265206c696e6b656420746f2074686520676976656e206061737365745f6964602e05012a206061737365745f6964603a20746865205b6041737365744944605d20746861742077696c6c20626520636f6e6e656374656420746f20607469636b6572602e003423205065726d697373696f6e731c2a2041737365740c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652eb506000002190200b9060c4c626f756e6465645f636f6c6c656374696f6e7344626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401800453000004008d02012c42547265655365743c543e0000bd060c6070616c6c65745f636f72706f726174655f616374696f6e7330646973747269627574696f6e1043616c6c04045400011428646973747269627574651c011463615f69649902011043414964000124706f7274666f6c696fc106015c4f7074696f6e3c506f7274666f6c696f4e756d6265723e00012063757272656e6379a8011c417373657449440001247065725f736861726518011c42616c616e6365000118616d6f756e7418011c42616c616e63650001287061796d656e745f61742801184d6f6d656e74000128657870697265735f6174050101384f7074696f6e3c4d6f6d656e743e0000ac2501537461727420616e64206174746163682061206361706974616c20646973747269627574696f6e2c20746f20746865204341206964656e746966696564206279206063615f6964602c6501776974682060616d6f756e74602066756e647320696e206063757272656e6379602077697468647261776e2066726f6d2060706f7274666f6c696f602062656c6f6e67696e6720746f20606f726967696e602773204449442e00290154686520646973747269627574696f6e2077696c6c20636f6d6d656e636520617420607061796d656e745f61746020616e64206578706972652061742060657870697265735f6174602cc869662070726f76696465642c206f7220696620604e6f6e65602c207468656e2074686572652773206e6f206578706972792e0025015468652066756e64732077696c6c206265206c6f636b656420696e2060706f7274666f6c696f602066726f6d207768656e206064697374726962757465602069732063616c6c65642e35015768656e2074686572652773206e6f206578706972792c20736f6d652066756e6473206d6179206265206c6f636b656420696e646566696e6974656c7920696e2060706f7274666f6c696f602c150164756520746f20636c61696d616e7473206e6f74207769746864726177696e67206f72206e6f2062656e6566697473206265696e672070757368656420746f207468656d2e2901466f7220696e646976697369626c652063757272656e636965732c20756e6c6f636b656420616d6f756e74732c206f66206c657373207468616e206f6e652077686f6c6520756e69742ca877696c6c206e6f74206265207472616e7366657261626c652066726f6d2060706f7274666f6c696f602e4d01486f77657665722c20696620776520696d6167696e6520746861742075736572732060416c6963656020616e642060426f626020626f74682061726520656e7469746c656420746f20312e3520756e6974732c5101616e64206f6e6c7920726563656976652060316020756e69747320656163682c207468656e2060302e35202b20302e35203d20316020756e69747320617265206c65667420696e2060706f7274666f6c696f602c6c7768696368206973206e6f77207472616e736665727261626c652e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602e01012d206063615f696460206964656e7469666965732074686520434120746f2073746172742061206361706974616c20646973747269627574696f6e20666f722e59012d2060706f7274666f6c696f60207370656369666965732074686520706f7274666f6c696f206e756d626572206f6620746865206167656e7420746f20646973747269627574652060616d6f756e74602066726f6d2ef42d206063757272656e63796020746f20776974686472617720616e6420646973747269627574652066726f6d207468652060706f7274666f6c696f602ef82d20607065725f73686172656020616d6f756e74206f66206063757272656e63796020746f20776974686472617720616e6420646973747269627574652e25012020205370656369666965642061732061207065722d6d696c6c696f6e2c20692e652e206031202f2031305e36607468206f66206f6e65206063757272656e63796020746f6b656e2ef02d2060616d6f756e7460206f66206063757272656e63796020746f20776974686472617720616e642064697374726962757465206174206d6f73742e19012d20607061796d656e745f61746020737065636966696573207768656e2062656e6566697473206d617920666972737420626520707573686564206f7220636c61696d65642e29012d2060657870697265735f617460207370656369666965732c2069662070726f76696465642c207768656e2072656d61696e696e672062656e65666974732061726520666f726665697490202020616e64206d6179206265207265636c61696d656420627920606f726967696e602e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602efc2d20604578706972794265666f72655061796d656e74602069662060657870697265735f61742e756e777261702829203c3d207061796d656e745f6174602ee42d20604e6f53756368434160206966206063615f69646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412ea82d20604e6f5265636f7264446174656020696620434120686173206e6f207265636f726420646174652ee82d20605265636f72644461746541667465725374617274602069662043412773207265636f72642064617465203e207061796d656e745f61742e31012d2060556e617574686f72697a6564437573746f6469616e60206966207468652063616c6c6572206973206e6f742074686520637573746f6469616e206f662060706f7274666f6c696f602e55012d2060496e73756666696369656e74506f7274666f6c696f42616c616e6365602069662060706f7274666f6c696f6020686173206c657373207468616e2060616d6f756e7460206f66206063757272656e6379602e01012d2060496e73756666696369656e7442616c616e636560206966207468652070726f746f636f6c2066656520636f756c646e277420626520636861726765642e45012d206043414e6f7442656e656669746020696620746865204341206973206e6f74206f66206b696e64205072656469637461626c6542656e656669742f556e7072656469637461626c6542656e65666974d42d2060446973747269627574696f6e416d6f756e7449735a65726f60206966207468652060616d6f756e7460206973207a65726f2ee82d2060446973747269627574696f6e506572536861726549735a65726f602069662074686520607065725f736861726560206973207a65726f2e003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f14636c61696d04011463615f6964990201104341496400015c0101436c61696d20612062656e65666974206f6620746865206361706974616c20646973747269627574696f6e20617474616368656420746f206063615f6964602e00a8546178657320617265207769746868656c6420617320737065636966696564206279207468652043412e5901506f73742d746178206561726e696e677320617265207468656e207472616e7366657272656420746f207468652064656661756c7420706f7274666f6c696f206f662074686520606f726967696e602773204449442e001101416c6c2062656e65666974732061726520726f756e646564206279207472756e636174696f6e2c20646f776e20746f20666972737420696e74656765722062656c6f772e39014d6f72656f7665722c206265666f726520706f73742d746178206561726e696e67732c20696e20696e646976697369626c652063757272656e6369657320617265207472616e736665727265642c98746865792061726520726f756e64656420646f776e20746f20612077686f6c6520756e69742e0030232320417267756d656e747345012d20606f726967696e60207768696368206d757374206265206120686f6c646572206f662074686520617373657420616e6420656c696769626c6520666f722074686520646973747269627574696f6e2e01012d206063615f696460206964656e7469666965732074686520434120746f2073746172742061206361706974616c20646973747269627574696f6e20666f722e002023204572726f727325012d2060486f6c646572416c7265616479506169646020696620606f726967696e602773204449442068617320616c7265616479207265636569766564206974732062656e656669742e19012d20604e6f53756368446973747269627574696f6e602069662074686572652773206e6f206361706974616c20646973747269627574696f6e20666f72206063615f6964602ec42d206043616e6e6f74436c61696d4265666f726553746172746020696620606e6f77203c207061796d656e745f6174602ee42d206043616e6e6f74436c61696d41667465724578706972796020696620606e6f77203e206578706972795f61742e756e777261702829602ee42d20604e6f53756368434160206966206063615f69646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412ef42d20604e6f74546172676574656442794341602069662074686520434120646f6573206e6f742074617267657420606f726967696e602773204449442e35012d206042616c616e6365416d6f756e7450726f647563744f766572666c6f7765646020696620606261203d2062616c616e6365202a20616d6f756e746020776f756c64206f766572666c6f772e35012d206042616c616e6365416d6f756e7450726f64756374537570706c794469766973696f6e4661696c65646020696620606261202a20737570706c796020776f756c64206f766572666c6f772e21012d204f74686572206572726f72732063616e206f636375722069662074686520636f6d706c69616e6365206d616e616765722072656a6563747320746865207472616e736665722e30707573685f62656e6566697408011463615f69649902011043414964000118686f6c6465728001284964656e746974794964000260f8507573682062656e65666974206f6620616e206f6e676f696e6720646973747269627574696f6e20746f2074686520676976656e2060686f6c646572602e00a8546178657320617265207769746868656c6420617320737065636966696564206279207468652043412e5901506f73742d746178206561726e696e677320617265207468656e207472616e7366657272656420746f207468652064656661756c7420706f7274666f6c696f206f662074686520606f726967696e602773204449442e001101416c6c2062656e65666974732061726520726f756e646564206279207472756e636174696f6e2c20646f776e20746f20666972737420696e74656765722062656c6f772e39014d6f72656f7665722c206265666f726520706f73742d746178206561726e696e67732c20696e20696e646976697369626c652063757272656e6369657320617265207472616e736665727265642c98746865792061726520726f756e64656420646f776e20746f20612077686f6c6520756e69742e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602e39012d206063615f696460206964656e7469666965732074686520434120776974682061206361706974616c20646973747269627574696f6e7320746f20707573682062656e656669747320666f722e7c2d2060686f6c6465726020746f20707573682062656e656669747320746f2e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e19012d20604e6f53756368446973747269627574696f6e602069662074686572652773206e6f206361706974616c20646973747269627574696f6e20666f72206063615f6964602ec42d206043616e6e6f74436c61696d4265666f726553746172746020696620606e6f77203c207061796d656e745f6174602ee42d206043616e6e6f74436c61696d41667465724578706972796020696620606e6f77203e206578706972795f61742e756e777261702829602ee42d20604e6f53756368434160206966206063615f69646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412edc2d20604e6f74546172676574656442794341602069662074686520434120646f6573206e6f74207461726765742060686f6c646572602e35012d206042616c616e6365416d6f756e7450726f647563744f766572666c6f7765646020696620606261203d2062616c616e6365202a20616d6f756e746020776f756c64206f766572666c6f772e35012d206042616c616e6365416d6f756e7450726f64756374537570706c794469766973696f6e4661696c65646020696620606261202a20737570706c796020776f756c64206f766572666c6f772e21012d204f74686572206572726f72732063616e206f636375722069662074686520636f6d706c69616e6365206d616e616765722072656a6563747320746865207472616e736665722e1c7265636c61696d04011463615f6964990201104341496400032c90417373756d696e67206120646973747269627574696f6e2068617320657870697265642ce4756e6c6f636b207468652072656d61696e696e6720616d6f756e7420696e20746865206469737472696275746f7220706f7274666f6c696f2e0030232320417267756d656e747345012d20606f726967696e60207768696368206d757374206265207468652063726561746f72206f6620746865206361706974616c20646973747269627574696f6e207469656420746f206063615f6964602e1d012d206063615f696460206964656e7469666965732074686520434120776974682061206361706974616c20646973747269627574696f6e20746f207265636c61696d20666f722e002023204572726f727319012d20604e6f53756368446973747269627574696f6e602069662074686572652773206e6f206361706974616c20646973747269627574696f6e20666f72206063615f6964602e2d012d2060416c72656164795265636c61696d65646020696620746869732066756e6374696f6e2068617320616c7265616479206265656e2063616c6c6564207375636365737366756c6c792e842d20604e6f74457870697265646020696620606e6f77203c20657870697279602e4c72656d6f76655f646973747269627574696f6e04011463615f6964990201104341496400042cbc52656d6f766573206120646973747269627574696f6e2074686174206861736e27742073746172746564207965742cdc756e6c6f636b696e67207468652066756c6c20616d6f756e7420696e20746865206469737472696275746f7220706f7274666f6c696f2e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602e49012d206063615f696460206964656e7469666965732074686520434120776974682061206e6f742d7965742d73746172746564206361706974616c20646973747269627574696f6e20746f2072656d6f76652e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e19012d20604e6f53756368446973747269627574696f6e602069662074686572652773206e6f206361706974616c20646973747269627574696f6e20666f72206063615f6964602ebc2d2060446973747269627574696f6e537461727465646020696620607061796d656e745f6174203c3d206e6f77602e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652ec10604184f7074696f6e04045401f00108104e6f6e6500000010536f6d650400f00000010000c5060c3070616c6c65745f617373657428636865636b706f696e741043616c6c040454000110446372656174655f636865636b706f696e7404012061737365745f6964a8011c41737365744944000024c04372656174657320612073696e676c6520636865636b706f696e74206174207468652063757272656e742074696d652e002c2320417267756d656e747335012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ea82d206061737365745f69646020746f206372656174652074686520636865636b706f696e7420666f722e002023204572726f72735d012d2060556e617574686f72697a65644167656e74602069662074686520444944206f6620606f726967696e602069736e27742061207065726d697373696f6e6564206167656e7420666f72206061737365745f6964602e0d012d2060436f756e7465724f766572666c6f77602069662074686520746f74616c20636865636b706f696e7420636f756e74657220776f756c64206f766572666c6f772e707365745f7363686564756c65735f6d61785f636f6d706c65786974790401386d61785f636f6d706c657869747928010c75363400012461015365747320746865206d617820636f6d706c6578697479206f662061207363686564756c652073657420666f7220616e206172626974726172792061737365745f696420746f20606d61785f636f6d706c6578697479602eb8546865206e6577206d6178696d756d206973206e6f7420656e666f7263656420726574726f6163746976656c792cb4616e64206f6e6c79206170706c696573206f6e6365206e6577207363686564756c657320617265206d6164652e00a84d7573742062652063616c6c6564206173206120504950202872657175697265732022726f6f7422292e002c2320417267756d656e7473782d20606f726967696e602069732074686520726f6f74206f726967696e2e05012d20606d61785f636f6d706c65786974796020616c6c6f77656420666f7220616e206172626974726172792061737365742773207363686564756c65207365742e3c6372656174655f7363686564756c6508012061737365745f6964a8011c417373657449440001207363686564756c65b502014c5363686564756c65436865636b706f696e7473000244a4437265617465732061207363686564756c652067656e65726174696e6720636865636b706f696e7473d4696e20746865206675747572652061742065697468657220612066697865642074696d65206f7220617420696e74657276616c732e000901546865207363686564756c6520737461727473206f7574207769746820607374726f6e675f7265665f636f756e74287363686564756c655f696429203c2d2030602e002c2320417267756d656e747329012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f20616374206173206f776e6572206f66206061737365745f6964602ea02d206061737365745f69646020746f2063726561746520746865207363686564756c6520666f722eb02d20607363686564756c656020746861742077696c6c2067656e657261746520636865636b706f696e74732e002023204572726f72735d012d2060556e617574686f72697a65644167656e74602069662074686520444944206f6620606f726967696e602069736e27742061207065726d697373696f6e6564206167656e7420666f72206061737365745f6964602e21012d2060496e73756666696369656e744163636f756e7442616c616e636560206966207468652070726f746f636f6c2066656520636f756c64206e6f7420626520636861726765642e4d012d2060436f756e7465724f766572666c6f776020696620746865207363686564756c65204944206f7220746f74616c20636865636b706f696e7420636f756e7465727320776f756c64206f766572666c6f772e003423205065726d697373696f6e731c2a2041737365743c72656d6f76655f7363686564756c6508012061737365745f6964a8011c417373657449440001086964b10201285363686564756c654964000338fc52656d6f7665732074686520636865636b706f696e74207363686564756c65206f6620616e206173736574206964656e74696669656420627920606964602e002c2320417267756d656e747329012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f20616374206173206f776e6572206f66206061737365745f6964602ea42d206061737365745f69646020746f2072656d6f766520746865207363686564756c652066726f6d2e09012d2060696460206f6620746865207363686564756c652c207768656e2069742077617320637265617465642062792060637265617465645f7363686564756c65602e002023204572726f72735d012d2060556e617574686f72697a65644167656e74602069662074686520444944206f6620606f726967696e602069736e27742061207065726d697373696f6e6564206167656e7420666f72206061737365745f6964602e49012d20604e6f436865636b706f696e745363686564756c6560206966206069646020646f6573206e6f74206964656e746966792061207363686564756c6520666f722074686973206061737365745f6964602ef42d20605363686564756c654e6f7452656d6f7661626c656020696620606964602065786973747320627574206973206e6f742072656d6f7661626c652e003423205065726d697373696f6e731c2a2041737365740c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652ec906086470616c6c65745f636f6d706c69616e63655f6d616e616765721043616c6c040454000124686164645f636f6d706c69616e63655f726571756972656d656e740c012061737365745f6964a8011c4173736574494400014473656e6465725f636f6e646974696f6e73c90201385665633c436f6e646974696f6e3e00014c72656365697665725f636f6e646974696f6e73c90201385665633c436f6e646974696f6e3e00002cf841646473206120636f6d706c69616e636520726571756972656d656e7420746f20616e20617373657420676976656e206279206061737365745f6964602e6901496620746865726520617265206475706c696361746520436c61696d547970657320666f72206120706172746963756c61722074727573746564206973737565722c206475706c696361746573206172652072656d6f7665642e002c2320417267756d656e747329012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f6620746865206173736574802a2061737365745f6964202d2053796d626f6c206f6620746865206173736574c42a2073656e6465725f636f6e646974696f6e73202d2053656e646572207472616e7366657220636f6e646974696f6e732ed42a2072656365697665725f636f6e646974696f6e73202d205265636569766572207472616e7366657220636f6e646974696f6e732e003423205065726d697373696f6e731c2a2041737365747472656d6f76655f636f6d706c69616e63655f726571756972656d656e7408012061737365745f6964a8011c41737365744944000108696410010c753332000124f052656d6f766573206120636f6d706c69616e636520726571756972656d656e742066726f6d20616e206173736574277320636f6d706c69616e63652e002c2320417267756d656e747329012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f6620746865206173736574802a2061737365745f6964202d2053796d626f6c206f6620746865206173736574f02a206964202d20436f6d706c69616e636520726571756972656d656e74206964207768696368206973206e65656420746f2062652072656d6f766564003423205065726d697373696f6e731c2a204173736574607265706c6163655f61737365745f636f6d706c69616e636508012061737365745f6964a8011c4173736574494400014061737365745f636f6d706c69616e6365f10201685665633c436f6d706c69616e6365526571756972656d656e743e00023cd45265706c6163657320616e206173736574277320636f6d706c69616e636520776974682061206e657720636f6d706c69616e63652e00fc436f6d706c69616e636520726571756972656d656e74732077696c6c20626520736f727465642028617363656e64696e6720627920696429206265666f72658c7265706c6163696e67207468652063757272656e7420726571756972656d656e74732e002c2320417267756d656e7473882a206061737365745f696460202d207468652061737365742061737365745f69642cbc2a206061737365745f636f6d706c69616e6365202d20746865206e657720617373657420636f6d706c69616e63652e002023204572726f7273f82a2060556e617574686f72697a65646020696620606f726967696e60206973206e6f7420746865206f776e6572206f66207468652061737365745f69642eb1012a20604475706c69636174654173736574436f6d706c69616e636560206966206061737365745f636f6d706c69616e63656020636f6e7461696e73206d756c7469706c6520656e74726965732077697468207468652073616d652060726571756972656d656e745f6964602e003423205065726d697373696f6e731c2a2041737365745872657365745f61737365745f636f6d706c69616e636504012061737365745f6964a8011c417373657449440003207452656d6f76657320616e206173736574277320636f6d706c69616e6365002c2320417267756d656e747329012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f6620746865206173736574802a2061737365745f6964202d2053796d626f6c206f6620746865206173736574003423205065726d697373696f6e731c2a2041737365745870617573655f61737365745f636f6d706c69616e636504012061737365745f6964a8011c4173736574494400042019015061757365732074686520766572696669636174696f6e206f6620636f6e646974696f6e7320666f72206061737365745f69646020647572696e67207472616e73666572732e002c2320417267756d656e747329012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f6620746865206173736574802a2061737365745f6964202d2053796d626f6c206f6620746865206173736574003423205065726d697373696f6e731c2a2041737365745c726573756d655f61737365745f636f6d706c69616e636504012061737365745f6964a8011c417373657449440005201d01526573756d65732074686520766572696669636174696f6e206f6620636f6e646974696f6e7320666f72206061737365745f69646020647572696e67207472616e73666572732e002c2320417267756d656e747329012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f6620746865206173736574802a2061737365745f6964202d2053796d626f6c206f6620746865206173736574003423205065726d697373696f6e731c2a204173736574806164645f64656661756c745f747275737465645f636c61696d5f69737375657208012061737365745f6964a8011c41737365744944000118697373756572e102013454727573746564497373756572000624f44164647320616e6f746865722064656661756c74207472757374656420636c61696d2069737375657220617420746865206173736574206c6576656c2e002c2320417267756d656e74732d012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f66207468652061737365742e842a2061737365745f6964202d2053796d626f6c206f66207468652061737365742ec82a20697373756572202d204964656e746974794964206f6620746865207472757374656420636c61696d206973737565722e003423205065726d697373696f6e731c2a2041737365748c72656d6f76655f64656661756c745f747275737465645f636c61696d5f69737375657208012061737365745f6964a8011c417373657449440001186973737565728001284964656e746974794964000724710152656d6f7665732074686520676976656e2060697373756572602066726f6d2074686520736574206f662064656661756c74207472757374656420636c61696d206973737565727320617420746865206173736574206c6576656c2e002c2320417267756d656e74732d012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f66207468652061737365742e842a2061737365745f6964202d2053796d626f6c206f66207468652061737365742ec82a20697373756572202d204964656e746974794964206f6620746865207472757374656420636c61696d206973737565722e003423205065726d697373696f6e731c2a204173736574746368616e67655f636f6d706c69616e63655f726571756972656d656e7408012061737365745f6964a8011c4173736574494400011c6e65775f726571c5020154436f6d706c69616e6365526571756972656d656e74000824ec4d6f6469667920616e206578697374696e6720636f6d706c69616e636520726571756972656d656e74206f66206120676976656e2061737365742e002c2320417267756d656e74732d012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f66207468652061737365742e842a2061737365745f6964202d2053796d626f6c206f66207468652061737365742e8c2a206e65775f726571202d20436f6d706c69616e636520726571756972656d656e742e003423205065726d697373696f6e731c2a2041737365740c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652ecd06086070616c6c65745f636f72706f726174655f616374696f6e731043616c6c040454000124587365745f6d61785f64657461696c735f6c656e6774680401186c656e67746810010c753332000008d053657420746865206d617820606c656e67746860206f66206064657461696c736020696e207465726d73206f662062797465732e744d6179206f6e6c792062652063616c6c6564207669612061205049502e4c7365745f64656661756c745f7461726765747308012061737365745f6964a8011c4173736574494400011c74617267657473f90201405461726765744964656e746974696573000134cc536574207468652064656661756c7420434120605461726765744964656e7469746965736020746f206074617267657473602e0030232320417267756d656e74734d012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206061737365745f69646020776974682072656c6576616e74207065726d697373696f6e732eec2d206061737365745f69646020666f72207768696368207468652064656661756c74206964656e74697469657320617265206368616e67696e672ecc2d20607461726765747360207468652064656661756c7420746172676574206964656e74697469657320666f7220612043412e00242323204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e31012d2060546f6f4d616e79546172676574496473602069662060746172676574732e6964656e7469746965732e6c656e2829203e20543a3a4d61785461726765744964733a3a6765742829602e003423205065726d697373696f6e731c2a2041737365746c7365745f64656661756c745f77697468686f6c64696e675f74617808012061737365745f6964a8011c4173736574494400010c746178a502010c5461780002304501536574207468652064656661756c742077697468686f6c64696e672074617820666f7220616c6c204449447320616e64204341732072656c6576616e7420746f2074686973206061737365745f6964602e0030232320417267756d656e74734d012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206061737365745f69646020776974682072656c6576616e74207065726d697373696f6e732ed02d206061737365745f6964602074686174207468652077697468686f6c64696e67207461782077696c6c206170706c7920746f2e05012d20607461786020746861742073686f756c64206265207769746868656c64207768656e20646973747269627574696e67206469766964656e64732c206574632e00242323204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e003423205065726d697373696f6e731c2a2041737365745c7365745f6469645f77697468686f6c64696e675f7461780c012061737365745f6964a8011c4173736574494400012474617865645f6469648001284964656e74697479496400010c7461780103012c4f7074696f6e3c5461783e000340fc536574207468652077697468686f6c64696e6720746178206f66206061737365745f69646020666f72206074617865645f6469646020746f2060746178602e890149662060536f6d652874617829602c2074686973206f7665727269646573207468652064656661756c742077697468686f6c64696e6720746178206f66206061737365745f69646020746f20607461786020666f72206074617865645f646964602efc4f74686572776973652c20696620604e6f6e65602c207468652064656661756c742077697468686f6c64696e67207461782077696c6c20626520757365642e0030232320417267756d656e74734d012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206061737365745f69646020776974682072656c6576616e74207065726d697373696f6e732ed02d206061737365745f6964602074686174207468652077697468686f6c64696e67207461782077696c6c206170706c7920746f2ee42d206074617865645f6469646020746861742077696c6c2068617665206974732077697468686f6c64696e672074617820757064617465642e05012d20607461786020746861742073686f756c64206265207769746868656c64207768656e20646973747269627574696e67206469766964656e64732c206574632e00242323204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e81012d2060546f6f4d616e794469645461786573602069662060536f6d6528746178296020616e6420616464696e6720746865206f7665727269646520776f756c6420676f206f76657220746865206c696d697420604d617844696457687473602e003423205065726d697373696f6e731c2a20417373657464696e6974696174655f636f72706f726174655f616374696f6e20012061737365745f6964a8011c417373657449440001106b696e640903011843414b696e640001246465636c5f646174652801184d6f6d656e7400012c7265636f72645f64617465d10601584f7074696f6e3c5265636f726444617465537065633e00011c64657461696c7321030124434144657461696c7300011c74617267657473d90601604f7074696f6e3c5461726765744964656e7469746965733e00015c64656661756c745f77697468686f6c64696e675f7461780103012c4f7074696f6e3c5461783e00013c77697468686f6c64696e675f746178dd0601784f7074696f6e3c5665633c284964656e7469747949642c20546178293e3e0004785101496e69746961746573206120434120666f72206061737365745f696460206f6620606b696e64602077697468206064657461696c736020616e64206f746865722070726f766964656420617267756d656e74732e0030232320417267756d656e74734d012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206061737365745f69646020776974682072656c6576616e74207065726d697373696f6e732e942d206061737365745f696460207468617420746865204341206973206d61646520666f722e7c2d20606b696e6460206f66204341206265696e6720696e697469617465642e982d20606465636c5f6461746560206f66204341206272696e6720696e697469616c697a65642ef02d20607265636f72645f64617465602c20696620616e792c20746f2063616c63756c6174652074686520696d70616374206f6620746869732043412e610120202049662070726f76696465642c207468697320726573756c747320696e2061207363686564756c65642062616c616e636520736e617073686f74202822636865636b706f696e7422292061742074686520646174652e4d012d206064657461696c7360206f662074686520434120696e20667265652d7465787420666f726d2c20757020746f2061206365727461696e206e756d626572206f6620627974657320696e206c656e6774682ef42d206074617267657473602c20696620616e792c20776869636820746869732043412069732072656c6576616e742f697272656c6576616e7420746f2e49012020204f76657272696465732c2069662070726f76696465642c207468652064656661756c7420617420746865206173736574206c6576656c2028607365745f64656661756c745f7461726765747360292e5d012d206064656661756c745f77697468686f6c64696e675f746178602c20696620616e792c206973207468652064656661756c742077697468686f6c64696e672074617820746f2075736520666f7220746869732043412e69012020204f76657272696465732c2069662070726f76696465642c207468652064656661756c7420617420746865206173736574206c6576656c2028607365745f64656661756c745f77697468686f6c64696e675f74617860292e21012d206077697468686f6c64696e675f746178602c20696620616e792c2070726f7669646573207065722d4449442077697468686f6c64696e6720746178206f76657272696465732e59012020204f76657272696465732c2069662070726f76696465642c207468652064656661756c7420617420746865206173736574206c6576656c2028607365745f6469645f77697468686f6c64696e675f74617860292e002023204572726f72731d012d206044657461696c73546f6f4c6f6e6760206966206064657461696c732e6c656e28296020676f6573206265796f6e6420606d61785f64657461696c735f6c656e677468602e2d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e71012d2060436f756e7465724f766572666c6f776020696e2074686520756e6c696b656c79206576656e74207468617420736f206d616e79204341732077657265206372656174656420666f722074686973206061737365745f6964602cf820207468617420696e7465676572206f766572666c6f7720776f756c642068617665206f63637572656420696620696e737465616420616c6c6f7765642e75012d2060546f6f4d616e79446964546178657360206966206077697468686f6c64696e675f7461782e756e7772617028292e6c656e28296020776f756c6420676f206f76657220746865206c696d697420604d617844696457687473602e01012d20604475706c69636174654469645461786020696620612044494420697320696e636c75646564206d6f7265207468616e206f6e636520696e20607774602e55012d2060546f6f4d616e79546172676574496473602069662060746172676574732e756e7772617028292e6964656e7469746965732e6c656e2829203e20543a3a4d61785461726765744964733a3a6765742829602e01012d20604465636c44617465496e4675747572656020696620746865206465636c61726174696f6e2064617465206973206e6f7420696e2074686520706173742e51012d205768656e20607265636f72645f646174652e69735f736f6d652829602c206f74686572206572726f72732064756520746f20636865636b706f696e74207363686564756c696e67206d6179206f636375722e003423205065726d697373696f6e731c2a2041737365742c6c696e6b5f63615f646f6308010869649902011043414964000110646f63732503013c5665633c446f63756d656e7449643e000548ac4c696e6b2074686520676976656e204341206069646020746f2074686520676976656e2060646f6373602ef4416e792070726576696f7573206c696e6b7320666f7220746865204341206172652072656d6f76656420696e206661766f72206f662060646f6373602e00550154686520776f726b666c6f77206865726520697320746f206164642074686520646f63756d656e747320616e6420696e6974696174696e672074686520434120696e20616e79206f7264657220646573697265642ec44f6e636520626f74682065786973742c20746865792063616e206e6f77206265206c696e6b656420746f6765746865722e0030232320417267756d656e747359012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206069642e61737365745f69646020776974682072656c6576616e74207065726d697373696f6e732ea82d2060696460206f662074686520434120746f206173736f636961746520776974682060646f6373602eb02d2060646f63736020746f206173736f6369617465207769746820746865204341207769746820606964602e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602ed82d20604e6f53756368434160206966206069646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412e19012d20604e6f53756368446f636020696620616e79206f662060646f63736020646f6573206e6f74206964656e7469667920616e206578697374696e6720646f63756d656e742e003423205065726d697373696f6e731c2a2041737365742472656d6f76655f636104011463615f696499020110434149640006489452656d6f76657320746865204341206964656e746966696564206279206063615f6964602e00c44173736f63696174656420646174612c207375636820617320646f63756d656e74206c696e6b732c2062616c6c6f74732cac616e64206361706974616c20646973747269627574696f6e732061726520616c736f2072656d6f7665642e00d4416e79207363686564756c65206173736f636961746564207769746820746865207265636f726420646174652077696c6c20736565b0607374726f6e675f7265665f636f756e74287363686564756c655f696429602064656372656d656e7465642e0030232320417267756d656e747365012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206063615f69642e61737365745f69646020776974682072656c6576616e74207065726d697373696f6e732e782d206063615f696460206f662074686520434120746f2072656d6f76652e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602ed82d20604e6f53756368434160206966206069646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412e003423205065726d697373696f6e731c2a204173736574486368616e67655f7265636f72645f6461746508011463615f6964990201104341496400012c7265636f72645f64617465d10601584f7074696f6e3c5265636f726444617465537065633e00073ce04368616e67657320746865207265636f72642064617465206f6620746865204341206964656e746966696564206279206063615f6964602e0030232320417267756d656e747365012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206063615f69642e61737365745f69646020776974682072656c6576616e74207065726d697373696f6e732e742d206063615f696460206f662074686520434120746f20616c7465722eec2d20607265636f72645f64617465602c20696620616e792c20746f2063616c63756c6174652074686520696d70616374206f66207468652043412e610120202049662070726f76696465642c207468697320726573756c747320696e2061207363686564756c65642062616c616e636520736e617073686f74202822636865636b706f696e7422292061742074686520646174652e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602ed82d20604e6f53756368434160206966206069646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412e51012d205768656e20607265636f72645f646174652e69735f736f6d652829602c206f74686572206572726f72732064756520746f20636865636b706f696e74207363686564756c696e67206d6179206f636375722e003423205065726d697373696f6e731c2a204173736574a0696e6974696174655f636f72706f726174655f616374696f6e5f616e645f646973747269627574651c011c63615f61726773e106016c496e697469617465436f72706f72617465416374696f6e41726773000124706f7274666f6c696fc106015c4f7074696f6e3c506f7274666f6c696f4e756d6265723e00012063757272656e6379a8011c417373657449440001247065725f736861726518011c42616c616e6365000118616d6f756e7418011c42616c616e63650001287061796d656e745f61742801184d6f6d656e74000128657870697265735f6174050101384f7074696f6e3c4d6f6d656e743e0008041d015574696c6974792065787472696e73696320746f2062617463682060696e6974696174655f636f72706f726174655f616374696f6e6020616e64206064697374726962757465600c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652ed10604184f7074696f6e04045401d5060108104e6f6e6500000010536f6d650400d5060000010000d506086070616c6c65745f636f72706f726174655f616374696f6e73385265636f7264446174655370656300010c245363686564756c656404002801184d6f6d656e74000000404578697374696e675363686564756c650400b10201285363686564756c654964000100204578697374696e670400ad020130436865636b706f696e74496400020000d90604184f7074696f6e04045401f9020108104e6f6e6500000010536f6d650400f9020000010000dd0604184f7074696f6e0404540119030108104e6f6e6500000010536f6d65040019030000010000e106086070616c6c65745f636f72706f726174655f616374696f6e736c496e697469617465436f72706f72617465416374696f6e41726773000020012061737365745f6964a8011c417373657449440001106b696e640903011843414b696e640001246465636c5f646174652801184d6f6d656e7400012c7265636f72645f64617465d10601584f7074696f6e3c5265636f726444617465537065633e00011c64657461696c7321030124434144657461696c7300011c74617267657473d90601604f7074696f6e3c5461726765744964656e7469746965733e00015c64656661756c745f77697468686f6c64696e675f7461780103012c4f7074696f6e3c5461783e00013c77697468686f6c64696e675f746178dd0601784f7074696f6e3c5665633c284964656e7469747949642c20546178293e3e0000e5060c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f741043616c6c040454000118346174746163685f62616c6c6f7410011463615f6964990201104341496400011472616e67652d03013c42616c6c6f7454696d6552616e67650001106d6574613103012842616c6c6f744d65746100010c72637639010110626f6f6c000068e8417474616368206120636f72706f726174652062616c6c6f7420746f20746865204341206964656e746966696564206279206063615f6964602e00ac5468652062616c6c6f742077696c6c2061646d697420766f7465732077697468696e206072616e6765602eb05468652062616c6c6f742773206d657461646174612069732070726f766964656420627920606d657461602c0501776869636820696e636c75646573207468652062616c6c6f74207469746c652c20746865206d6f74696f6e732c2074686569722063686f696365732c206574632e7853656520746865206042616c6c6f744d6574616020666f72206d6f72652e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602ed02d206063615f696460206964656e7469666965732074686520434120746f20617474616368207468652062616c6c6f7420746f2ec02d206072616e67656020737065636966696573207768656e20766f74696e672073746172747320616e6420656e64732eec2d20606d6574616020737065636966696573207468652062616c6c6f742773206d657461646174612061732061666f72656d656e74696f6e65642ee42d2060726376602073706563696669657320776865746865722052435620697320656e61626c656420666f7220746869732062616c6c6f742e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602ee42d20604e6f53756368434160206966206063615f69646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412ef02d206043414e6f744e6f746963656020696620746865204341206973206e6f74206f662074686520604973737565724e6f7469636560206b696e642ebc2d206053746172744166746572456e6460206966206072616e67652e7374617274203e2072616e67652e656e64602e29012d20604e6f774166746572456e646020696620606e6f77203e2072616e67652e656e646020776865726520606e6f7760206973207468652063757272656e742074696d657374616d702ea82d20604e6f5265636f7264446174656020696620434120686173206e6f207265636f726420646174652e59012d20605265636f7264446174654166746572537461727460206966206064617465203e2072616e67652e73746172746020776865726520606461746560206973207468652043412773207265636f726420646174652eb82d2060416c726561647945786973747360206966207468657265277320612062616c6c6f7420616c72656164792e31012d20604e756d6265724f6643686f696365734f766572666c6f77602069662074686520746f74616c2063686f69636520696e20606d65746160206f766572666c6f777320607573697a65602e09012d2060546f6f4c6f6e676020696620616e79206f662074686520656d62656464656420737472696e677320696e20606d657461602061726520746f6f206c6f6e672e01012d2060496e73756666696369656e7442616c616e636560206966207468652070726f746f636f6c2066656520636f756c646e277420626520636861726765642e10766f746508011463615f69649902011043414964000114766f7465735103013c5665633c42616c6c6f74566f74653e0001441101436173742060766f7465736020696e207468652062616c6c6f7420617474616368656420746f20746865204341206964656e746966696564206279206063615f6964602e0030232320417267756d656e747309012d20606f726967696e60207768696368206d7573742062652061207065726d697373696f6e6564207369676e6572207461726765746564206279207468652043412eb82d206063615f696460206964656e746966696573207468652061747461636865642062616c6c6f7427732043412e21012d2060766f7465736020737065636966696573207468652062616c616e63657320746f2061737369676e20746f20656163682063686f69636520696e207468652062616c6c6f742e55012020205468652066756c6c20766f74696e6720706f776572206f6620606f726967696e60277320444944206d6179206265207573656420666f722065616368206d6f74696f6e20696e207468652062616c6c6f742e002023204572726f7273dc2d20604e6f5375636842616c6c6f7460206966206063615f69646020646f6573206e6f74206964656e7469667920612062616c6c6f742efc2d2060566f74696e674e6f7453746172746564602069662074686520766f74696e6720706572696f64206861736e277420636f6d6d656e636564207965742ed82d2060566f74696e67416c7265616479456e646564602069662074686520766f74696e6720706572696f642068617320656e6465642e5d012d206057726f6e67566f7465436f756e746020696620746865206e756d626572206f662063686f6963657320696e207468652062616c6c6f7420646f6573206e6f74206d617463682060766f7465732e6c656e2829602ee42d20604e6f53756368434160206966206063615f69646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412ef42d20604e6f74546172676574656442794341602069662074686520434120646f6573206e6f742074617267657420606f726967696e602773204449442e21012d2060496e73756666696369656e74566f746573602069662074686520766f74696e6720706f776572207573656420666f7220616e79206d6f74696f6e20696e2060766f74657360a42020206578636565647320606f726967696e60277320444944277320766f74696e6720706f7765722e286368616e67655f656e6408011463615f6964990201104341496400010c656e642801184d6f6d656e740002300501416d656e642074686520656e642064617465206f66207468652062616c6c6f74206f6620746865204341206964656e746966696564206279206063615f6964602e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602eb82d206063615f696460206964656e746966696573207468652061747461636865642062616c6c6f7427732043412ec42d2060656e64602073706563696669657320746865206e657720656e642064617465206f66207468652062616c6c6f742e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602edc2d20604e6f5375636842616c6c6f7460206966206063615f69646020646f6573206e6f74206964656e7469667920612062616c6c6f742e31012d2060566f74696e67416c7265616479537461727465646020696620607374617274203e3d206e6f77602c20776865726520606e6f7760206973207468652063757272656e742074696d652e8c2d206053746172744166746572456e646020696620607374617274203e20656e64602e2c6368616e67655f6d65746108011463615f696499020110434149640001106d6574613103012842616c6c6f744d6574610003346101416d656e6420746865206d6574616461746120287469746c652c206d6f74696f6e732c206574632e29206f66207468652062616c6c6f74206f6620746865204341206964656e746966696564206279206063615f6964602e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602eb82d206063615f696460206964656e746966696573207468652061747461636865642062616c6c6f7427732043412e902d20606d657461602073706563696669657320746865206e6577206d657461646174612e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602edc2d20604e6f5375636842616c6c6f7460206966206063615f69646020646f6573206e6f74206964656e7469667920612062616c6c6f742e31012d2060566f74696e67416c7265616479537461727465646020696620607374617274203e3d206e6f77602c20776865726520606e6f7760206973207468652063757272656e742074696d652e31012d20604e756d6265724f6643686f696365734f766572666c6f77602069662074686520746f74616c2063686f69636520696e20606d65746160206f766572666c6f777320607573697a65602e09012d2060546f6f4c6f6e676020696620616e79206f662074686520656d62656464656420737472696e677320696e20606d657461602061726520746f6f206c6f6e672e286368616e67655f72637608011463615f6964990201104341496400010c72637639010110626f6f6c00042c0501416d656e642052435620737570706f727420666f72207468652062616c6c6f74206f6620746865204341206964656e746966696564206279206063615f6964602e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602eb82d206063615f696460206964656e746966696573207468652061747461636865642062616c6c6f7427732043412ecc2d206072637660207370656369666965732069662052435620697320746f20626520737570706f72746564206f72206e6f742e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602edc2d20604e6f5375636842616c6c6f7460206966206063615f69646020646f6573206e6f74206964656e7469667920612062616c6c6f742e31012d2060566f74696e67416c7265616479537461727465646020696620607374617274203e3d206e6f77602c20776865726520606e6f7760206973207468652063757272656e742074696d652e3472656d6f76655f62616c6c6f7404011463615f69649902011043414964000528c852656d6f7665207468652062616c6c6f74206f6620746865204341206964656e746966696564206279206063615f6964602e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602eb82d206063615f696460206964656e746966696573207468652061747461636865642062616c6c6f7427732043412e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602edc2d20604e6f5375636842616c6c6f7460206966206063615f69646020646f6573206e6f74206964656e7469667920612062616c6c6f742e31012d2060566f74696e67416c7265616479537461727465646020696620607374617274203e3d206e6f77602c20776865726520606e6f7760206973207468652063757272656e742074696d652e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652ee906082c70616c6c65745f706970731043616c6c040454000144647365745f7072756e655f686973746f726963616c5f706970730401147072756e6539010110626f6f6c000014a44368616e6765207768657468657220636f6d706c65746564205049507320617265207072756e65642e6c43616e206f6e6c792062652063616c6c656420627920726f6f742e002c2320417267756d656e7473f02a20607072756e656020737065636966696573207768657468657220636f6d706c6574656420504950732073686f756c64206265207072756e65642e607365745f6d696e5f70726f706f73616c5f6465706f73697404011c6465706f73697418011c42616c616e636500011421014368616e676520746865206d696e696d756d2070726f706f73616c206465706f73697420616d6f756e7420726571756972656420746f20737461727420612070726f706f73616c2e6c43616e206f6e6c792062652063616c6c656420627920726f6f742e002c2320417267756d656e7473f02a20606465706f7369746020746865206e6577206d696e206465706f73697420726571756972656420746f20737461727420612070726f706f73616c707365745f64656661756c745f656e6163746d656e745f706572696f640401206475726174696f6e100138543a3a426c6f636b4e756d626572000214904368616e6765207468652064656661756c7420656e6163746d656e7420706572696f642e6c43616e206f6e6c792062652063616c6c656420627920726f6f742e002c2320417267756d656e747369012a20606475726174696f6e6020746865206e65772064656661756c7420656e6163746d656e7420706572696f642069742074616b657320666f722061207363686564756c65642050495020746f2062652065786563757465642e587365745f70656e64696e675f7069705f657870697279040118657870697279590101684d61796265426c6f636b3c543a3a426c6f636b4e756d6265723e00031805014368616e67652074686520616d6f756e74206f6620626c6f636b7320616674657220776869636820612070656e64696e672050495020697320657870697265642eb4496620606578706972796020697320604e6f6e6560207468656e2050495073206e65766572206578706972652e6c43616e206f6e6c792062652063616c6c656420627920726f6f742e002c2320417267756d656e74731d012a2060657870697279602074686520626c6f636b2d74696d652069742074616b657320666f722061207374696c6c2d6050656e64696e67602050495020746f206578706972652e587365745f6d61785f7069705f736b69705f636f756e7404010c6d6178080130536b6970706564436f756e74000414d44368616e676520746865206d6178696d756d20736b697020636f756e742028606d61785f7069705f736b69705f636f756e7460292e6c43616e206f6e6c792062652063616c6c656420627920726f6f742e002c2320417267756d656e7473ec2a20606d61786020736b697073206265666f72652061205049502063616e6e6f7420626520736b697070656420627920474320616e796d6f72652e507365745f6163746976655f7069705f6c696d69740401146c696d697410010c75333200051469014368616e676520746865206d6178696d756d206e756d626572206f66206163746976652050495073206265666f726520636f6d6d756e697479206d656d626572732063616e6e6f742070726f706f736520616e797468696e672e6c43616e206f6e6c792062652063616c6c656420627920726f6f742e002c2320417267756d656e7473902a20606c696d697460206f6620636f6e63757272656e742061637469766520504950732e1c70726f706f736510012070726f706f73616c0d060140426f783c543a3a50726f706f73616c3e00011c6465706f73697418011c42616c616e636500010c75726c6102012c4f7074696f6e3c55726c3e00012c6465736372697074696f6e710301584f7074696f6e3c5069704465736372697074696f6e3e000624050141206e6574776f726b206d656d6265722063726561746573206120504950206279207375626d697474696e67206120646973706174636861626c6520776869636855016368616e67657320746865206e6574776f726b20696e20736f6d657761792e2041206d696e696d756d206465706f73697420697320726571756972656420746f206f70656e2061206e65772070726f706f73616c2e002c2320417267756d656e7473c82a206070726f706f73657260206973206569746865722061207369676e696e67206b6579206f7220636f6d6d69747465652e65012020205573656420746f20756e6465727374616e6420776865746865722074686973206973206120636f6d6d69747465652070726f706f73616c20616e6420766572696669656420616761696e737420606f726967696e602e802a206070726f706f73616c60206120646973706174636861626c652063616c6c45012a20606465706f73697460206d696e696d756d206465706f7369742076616c75652c2077686963682069732069676e6f726564206966206070726f706f73657260206973206120636f6d6d69747465652ecc2a206075726c602061206c696e6b20746f2061207765627369746520666f722070726f706f73616c2064697363757373696f6e10766f74650c010869646d03011450697049640001286179655f6f725f6e617939010110626f6f6c00011c6465706f73697418011c42616c616e63650007481d01566f74652065697468657220696e206661766f722028606179655f6f725f6e617960203d3d207472756529206f7220616761696e7374206120504950207769746820606964602e4d015468652022636f6e76696e6374696f6e22206f7220737472656e677468206f662074686520766f746520697320676976656e20627920606465706f736974602c2077686963682069732072657365727665642e008c4e6f746520746861742060766f746560206973202a6e6f742a2061646469746976652ef8546861742069732c2060766f74652869642c20747275652c203530296020666f6c6c6f7765642062792060766f74652869642c20747275652c2034302960490177696c6c2066697273742072657365727665206035306020616e64207468656e20726566756e6420603530202d203130602c20656e64696e672075702077697468206034306020696e206465706f7369742e2501546f206164642061746f70206f66206578697374696e6720766f7465732c20796f75276c6c206e65656420606578697374696e675f6465706f736974202b206164646974696f6e602e002c2320417267756d656e74734c2a20606964602c2070726f706f73616c206964dc2a20606179655f6f725f6e6179602c206120626f6f6c20726570726573656e74696e6720666f72206f7220616761696e737420766f7465e82a20606465706f736974602c207468652022636f6e76696374696f6e2220776974682077686963682074686520766f7465206973206d6164652e002023204572726f7273e42a20604e6f5375636850726f706f73616c60206966206069646020646f65736e2774207265666572656e636520612076616c6964205049502ee42a20604e6f7446726f6d436f6d6d756e697479602069662070726f706f73616c20776173206d616465206279206120636f6d6d69747465652ec02a2060496e636f727265637450726f706f73616c537461746560206966205049502069736e27742070656e64696e672e2d012a2060496e73756666696369656e744465706f7369746020696620606f726967696e602063616e6e6f74207265736572766520606465706f736974202d206f6c645f6465706f736974602e68617070726f76655f636f6d6d69747465655f70726f706f73616c04010869646d030114506970496400081cd4417070726f766573207468652070656e64696e6720636f6d6d69747465652050495020676976656e2062792074686520606964602e002023204572726f727305012a20604261644f726967696e6020756e6c657373206120474320766f74696e67206d616a6f7269747920657865637574657320746869732066756e6374696f6e2ed82a20604e6f5375636850726f706f73616c6020696620746865205049502077697468206069646020646f65736e27742065786973742ee42a2060496e636f727265637450726f706f73616c537461746560206966207468652070726f706f73616c2069736e27742070656e64696e672ee02a20604e6f744279436f6d6d697474656560206966207468652070726f706f73616c2069736e2774206279206120636f6d6d69747465652e3c72656a6563745f70726f706f73616c04010869646d0301145069704964000920f852656a65637473207468652050495020676976656e2062792074686520606964602c20726566756e64696e6720616e7920626f6e6465642066756e64732cb8617373756d696e67206974206861736e2774206265656e2063616e63656c6c6564206f722065786563757465642e05014e6f746520746861742070726f706f73616c73207363686564756c65642d666f722d657865637574696f6e2063616e20616c736f2062652072656a65637465642e002023204572726f727305012a20604261644f726967696e6020756e6c657373206120474320766f74696e67206d616a6f7269747920657865637574657320746869732066756e6374696f6e2ed82a20604e6f5375636850726f706f73616c6020696620746865205049502077697468206069646020646f65736e27742065786973742e15012a2060496e636f727265637450726f706f73616c537461746560206966207468652070726f706f73616c207761732063616e63656c6c6564206f722065786563757465642e387072756e655f70726f706f73616c04010869646d0301145069704964000a2429015072756e65207468652050495020676976656e2062792074686520606964602c20726566756e64696e6720616e792066756e6473206e6f7420616c726561647920726566756e6465642e6454686520504950206d6179206e6f7420626520616374697665000901546869732066756e6374696f6e20697320696e74656e64656420666f722073746f72616765206761726261676520636f6c6c656374696f6e20707572706f7365732e002023204572726f727305012a20604261644f726967696e6020756e6c657373206120474320766f74696e67206d616a6f7269747920657865637574657320746869732066756e6374696f6e2ed82a20604e6f5375636850726f706f73616c6020696620746865205049502077697468206069646020646f65736e27742065786973742ed42a2060496e636f727265637450726f706f73616c537461746560206966207468652070726f706f73616c206973206163746976652e5072657363686564756c655f657865637574696f6e08010869646d0301145069704964000114756e74696c510601584f7074696f6e3c543a3a426c6f636b4e756d6265723e000b24e0557064617465732074686520657865637574696f6e207363686564756c65206f66207468652050495020676976656e20627920606964602e002c2320417267756d656e747331012a2060756e74696c6020646566696e6573207468652066757475726520626c6f636b2077686572652074686520656e6163746d656e7420706572696f642077696c6c2066696e69736865642e4501202020604e6f6e65602076616c7565206d65616e73207468617420656e6163746d656e7420706572696f6420697320676f696e6720746f2066696e69736820696e20746865206e65787420626c6f636b2e002023204572726f727339012a206052657363686564756c654e6f74427952656c65617365436f6f7264696e61746f726020756e6c657373207472696767657265642062792072656c6561736520636f6f7264696e61746f722e21012a2060496e636f727265637450726f706f73616c53746174656020756e6c657373207468652070726f706f73616c2077617320696e2061207363686564756c65642073746174652e38636c6561725f736e617073686f74000c10e8436c656172732074686520736e617073686f7420616e6420656d69747320746865206576656e742060536e617073686f74436c6561726564602e002023204572726f72733d012a20604e6f7441436f6d6d69747465654d656d62657260202d20747269676765726564207768656e2061206e6f6e2d47432d6d656d626572206578656375746573207468652066756e6374696f6e2e20736e617073686f74000d140d0154616b65732061206e657720736e617073686f74206f66207468652063757272656e74206c697374206f66206163746976652026262070656e64696e6720504950732e2901546865205049507320617265207468656e20736f7274656420696e746f2061207072696f72697479207175657565206261736564206f6e2065616368205049502773207765696768742e002023204572726f72733d012a20604e6f7441436f6d6d69747465654d656d62657260202d20747269676765726564207768656e2061206e6f6e2d47432d6d656d626572206578656375746573207468652066756e6374696f6e2e58656e6163745f736e617073686f745f726573756c747304011c726573756c7473ed0601705665633c2850697049642c20536e617073686f74526573756c74293e000e44d0456e616374732060726573756c74736020666f7220746865205049507320696e2074686520736e617073686f742071756575652e290154686520736e617073686f742077696c6c20626520617661696c61626c6520666f72206675727468657220656e6163746d656e747320756e74696c20697420697320636c65617265642e0055015468652060726573756c7473602061726520656e636f6465642061206c697374206f6620602869642c20726573756c7429602077686572652060726573756c7460206973206170706c69656420746f20606964602e49014e6f746520746861742074686520736e617073686f74207072696f7269747920717565756520697320656e636f646564207769746820746865202a6c6f77657374207072696f726974792066697273742a2e5501736f2060726573756c7473203d205b2869642c20417070726f7665295d602077696c6c20617070726f76652060536e617073686f7451756575655b536e617073686f7451756575652e6c656e2829202d20315d602e002023204572726f72730d012a20604261644f726967696e60202d20756e6c657373206120474320766f74696e67206d616a6f7269747920657865637574657320746869732066756e6374696f6e2e21012a206043616e6e6f74536b697050697060202d206120676976656e205049502068617320616c7265616479206265656e20736b697070656420746f6f206d616e792074696d65732e0d012a2060536e617073686f74526573756c74546f6f4c6172676560202d206f6e206c656e28726573756c747329203e206c656e28736e617073686f745f7175657565292e702a2060536e617073686f7449644d69736d6174636860202d2069663a2420206060607465787498202020e2888320286920e2888820302e2e536e617073686f7451756575652e6c656e2829292efc2020202020726573756c74735b695d2e3020e289a020536e617073686f7451756575655b536e617073686f7451756575652e6c656e2829202d20695d2e6964142020606060f8202020546869732069732070726f746563747320616761696e737420636c656172696e67207175657565207768696c6520474320697320766f74696e672e54657865637574655f7363686564756c65645f70697004010869646d0301145069704964000f04d8496e7465726e616c20646973706174636861626c6520746861742068616e646c657320657865637574696f6e206f662061205049502e506578706972655f7363686564756c65645f70697008010c6469648001284964656e74697479496400010869646d0301145069704964001004dc496e7465726e616c20646973706174636861626c6520746861742068616e646c65732065787069726174696f6e206f662061205049502e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652eed06000002f10600f106000004086d03f50600f506082c70616c6c65745f7069707338536e617073686f74526573756c7400010c1c417070726f76650000001852656a65637400010010536b697000020000f906084070616c6c65745f706f7274666f6c696f1043616c6c04045400012c406372656174655f706f7274666f6c696f0401106e616d65a5030134506f7274666f6c696f4e616d65000004a843726561746573206120706f7274666f6c696f20776974682074686520676976656e20606e616d65602e4064656c6574655f706f7274666f6c696f04010c6e756df0013c506f7274666f6c696f4e756d626572000120350144656c657465732061207573657220706f7274666f6c696f2e204120706f7274666f6c696f2063616e2062652064656c65746564206f6e6c7920696620697420686173206e6f2066756e64732e002023204572726f72731d012a2060506f7274666f6c696f446f65734e6f7445786973746020696620606e756d6020646f65736e2774207265666572656e636520612076616c696420706f7274666f6c696f2ef02a2060506f7274666f6c696f4e6f74456d707479602069662074686520706f7274666f6c696f207374696c6c20686f6c647320616e79206173736574003423205065726d697373696f6e732c2a20506f7274666f6c696f4072656e616d655f706f7274666f6c696f08010c6e756df0013c506f7274666f6c696f4e756d62657200011c746f5f6e616d65a5030134506f7274666f6c696f4e616d6500021c8052656e616d65732061206e6f6e2d64656661756c7420706f7274666f6c696f2e002023204572726f72731d012a2060506f7274666f6c696f446f65734e6f7445786973746020696620606e756d6020646f65736e2774207265666572656e636520612076616c696420706f7274666f6c696f2e003423205065726d697373696f6e732c2a20506f7274666f6c696f58717569745f706f7274666f6c696f5f637573746f647904010c706964e8012c506f7274666f6c696f4964000320bc5768656e2063616c6c65642062792074686520637573746f6469616e206f662060706f7274666f6c696f5f6964602c4901616c6c6f77732072657475726e696e672074686520637573746f6479206f662074686520706f7274666f6c696f20746f2074686520706f7274666f6c696f206f776e657220756e696c61746572616c6c792e002023204572726f72735d012a2060556e617574686f72697a6564437573746f6469616e60206966207468652063616c6c6572206973206e6f74207468652063757272656e7420637573746f6469616e206f662060706f7274666f6c696f5f6964602e003423205065726d697373696f6e732c2a20506f7274666f6c696f606163636570745f706f7274666f6c696f5f637573746f647904011c617574685f696428010c753634000400506d6f76655f706f7274666f6c696f5f66756e64730c011066726f6de8012c506f7274666f6c696f4964000108746fe8012c506f7274666f6c696f496400011466756e6473fd0601245665633c46756e643e000548a1014d6f7665732066756e6769676c6520616e206e6f6e2d66756e6769626c6520746f6b656e732066726f6d206f6e6520706f7274666f6c696f206f6620616e206964656e7469747920746f20616e6f7468657220706f7274666f6c696f206f66207468652073616d65e06964656e746974792e204d7573742062652063616c6c65642062792074686520637573746f6469616e206f66207468652073656e6465722e110146756e64732066726f6d2064656c6574656420706f7274666f6c696f732063616e20616c736f206265207265636f7665726564207669612074686973206d6574686f642e00e0412073686f7274206d656d6f2063616e20626520616464656420746f20746f206561636820746f6b656e20616d6f756e74206d6f7665642e002023204572726f727369012a2060506f7274666f6c696f446f65734e6f74457869737460206966206f6e65206f7220626f7468206f662074686520706f7274666f6c696f73207265666572656e636520616e20696e76616c696420706f7274666f6c696f2e51012a206064657374696e6174696f6e5f69735f73616d655f706f7274666f6c696f6020696620626f74682073656e64657220616e6420726563656976657220706f7274666f6c696f20617265207468652073616d6591012a2060446966666572656e744964656e74697479506f7274666f6c696f7360206966207468652073656e64657220616e6420726563656976657220706f7274666f6c696f732062656c6f6e6720746f20646966666572656e74206964656e74697469657349012a2060556e617574686f72697a6564437573746f6469616e60206966207468652063616c6c6572206973206e6f742074686520637573746f6469616e206f66207468652066726f6d20706f7274666f6c696f41012a2060496e73756666696369656e74506f7274666f6c696f42616c616e636560206966207468652073656e64657220646f6573206e6f74206861766520656e6f75676820667265652062616c616e636549012a20604e6f4475706c6963617465417373657473416c6c6f77656460207468652073616d652061737365742063616e277420626520726570656174656420696e20746865206974656d7320766563746f722e55012a2060496e76616c69645472616e736665724e46544e6f744f776e656460206966207468652063616c6c657220697320747279696e6720746f206d6f766520616e204e465420686520646f65736e2774206f776e2e31012a2060496e76616c69645472616e736665724e465449734c6f636b656460206966207468652063616c6c657220697320747279696e6720746f206d6f76652061206c6f636b6564204e46542e003423205065726d697373696f6e732c2a20506f7274666f6c696f547072655f617070726f76655f706f7274666f6c696f08012061737365745f6964a8011c41737365744944000130706f7274666f6c696f5f6964e8012c506f7274666f6c696f4964000624e05072652d617070726f7665732074686520726563656976656d656e74206f6620616e20617373657420746f206120706f7274666f6c696f2e002c2320417267756d656e7473b42a20606f726967696e60202d20746865207365636f6e64617279206b6579206f66207468652073656e6465722e11012a206061737365745f696460202d20746865205b6041737365744944605d20746861742077696c6c206265206578656d70742066726f6d2061666669726d6174696f6e2e5d012a2060706f7274666f6c696f5f696460202d20746865205b60506f7274666f6c696f4964605d20746861742063616e2072656365697665206061737365745f69646020776974686f75742061666669726d6174696f6e2e003423205065726d697373696f6e732c2a20506f7274666f6c696f7472656d6f76655f706f7274666f6c696f5f7072655f617070726f76616c08012061737365745f6964a8011c41737365744944000130706f7274666f6c696f5f6964e8012c506f7274666f6c696f4964000724d052656d6f766573207468652070726520617070726f76616c206f6620616e20617373657420746f206120706f7274666f6c696f2e002c2320417267756d656e7473b42a20606f726967696e60202d20746865207365636f6e64617279206b6579206f66207468652073656e6465722e11012a206061737365745f696460202d20746865205b6041737365744944605d20746861742077696c6c206265206578656d70742066726f6d2061666669726d6174696f6e2e5d012a2060706f7274666f6c696f5f696460202d20746865205b60506f7274666f6c696f4964605d20746861742063616e2072656365697665206061737365745f69646020776974686f75742061666669726d6174696f6e2e003423205065726d697373696f6e732c2a20506f7274666f6c696f8c616c6c6f775f6964656e746974795f746f5f6372656174655f706f7274666f6c696f73040140747275737465645f6964656e746974798001284964656e746974794964000814b1014164647320616e206964656e7469747920746861742077696c6c20626520616c6c6f77656420746f2063726561746520616e642074616b6520637573746f6479206f66206120706f7274666f6c696f20756e646572207468652063616c6c65722773206964656e746974792e002c2320417267756d656e747389012a2060747275737465645f6964656e7469747960202d20746865205b604964656e746974794964605d20746861742077696c6c20626520616c6c6f77656420746f2063616c6c20606372656174655f637573746f64795f706f7274666f6c696f602e008c7265766f6b655f6372656174655f706f7274666f6c696f735f7065726d697373696f6e0401206964656e746974798001284964656e746974794964000914a10152656d6f766573207065726d697373696f6e206f6620616e206964656e7469747920746f2063726561746520616e642074616b6520637573746f6479206f66206120706f7274666f6c696f20756e646572207468652063616c6c65722773206964656e746974792e002c2320417267756d656e7473b1012a20606964656e7469747960202d20746865205b604964656e746974794964605d20746861742077696c6c206861766520746865207065726d697373696f6e7320746f2063616c6c20606372656174655f637573746f64795f706f7274666f6c696f60207265766f6b65642e00606372656174655f637573746f64795f706f7274666f6c696f080148706f7274666f6c696f5f6f776e65725f69648001284964656e746974794964000138706f7274666f6c696f5f6e616d65a5030134506f7274666f6c696f4e616d65000a18bd0143726561746573206120706f7274666f6c696f20756e646572207468652060706f7274666f6c696f5f6f776e65725f696460206964656e7469747920616e64207472616e73666572732069747320637573746f647920746f207468652063616c6c65722773206964656e746974792e002c2320417267756d656e747331012a2060706f7274666f6c696f5f6f776e65725f696460202d20746865205b604964656e746974794964605d20746861742077696c6c206f776e20746865206e657720706f7274666f6c696f2e01012a2060706f7274666f6c696f5f6e616d6560202d20746865205b60506f7274666f6c696f4e616d65605d206f6620746865206e657720706f7274666f6c696f2e000c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652efd0600000201070001070c4c706f6c796d6573685f7072696d69746976657324706f7274666f6c696f1046756e64000008012c6465736372697074696f6eb103013c46756e644465736372697074696f6e0001106d656d6f8401304f7074696f6e3c4d656d6f3e00000507084c70616c6c65745f70726f746f636f6c5f6665651043616c6c040454000108486368616e67655f636f656666696369656e7404012c636f656666696369656e74c5030120506f73526174696f000010c04368616e676573207468652066656520636f656666696369656e7420666f722074686520726f6f74206f726967696e2e002023204572726f7273882a20604261644f726967696e60202d204f6e6c7920726f6f7420616c6c6f7765642e3c6368616e67655f626173655f6665650801086f700907012850726f746f636f6c4f70000120626173655f66656518011c42616c616e6365000110ac4368616e67657320746865206120626173652066656520666f722074686520726f6f74206f726967696e2e002023204572726f7273882a20604261644f726967696e60202d204f6e6c7920726f6f7420616c6c6f7765642e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e09070c64706f6c796d6573685f636f6d6d6f6e5f7574696c69746965733070726f746f636f6c5f6665652850726f746f636f6c4f700001404c417373657452656769737465725469636b65720000002841737365744973737565000100444173736574416464446f63756d656e7473000200404173736574437265617465417373657400030060436865636b706f696e744372656174655363686564756c65000400a4436f6d706c69616e63654d616e61676572416464436f6d706c69616e6365526571756972656d656e74000500584964656e746974794364645265676973746572446964000600404964656e74697479416464436c61696d000700a44964656e746974794164645365636f6e646172794b65797357697468417574686f72697a6174696f6e0008002c5069707350726f706f736500090040436f6e747261637473507574436f6465000a006c436f72706f7261746542616c6c6f7441747461636842616c6c6f74000b00744361706974616c446973747269627574696f6e44697374726962757465000c004c4e4654437265617465436f6c6c656374696f6e000d001c4e46544d696e74000e006c4964656e746974794372656174654368696c644964656e74697479000f00000d070c4070616c6c65745f7363686564756c65721870616c6c65741043616c6c040454000118207363686564756c651001107768656e100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963110701a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6c0d06017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00000470416e6f6e796d6f75736c79207363686564756c652061207461736b2e1863616e63656c0801107768656e100138543a3a426c6f636b4e756d626572000114696e64657810010c7533320001049443616e63656c20616e20616e6f6e796d6f75736c79207363686564756c6564207461736b2e387363686564756c655f6e616d656414010869640401205461736b4e616d650001107768656e100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963110701a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6c0d06017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000204585363686564756c652061206e616d6564207461736b2e3063616e63656c5f6e616d656404010869640401205461736b4e616d650003047843616e63656c2061206e616d6564207363686564756c6564207461736b2e387363686564756c655f61667465721001146166746572100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963110701a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6c0d06017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000404a8416e6f6e796d6f75736c79207363686564756c652061207461736b20616674657220612064656c61792e507363686564756c655f6e616d65645f616674657214010869640401205461736b4e616d650001146166746572100138543a3a426c6f636b4e756d6265720001386d617962655f706572696f646963110701a04f7074696f6e3c7363686564756c653a3a506572696f643c543a3a426c6f636b4e756d6265723e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6c0d06017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000504905363686564756c652061206e616d6564207461736b20616674657220612064656c61792e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e110704184f7074696f6e04045401cd030108104e6f6e6500000010536f6d650400cd0300000100001507084470616c6c65745f736574746c656d656e741043616c6c040454000160306372656174655f76656e75650c011c64657461696c73dd03013056656e756544657461696c7300011c7369676e657273fc01445665633c543a3a4163636f756e7449643e00010c747970e103012456656e756554797065000014585265676973746572732061206e65772076656e75652e00a42a206064657461696c7360202d2045787472612064657461696c732061626f757420612076656e75653d012a20607369676e65727360202d204172726179206f66207369676e65727320746861742061726520616c6c6f77656420746f207369676e20726563656970747320666f7220746869732076656e7565942a206074797060202d2054797065206f662076656e7565206265696e672063726561746564507570646174655f76656e75655f64657461696c730801086964d903011c56656e7565496400011c64657461696c73dd03013056656e756544657461696c730001105c4564697420612076656e756527732064657461696c732e00b42a20606964602073706563696669657320746865204944206f66207468652076656e756520746f20656469742ec02a206064657461696c7360207370656369666965732074686520757064617465642076656e75652064657461696c732e447570646174655f76656e75655f747970650801086964d903011c56656e7565496400010c747970e103012456656e756554797065000210504564697420612076656e7565277320747970652e00b42a20606964602073706563696669657320746865204944206f66207468652076656e756520746f20656469742eb42a206074797065602073706563696669657320746865206e65772074797065206f66207468652076656e75652e5061666669726d5f776974685f72656365697074730c0108696489020134496e737472756374696f6e496400013c726563656970745f64657461696c73190701dc5665633c5265636569707444657461696c733c543a3a4163636f756e7449642c20543a3a4f6666436861696e5369676e61747572653e3e000128706f7274666f6c696f73f801405665633c506f7274666f6c696f49643e000324f441666669726d7320616e20696e737472756374696f6e207573696e6720726563656970747320666f72206f6666636861696e207472616e73666572732e002c2320417267756d656e747305012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672061666669726d65642eb1012a2060726563656970745f64657461696c7360202d206120766563746f72206f66205b605265636569707444657461696c73605d2c20776869636820636f6e7461696e207468652064657461696c732061626f757420746865206f6666636861696e207472616e736665722e95012a2060706f7274666f6c696f7360202d206120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e2e003423205065726d697373696f6e732c2a20506f7274666f6c696f4c7365745f76656e75655f66696c746572696e6708012061737365745f6964a8011c4173736574494400011c656e61626c656439010110626f6f6c000420c0456e61626c6573206f722064697361626c65642076656e75652066696c746572696e6720666f72206120746f6b656e2e002c2320417267756d656e7473c02a206061737365745f696460202d2041737365744944206f662074686520746f6b656e20696e207175657374696f6e2e19012a2060656e61626c656460202d20426f6f6c65616e20746861742064656369646573206966207468652066696c746572696e672073686f756c6420626520656e61626c65642e003423205065726d697373696f6e731c2a20417373657430616c6c6f775f76656e75657308012061737365745f6964a8011c4173736574494400011876656e756573f10301305665633c56656e756549643e00051c0d01416c6c6f7773206164646974696f6e616c2076656e75657320746f2063726561746520696e737472756374696f6e7320696e766f6c76696e6720616e2061737365742e00c02a206061737365745f696460202d2041737365744944206f662074686520746f6b656e20696e207175657374696f6e2e7d012a206076656e75657360202d204172726179206f662076656e75657320746861742061726520616c6c6f77656420746f2063726561746520696e737472756374696f6e7320666f722074686520746f6b656e20696e207175657374696f6e2e003423205065726d697373696f6e731c2a2041737365743c646973616c6c6f775f76656e75657308012061737365745f6964a8011c4173736574494400011876656e756573f10301305665633c56656e756549643e00061c69015265766f6b6573207065726d697373696f6e20676976656e20746f2076656e75657320666f72206372656174696e6720696e737472756374696f6e7320696e766f6c76696e67206120706172746963756c61722061737365742e00c02a206061737365745f696460202d2041737365744944206f662074686520746f6b656e20696e207175657374696f6e2ea5012a206076656e75657360202d204172726179206f662076656e756573207468617420617265206e6f206c6f6e67657220616c6c6f77656420746f2063726561746520696e737472756374696f6e7320666f722074686520746f6b656e20696e207175657374696f6e2e003423205065726d697373696f6e731c2a204173736574507570646174655f76656e75655f7369676e6572730c01086964d903011c56656e7565496400011c7369676e657273fc01445665633c543a3a4163636f756e7449643e00012c6164645f7369676e65727339010110626f6f6c0007105c4564697420612076656e75652773207369676e6572732eb42a20606964602073706563696669657320746865204944206f66207468652076656e756520746f20656469742ec02a20607369676e657273602073706563696669657320746865207369676e65727320746f206164642f72656d6f76652e91012a20606164645f7369676e657273602073706563696669657320746865207570646174652074797065206164642f72656d6f7665206f662076656e756520776865726520616464206973207472756520616e642072656d6f76652069732066616c73652e68657865637574655f6d616e75616c5f696e737472756374696f6e180108696489020134496e737472756374696f6e4964000124706f7274666f6c696f7d02014c4f7074696f6e3c506f7274666f6c696f49643e00014866756e6769626c655f7472616e736665727310010c7533320001386e6674735f7472616e736665727310010c7533320001486f6666636861696e5f7472616e736665727310010c7533320001307765696768745f6c696d6974ed0401384f7074696f6e3c5765696768743e000834844d616e75616c6c7920657865637574657320616e20696e737472756374696f6e2e002c2320417267756d656e747301012a20606964603a20546865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e20746f2062652065786563757465642e95012a2060706f7274666f6c696f603a20204f6e65206f66207468652063616c6c65722773205b60506f7274666f6c696f4964605d20776869636820697320616c736f206120636f756e74657220706174727920696e2074686520696e737472756374696f6e2e61014966204e6f6e652c207468652063616c6c6572206d757374206265207468652076656e75652063726561746f72206f72206120636f756e74657220706172747920696e2061205b604c65673a3a4f6666436861696e605d2e1d012a206066756e6769626c655f7472616e7366657273603a20546865206e756d626572206f662066756e6769626c65206c65677320696e2074686520696e737472756374696f6e2e31012a20606e6674735f7472616e7366657273603a20546865206e756d626572206f66206e667473206265696e67207472616e7366657272656420696e2074686520696e737472756374696f6e2e1d012a20606f6666636861696e5f7472616e7366657273603a20546865206e756d626572206f66206f6666636861696e206c65677320696e2074686520696e737472756374696f6e2e8d012a20607765696768745f6c696d6974603a20416e206f7074696f6e616c206d6178696d756d205b60576569676874605d2076616c756520746f206265206368617267656420666f7220657865637574696e672074686520696e737472756374696f6e2e710149662074686520607765696768745f6c696d697460206973206c657373207468616e2074686520726571756972656420616d6f756e742c2074686520696e737472756374696f6e2077696c6c206661696c20657865637574696f6e2e004d024e6f74653a2063616c6c696e672074686520727063206d6574686f6420606765745f657865637574655f696e737472756374696f6e5f696e666f602072657475726e7320616e20696e7374616e6365206f66205b6045786563757465496e737472756374696f6e496e666f605d2c20776869636820636f6e7461696e732074686520636f756e7420706172616d65746572732e3c6164645f696e737472756374696f6e18012076656e75655f6964f503013c4f7074696f6e3c56656e756549643e00013c736574746c656d656e745f74797065f9030178536574746c656d656e74547970653c543a3a426c6f636b4e756d6265723e00012874726164655f64617465050101444f7074696f6e3c543a3a4d6f6d656e743e00012876616c75655f64617465050101444f7074696f6e3c543a3a4d6f6d656e743e0001106c656773fd0301205665633c4c65673e000140696e737472756374696f6e5f6d656d6f8401304f7074696f6e3c4d656d6f3e0009245c416464732061206e657720696e737472756374696f6e2e002c2320417267756d656e747341012a206076656e75655f6964603a20546865206f7074696f6e616c205b6056656e75654964605d206f66207468652076656e7565207468697320696e737472756374696f6e2062656c6f6e677320746f2e79012a2060736574746c656d656e745f74797065603a20546865205b60536574746c656d656e7454797065605d2073706563696679696e67207768656e2074686520696e737472756374696f6e2073686f756c6420626520736574746c65642e4d012a206074726164655f64617465603a204f7074696f6e616c20646174652066726f6d2077686963682070656f706c652063616e20696e7465726163742077697468207468697320696e737472756374696f6e2e6d012a206076616c75655f64617465603a204f7074696f6e616c20646174652061667465722077686963682074686520696e737472756374696f6e2073686f756c6420626520736574746c656420286e6f7420656e666f72636564292efc2a20606c656773603a204120766563746f72206f6620616c6c205b604c6567605d20696e636c7564656420696e207468697320696e737472756374696f6e2ee82a20606d656d6f603a20416e206f7074696f6e616c205b604d656d6f605d206669656c6420666f72207468697320696e737472756374696f6e2e686164645f616e645f61666669726d5f696e737472756374696f6e1c012076656e75655f6964f503013c4f7074696f6e3c56656e756549643e00013c736574746c656d656e745f74797065f9030178536574746c656d656e74547970653c543a3a426c6f636b4e756d6265723e00012874726164655f64617465050101444f7074696f6e3c543a3a4d6f6d656e743e00012876616c75655f64617465050101444f7074696f6e3c543a3a4d6f6d656e743e0001106c656773fd0301205665633c4c65673e000128706f7274666f6c696f73f801405665633c506f7274666f6c696f49643e000140696e737472756374696f6e5f6d656d6f8401304f7074696f6e3c4d656d6f3e000a348c4164647320616e642061666669726d732061206e657720696e737472756374696f6e2e002c2320417267756d656e74731d012a206076656e75655f6964603a20546865205b6056656e75654964605d206f66207468652076656e7565207468697320696e737472756374696f6e2062656c6f6e677320746f2e79012a2060736574746c656d656e745f74797065603a20546865205b60536574746c656d656e7454797065605d2073706563696679696e67207768656e2074686520696e737472756374696f6e2073686f756c6420626520736574746c65642e4d012a206074726164655f64617465603a204f7074696f6e616c20646174652066726f6d2077686963682070656f706c652063616e20696e7465726163742077697468207468697320696e737472756374696f6e2e6d012a206076616c75655f64617465603a204f7074696f6e616c20646174652061667465722077686963682074686520696e737472756374696f6e2073686f756c6420626520736574746c656420286e6f7420656e666f72636564292efc2a20606c656773603a204120766563746f72206f6620616c6c205b604c6567605d20696e636c7564656420696e207468697320696e737472756374696f6e2e91012a2060706f7274666f6c696f73603a204120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e2ee82a20606d656d6f603a20416e206f7074696f6e616c205b604d656d6f605d206669656c6420666f72207468697320696e737472756374696f6e2e003423205065726d697373696f6e732c2a20506f7274666f6c696f4861666669726d5f696e737472756374696f6e080108696489020134496e737472756374696f6e4964000128706f7274666f6c696f73f801405665633c506f7274666f6c696f49643e000b20bc50726f766964652061666669726d6174696f6e20746f20616e206578697374696e6720696e737472756374696f6e2e002c2320417267756d656e747305012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672061666669726d65642e95012a2060706f7274666f6c696f7360202d206120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e2e003423205065726d697373696f6e732c2a20506f7274666f6c696f5077697468647261775f61666669726d6174696f6e080108696489020134496e737472756374696f6e4964000128706f7274666f6c696f73f801405665633c506f7274666f6c696f49643e000c20c0576974686472617720616e2061666669726d6174696f6e20666f72206120676976656e20696e737472756374696f6e2e002c2320417267756d656e74734d012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e2067657474696e6720616e2061666669726d6174696f6e2077697468647261776e2ec1012a2060706f7274666f6c696f7360202d206120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e207769746864726177616c2e003423205065726d697373696f6e732c2a20506f7274666f6c696f4872656a6563745f696e737472756374696f6e080108696489020134496e737472756374696f6e4964000124706f7274666f6c696fe8012c506f7274666f6c696f4964000d208052656a6563747320616e206578697374696e6720696e737472756374696f6e2e002c2320417267756d656e747305012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672072656a65637465642e61012a2060706f7274666f6c696f60202d20746865205b60506f7274666f6c696f4964605d20746861742062656c6f6e677320746f2074686520696e737472756374696f6e20616e642069732072656a656374696e672069742e003423205065726d697373696f6e732c2a20506f7274666f6c696f74657865637574655f7363686564756c65645f696e737472756374696f6e080108696489020134496e737472756374696f6e49640001307765696768745f6c696d6974200118576569676874000e048101526f6f742063616c6c61626c652065787472696e7369632c207573656420617320616e20696e7465726e616c2063616c6c20746f20657865637574652061207363686564756c656420736574746c656d656e7420696e737472756374696f6e2e7c61666669726d5f776974685f72656365697074735f776974685f636f756e74100108696489020134496e737472756374696f6e496400013c726563656970745f64657461696c73190701dc5665633c5265636569707444657461696c733c543a3a4163636f756e7449642c20543a3a4f6666436861696e5369676e61747572653e3e000128706f7274666f6c696f73f801405665633c506f7274666f6c696f49643e0001406e756d6265725f6f665f6173736574732d0701604f7074696f6e3c41666669726d6174696f6e436f756e743e000f30f441666669726d7320616e20696e737472756374696f6e207573696e6720726563656970747320666f72206f6666636861696e207472616e73666572732e002c2320417267756d656e747305012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672061666669726d65642eb1012a2060726563656970745f64657461696c7360202d206120766563746f72206f66205b605265636569707444657461696c73605d2c20776869636820636f6e7461696e207468652064657461696c732061626f757420746865206f6666636861696e207472616e736665722e95012a2060706f7274666f6c696f7360202d206120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e2e19022a20606e756d6265725f6f665f61737365747360202d20616e206f7074696f6e616c205b6041666669726d6174696f6e436f756e74605d20746861742077696c6c206265207573656420666f72206120707265636973652066656520657374696d6174696f6e206265666f726520657865637574696e67207468652065787472696e7369632e0085014e6f74653a2063616c6c696e672074686520727063206d6574686f6420606765745f61666669726d6174696f6e5f636f756e74602072657475726e7320616e20696e7374616e6365206f66205b6041666669726d6174696f6e436f756e74605d2e003423205065726d697373696f6e732c2a20506f7274666f6c696f7461666669726d5f696e737472756374696f6e5f776974685f636f756e740c0108696489020134496e737472756374696f6e4964000128706f7274666f6c696f73f801405665633c506f7274666f6c696f49643e0001406e756d6265725f6f665f6173736574732d0701604f7074696f6e3c41666669726d6174696f6e436f756e743e00102cbc50726f766964652061666669726d6174696f6e20746f20616e206578697374696e6720696e737472756374696f6e2e002c2320417267756d656e747305012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672061666669726d65642e95012a2060706f7274666f6c696f7360202d206120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e2e19022a20606e756d6265725f6f665f61737365747360202d20616e206f7074696f6e616c205b6041666669726d6174696f6e436f756e74605d20746861742077696c6c206265207573656420666f72206120707265636973652066656520657374696d6174696f6e206265666f726520657865637574696e67207468652065787472696e7369632e0085014e6f74653a2063616c6c696e672074686520727063206d6574686f6420606765745f61666669726d6174696f6e5f636f756e74602072657475726e7320616e20696e7374616e6365206f66205b6041666669726d6174696f6e436f756e74605d2e003423205065726d697373696f6e732c2a20506f7274666f6c696f7472656a6563745f696e737472756374696f6e5f776974685f636f756e740c0108696489020134496e737472756374696f6e4964000124706f7274666f6c696fe8012c506f7274666f6c696f49640001406e756d6265725f6f665f617373657473390701484f7074696f6e3c4173736574436f756e743e00112c8052656a6563747320616e206578697374696e6720696e737472756374696f6e2e002c2320417267756d656e747305012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672072656a65637465642e61012a2060706f7274666f6c696f60202d20746865205b60506f7274666f6c696f4964605d20746861742062656c6f6e677320746f2074686520696e737472756374696f6e20616e642069732072656a656374696e672069742e01022a20606e756d6265725f6f665f61737365747360202d20616e206f7074696f6e616c205b604173736574436f756e74605d20746861742077696c6c206265207573656420666f72206120707265636973652066656520657374696d6174696f6e206265666f726520657865637574696e67207468652065787472696e7369632e0035024e6f74653a2063616c6c696e672074686520727063206d6574686f6420606765745f657865637574655f696e737472756374696f6e5f696e666f602072657475726e7320616e20696e7374616e6365206f66205b6045786563757465496e737472756374696f6e496e666f605d2c20776869636820636f6e7461696e2074686520617373657420636f756e742e003423205065726d697373696f6e732c2a20506f7274666f6c696f7c77697468647261775f61666669726d6174696f6e5f776974685f636f756e740c0108696489020134496e737472756374696f6e4964000128706f7274666f6c696f73f801405665633c506f7274666f6c696f49643e0001406e756d6265725f6f665f6173736574732d0701604f7074696f6e3c41666669726d6174696f6e436f756e743e00122cc0576974686472617720616e2061666669726d6174696f6e20666f72206120676976656e20696e737472756374696f6e2e002c2320417267756d656e74734d012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e2067657474696e6720616e2061666669726d6174696f6e2077697468647261776e2ec1012a2060706f7274666f6c696f7360202d206120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e207769746864726177616c2e19022a20606e756d6265725f6f665f61737365747360202d20616e206f7074696f6e616c205b6041666669726d6174696f6e436f756e74605d20746861742077696c6c206265207573656420666f72206120707265636973652066656520657374696d6174696f6e206265666f726520657865637574696e67207468652065787472696e7369632e0085014e6f74653a2063616c6c696e672074686520727063206d6574686f6420606765745f61666669726d6174696f6e5f636f756e74602072657475726e7320616e20696e7374616e6365206f66205b6041666669726d6174696f6e436f756e74605d2e003423205065726d697373696f6e732c2a20506f7274666f6c696f786164645f696e737472756374696f6e5f776974685f6d65646961746f72731c012076656e75655f6964f503013c4f7074696f6e3c56656e756549643e00013c736574746c656d656e745f74797065f9030178536574746c656d656e74547970653c543a3a426c6f636b4e756d6265723e00012874726164655f64617465050101444f7074696f6e3c543a3a4d6f6d656e743e00012876616c75655f64617465050101444f7074696f6e3c543a3a4d6f6d656e743e0001106c656773fd0301205665633c4c65673e000140696e737472756374696f6e5f6d656d6f8401304f7074696f6e3c4d656d6f3e0001246d65646961746f72733d0701dc426f756e64656442547265655365743c4964656e7469747949642c20543a3a4d6178496e737472756374696f6e4d65646961746f72733e00132898416464732061206e657720696e737472756374696f6e2077697468206d65646961746f72732e002c2320417267756d656e74731d012a206076656e75655f6964603a20546865205b6056656e75654964605d206f66207468652076656e7565207468697320696e737472756374696f6e2062656c6f6e677320746f2e79012a2060736574746c656d656e745f74797065603a20546865205b60536574746c656d656e7454797065605d2073706563696679696e67207768656e2074686520696e737472756374696f6e2073686f756c6420626520736574746c65642e4d012a206074726164655f64617465603a204f7074696f6e616c20646174652066726f6d2077686963682070656f706c652063616e20696e7465726163742077697468207468697320696e737472756374696f6e2e6d012a206076616c75655f64617465603a204f7074696f6e616c20646174652061667465722077686963682074686520696e737472756374696f6e2073686f756c6420626520736574746c656420286e6f7420656e666f72636564292efc2a20606c656773603a204120766563746f72206f6620616c6c205b604c6567605d20696e636c7564656420696e207468697320696e737472756374696f6e2e19012a2060696e737472756374696f6e5f6d656d6f603a20416e206f7074696f6e616c205b604d656d6f605d206669656c6420666f72207468697320696e737472756374696f6e2e69012a20606d65646961746f7273603a204120736574206f66205b604964656e746974794964605d206f6620616c6c20746865206d616e6461746f7279206d65646961746f727320666f722074686520696e737472756374696f6e2e746164645f616e645f61666669726d5f776974685f6d65646961746f727320012076656e75655f6964f503013c4f7074696f6e3c56656e756549643e00013c736574746c656d656e745f74797065f9030178536574746c656d656e74547970653c543a3a426c6f636b4e756d6265723e00012874726164655f64617465050101444f7074696f6e3c543a3a4d6f6d656e743e00012876616c75655f64617465050101444f7074696f6e3c543a3a4d6f6d656e743e0001106c656773fd0301205665633c4c65673e000128706f7274666f6c696f73f801405665633c506f7274666f6c696f49643e000140696e737472756374696f6e5f6d656d6f8401304f7074696f6e3c4d656d6f3e0001246d65646961746f72733d0701dc426f756e64656442547265655365743c4964656e7469747949642c20543a3a4d6178496e737472756374696f6e4d65646961746f72733e001438c84164647320616e642061666669726d732061206e657720696e737472756374696f6e2077697468206d65646961746f72732e002c2320417267756d656e74731d012a206076656e75655f6964603a20546865205b6056656e75654964605d206f66207468652076656e7565207468697320696e737472756374696f6e2062656c6f6e677320746f2e79012a2060736574746c656d656e745f74797065603a20546865205b60536574746c656d656e7454797065605d2073706563696679696e67207768656e2074686520696e737472756374696f6e2073686f756c6420626520736574746c65642e4d012a206074726164655f64617465603a204f7074696f6e616c20646174652066726f6d2077686963682070656f706c652063616e20696e7465726163742077697468207468697320696e737472756374696f6e2e6d012a206076616c75655f64617465603a204f7074696f6e616c20646174652061667465722077686963682074686520696e737472756374696f6e2073686f756c6420626520736574746c656420286e6f7420656e666f72636564292efc2a20606c656773603a204120766563746f72206f6620616c6c205b604c6567605d20696e636c7564656420696e207468697320696e737472756374696f6e2e91012a2060706f7274666f6c696f73603a204120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e2e19012a2060696e737472756374696f6e5f6d656d6f603a20416e206f7074696f6e616c205b604d656d6f605d206669656c6420666f72207468697320696e737472756374696f6e2e69012a20606d65646961746f7273603a204120736574206f66205b604964656e746974794964605d206f6620616c6c20746865206d616e6461746f7279206d65646961746f727320666f722074686520696e737472756374696f6e2e003423205065726d697373696f6e732c2a20506f7274666f6c696f7861666669726d5f696e737472756374696f6e5f61735f6d65646961746f72080138696e737472756374696f6e5f696489020134496e737472756374696f6e4964000118657870697279050101444f7074696f6e3c543a3a4d6f6d656e743e0015188d0141666669726d732074686520696e737472756374696f6e2061732061206d65646961746f72202d2073686f756c64206f6e6c792062652063616c6c6564206279206d65646961746f72732c206f74686572776973652069742077696c6c206661696c2e002c2320417267756d656e7473b02a20606f726967696e603a20546865207365636f6e64617279206b6579206f66207468652073656e6465722e41012a2060696e737472756374696f6e5f6964603a20546865205b60496e737472756374696f6e4964605d20746861742077696c6c2062652061666669726d656420627920746865206d65646961746f722ec5012a2060657870697279603a20416e204f7074696f6e616c2076616c756520666f7220646566696e696e67207768656e207468652061666669726d6174696f6e2077696c6c2065787069726520284e6f6e65206d65616e732069742077696c6c20616c776179732062652076616c6964292e8077697468647261775f61666669726d6174696f6e5f61735f6d65646961746f72040138696e737472756374696f6e5f696489020134496e737472756374696f6e4964001614d10152656d6f76657320746865206d65646961746f7227732061666669726d6174696f6e20666f722074686520696e737472756374696f6e202d2073686f756c64206f6e6c792062652063616c6c6564206279206d65646961746f72732c206f74686572776973652069742077696c6c206661696c2e002c2320417267756d656e7473b02a20606f726967696e603a20546865207365636f6e64617279206b6579206f66207468652073656e6465722e45012a2060696e737472756374696f6e5f6964603a20546865205b60496e737472756374696f6e4964605d20746861742077696c6c2068617665207468652061666669726d6174696f6e2072656d6f7665642e7872656a6563745f696e737472756374696f6e5f61735f6d65646961746f72080138696e737472756374696f6e5f696489020134496e737472756374696f6e49640001406e756d6265725f6f665f617373657473390701484f7074696f6e3c4173736574436f756e743e00171c750152656a6563747320616e206578697374696e6720696e737472756374696f6e202d2073686f756c64206f6e6c792062652063616c6c6564206279206d65646961746f72732c206f74686572776973652069742077696c6c206661696c2e002c2320417267756d656e747335012a2060696e737472756374696f6e5f696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672072656a65637465642e01022a20606e756d6265725f6f665f61737365747360202d20616e206f7074696f6e616c205b604173736574436f756e74605d20746861742077696c6c206265207573656420666f72206120707265636973652066656520657374696d6174696f6e206265666f726520657865637574696e67207468652065787472696e7369632e0035024e6f74653a2063616c6c696e672074686520727063206d6574686f6420606765745f657865637574655f696e737472756374696f6e5f696e666f602072657475726e7320616e20696e7374616e6365206f66205b6045786563757465496e737472756374696f6e496e666f605d2c20776869636820636f6e7461696e2074686520617373657420636f756e742e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e19070000021d07001d070c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e74385265636569707444657461696c7308244163636f756e7449640100444f6666436861696e5369676e61747572650121070018010c75696428010c753634000138696e737472756374696f6e5f696489020134496e737472756374696f6e49640001186c65675f6964e50301144c656749640001187369676e65720001244163636f756e7449640001247369676e6174757265210701444f6666436861696e5369676e61747572650001206d65746164617461e903015c4f7074696f6e3c526563656970744d657461646174613e00002107082873705f72756e74696d65384d756c74695369676e617475726500010c1c45643235353139040079060148656432353531393a3a5369676e61747572650000001c537232353531390400a9060148737232353531393a3a5369676e617475726500010014456364736104002507014065636473613a3a5369676e61747572650002000025070c1c73705f636f7265146563647361245369676e617475726500000400290701205b75383b2036355d000029070000034100000008002d0704184f7074696f6e0404540131070108104e6f6e6500000010536f6d6504003107000001000031070c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e744041666669726d6174696f6e436f756e7400000c014873656e6465725f61737365745f636f756e74350701284173736574436f756e7400015072656365697665725f61737365745f636f756e74350701284173736574436f756e740001386f6666636861696e5f636f756e7410010c753332000035070c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e74284173736574436f756e7400000c012066756e6769626c6510010c7533320001306e6f6e5f66756e6769626c6510010c7533320001246f66665f636861696e10010c7533320000390704184f7074696f6e0404540135070108104e6f6e6500000010536f6d650400350700000100003d070c4c626f756e6465645f636f6c6c656374696f6e7344626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401800453000004008d02012c42547265655365743c543e00004107084470616c6c65745f737461746973746963731043616c6c040454000110587365745f6163746976655f61737365745f737461747308012061737365745f6964a8011c41737365744944000128737461745f74797065734507014842547265655365743c53746174547970653e00003c80536574207468652061637469766520617373657420737461745f74797065732e002c2320417267756d656e747331012d20606f726967696e60202d2061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ef42d206061737365745f696460202d20746865205b6041737365744944605d20746f206368616e67652074686520616374697665207374617473206f6e2e09012d2060737461745f747970657360202d20746865206e6577207374617420747970657320746f207265706c61636520616e79206578697374696e672074797065732e002023204572726f727329012d206053746174547970654c696d69745265616368656460202d20746f6f206d616e79207374617420747970657320656e61626c656420666f7220746865206061737365745f6964602e85012d206043616e6e6f7452656d6f76655374617454797065496e55736560202d2063616e206e6f742072656d6f7665206120737461742074797065207468617420697320696e20757365206279207472616e7366657220636f6e646974696f6e732e2d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e003423205065726d697373696f6e731c2d204167656e741c2d2041737365746062617463685f7570646174655f61737365745f73746174730c012061737365745f6964a8011c41737365744944000124737461745f747970650d040120537461745479706500011876616c7565734907015042547265655365743c537461745570646174653e00013ce8416c6c6f77206120747275737465642069737375657220746f20696e69742f726573796e632061737365742f636f6d70616e792073746174732e002c2320417267756d656e747331012d20606f726967696e60202d2061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ef42d206061737365745f696460202d20746865205b6041737365744944605d20746f206368616e67652074686520616374697665207374617473206f6e2e902d2060737461745f7479706560202d2073746174207479706520746f207570646174652eb02d206076616c75657360202d20557064617465642076616c75657320666f722060737461745f74797065602e002023204572726f727311012d206053746174547970654d697373696e6760202d2060737461745f7479706560206973206e6f7420656e61626c656420666f7220746865206061737365745f6964602e2d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e003423205065726d697373696f6e731c2d204167656e741c2d204173736574747365745f61737365745f7472616e736665725f636f6d706c69616e636508012061737365745f6964a8011c4173736574494400014c7472616e736665725f636f6e646974696f6e734d07016c42547265655365743c5472616e73666572436f6e646974696f6e3e00023c90536574206173736574207472616e7366657220636f6d706c69616e63652072756c65732e002c2320417267756d656e747331012d20606f726967696e60202d2061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ef42d206061737365745f696460202d20746865205b6041737365744944605d20746f206368616e67652074686520616374697665207374617473206f6e2e61012d20607472616e736665725f636f6e646974696f6e7360202d20746865206e6577207472616e7366657220636f6e646974696f6e20746f207265706c61636520616e79206578697374696e6720636f6e646974696f6e732e002023204572726f727361012d20605472616e73666572436f6e646974696f6e4c696d69745265616368656460202d20746f6f206d616e79207472616e7366657220636f6e64697469746f6e20656e61626c656420666f72206061737365745f6964602e9d012d206053746174547970654d697373696e6760202d2061207472616e7366657220636f6e646974696f6e2072657175697265732061207374617420747970652074686174206973206e6f7420656e61626c656420666f7220746865206061737365745f6964602e2d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e003423205065726d697373696f6e731c2d204167656e741c2d2041737365744c7365745f656e7469746965735f6578656d70740c012469735f6578656d707439010110626f6f6c0001286578656d70745f6b65793d0401685472616e73666572436f6e646974696f6e4578656d70744b6579000120656e7469746965738d02015042547265655365743c4964656e7469747949643e00033811015365742f756e73657420656e746974696573206578656d70742066726f6d20616e2061737365742773207472616e7366657220636f6d706c69616e63652072756c65732e002c2320417267756d656e747351012d20606f726967696e60202d2061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f6620606578656d70745f6b65792e6173736574602ee02d206069735f6578656d707460202d20656e61626c652f64697361626c65206578656d7074696f6e20666f722060656e746974696573602e1d012d20606578656d70745f6b657960202d2074686520617373657420616e642073746174207479706520746f206578656d7074207468652060656e746974696573602066726f6d2eec2d2060656e74697469657360202d2074686520656e74697469657320746f207365742f756e73657420746865206578656d7074696f6e20666f722e002023204572726f727321012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f7220606173736574602e003423205065726d697373696f6e731c2d204167656e741c2d2041737365740c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e450704204254726565536574040454010d0400040009040000004907042042547265655365740404540121040004001d040000004d070420425472656553657404045401390400040035040000005107082870616c6c65745f73746f1043616c6c040454000118446372656174655f66756e647261697365722801486f66666572696e675f706f7274666f6c696fe8012c506f7274666f6c696f49640001386f66666572696e675f6173736574a8011c4173736574494400014472616973696e675f706f7274666f6c696fe8012c506f7274666f6c696f496400013472616973696e675f6173736574a8011c417373657449440001147469657273550701385665633c5072696365546965723e00012076656e75655f6964d903011c56656e756549640001147374617274050101444f7074696f6e3c543a3a4d6f6d656e743e00010c656e64050101444f7074696f6e3c543a3a4d6f6d656e743e0001486d696e696d756d5f696e766573746d656e7418011c42616c616e636500013c66756e647261697365725f6e616d654d04013846756e647261697365724e616d65000040604372656174652061206e65772066756e647261697365722e000d012a20606f66666572696e675f706f7274666f6c696f60202d20506f7274666f6c696f20636f6e7461696e696e672074686520606f66666572696e675f6173736574602ea42a20606f66666572696e675f617373657460202d204173736574206265696e67206f6666657265642e05012a206072616973696e675f706f7274666f6c696f60202d20506f7274666f6c696f20636f6e7461696e696e6720746865206072616973696e675f6173736574602e35012a206072616973696e675f617373657460202d204173736574206265696e672065786368616e67656420666f7220606f66666572696e675f617373657460206f6e20696e766573746d656e742ee82a2060746965727360202d20507269636520746965727320746f2063686172676520696e766573746f7273206f6e20696e766573746d656e742ea82a206076656e75655f696460202d2056656e756520746f2068616e646c6520736574746c656d656e742e4d012a2060737461727460202d2046756e647261697365722073746172742074696d652c20696620604e6f6e6560207468652066756e647261697365722077696c6c20737461727420696d6d6564696174656c792e29012a2060656e6460202d2046756e6472616973657220656e642074696d652c20696620604e6f6e6560207468652066756e647261697365722077696c6c206e65766572206578706972652ecd012a20606d696e696d756d5f696e766573746d656e7460202d204d696e696d756d20616d6f756e74206f66206072616973696e675f617373657460207468617420616e20696e766573746f72206e6565647320746f207370656e6420746f20696e7665737420696e20746869732072616973652ef02a206066756e647261697365725f6e616d6560202d2046756e64726169736572206e616d652c206f6e6c79207573656420696e20746865205549732e003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f18696e766573741c0150696e766573746d656e745f706f7274666f6c696fe8012c506f7274666f6c696f496400014466756e64696e675f706f7274666f6c696fe8012c506f7274666f6c696f49640001386f66666572696e675f6173736574a8011c4173736574494400010869644904013046756e64726169736572496400013c70757263686173655f616d6f756e7418011c42616c616e63650001246d61785f70726963653104013c4f7074696f6e3c42616c616e63653e00011c726563656970745d0701e84f7074696f6e3c5265636569707444657461696c733c543a3a4163636f756e7449642c20543a3a4f6666436861696e5369676e61747572653e3e0001305c496e7665737420696e20612066756e647261697365722e0041012a2060696e766573746d656e745f706f7274666f6c696f60202d20506f7274666f6c696f207468617420606f66666572696e675f6173736574602077696c6c206265206465706f736974656420696e2e01012a206066756e64696e675f706f7274666f6c696f60202d20506f7274666f6c696f20746861742077696c6c2066756e642074686520696e766573746d656e742ea02a20606f66666572696e675f617373657460202d20417373657420746f20696e7665737420696e2eac2a2060696460202d204944206f66207468652066756e6472616973657220746f20696e7665737420696e2ef42a206070757263686173655f616d6f756e7460202d20416d6f756e74206f6620606f66666572696e675f61737365746020746f2070757263686173652eb9012a20606d61785f707269636560202d204d6178696d756d20707269636520746f207061792070657220756e6974206f6620606f66666572696e675f6173736574602c20496620604e6f6e6560746865726520617265206e6f20636f6e73747261696e7473206f6e2070726963652e69012a20607265636569707460202d204f66662d636861696e207265636569707420746f2075736520696e7374656164206f66206f6e2d636861696e2062616c616e636520696e206066756e64696e675f706f7274666f6c696f602e003423205065726d697373696f6e732c2a20506f7274666f6c696f44667265657a655f66756e647261697365720801386f66666572696e675f6173736574a8011c4173736574494400010869644904013046756e64726169736572496400021c50467265657a6520612066756e647261697365722e00942a20606f66666572696e675f617373657460202d20417373657420746f20667265657a652ea02a2060696460202d204944206f66207468652066756e6472616973657220746f20667265657a652e003423205065726d697373696f6e731c2a2041737365744c756e667265657a655f66756e647261697365720801386f66666572696e675f6173736574a8011c4173736574494400010869644904013046756e64726169736572496400031c58556e667265657a6520612066756e647261697365722e009c2a20606f66666572696e675f617373657460202d20417373657420746f20756e667265657a652ea82a2060696460202d204944206f66207468652066756e6472616973657220746f20756e667265657a652e003423205065726d697373696f6e731c2a204173736574606d6f646966795f66756e647261697365725f77696e646f771001386f66666572696e675f6173736574a8011c4173736574494400010869644904013046756e6472616973657249640001147374617274280124543a3a4d6f6d656e7400010c656e64050101444f7074696f6e3c543a3a4d6f6d656e743e000424b44d6f64696679207468652074696d652077696e646f7720612066756e647261697365722069732061637469766500942a20606f66666572696e675f617373657460202d20417373657420746f206d6f646966792ea02a2060696460202d204944206f66207468652066756e6472616973657220746f206d6f646966792ea02a2060737461727460202d204e6577207374617274206f66207468652066756e647261697365722eb82a2060656e6460202d204e657720656e64206f66207468652066756e6472616973657220746f206d6f646966792e003423205065726d697373696f6e731c2a2041737365741073746f700801386f66666572696e675f6173736574a8011c4173736574494400010869644904013046756e64726169736572496400051c4853746f7020612066756e647261697365722e008c2a20606f66666572696e675f617373657460202d20417373657420746f2073746f702e982a2060696460202d204944206f66207468652066756e6472616973657220746f2073746f702e003423205065726d697373696f6e731c2a2041737365740c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e55070000025907005907082870616c6c65745f73746f245072696365546965720000080114746f74616c18011c42616c616e6365000114707269636518011c42616c616e636500005d0704184f7074696f6e040454011d070108104e6f6e6500000010536f6d6504001d0700000100006107083c70616c6c65745f74726561737572791043616c6c0404540001083064697362757273656d656e7404013462656e65666963696172696573650701785665633c42656e65666963696172793c42616c616e63654f663c543e3e3e00001c51014974207472616e73666572732062616c616e6365732066726f6d20747265617375727920746f2065616368206f662062656e6566696369617269657320616e642074686520737065636966696320616d6f756e7444666f722065616368206f66207468656d2e001c23204572726f72c42a20604261644f726967696e603a204f6e6c7920726f6f742063616e2065786563757465207472616e73616374696f6e2e5d012a2060496e73756666696369656e7442616c616e6365603a2049662074726561737572792062616c616e636573206973206e6f7420656e6f75676820746f20636f76657220616c6c2062656e656669636961726965732e25012a2060496e76616c69644964656e74697479603a204966206f6e65206f66207468652062656e656669636961726965732068617320616e20696e76616c6964206964656e746974792e347265696d62757273656d656e74040118616d6f756e7418013042616c616e63654f663c543e00010c1d014974207472616e7366657273207468652073706563696669632060616d6f756e74602066726f6d20606f726967696e60206163636f756e7420696e746f2074726561737572792e0049014f6e6c79206163636f756e747320776869636820617265206173736f63696174656420746f20616e206964656e746974792063616e206d616b65206120646f6e6174696f6e20746f2074726561737572792e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e65070000026907006907084c706f6c796d6573685f7072696d6974697665732c42656e6566696369617279041c42616c616e636501180008010869648001284964656e746974794964000118616d6f756e7418011c42616c616e636500006d070c3870616c6c65745f7574696c6974791870616c6c65741043616c6c04045400012814626174636804011463616c6c737107017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e0000487c53656e642061206261746368206f662064697370617463682063616c6c732e00b04d61792062652063616c6c65642066726f6d20616e79206f726967696e2065786365707420604e6f6e65602e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e0055014966206f726967696e20697320726f6f74207468656e207468652063616c6c7320617265206469737061746368656420776974686f757420636865636b696e67206f726967696e2066696c7465722e202854686973ec696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e0034232320436f6d706c6578697479d02d204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e005501546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e31016576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e207468655501604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d6164654d01616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c65746564604c6576656e74206973206465706f73697465642e2072656c61795f74780c0118746172676574000130543a3a4163636f756e7449640001247369676e617475726521070150543a3a4f6666436861696e5369676e617475726500011063616c6c75070198556e6971756543616c6c3c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000134a052656c617920612063616c6c20666f722061207461726765742066726f6d20616e206f726967696e00510152656c6179696e6720696e207468697320636f6e746578742072656665727320746f20746865206162696c697479206f66206f726967696e20746f206d616b6520612063616c6c206f6e20626568616c66206f661c7461726765742e00684665657320617265206368617267656420746f206f726967696e00302320506172616d6574657273842d2060746172676574603a204163636f756e7420746f2062652072656c61796564e82d20607369676e6174757265603a205369676e61747572652066726f6d2074617267657420617574686f72697a696e67207468652072656c6179c02d206063616c6c603a2043616c6c20746f2062652072656c61796564206f6e20626568616c66206f66207461726765740040504f4c594d4553483a2061646465642e2462617463685f616c6c04011463616c6c737107017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000234ec53656e642061206261746368206f662064697370617463682063616c6c7320616e642061746f6d6963616c6c792065786563757465207468656d2e21015468652077686f6c65207472616e73616374696f6e2077696c6c20726f6c6c6261636b20616e64206661696c20696620616e79206f66207468652063616c6c73206661696c65642e00b04d61792062652063616c6c65642066726f6d20616e79206f726967696e2065786365707420604e6f6e65602e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e0055014966206f726967696e20697320726f6f74207468656e207468652063616c6c7320617265206469737061746368656420776974686f757420636865636b696e67206f726967696e2066696c7465722e202854686973ec696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e0034232320436f6d706c6578697479d02d204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c64697370617463685f617308012461735f6f726967696e79070154426f783c543a3a50616c6c6574734f726967696e3e00011063616c6c0d06017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000318c84469737061746368657320612066756e6374696f6e2063616c6c207769746820612070726f7669646564206f726967696e2e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e0034232320436f6d706c65786974791c2d204f2831292e2c666f7263655f626174636804011463616c6c737107017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e0004347c53656e642061206261746368206f662064697370617463682063616c6c732ed4556e6c696b6520606261746368602c20697420616c6c6f7773206572726f727320616e6420776f6e277420696e746572727570742e00b04d61792062652063616c6c65642066726f6d20616e79206f726967696e2065786365707420604e6f6e65602e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e004d014966206f726967696e20697320726f6f74207468656e207468652063616c6c732061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e202854686973ec696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e0034232320436f6d706c6578697479d02d204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c776974685f77656967687408011063616c6c0d06017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000118776569676874200118576569676874000518c4446973706174636820612066756e6374696f6e2063616c6c2077697468206120737065636966696564207765696768742e002d01546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b8526f6f74206f726967696e20746f20737065636966792074686520776569676874206f66207468652063616c6c2e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e2462617463685f6f6c6404011463616c6c737107017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000650c44469737061746368206d756c7469706c652063616c6c732066726f6d207468652073656e6465722773206f726967696e2e00e8546869732077696c6c206578656375746520756e74696c20746865206669727374206f6e65206661696c7320616e64207468656e2073746f702e00ac4d61792062652063616c6c65642066726f6d20726f6f74206f722061207369676e6564206f726967696e2e00302320506172616d6574657273ec2d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e00202320576569676874a02d205468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602e302d204f6e65206576656e742e00bd01546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732065786365707420616e20756e7369676e6564206f726967696e2e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e31016576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e207468656101604261746368496e7465727275707465644f6c6460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d6164655901616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c657465644f6c64604c6576656e74206973206465706f73697465642e00b8504f4c594d4553483a2052656e616d65642066726f6d206062617463686020616e6420646570726563617465642e3062617463685f61746f6d696304011463616c6c737107017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000754c44469737061746368206d756c7469706c652063616c6c732066726f6d207468652073656e6465722773206f726967696e2e001501546869732077696c6c206578656375746520616c6c2063616c6c732c20696e206f726465722c2073746f7070696e6720617420746865206669727374206661696c7572652cc0696e207768696368206361736520746865207374617465206368616e6765732061726520726f6c6c6564206261636b2e31014f6e206661696c7572652c20616e206576656e7420604261746368496e7465727275707465644f6c64286661696c7572655f6964782c206572726f722960206973206465706f73697465642e00ac4d61792062652063616c6c65642066726f6d20726f6f74206f722061207369676e6564206f726967696e2e00302320506172616d6574657273ec2d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e00202320576569676874a02d205468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602e302d204f6e65206576656e742e001501546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732065786365707420616e20756e7369676e6564206f726967696e2ef4546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e206576656e74206973206465706f73697465642ef0496620616e792063616c6c206661696c65642c207468656e20604261746368496e7465727275707465644f6c6460206973206465706f73697465642e2101496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c657465644f6c6460206576656e74206973206465706f73697465642e0054504f4c594d4553483a20646570726563617465642e4062617463685f6f7074696d697374696304011463616c6c737107017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00085cc44469737061746368206d756c7469706c652063616c6c732066726f6d207468652073656e6465722773206f726967696e2e000101546869732077696c6c206578656375746520616c6c2063616c6c732c20696e206f726465722c20697272657370656374697665206f66206661696c757265732e0901416e79206661696c757265732077696c6c20626520617661696c61626c6520696e2061206042617463684f7074696d69737469634661696c656460206576656e742e00ac4d61792062652063616c6c65642066726f6d20726f6f74206f722061207369676e6564206f726967696e2e00302320506172616d6574657273ec2d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e0000202320576569676874a02d205468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602e302d204f6e65206576656e742e001501546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732065786365707420616e20756e7369676e6564206f726967696e2ef4546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e206576656e74206973206465706f73697465642ef8496620616e792063616c6c206661696c65642c207468656e206042617463684f7074696d69737469634661696c656460206973206465706f73697465642cfc77697468206120766563746f72206f66206576656e7420636f756e747320666f7220656163682063616c6c2061732077656c6c206173206120766563746f72286f66206572726f72732e2101496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c657465644f6c6460206576656e74206973206465706f73697465642e0054504f4c594d4553483a20646570726563617465642e3461735f64657269766174697665080114696e6465785d03010c75313600011063616c6c0d06017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000918dc53656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e00550146696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e207768696368bc757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e71070000020d06007507083870616c6c65745f7574696c69747928556e6971756543616c6c040443010d06000801146e6f6e6365280148417574686f72697a6174696f6e4e6f6e636500011063616c6c0d060118426f783c433e000079070c60706f6c796d6573685f72756e74696d655f646576656c6f701c72756e74696d65304f726967696e43616c6c65720001141873797374656d04007d0701746672616d655f73797374656d3a3a4f726967696e3c52756e74696d653e00000044506f6c796d657368436f6d6d69747465650400810701f870616c6c65745f636f6d6d69747465653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6d6d69747465653a3a496e7374616e6365313e00090048546563686e6963616c436f6d6d69747465650400850701f870616c6c65745f636f6d6d69747465653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6d6d69747465653a3a496e7374616e6365333e000b004055706772616465436f6d6d69747465650400890701f870616c6c65745f636f6d6d69747465653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6d6d69747465653a3a496e7374616e6365343e000d0010566f696404008d0701110173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a566f6964000400007d070c346672616d655f737570706f7274206469737061746368245261774f726967696e04244163636f756e7449640100010c10526f6f74000000185369676e656404000001244163636f756e744964000100104e6f6e65000200008107084070616c6c65745f636f6d6d6974746565245261774f726967696e08244163636f756e74496401000449014d01010420456e646f72736564000000008507084070616c6c65745f636f6d6d6974746565245261774f726967696e08244163636f756e74496401000449016901010420456e646f72736564000000008907084070616c6c65745f636f6d6d6974746565245261774f726967696e08244163636f756e74496401000449017901010420456e646f72736564000000008d07081c73705f636f726510566f6964000100009107082c70616c6c65745f626173651043616c6c0404540001000c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e9507085870616c6c65745f65787465726e616c5f6167656e74731043616c6c040454000120306372656174655f67726f757008012061737365745f6964a8011c417373657449440001147065726d73b8015045787472696e7369635065726d697373696f6e73000048ec43726561746573206120637573746f6d206167656e742067726f7570202841472920666f722074686520676976656e206061737365745f6964602e00d45468652041472077696c6c206861766520746865207065726d697373696f6e7320617320676976656e20627920607065726d73602e290154686973206e6577204147206973207468656e2061737369676e656420606964203d204147496453657175656e63653a3a6765742829202b20316020617320697473206041474964602c4101776869636820796f752063616e2075736520617320604167656e7447726f75703a3a437573746f6d2869642960207768656e20616464696e67206167656e747320666f72206061737365745f6964602e002c2320417267756d656e7473dc2d2060617373657449446020746865205b60417373657449445d20746f206164642074686520637573746f6d2067726f757020666f722e902d20607065726d7360207468617420746865206e65772041472077696c6c20686176652e002023204572726f727339012d2060556e617574686f72697a65644167656e746020696620606f726967696e6020776173206e6f7420617574686f72697a656420617320616e206167656e7420746f2063616c6c20746869732e21012d2060546f6f4c6f6e676020696620607065726d73602068616420736f6d6520737472696e67206f72206c697374206c656e67746820746861742077617320746f6f206c6f6e672e25012d2060436f756e7465724f766572666c6f776020696620604147496453657175656e63653a3a6765742829202b20316020776f756c642065786365656420607533323a3a4d4158602e003423205065726d697373696f6e731c2a2041737365741c2a204167656e74547365745f67726f75705f7065726d697373696f6e730c012061737365745f6964a8011c41737365744944000108696435010110414749640001147065726d73b8015045787472696e7369635065726d697373696f6e7300013c59015570646174657320746865207065726d697373696f6e73206f662074686520637573746f6d204147206964656e74696669656420627920606964602c20666f722074686520676976656e206061737365745f6964602e002c2320417267756d656e7473d02d2060617373657449446020746865205b60417373657449445d2074686520637573746f6d2041472062656c6f6e677320746f2eac2d206069646020666f722074686520637573746f6d2041472077697468696e206061737365745f6964602e942d20607065726d736020746f207570646174652074686520637573746f6d20414720746f2e002023204572726f727339012d2060556e617574686f72697a65644167656e746020696620606f726967696e6020776173206e6f7420617574686f72697a656420617320616e206167656e7420746f2063616c6c20746869732e21012d2060546f6f4c6f6e676020696620607065726d73602068616420736f6d6520737472696e67206f72206c697374206c656e67746820746861742077617320746f6f206c6f6e672ecc2d20604e6f53756368414760206966206069646020646f6573206e6f74206964656e74696679206120637573746f6d2041472e003423205065726d697373696f6e731c2a2041737365741c2a204167656e743072656d6f76655f6167656e7408012061737365745f6964a8011c417373657449440001146167656e748001284964656e746974794964000238a452656d6f76652074686520676976656e20606167656e74602066726f6d206061737365745f6964602e002c2320417267756d656e7473e82d2060617373657449446020746865205b60417373657449445d2074686174206861732074686520606167656e746020746f2072656d6f76652e882d20606167656e7460206f66206061737365745f69646020746f2072656d6f76652e002023204572726f727339012d2060556e617574686f72697a65644167656e746020696620606f726967696e6020776173206e6f7420617574686f72697a656420617320616e206167656e7420746f2063616c6c20746869732ee02d20604e6f74416e4167656e746020696620606167656e7460206973206e6f7420616e206167656e74206f66206061737365745f6964602ee82d206052656d6f76696e674c61737446756c6c4167656e746020696620606167656e746020697320746865206c6173742066756c6c206f6e652e003423205065726d697373696f6e731c2a2041737365741c2a204167656e7420616264696361746504012061737365745f6964a8011c4173736574494400032c884162646963617465206167656e747368697020666f72206061737365745f6964602e002c2320417267756d656e7473ec2d2060617373657449446020746865205b60417373657449445d206f66207768696368207468652063616c6c657220697320616e206167656e742e002023204572726f7273ec2d20604e6f74416e4167656e7460206966207468652063616c6c6572206973206e6f7420616e206167656e74206f66206061737365745f6964602efc2d206052656d6f76696e674c61737446756c6c4167656e7460206966207468652063616c6c657220697320746865206c6173742066756c6c206167656e742e003423205065726d697373696f6e731c2a204173736574306368616e67655f67726f75700c012061737365745f6964a8011c417373657449440001146167656e748001284964656e74697479496400011467726f7570310101284167656e7447726f7570000440f44368616e676520746865206167656e742067726f7570207468617420606167656e74602062656c6f6e677320746f20696e206061737365745f6964602e002c2320417267756d656e7473c02d2060617373657449446020746865205b60417373657449445d2074686174206861732074686520606167656e74602ec02d20606167656e7460206f66206061737365745f69646020746f206368616e6765207468652067726f757020666f722ed02d206067726f757060207468617420606167656e74602077696c6c2062656c6f6e6720746f20696e206061737365745f6964602e002023204572726f727339012d2060556e617574686f72697a65644167656e746020696620606f726967696e6020776173206e6f7420617574686f72697a656420617320616e206167656e7420746f2063616c6c20746869732ecc2d20604e6f53756368414760206966206069646020646f6573206e6f74206964656e74696679206120637573746f6d2041472ee02d20604e6f74416e4167656e746020696620606167656e7460206973206e6f7420616e206167656e74206f66206061737365745f6964602e2d012d206052656d6f76696e674c61737446756c6c4167656e746020696620606167656e7460207761732061206046756c6c60206f6e6520616e64206973206265696e672064656d6f7465642e003423205065726d697373696f6e731c2a2041737365741c2a204167656e744c6163636570745f6265636f6d655f6167656e7404011c617574685f696428010c753634000540010141636365707420616e20617574686f72697a6174696f6e20627920616e206167656e742022416c696365222077686f206973737565642060617574685f696460d4746f20616c736f206265636f6d6520616e206167656e74206f662074686520617373657420416c696365207370656369666965642e002c2320417267756d656e7473d02d2060617574685f696460206964656e74696679696e672074686520617574686f72697a6174696f6e20746f206163636570742e002023204572726f727345012d2060417574686f72697a6174696f6e4572726f723a3a496e76616c6964602069662060617574685f69646020646f6573206e6f7420657869737420666f722074686520676976656e2063616c6c65722e35012d2060417574686f72697a6174696f6e4572726f723a3a45787069726564602069662060617574685f69646020697320666f7220616e206175746820746861742068617320657870697265642e4d012d2060417574686f72697a6174696f6e4572726f723a3a42616454797065602069662060617574685f69646020776173206e6f7420666f72206120604265636f6d654167656e7460206175746820747970652e25012d2060556e617574686f72697a65644167656e74602069662022416c69636522206973206e6f74207065726d697373696f6e656420746f2070726f766964652074686520617574682e0d012d20604e6f53756368414760206966207468652067726f757020726566657272656420746f206120637573746f6d207468617420646f6573206e6f742065786973742e09012d2060416c7265616479416e4167656e7460206966207468652063616c6c657220697320616c726561647920616e206167656e74206f66207468652061737365742e003423205065726d697373696f6e731c2a204167656e74646372656174655f67726f75705f616e645f6164645f6175746810012061737365745f6964a8011c417373657449440001147065726d73b8015045787472696e7369635065726d697373696f6e730001187461726765748001284964656e746974794964000118657870697279050101444f7074696f6e3c543a3a4d6f6d656e743e000614e85574696c6974792065787472696e73696320746f20626174636820606372656174655f67726f75706020616e642020606164645f61757468602e003423205065726d697373696f6e731c2a2041737365741c2a204167656e74786372656174655f616e645f6368616e67655f637573746f6d5f67726f75700c012061737365745f6964a8011c417373657449440001147065726d73b8015045787472696e7369635065726d697373696f6e730001146167656e748001284964656e74697479496400071455015574696c6974792065787472696e73696320746f20626174636820606372656174655f67726f75706020616e642020606368616e67655f67726f75706020666f7220637573746f6d2067726f757073206f6e6c792e003423205065726d697373696f6e731c2a2041737365741c2a204167656e740c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e9907083870616c6c65745f72656c617965721043616c6c040454000118387365745f706179696e675f6b6579080120757365725f6b6579000130543a3a4163636f756e74496400012c706f6c79785f6c696d697418011c42616c616e6365000020bd014372656174657320616e20617574686f72697a6174696f6e20746f20616c6c6f772060757365725f6b65796020746f20616363657074207468652063616c6c65722028606f726967696e203d3d20706179696e675f6b6579602920617320746865697220737562736964697365722e002c2320417267756d656e74739c2d2060757365725f6b657960207468652075736572206b657920746f207375627369646973652ee42d2060706f6c79785f6c696d6974602074686520696e697469616c20504f4c5958206c696d697420666f72207468697320737562736964792e002023204572726f727331012d2060556e617574686f72697a656443616c6c65726020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2063616c6c20746869732065787472696e7369632e446163636570745f706179696e675f6b657904011c617574685f696428010c753634000138944163636570747320612060706179696e675f6b65796020617574686f72697a6174696f6e2e002c2320417267756d656e7473e82d2060617574685f6964602074686520617574686f72697a6174696f6e20696420746f2061636365707420612060706179696e675f6b6579602e002023204572726f727345012d2060417574686f72697a6174696f6e4572726f723a3a496e76616c6964602069662060617574685f69646020646f6573206e6f7420657869737420666f722074686520676976656e2063616c6c65722e2d012d2060417574686f72697a6174696f6e4572726f723a3a45787069726564602069662060617574685f6964602074686520617574686f72697a6174696f6e2068617320657870697265642e6d012d2060417574686f72697a6174696f6e4572726f723a3a42616454797065602069662060617574685f69646020776173206e6f742061206041646452656c61796572506179696e674b65796020617574686f72697a6174696f6e2ea5012d20604e6f74417574686f72697a6564466f72557365724b65796020696620606f726967696e60206973206e6f7420617574686f72697a656420746f206163636570742074686520617574686f72697a6174696f6e20666f72207468652060757365725f6b6579602ed9012d20604e6f74417574686f72697a6564466f72506179696e674b6579602069662074686520617574686f72697a6174696f6e20776173206372656174656420616e206964656e7469747920646966666572656e742066726f6d207468652060706179696e675f6b6579602773206964656e746974792e31012d2060557365724b65794364644d697373696e6760206966207468652060757365725f6b657960206973206e6f7420617474616368656420746f2061204344442764206964656e746974792e41012d2060506179696e674b65794364644d697373696e6760206966207468652060706179696e675f6b657960206973206e6f7420617474616368656420746f2061204344442764206964656e746974792e31012d2060556e617574686f72697a656443616c6c65726020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2063616c6c20746869732065787472696e7369632e4472656d6f76655f706179696e675f6b6579080120757365725f6b6579000130543a3a4163636f756e744964000128706179696e675f6b6579000130543a3a4163636f756e74496400022cac52656d6f766573207468652060706179696e675f6b6579602066726f6d20612060757365725f6b6579602e002c2320417267756d656e7473d42d2060757365725f6b657960207468652075736572206b657920746f2072656d6f76652074686520737562736964792066726f6d2e09012d2060706179696e675f6b6579602074686520706179696e67206b6579207468617420776173207375627369646973696e67207468652060757365725f6b6579602e002023204572726f72738d012d20604e6f74417574686f72697a6564466f72557365724b65796020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2072656d6f766520746865207375627369647920666f72207468652060757365725f6b6579602ef82d20604e6f506179696e674b657960206966207468652060757365725f6b65796020646f65736e2774206861766520612060706179696e675f6b6579602e31012d20604e6f74506179696e674b657960206966207468652060706179696e675f6b65796020646f65736e2774206d61746368207468652063757272656e742060706179696e675f6b6579602e31012d2060556e617574686f72697a656443616c6c65726020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2063616c6c20746869732065787472696e7369632e487570646174655f706f6c79785f6c696d6974080120757365725f6b6579000130543a3a4163636f756e74496400012c706f6c79785f6c696d697418011c42616c616e6365000328b4557064617465732074686520617661696c61626c6520504f4c595820666f7220612060757365725f6b6579602e002c2320417267756d656e74731d012d2060757365725f6b657960207468652075736572206b6579206f6620746865207375627369647920746f207570646174652074686520617661696c61626c6520504f4c59582e35012d2060706f6c79785f6c696d6974602074686520616d6f756e74206f6620504f4c595820617661696c61626c6520666f72207375627369646973696e67207468652060757365725f6b6579602e002023204572726f7273f82d20604e6f506179696e674b657960206966207468652060757365725f6b65796020646f65736e2774206861766520612060706179696e675f6b6579602e11012d20604e6f74506179696e674b65796020696620606f726967696e6020646f65736e2774206d61746368207468652063757272656e742060706179696e675f6b6579602e31012d2060556e617574686f72697a656443616c6c65726020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2063616c6c20746869732065787472696e7369632e50696e6372656173655f706f6c79785f6c696d6974080120757365725f6b6579000130543a3a4163636f756e744964000118616d6f756e7418011c42616c616e636500042cb8496e6372656173652074686520617661696c61626c6520504f4c595820666f7220612060757365725f6b6579602e002c2320417267756d656e74731d012d2060757365725f6b657960207468652075736572206b6579206f6620746865207375627369647920746f207570646174652074686520617661696c61626c6520504f4c59582e0d012d2060616d6f756e74602074686520616d6f756e74206f6620504f4c595820746f2061646420746f207468652073756273696479206f662060757365725f6b6579602e002023204572726f7273f82d20604e6f506179696e674b657960206966207468652060757365725f6b65796020646f65736e2774206861766520612060706179696e675f6b6579602e11012d20604e6f74506179696e674b65796020696620606f726967696e6020646f65736e2774206d61746368207468652063757272656e742060706179696e675f6b6579602e31012d2060556e617574686f72697a656443616c6c65726020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2063616c6c20746869732065787472696e7369632e3d012d20604f7665726c6f776020696620746865207375627369647927732072656d61696e696e6720504f4c595820776f756c642068617665206f766572666c6f7765642060753132383a3a4d4158602e5064656372656173655f706f6c79785f6c696d6974080120757365725f6b6579000130543a3a4163636f756e744964000118616d6f756e7418011c42616c616e636500052cb844656372656173652074686520617661696c61626c6520504f4c595820666f7220612060757365725f6b6579602e002c2320417267756d656e74731d012d2060757365725f6b657960207468652075736572206b6579206f6620746865207375627369647920746f207570646174652074686520617661696c61626c6520504f4c59582e21012d2060616d6f756e74602074686520616d6f756e74206f6620504f4c595820746f2072656d6f76652066726f6d207468652073756273696479206f662060757365725f6b6579602e002023204572726f7273f82d20604e6f506179696e674b657960206966207468652060757365725f6b65796020646f65736e2774206861766520612060706179696e675f6b6579602e11012d20604e6f74506179696e674b65796020696620606f726967696e6020646f65736e2774206d61746368207468652063757272656e742060706179696e675f6b6579602e31012d2060556e617574686f72697a656443616c6c65726020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2063616c6c20746869732065787472696e7369632e09012d20604f7665726c6f776020696620746865207375627369647920686173206c657373207468656e2060616d6f756e746020504f4c59582072656d61696e696e672e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e9d070c4070616c6c65745f636f6e7472616374731870616c6c65741043616c6c0404540001243c63616c6c5f6f6c645f77656967687414011064657374850501504163636f756e7449644c6f6f6b75704f663c543e00011476616c7565d901013042616c616e63654f663c543e0001246761735f6c696d6974a10701244f6c6457656967687400015473746f726167655f6465706f7369745f6c696d6974a90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e0001106461746130011c5665633c75383e0000041501446570726563617465642076657273696f6e206966205b6053656c663a3a63616c6c605d20666f722075736520696e20616e20696e2d73746f72616765206043616c6c602e80696e7374616e74696174655f776974685f636f64655f6f6c645f77656967687418011476616c7565d901013042616c616e63654f663c543e0001246761735f6c696d6974a10701244f6c6457656967687400015473746f726167655f6465706f7369745f6c696d6974a90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e000110636f646530011c5665633c75383e0001106461746130011c5665633c75383e00011073616c7430011c5665633c75383e0001045901446570726563617465642076657273696f6e206966205b6053656c663a3a696e7374616e74696174655f776974685f636f6465605d20666f722075736520696e20616e20696e2d73746f72616765206043616c6c602e58696e7374616e74696174655f6f6c645f77656967687418011476616c7565d901013042616c616e63654f663c543e0001246761735f6c696d6974a10701244f6c6457656967687400015473746f726167655f6465706f7369745f6c696d6974a90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e000124636f64655f686173682c012c436f6465486173683c543e0001106461746130011c5665633c75383e00011073616c7430011c5665633c75383e0002043101446570726563617465642076657273696f6e206966205b6053656c663a3a696e7374616e7469617465605d20666f722075736520696e20616e20696e2d73746f72616765206043616c6c602e2c75706c6f61645f636f64650c0110636f646530011c5665633c75383e00015473746f726167655f6465706f7369745f6c696d6974a90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e00012c64657465726d696e69736dad07012c44657465726d696e69736d000350ec55706c6f6164206e65772060636f64656020776974686f757420696e7374616e74696174696e67206120636f6e74726163742066726f6d2069742e00210149662074686520636f646520646f6573206e6f7420616c72656164792065786973742061206465706f7369742069732072657365727665642066726f6d207468652063616c6c65724501616e6420756e7265736572766564206f6e6c79207768656e205b6053656c663a3a72656d6f76655f636f6465605d2069732063616c6c65642e205468652073697a65206f66207468652072657365727665f0646570656e6473206f6e2074686520696e737472756d656e7465642073697a65206f66207468652074686520737570706c6965642060636f6465602e00310149662074686520636f646520616c72656164792065786973747320696e2073746f726167652069742077696c6c207374696c6c2072657475726e20604f6b6020616e642075706772616465739474686520696e2073746f726167652076657273696f6e20746f207468652063757272656e74d05b60496e737472756374696f6e576569676874733a3a76657273696f6e605d28496e737472756374696f6e57656967687473292e0055012d206064657465726d696e69736d603a20496620746869732069732073657420746f20616e79206f746865722076616c756520627574205b6044657465726d696e69736d3a3a44657465726d696e6973746963605d450120207468656e20746865206f6e6c792077617920746f20757365207468697320636f646520697320746f2064656c65676174652063616c6c20696e746f2069742066726f6d20616e206f6666636861696efc2020657865637574696f6e2e2053657420746f205b6044657465726d696e69736d3a3a44657465726d696e6973746963605d20696620696e20646f7562742e001823204e6f7465005901416e796f6e652063616e20696e7374616e7469617465206120636f6e74726163742066726f6d20616e792075706c6f6164656420636f646520616e6420746875732070726576656e74206974732072656d6f76616c2e4101546f2061766f6964207468697320736974756174696f6e206120636f6e7374727563746f7220636f756c6420656d706c6f792061636365737320636f6e74726f6c20736f20746861742069742063616e39016f6e6c7920626520696e7374616e746961746564206279207065726d697373696f6e656420656e7469746965732e205468652073616d652069732074727565207768656e2075706c6f6164696e67a07468726f756768205b6053656c663a3a696e7374616e74696174655f776974685f636f6465605d2e2c72656d6f76655f636f6465040124636f64655f686173682c012c436f6465486173683c543e000410350152656d6f76652074686520636f64652073746f72656420756e6465722060636f64655f686173686020616e6420726566756e6420746865206465706f73697420746f20697473206f776e65722e0045014120636f64652063616e206f6e6c792062652072656d6f76656420627920697473206f726967696e616c2075706c6f616465722028697473206f776e65722920616e64206f6e6c79206966206974206973646e6f74207573656420627920616e7920636f6e74726163742e207365745f636f646508011064657374850501504163636f756e7449644c6f6f6b75704f663c543e000124636f64655f686173682c012c436f6465486173683c543e000528090150726976696c656765642066756e6374696f6e2074686174206368616e6765732074686520636f6465206f6620616e206578697374696e6720636f6e74726163742e004501546869732074616b65732063617265206f66207570646174696e6720726566636f756e747320616e6420616c6c206f74686572206e6563657373617279206f7065726174696f6e732e2052657475726e73e8616e206572726f7220696620656974686572207468652060636f64655f6861736860206f722060646573746020646f206e6f742065786973742e001823204e6f74650031015468697320646f6573202a2a6e6f742a2a206368616e6765207468652061646472657373206f662074686520636f6e747261637420696e207175657374696f6e2e2054686973206d65616e733d01746861742074686520636f6e74726163742061646472657373206973206e6f206c6f6e67657220646572697665642066726f6d2069747320636f646520686173682061667465722063616c6c696e67487468697320646973706174636861626c652e1063616c6c14011064657374850501504163636f756e7449644c6f6f6b75704f663c543e00011476616c7565d901013042616c616e63654f663c543e0001246761735f6c696d697420011857656967687400015473746f726167655f6465706f7369745f6c696d6974a90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e0001106461746130011c5665633c75383e00064005014d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e00302320506172616d657465727300a82a206064657374603a2041646472657373206f662074686520636f6e747261637420746f2063616c6c2efc2a206076616c7565603a205468652062616c616e636520746f207472616e736665722066726f6d2074686520606f726967696e6020746f206064657374602e15012a20606761735f6c696d6974603a2054686520676173206c696d697420656e666f72636564207768656e20657865637574696e672074686520636f6e7374727563746f722e55012a206073746f726167655f6465706f7369745f6c696d6974603a20546865206d6178696d756d20616d6f756e74206f662062616c616e636520746861742063616e20626520636861726765642066726f6d20746865a4202063616c6c657220746f2070617920666f72207468652073746f7261676520636f6e73756d65642ec42a206064617461603a2054686520696e707574206461746120746f207061737320746f2074686520636f6e74726163742e0025012a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c206265ac657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e15012a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e45012a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c11016120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e54696e7374616e74696174655f776974685f636f646518011476616c7565d901013042616c616e63654f663c543e0001246761735f6c696d697420011857656967687400015473746f726167655f6465706f7369745f6c696d6974a90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e000110636f646530011c5665633c75383e0001106461746130011c5665633c75383e00011073616c7430011c5665633c75383e0007683101496e7374616e7469617465732061206e657720636f6e74726163742066726f6d2074686520737570706c6965642060636f646560206f7074696f6e616c6c79207472616e7366657272696e6734736f6d652062616c616e63652e0021015468697320646973706174636861626c6520686173207468652073616d65206566666563742061732063616c6c696e67205b6053656c663a3a75706c6f61645f636f6465605d202b3d015b6053656c663a3a696e7374616e7469617465605d2e2042756e646c696e67207468656d20746f6765746865722070726f766964657320656666696369656e6379206761696e732e20506c65617365d8616c736f20636865636b2074686520646f63756d656e746174696f6e206f66205b6053656c663a3a75706c6f61645f636f6465605d2e00302320506172616d6574657273004d012a206076616c7565603a205468652062616c616e636520746f207472616e736665722066726f6d2074686520606f726967696e6020746f20746865206e65776c79206372656174656420636f6e74726163742e15012a20606761735f6c696d6974603a2054686520676173206c696d697420656e666f72636564207768656e20657865637574696e672074686520636f6e7374727563746f722e55012a206073746f726167655f6465706f7369745f6c696d6974603a20546865206d6178696d756d20616d6f756e74206f662062616c616e636520746861742063616e20626520636861726765642f7265736572766564c8202066726f6d207468652063616c6c657220746f2070617920666f72207468652073746f7261676520636f6e73756d65642ecc2a2060636f6465603a2054686520636f6e747261637420636f646520746f206465706c6f7920696e207261772062797465732ef42a206064617461603a2054686520696e707574206461746120746f207061737320746f2074686520636f6e747261637420636f6e7374727563746f722e31012a206073616c74603a205573656420666f722074686520616464726573732064657269766174696f6e2e20536565205b6050616c6c65743a3a636f6e74726163745f61646472657373605d2e0094496e7374616e74696174696f6e20697320657865637574656420617320666f6c6c6f77733a0059012d2054686520737570706c6965642060636f64656020697320696e737472756d656e7465642c206465706c6f7965642c20616e6420612060636f64655f6861736860206973206372656174656420666f7220746861741c2020636f64652e59012d204966207468652060636f64655f686173686020616c726561647920657869737473206f6e2074686520636861696e2074686520756e6465726c79696e672060636f6465602077696c6c206265207368617265642e49012d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e6465722c20636f64655f6861736820616e64207468652073616c742e01012d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732ec02d20546865206076616c756560206973207472616e7366657272656420746f20746865206e6577206163636f756e742e41012d2054686520606465706c6f79602066756e6374696f6e20697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e2c696e7374616e746961746518011476616c7565d901013042616c616e63654f663c543e0001246761735f6c696d697420011857656967687400015473746f726167655f6465706f7369745f6c696d6974a90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e000124636f64655f686173682c012c436f6465486173683c543e0001106461746130011c5665633c75383e00011073616c7430011c5665633c75383e000814fc496e7374616e746961746573206120636f6e74726163742066726f6d20612070726576696f75736c79206465706c6f796564207761736d2062696e6172792e003501546869732066756e6374696f6e206973206964656e746963616c20746f205b6053656c663a3a696e7374616e74696174655f776974685f636f6465605d2062757420776974686f7574207468654901636f6465206465706c6f796d656e7420737465702e20496e73746561642c207468652060636f64655f6861736860206f6620616e206f6e2d636861696e206465706c6f796564207761736d2062696e617279446d75737420626520737570706c6965642e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ea107000006a50700a507082873705f77656967687473244f6c645765696768740000040028010c7536340000a90704184f7074696f6e04045401d9010108104e6f6e6500000010536f6d650400d9010000010000ad070c4070616c6c65745f636f6e747261637473107761736d2c44657465726d696e69736d0001083444657465726d696e697374696300000048416c6c6f77496e64657465726d696e69736d00010000b1070848706f6c796d6573685f636f6e7472616374731043616c6c0404540001186c696e7374616e74696174655f776974685f636f64655f7065726d731c0124656e646f776d656e7418011c42616c616e63650001246761735f6c696d697420011857656967687400015473746f726167655f6465706f7369745f6c696d69743104013c4f7074696f6e3c42616c616e63653e000110636f646530011c5665633c75383e0001106461746130011c5665633c75383e00011073616c7430011c5665633c75383e0001147065726d73a0012c5065726d697373696f6e730000602d01496e7374616e746961746573206120736d61727420636f6e747261637420646566696e696e6720697420776974682074686520676976656e2060636f64656020616e64206073616c74602e00c454686520636f6e74726163742077696c6c2062652061747461636865642061732061207365636f6e64617279206b65792ce07769746820607065726d736020617320697473207065726d697373696f6e732c20746f20606f726967696e602773206964656e746974792e00e054686520636f6e7472616374206973207472616e736665727265642060656e646f776d656e746020616d6f756e74206f6620504f4c59582e98546869732069732064697374696e63742066726f6d2074686520606761735f6c696d6974602c1101776869636820636f6e74726f6c7320686f77206d7563682067617320746865206465706c6f796d656e7420636f6465206d6179206174206d6f737420636f6e73756d652e002c2320417267756d656e7473e82d2060656e646f776d656e746020616d6f756e74206f6620504f4c595820746f207472616e7366657220746f2074686520636f6e74726163742e55012d20606761735f6c696d69746020666f7220686f77206d756368206761732074686520606465706c6f796020636f646520696e2074686520636f6e7472616374206d6179206174206d6f737420636f6e73756d652e51012d206073746f726167655f6465706f7369745f6c696d69746020546865206d6178696d756d20616d6f756e74206f662062616c616e636520746861742063616e20626520636861726765642f7265736572766564c8202066726f6d207468652063616c6c657220746f2070617920666f72207468652073746f7261676520636f6e73756d65642ee82d2060636f646560207769746820746865205741534d2062696e61727920646566696e696e672074686520736d61727420636f6e74726163742ef02d206064617461602054686520696e707574206461746120746f207061737320746f2074686520636f6e747261637420636f6e7374727563746f722eb82d206073616c7460207573656420666f7220636f6e747261637420616464726573732064657269766174696f6e2e210120202042792076617279696e6720746869732c207468652073616d652060636f6465602063616e206265207573656420756e646572207468652073616d65206964656e746974792ebc2d20607065726d7360207468617420746865206e6577207365636f6e64617279206b65792077696c6c20686176652e002023204572726f727365012d20416c6c20746865206572726f727320696e206070616c6c65745f636f6e7472616374733a3a43616c6c3a3a696e7374616e74696174655f776974685f636f6465602063616e20616c736f2068617070656e20686572652ef02d204344442f5065726d697373696f6e732061726520636865636b65642c20756e6c696b6520696e206070616c6c65745f636f6e747261637473602e21012d204572726f72732074686174206172697365207768656e20616464696e672061206e6577207365636f6e64617279206b65792063616e20616c736f206f6363757220686572652e6c696e7374616e74696174655f776974685f686173685f7065726d731c0124656e646f776d656e7418011c42616c616e63650001246761735f6c696d697420011857656967687400015473746f726167655f6465706f7369745f6c696d69743104013c4f7074696f6e3c42616c616e63653e000124636f64655f686173682c012c436f6465486173683c543e0001106461746130011c5665633c75383e00011073616c7430011c5665633c75383e0001147065726d73a0012c5065726d697373696f6e7300016c3901496e7374616e746961746573206120736d61727420636f6e747261637420646566696e696e67207573696e672074686520676976656e2060636f64655f686173686020616e64206073616c74602e007c556e6c696b652060696e7374616e74696174655f776974685f636f6465602c69017468697320617373756d65732074686174206174206c65617374206f6e6520636f6e74726163742077697468207468652073616d65205741534d20636f64652068617320616c7265616479206265656e2075706c6f616465642e00c454686520636f6e74726163742077696c6c2062652061747461636865642061732061207365636f6e64617279206b65792ce07769746820607065726d736020617320697473207065726d697373696f6e732c20746f20606f726967696e602773206964656e746974792e00e054686520636f6e7472616374206973207472616e736665727265642060656e646f776d656e746020616d6f756e74206f6620504f4c59582e98546869732069732064697374696e63742066726f6d2074686520606761735f6c696d6974602c1101776869636820636f6e74726f6c7320686f77206d7563682067617320746865206465706c6f796d656e7420636f6465206d6179206174206d6f737420636f6e73756d652e002c2320417267756d656e7473e82d2060656e646f776d656e746020616d6f756e74206f6620504f4c595820746f207472616e7366657220746f2074686520636f6e74726163742e55012d20606761735f6c696d69746020666f7220686f77206d756368206761732074686520606465706c6f796020636f646520696e2074686520636f6e7472616374206d6179206174206d6f737420636f6e73756d652e51012d206073746f726167655f6465706f7369745f6c696d69746020546865206d6178696d756d20616d6f756e74206f662062616c616e636520746861742063616e20626520636861726765642f7265736572766564c8202066726f6d207468652063616c6c657220746f2070617920666f72207468652073746f7261676520636f6e73756d65642ec42d2060636f64655f6861736860206f6620616e20616c72656164792075706c6f61646564205741534d2062696e6172792ef02d206064617461602054686520696e707574206461746120746f207061737320746f2074686520636f6e747261637420636f6e7374727563746f722eb82d206073616c7460207573656420666f7220636f6e747261637420616464726573732064657269766174696f6e2e210120202042792076617279696e6720746869732c207468652073616d652060636f6465602063616e206265207573656420756e646572207468652073616d65206964656e746974792ebc2d20607065726d7360207468617420746865206e6577207365636f6e64617279206b65792077696c6c20686176652e002023204572726f72733d012d20416c6c20746865206572726f727320696e206070616c6c65745f636f6e7472616374733a3a43616c6c3a3a696e7374616e7469617465602063616e20616c736f2068617070656e20686572652ef02d204344442f5065726d697373696f6e732061726520636865636b65642c20756e6c696b6520696e206070616c6c65745f636f6e747261637473602e21012d204572726f72732074686174206172697365207768656e20616464696e672061206e6577207365636f6e64617279206b65792063616e20616c736f206f6363757220686572652e747570646174655f63616c6c5f72756e74696d655f77686974656c69737404011c75706461746573b50701605665633c2845787472696e73696349642c20626f6f6c293e000214745570646174652043616c6c52756e74696d652077686974656c6973742e002c2320417267756d656e7473002023204572726f727390696e7374616e74696174655f776974685f636f64655f61735f7072696d6172795f6b6579180124656e646f776d656e7418011c42616c616e63650001246761735f6c696d697420011857656967687400015473746f726167655f6465706f7369745f6c696d69743104013c4f7074696f6e3c42616c616e63653e000110636f646530011c5665633c75383e0001106461746130011c5665633c75383e00011073616c7430011c5665633c75383e0003302d01496e7374616e746961746573206120736d61727420636f6e747261637420646566696e696e6720697420776974682074686520676976656e2060636f64656020616e64206073616c74602e007d0154686520636f6e74726163742077696c6c2062652061747461636865642061732061207072696d617279206b6579206f662061206e65776c792063726561746564206368696c64206964656e74697479206f66207468652063616c6c65722e002c2320417267756d656e7473ec2d2060656e646f776d656e74603a20416d6f756e74206f6620504f4c595820746f207472616e7366657220746f2074686520636f6e74726163742e59012d20606761735f6c696d6974603a20466f7220686f77206d756368206761732074686520606465706c6f796020636f646520696e2074686520636f6e7472616374206d6179206174206d6f737420636f6e73756d652e19022d206073746f726167655f6465706f7369745f6c696d6974603a20546865206d6178696d756d20616d6f756e74206f662062616c616e636520746861742063616e20626520636861726765642f72657365727665642066726f6d207468652063616c6c657220746f2070617920666f72207468652073746f7261676520636f6e73756d65642ed82d2060636f6465603a20546865205741534d2062696e61727920646566696e696e672074686520736d61727420636f6e74726163742ef42d206064617461603a2054686520696e707574206461746120746f207061737320746f2074686520636f6e747261637420636f6e7374727563746f722ed5012d206073616c74603a205573656420666f7220636f6e747261637420616464726573732064657269766174696f6e2e2042792076617279696e6720746869732c207468652073616d652060636f6465602063616e206265207573656420756e646572207468652073616d65206964656e746974792e0090696e7374616e74696174655f776974685f686173685f61735f7072696d6172795f6b6579180124656e646f776d656e7418011c42616c616e63650001246761735f6c696d697420011857656967687400015473746f726167655f6465706f7369745f6c696d69743104013c4f7074696f6e3c42616c616e63653e000124636f64655f686173682c012c436f6465486173683c543e0001106461746130011c5665633c75383e00011073616c7430011c5665633c75383e0004383901496e7374616e746961746573206120736d61727420636f6e747261637420646566696e696e67207573696e672074686520676976656e2060636f64655f686173686020616e64206073616c74602e00e901556e6c696b652060696e7374616e74696174655f776974685f636f6465602c207468697320617373756d65732074686174206174206c65617374206f6e6520636f6e74726163742077697468207468652073616d65205741534d20636f64652068617320616c7265616479206265656e2075706c6f616465642e007d0154686520636f6e74726163742077696c6c2062652061747461636865642061732061207072696d617279206b6579206f662061206e65776c792063726561746564206368696c64206964656e74697479206f66207468652063616c6c65722e002c2320417267756d656e7473ec2d2060656e646f776d656e74603a20616d6f756e74206f6620504f4c595820746f207472616e7366657220746f2074686520636f6e74726163742e59012d20606761735f6c696d6974603a20666f7220686f77206d756368206761732074686520606465706c6f796020636f646520696e2074686520636f6e7472616374206d6179206174206d6f737420636f6e73756d652e19022d206073746f726167655f6465706f7369745f6c696d6974603a20546865206d6178696d756d20616d6f756e74206f662062616c616e636520746861742063616e20626520636861726765642f72657365727665642066726f6d207468652063616c6c657220746f2070617920666f72207468652073746f7261676520636f6e73756d65642ec82d2060636f64655f68617368603a206f6620616e20616c72656164792075706c6f61646564205741534d2062696e6172792ef42d206064617461603a2054686520696e707574206461746120746f207061737320746f2074686520636f6e747261637420636f6e7374727563746f722ed5012d206073616c74603a207573656420666f7220636f6e747261637420616464726573732064657269766174696f6e2e2042792076617279696e6720746869732c207468652073616d652060636f6465602063616e206265207573656420756e646572207468652073616d65206964656e746974792e002c757067726164655f61706908010c6170698d04010c4170690001306e6578745f75706772616465bd0701384e657874557067726164653c543e0005000c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652eb507000002b90700b907000004089504390100bd070848706f6c796d6573685f636f6e7472616374732c4e657874557067726164650404540000080134636861696e5f76657273696f6e91040130436861696e56657273696f6e0001206170695f68617368c1070138417069436f6465486173683c543e0000c1070848706f6c796d6573685f636f6e7472616374732c417069436f6465486173680404540000040110686173682c012c436f6465486173683c543e0000c5070c3c70616c6c65745f707265696d6167651870616c6c65741043616c6c040454000110346e6f74655f707265696d616765040114627974657330011c5665633c75383e000010745265676973746572206120707265696d616765206f6e2d636861696e2e00550149662074686520707265696d616765207761732070726576696f75736c79207265717565737465642c206e6f2066656573206f72206465706f73697473206172652074616b656e20666f722070726f766964696e67550174686520707265696d6167652e204f74686572776973652c2061206465706f7369742069732074616b656e2070726f706f7274696f6e616c20746f207468652073697a65206f662074686520707265696d6167652e3c756e6e6f74655f707265696d616765040110686173682c011c543a3a48617368000118dc436c65617220616e20756e72657175657374656420707265696d6167652066726f6d207468652072756e74696d652073746f726167652e00fc496620606c656e602069732070726f76696465642c207468656e2069742077696c6c2062652061206d7563682063686561706572206f7065726174696f6e2e0001012d206068617368603a205468652068617368206f662074686520707265696d61676520746f2062652072656d6f7665642066726f6d207468652073746f72652eb82d20606c656e603a20546865206c656e677468206f662074686520707265696d616765206f66206068617368602e40726571756573745f707265696d616765040110686173682c011c543a3a48617368000210410152657175657374206120707265696d6167652062652075706c6f6164656420746f2074686520636861696e20776974686f757420706179696e6720616e792066656573206f72206465706f736974732e00550149662074686520707265696d6167652072657175657374732068617320616c7265616479206265656e2070726f7669646564206f6e2d636861696e2c20776520756e7265736572766520616e79206465706f7369743901612075736572206d6179206861766520706169642c20616e642074616b652074686520636f6e74726f6c206f662074686520707265696d616765206f7574206f662074686569722068616e64732e48756e726571756573745f707265696d616765040110686173682c011c543a3a4861736800030cbc436c65617220612070726576696f75736c79206d616465207265717565737420666f72206120707265696d6167652e002d014e4f54453a2054484953204d555354204e4f542042452043414c4c4544204f4e20606861736860204d4f52452054494d4553205448414e2060726571756573745f707265696d616765602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ec907082870616c6c65745f6e66741043616c6c040454000110546372656174655f6e66745f636f6c6c656374696f6e0c012061737365745f6964cd07013c4f7074696f6e3c417373657449443e0001206e66745f74797065d107015c4f7074696f6e3c4e6f6e46756e6769626c65547970653e00013c636f6c6c656374696f6e5f6b657973d50701444e4654436f6c6c656374696f6e4b657973000044744372657465732061206e657720604e4654436f6c6c656374696f6e602e002c2320417267756d656e7473c5012a20606f726967696e60202d20636f6e7461696e7320746865207365636f6e64617279206b6579206f66207468652063616c6c65722028692e652e2077686f207369676e656420746865207472616e73616374696f6e20746f206578656375746520746869732066756e6374696f6e292e95012a206061737365745f696460202d206f7074696f6e616c205b6041737365744944605d206173736f63696174656420746f20746865206e657720636f6c6c656374696f6e2e20604e6f6e65602077696c6c206372656174652061206e65772061737365742e89012a20606e66745f7479706560202d20696e206361736520746865206173736574206861736e2774206265656e2063726561746564207965742c206f6e652077696c6c206265206372656174656420776974682074686520676976656e20747970652e79012a2060636f6c6c656374696f6e5f6b65797360202d20616c6c206d616e6461746f7279206d65746164617461206b65797320746861742074686520746f6b656e7320696e2074686520636f6c6c656374696f6e206d75737420686176652e00242323204572726f727371012d2060436f6c6c656374696f6e416c726564795265676973746572656460202d206966207468652061737365745f696420697320616c7265616479206173736f63696174656420746f20616e204e465420636f6c6c656374696f6e2e09012d2060496e76616c696441737365745479706560202d20696620746865206173736f636961746564206173736574206973206e6f74206f662074797065204e46542ed1012d20604d61784e756d6265724f664b657973457863656564656460202d20696620746865206e756d626572206f66206d65746164617461206b65797320666f722074686520636f6c6c656374696f6e2069732067726561746572207468616e20746865206d6178696d756d20616c6c6f7765642eb1012d2060556e726567697374657265644d657461646174614b657960202d20696620616e79206f6620746865206d65746164617461206b657973206e656564656420666f722074686520636f6c6c656374696f6e20686173206e6f74206265656e20726567697374657265642e45012d20604475706c69636174654d657461646174614b657960202d2069662061206475706c6963617465206d65746164617461206b65797320686173206265656e2070617373656420617320696e7075742e003423205065726d697373696f6e731c2a2041737365742469737375655f6e66740c012061737365745f6964a8011c4173736574494400015c6e66745f6d657461646174615f61747472696275746573dd0701645665633c4e46544d657461646174614174747269627574653e000138706f7274666f6c696f5f6b696e64ec0134506f7274666f6c696f4b696e640001447049737375657320616e204e465420746f207468652063616c6c65722e002c2320417267756d656e74733d012a20606f726967696e60202d2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed42a206061737365745f696460202d20746865205b6041737365744944605d206f6620746865204e465420636f6c6c656374696f6e2e45012a20606e66745f6d657461646174615f6174747269627574657360202d20616c6c206d616e6461746f7279206d65746164617461206b65797320616e642076616c75657320666f7220746865204e46542e11012d2060706f7274666f6c696f5f6b696e6460202d2074686520706f7274666f6c696f20746861742077696c6c207265636569766520746865206d696e746564206e66742e00242323204572726f727385012d2060436f6c6c656374696f6e4e6f74466f756e6460202d2069662074686520636f6c6c656374696f6e206173736f63696174656420746f2074686520676976656e2061737365745f696420686173206e6f74206265656e20637265617465642ec9022d2060496e76616c69644d6574616461746141747472696275746560202d20696620746865206e756d626572206f662061747472696275746573206973206e6f7420657175616c20746f20746865206e756d6265722073657420696e2074686520636f6c6c656374696f6e206f7220617474656d7074696e6720746f2073657420612076616c756520666f722061206b6579206e6f7420646566696e69656420696e2074686520636f6c6c656374696f6e2e45012d20604475706c69636174654d657461646174614b657960202d2069662061206475706c6963617465206d65746164617461206b65797320686173206265656e2070617373656420617320696e7075742e00003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f2872656465656d5f6e66740c012061737365745f6964a8011c417373657449440001186e66745f6964bd0301144e46544964000138706f7274666f6c696f5f6b696e64ec0134506f7274666f6c696f4b696e6400023cc852656465656d732074686520676976656e204e46542066726f6d207468652063616c6c6572277320706f7274666f6c696f2e002c2320417267756d656e74733d012a20606f726967696e60202d2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed42a206061737365745f696460202d20746865205b6041737365744944605d206f6620746865204e465420636f6c6c656374696f6e2eb02a20606e66745f696460202d20746865206964206f6620746865204e465420746f206265206275726e65642ee42a2060706f7274666f6c696f5f6b696e6460202d2074686520706f7274666f6c696f207468617420636f6e7461696e7320746865206e66742e00242323204572726f727385012d2060436f6c6c656374696f6e4e6f74466f756e6460202d2069662074686520636f6c6c656374696f6e206173736f63696174656420746f2074686520676976656e2061737365745f696420686173206e6f74206265656e20637265617465642e0d012d20604e46544e6f74466f756e6460202d2069662074686520676976656e204e465420646f6573206e6f7420657869737420696e2074686520706f7274666f6c696f2e003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f4c636f6e74726f6c6c65725f7472616e736665720c01106e667473b50301104e465473000140736f757263655f706f7274666f6c696fe8012c506f7274666f6c696f496400015863616c6c6572735f706f7274666f6c696f5f6b696e64ec0134506f7274666f6c696f4b696e6400032c3501466f7263657320746865207472616e73666572206f66204e4654732066726f6d206120676976656e20706f7274666f6c696f20746f207468652063616c6c6572277320706f7274666f6c696f2e002c2320417267756d656e74733d012a20606f726967696e60202d2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ee02a20606e66745f696460202d20746865205b604e46544964605d206f6620746865204e465420746f206265207472616e736665727265642e21012a2060736f757263655f706f7274666f6c696f60202d20746865205b60506f7274666f6c696f4964605d20746861742063757272656e746c7920686f6c647320746865204e46542e35012a206063616c6c6572735f706f7274666f6c696f5f6b696e6460202d20746865205b60506f7274666f6c696f4b696e64605d206f66207468652063616c6c6572277320706f7274666f6c696f2e003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652ecd0704184f7074696f6e04045401a80108104e6f6e6500000010536f6d650400a80000010000d10704184f7074696f6e04045401f5010108104e6f6e6500000010536f6d650400f5010000010000d5070c4c706f6c796d6573685f7072696d6974697665730c6e6674444e4654436f6c6c656374696f6e4b65797300000400d90701545665633c41737365744d657461646174614b65793e0000d907000002790200dd07000002e10700e1070c4c706f6c796d6573685f7072696d6974697665730c6e6674504e46544d65746164617461417474726962757465000008010c6b65797902014041737365744d657461646174614b657900011476616c75654502014841737365744d6574616461746156616c75650000e5070c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c65741043616c6c0404540001143c7375626d69745f756e7369676e65640801307261775f736f6c7574696f6ee90701b0426f783c526177536f6c7574696f6e3c536f6c7574696f6e4f663c543a3a4d696e6572436f6e6669673e3e3e00011c7769746e657373b9080158536f6c7574696f6e4f72536e617073686f7453697a65000038a45375626d6974206120736f6c7574696f6e20666f722074686520756e7369676e65642070686173652e00c8546865206469737061746368206f726967696e20666f20746869732063616c6c206d757374206265205f5f6e6f6e655f5f2e003d0154686973207375626d697373696f6e20697320636865636b6564206f6e2074686520666c792e204d6f72656f7665722c207468697320756e7369676e656420736f6c7574696f6e206973206f6e6c79550176616c696461746564207768656e207375626d697474656420746f2074686520706f6f6c2066726f6d20746865202a2a6c6f63616c2a2a206e6f64652e204566666563746976656c792c2074686973206d65616e735d0174686174206f6e6c79206163746976652076616c696461746f72732063616e207375626d69742074686973207472616e73616374696f6e207768656e20617574686f72696e67206120626c6f636b202873696d696c617240746f20616e20696e686572656e74292e005901546f2070726576656e7420616e7920696e636f727265637420736f6c7574696f6e2028616e642074687573207761737465642074696d652f776569676874292c2074686973207472616e73616374696f6e2077696c6c4d0170616e69632069662074686520736f6c7574696f6e207375626d6974746564206279207468652076616c696461746f7220697320696e76616c696420696e20616e79207761792c206566666563746976656c799c70757474696e6720746865697220617574686f72696e6720726577617264206174207269736b2e00e04e6f206465706f736974206f7220726577617264206973206173736f63696174656420776974682074686973207375626d697373696f6e2e6c7365745f6d696e696d756d5f756e747275737465645f73636f72650401406d617962655f6e6578745f73636f7265bd0801544f7074696f6e3c456c656374696f6e53636f72653e000114b05365742061206e65772076616c756520666f7220604d696e696d756d556e7472757374656453636f7265602e00d84469737061746368206f726967696e206d75737420626520616c69676e656420776974682060543a3a466f7263654f726967696e602e00f05468697320636865636b2063616e206265207475726e6564206f66662062792073657474696e67207468652076616c756520746f20604e6f6e65602e747365745f656d657267656e63795f656c656374696f6e5f726573756c74040120737570706f727473c1080158537570706f7274733c543a3a4163636f756e7449643e0002205901536574206120736f6c7574696f6e20696e207468652071756575652c20746f2062652068616e646564206f757420746f2074686520636c69656e74206f6620746869732070616c6c657420696e20746865206e6578748863616c6c20746f2060456c656374696f6e50726f76696465723a3a656c656374602e004501546869732063616e206f6e6c79206265207365742062792060543a3a466f7263654f726967696e602c20616e64206f6e6c79207768656e207468652070686173652069732060456d657267656e6379602e00610154686520736f6c7574696f6e206973206e6f7420636865636b656420666f7220616e7920666561736962696c69747920616e6420697320617373756d656420746f206265207472757374776f727468792c20617320616e795101666561736962696c69747920636865636b20697473656c662063616e20696e207072696e6369706c652063617573652074686520656c656374696f6e2070726f6365737320746f206661696c202864756520746f686d656d6f72792f77656967687420636f6e73747261696e73292e187375626d69740401307261775f736f6c7574696f6ee90701b0426f783c526177536f6c7574696f6e3c536f6c7574696f6e4f663c543a3a4d696e6572436f6e6669673e3e3e0003249c5375626d6974206120736f6c7574696f6e20666f7220746865207369676e65642070686173652e00d0546865206469737061746368206f726967696e20666f20746869732063616c6c206d757374206265205f5f7369676e65645f5f2e005d0154686520736f6c7574696f6e20697320706f74656e7469616c6c79207175657565642c206261736564206f6e2074686520636c61696d65642073636f726520616e642070726f6365737365642061742074686520656e64506f6620746865207369676e65642070686173652e005d0141206465706f73697420697320726573657276656420616e64207265636f7264656420666f722074686520736f6c7574696f6e2e204261736564206f6e20746865206f7574636f6d652c2074686520736f6c7574696f6e15016d696768742062652072657761726465642c20736c61736865642c206f722067657420616c6c206f7220612070617274206f6620746865206465706f736974206261636b2e4c676f7665726e616e63655f66616c6c6261636b0801406d617962655f6d61785f766f746572735106012c4f7074696f6e3c7533323e0001446d617962655f6d61785f746172676574735106012c4f7074696f6e3c7533323e00041080547269676765722074686520676f7665726e616e63652066616c6c6261636b2e004901546869732063616e206f6e6c792062652063616c6c6564207768656e205b6050686173653a3a456d657267656e6379605d20697320656e61626c65642c20617320616e20616c7465726e617469766520746fc063616c6c696e67205b6043616c6c3a3a7365745f656d657267656e63795f656c656374696f6e5f726573756c74605d2e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ee907089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173652c526177536f6c7574696f6e04045301ed07000c0120736f6c7574696f6eed0701045300011473636f7265ad040134456c656374696f6e53636f7265000114726f756e6410010c7533320000ed07085c706f6c796d6573685f72756e74696d655f636f6d6d6f6e384e706f73536f6c7574696f6e31360000400118766f74657331f10700000118766f74657332fd0700000118766f74657333110800000118766f746573341d0800000118766f74657335290800000118766f74657336350800000118766f74657337410800000118766f746573384d0800000118766f7465733959080000011c766f746573313065080000011c766f746573313171080000011c766f74657331327d080000011c766f746573313389080000011c766f746573313495080000011c766f7465733135a1080000011c766f7465733136ad08000000f107000002f50700f50700000408cd04f90700f9070000065d0300fd0700000201080001080000040ccd040508f90700050800000408f90709080009080000060d08000d080c3473705f61726974686d65746963287065725f7468696e677318506572553136000004005d03010c7531360000110800000215080015080000040ccd041908f907001908000003020000000508001d0800000221080021080000040ccd042508f9070025080000030300000005080029080000022d08002d080000040ccd043108f90700310800000304000000050800350800000239080039080000040ccd043d08f907003d0800000305000000050800410800000245080045080000040ccd044908f907004908000003060000000508004d0800000251080051080000040ccd045508f9070055080000030700000005080059080000025d08005d080000040ccd046108f90700610800000308000000050800650800000269080069080000040ccd046d08f907006d0800000309000000050800710800000275080075080000040ccd047908f9070079080000030a0000000508007d0800000281080081080000040ccd048508f9070085080000030b00000005080089080000028d08008d080000040ccd049108f9070091080000030c000000050800950800000299080099080000040ccd049d08f907009d080000030d000000050800a108000002a50800a5080000040ccd04a908f90700a9080000030e000000050800ad08000002b10800b1080000040ccd04b508f90700b5080000030f000000050800b908089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f706861736558536f6c7574696f6e4f72536e617073686f7453697a650000080118766f74657273cd04010c75333200011c74617267657473cd04010c7533320000bd0804184f7074696f6e04045401ad040108104e6f6e6500000010536f6d650400ad040000010000c108000002c50800c5080000040800c90800c908084473705f6e706f735f656c656374696f6e731c537570706f727404244163636f756e744964010000080114746f74616c18013c457874656e64656442616c616e6365000118766f74657273cd0801845665633c284163636f756e7449642c20457874656e64656442616c616e6365293e0000cd08000002d10800d10800000408001800d508084470616c6c65745f746573745f7574696c731043616c6c0404540001103072656769737465725f6469640401387365636f6e646172795f6b65797398017c5665633c5365636f6e646172794b65793c543a3a4163636f756e7449643e3e0000284d0147656e6572617465732061206e657720604964656e7469747949446020666f72207468652063616c6c65722c20616e642069737375657320612073656c662d67656e6572617465642043444420636c61696d2e00f05468652063616c6c6572206163636f756e742077696c6c20626520746865207072696d617279206b6579206f662074686174206964656e746974792e5d01466f722065616368206163636f756e74206f6620607365636f6e646172795f6b657973602c2061206e657720604a6f696e4964656e746974796020617574686f72697a6174696f6e20697320637265617465642c20736f410165616368206f66207468656d2077696c6c206e65656420746f20616363657074206974206265666f7265206265636f6d652070617274206f662074686973206e657720604964656e746974794944602e002023204572726f7273d5012d2060416c72656164794c696e6b656460206966207468652063616c6c6572206163636f756e74206f7220696620616e79206f662074686520676976656e20607365636f6e646172795f6b657973602068617320616c7265616479206c696e6b656420746f20616e20604964656e746974794944604d012d20605365636f6e646172794b657973436f6e7461696e5072696d6172794b65796020696620607365636f6e646172795f6b6579736020636f6e7461696e73207468652063616c6c6572206163636f756e742ee82d2060446964416c726561647945786973747360206966206175746f2d67656e6572617465642044494420616c7265616479206578697374732e546d6f636b5f6364645f72656769737465725f6469640401387461726765745f6163636f756e74000130543a3a4163636f756e74496400011c3d015265676973746572732061206e6577204964656e7469747920666f722074686520607461726765745f6163636f756e746020616e642069737375657320612043444420636c61696d20746f2069742e002423204661696c75726549012d20606f726967696e602068617320746f20626520616e20616374697665204344442070726f76696465722e20496e616374697665204344442070726f7669646572732063616e6e6f7420616464206e65771c636c61696d732e5d012d20607461726765745f6163636f756e746020287072696d617279206b6579206f6620746865206e6577204964656e74697479292063616e206265206c696e6b656420746f206a757374206f6e6520616e64206f6e6c79346f6e65206964656e746974792e286765745f6d795f64696400020498456d69747320616e206576656e7420776974682063616c6c65722773206964656e746974792e286765745f6364645f6f660401086f66000130543a3a4163636f756e744964000304d4456d69747320616e206576656e7420776974682063616c6c65722773206964656e7469747920616e6420434444207374617475732e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652ed908084070616c6c65745f636f6d6d697474656534506f6c796d657368566f746573042c426c6f636b4e756d626572011000100114696e64657810013450726f706f73616c496e646578000110617965734501013c5665633c4964656e7469747949643e0001106e6179734501013c5665633c4964656e7469747949643e0001186578706972795901015c4d61796265426c6f636b3c426c6f636b4e756d6265723e0000dd08084070616c6c65745f636f6d6d69747465651c56657273696f6e0000040008010875380000e108084070616c6c65745f636f6d6d6974746565144572726f72080454000449000124344475706c6963617465566f7465000004804475706c696361746520766f74657320617265206e6f7420616c6c6f7765642e284e6f74414d656d6265720001088841204449442069736e27742070617274206f662074686520636f6d6d69747465652ed454686520444944206d61792065697468657220626520612063616c6c6572206f7220736f6d65206f7468657220636f6e746578742e384e6f5375636850726f706f73616c000204444e6f20737563682070726f706f73616c2e3c50726f706f73616c457870697265640003049050726f706f73616c206578697374732c206275742069742068617320657870697265642e444475706c696361746550726f706f73616c0004044c4475706c69636174652070726f706f73616c2e544d69736d617463686564566f74696e67496e646578000504604d69736d61746368656420766f74696e6720696e6465782e44496e76616c696450726f706f7274696f6e0006049450726f706f7274696f6e206d757374206265206120726174696f6e616c206e756d6265722e3c4669727374566f746552656a65637400070cfc466972737420766f7465206f6e20612070726f706f73616c20637265617465732069742c20736f206974206d75737420626520616e20617070726f76616c2e0101416c6c2070726f706f73616c7320617265206d6f74696f6e7320746f206578656375746520736f6d657468696e6720617320224743206d616a6f72697479222efc546f2072656a65637420652e672e2c2061205049502c2061206d6f74696f6e20746f2072656a6563742073686f756c64206265202a617070726f7665642a2e5450726f706f73616c734c696d697452656163686564000804b44d6178696d756d206e756d626572206f662070726f706f73616c7320686173206265656e20726561636865642e00e508083070616c6c65745f67726f7570144572726f72080454000449000118544f6e6c795072696d6172794b6579416c6c6f776564000004b04f6e6c79207072696d617279206b6579206f6620746865206964656e7469747920697320616c6c6f7765642e3c4475706c69636174654d656d6265720001047c47726f7570206d656d6265722077617320616464656420616c72656164792e304e6f537563684d656d626572000204a443616e27742072656d6f76652061206d656d626572207468617420646f65736e27742065786973742e504c6173744d656d62657243616e6e6f7451756974000304a84c617374206d656d626572206f662074686520636f6d6d69747465652063616e206e6f7420717569742e684163746976654d656d626572734c696d697445786365656465640004045d01546865206c696d697420666f7220746865206e756d626572206f6620636f6e63757272656e7420616374697665206d656d6265727320666f7220746869732067726f757020686173206265656e2065786365656465642e684163746976654d656d626572734c696d69744f766572666c6f770005041501416374697665206d656d626572206c696d6974207761732067726561746572207468616e206d6178696d756d20636f6d6d6974746565206d656d62657273206c696d69742e00e908084070616c6c65745f636f6d6d6974746565144572726f72080454000449000124344475706c6963617465566f7465000004804475706c696361746520766f74657320617265206e6f7420616c6c6f7765642e284e6f74414d656d6265720001088841204449442069736e27742070617274206f662074686520636f6d6d69747465652ed454686520444944206d61792065697468657220626520612063616c6c6572206f7220736f6d65206f7468657220636f6e746578742e384e6f5375636850726f706f73616c000204444e6f20737563682070726f706f73616c2e3c50726f706f73616c457870697265640003049050726f706f73616c206578697374732c206275742069742068617320657870697265642e444475706c696361746550726f706f73616c0004044c4475706c69636174652070726f706f73616c2e544d69736d617463686564566f74696e67496e646578000504604d69736d61746368656420766f74696e6720696e6465782e44496e76616c696450726f706f7274696f6e0006049450726f706f7274696f6e206d757374206265206120726174696f6e616c206e756d6265722e3c4669727374566f746552656a65637400070cfc466972737420766f7465206f6e20612070726f706f73616c20637265617465732069742c20736f206974206d75737420626520616e20617070726f76616c2e0101416c6c2070726f706f73616c7320617265206d6f74696f6e7320746f206578656375746520736f6d657468696e6720617320224743206d616a6f72697479222efc546f2072656a65637420652e672e2c2061205049502c2061206d6f74696f6e20746f2072656a6563742073686f756c64206265202a617070726f7665642a2e5450726f706f73616c734c696d697452656163686564000804b44d6178696d756d206e756d626572206f662070726f706f73616c7320686173206265656e20726561636865642e00ed08083070616c6c65745f67726f7570144572726f72080454000449000118544f6e6c795072696d6172794b6579416c6c6f776564000004b04f6e6c79207072696d617279206b6579206f6620746865206964656e7469747920697320616c6c6f7765642e3c4475706c69636174654d656d6265720001047c47726f7570206d656d6265722077617320616464656420616c72656164792e304e6f537563684d656d626572000204a443616e27742072656d6f76652061206d656d626572207468617420646f65736e27742065786973742e504c6173744d656d62657243616e6e6f7451756974000304a84c617374206d656d626572206f662074686520636f6d6d69747465652063616e206e6f7420717569742e684163746976654d656d626572734c696d697445786365656465640004045d01546865206c696d697420666f7220746865206e756d626572206f6620636f6e63757272656e7420616374697665206d656d6265727320666f7220746869732067726f757020686173206265656e2065786365656465642e684163746976654d656d626572734c696d69744f766572666c6f770005041501416374697665206d656d626572206c696d6974207761732067726561746572207468616e206d6178696d756d20636f6d6d6974746565206d656d62657273206c696d69742e00f108084070616c6c65745f636f6d6d6974746565144572726f72080454000449000124344475706c6963617465566f7465000004804475706c696361746520766f74657320617265206e6f7420616c6c6f7765642e284e6f74414d656d6265720001088841204449442069736e27742070617274206f662074686520636f6d6d69747465652ed454686520444944206d61792065697468657220626520612063616c6c6572206f7220736f6d65206f7468657220636f6e746578742e384e6f5375636850726f706f73616c000204444e6f20737563682070726f706f73616c2e3c50726f706f73616c457870697265640003049050726f706f73616c206578697374732c206275742069742068617320657870697265642e444475706c696361746550726f706f73616c0004044c4475706c69636174652070726f706f73616c2e544d69736d617463686564566f74696e67496e646578000504604d69736d61746368656420766f74696e6720696e6465782e44496e76616c696450726f706f7274696f6e0006049450726f706f7274696f6e206d757374206265206120726174696f6e616c206e756d6265722e3c4669727374566f746552656a65637400070cfc466972737420766f7465206f6e20612070726f706f73616c20637265617465732069742c20736f206974206d75737420626520616e20617070726f76616c2e0101416c6c2070726f706f73616c7320617265206d6f74696f6e7320746f206578656375746520736f6d657468696e6720617320224743206d616a6f72697479222efc546f2072656a65637420652e672e2c2061205049502c2061206d6f74696f6e20746f2072656a6563742073686f756c64206265202a617070726f7665642a2e5450726f706f73616c734c696d697452656163686564000804b44d6178696d756d206e756d626572206f662070726f706f73616c7320686173206265656e20726561636865642e00f508083070616c6c65745f67726f7570144572726f72080454000449000118544f6e6c795072696d6172794b6579416c6c6f776564000004b04f6e6c79207072696d617279206b6579206f6620746865206964656e7469747920697320616c6c6f7765642e3c4475706c69636174654d656d6265720001047c47726f7570206d656d6265722077617320616464656420616c72656164792e304e6f537563684d656d626572000204a443616e27742072656d6f76652061206d656d626572207468617420646f65736e27742065786973742e504c6173744d656d62657243616e6e6f7451756974000304a84c617374206d656d626572206f662074686520636f6d6d69747465652063616e206e6f7420717569742e684163746976654d656d626572734c696d697445786365656465640004045d01546865206c696d697420666f7220746865206e756d626572206f6620636f6e63757272656e7420616374697665206d656d6265727320666f7220746869732067726f757020686173206265656e2065786365656465642e684163746976654d656d626572734c696d69744f766572666c6f770005041501416374697665206d656d626572206c696d6974207761732067726561746572207468616e206d6178696d756d20636f6d6d6974746565206d656d62657273206c696d69742e00f90800000408000000fd0800000408002800010900000408fd08000005090c4c706f6c796d6573685f7072696d697469766573206d756c74697369674450726f706f73616c566f7465436f756e740000080124617070726f76616c7328010c75363400012872656a656374696f6e7328010c753634000009090c4c706f6c796d6573685f7072696d697469766573206d756c74697369673450726f706f73616c537461746504184d6f6d656e740128011018416374697665040114756e74696c050101384f7074696f6e3c4d6f6d656e743e0000004c457865637574696f6e5375636365737366756c0001003c457865637574696f6e4661696c65640002002052656a6563746564000300000d09083c70616c6c65745f6d756c74697369671c56657273696f6e000004000801087538000011090c3c70616c6c65745f6d756c74697369671870616c6c6574144572726f720404540001583c50726f706f73616c4d697373696e67000004705468652070726f706f73616c20646f6573206e6f742065786973742e344465636f64696e674572726f72000104444d756c746973696720616464726573732e5452657175697265645369676e65727349735a65726f000204d45265717569726564206e756d626572206f66207369676e657273206d7573742062652067726561746572207468656e207a65726f2e284e6f74415369676e6572000304344e6f742061207369676e65722e384e6f537563684d756c7469736967000404444e6f2073756368206d756c74697369672e404e6f74456e6f7567685369676e65727300050835014e6f7420656e6f756768207369676e6572732e2020546865206e756d626572206f66207369676e6572732068617320746f2062652067726561746572207468656e206f7220657175616c20746fd0746865207265717569726564206e756d626572206f66207369676e65727320746f20617070726f76652070726f706f73616c732e344e6f6e63654f766572666c6f770006044441206e6f6e6365206f766572666c6f772e30416c7265616479566f74656400070438416c726561647920766f7465642e38416c7265616479415369676e657200080444416c72656164792061207369676e65722e404964656e746974794e6f7441646d696e000904b84964656e746974792070726f7669646564206973206e6f7420746865206d756c746973696727732061646d696e2e404964656e746974794e6f745061796572000a04b84964656e746974792070726f7669646564206973206e6f7420746865206d756c746973696727732070617965722e404368616e67654e6f74416c6c6f776564000b0425014368616e67696e67206d756c746973696720706172616d6574657273206e6f7420616c6c6f7765642073696e6365206d756c74697369672069732061207072696d617279206b65792e745369676e6572416c72656164794c696e6b6564546f4d756c7469736967000c0411015369676e657220697320616e206163636f756e74206b6579207468617420697320616c7265616479206173736f63696174656420776974682061206d756c74697369672e745369676e6572416c72656164794c696e6b6564546f4964656e74697479000d0415015369676e657220697320616e206163636f756e74206b6579207468617420697320616c7265616479206173736f636961746564207769746820616e206964656e746974792e444e657374696e674e6f74416c6c6f776564000e04c441206d756c74697369672063616e27742062652061207369676e6572206f6620616e6f74686572206d756c74697369672e5c50726f706f73616c416c726561647952656a6563746564000f047450726f706f73616c207761732072656a6563746564206561726c6965723c50726f706f73616c457870697265640010045050726f706f73616c2068617320657870697265645c50726f706f73616c416c726561647945786563757465640011047450726f706f73616c20776173206578656375746564206561726c6965723c4d6178576569676874546f6f4c6f77001204a84d617820776569676874206e6f7420656e6f75676820746f20657865637574652070726f706f73616c2e5c4d756c74697369674d697373696e674964656e746974790013049c4d756c7469736967206973206e6f7420617474616368656420746f20616e206964656e7469747938546f6f4d616e795369676e65727300140494547269656420746f206164642f72656d6f766520746f6f206d616e79207369676e6572732e2c4e6f506179696e674469640015048c4d756c746973696720646f65736e27742068617665206120706179696e67204449442e045c4d756c7469736967206d6f64756c65206572726f72732e1509000004080010001909083470616c6c65745f62726964676538427269646765547844657461696c042c426c6f636b4e756d626572011000100118616d6f756e7418011c42616c616e63650001187374617475731d090138427269646765547853746174757300013c657865637574696f6e5f626c6f636b10012c426c6f636b4e756d62657200011c74785f686173682c01104832353600001d09083470616c6c65745f62726964676538427269646765547853746174757300011418416273656e740000001c50656e64696e67040008010875380001001846726f7a656e0002002854696d656c6f636b65640003001c48616e646c6564000400002109000004081810002509083470616c6c65745f6272696467651c56657273696f6e00000400080108753800002909083870616c6c65745f7374616b696e67345374616b696e674c656467657204045400001401147374617368000130543a3a4163636f756e744964000114746f74616cd901013042616c616e63654f663c543e000118616374697665d901013042616c616e63654f663c543e000124756e6c6f636b696e672d0901f0426f756e6465645665633c556e6c6f636b4368756e6b3c42616c616e63654f663c543e3e2c20543a3a4d6178556e6c6f636b696e674368756e6b733e00013c636c61696d65645f7265776172647339090194426f756e6465645665633c457261496e6465782c20543a3a486973746f727944657074683e00002d090c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e646564566563080454013109045300000400350901185665633c543e00003109083870616c6c65745f7374616b696e672c556e6c6f636b4368756e6b041c42616c616e636501180008011476616c7565d901011c42616c616e636500010c657261cd040120457261496e6465780000350900000231090039090c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e6465645665630804540110045300000400690401185665633c543e00003d09083870616c6c65745f7374616b696e672c4e6f6d696e6174696f6e7304045400000c011c74617267657473410901ac426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61784e6f6d696e6174696f6e733e0001307375626d69747465645f696e100120457261496e6465780001287375707072657373656439010110626f6f6c000041090c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e6465645665630804540100045300000400fc01185665633c543e00004509083870616c6c65745f7374616b696e6734416374697665457261496e666f0000080114696e646578100120457261496e64657800011473746172740501012c4f7074696f6e3c7536343e00004909000004081000004d09083870616c6c65745f7374616b696e673c457261526577617264506f696e747304244163636f756e744964010000080114746f74616c10012c526577617264506f696e74000128696e646976696475616c5109018042547265654d61703c4163636f756e7449642c20526577617264506f696e743e00005109042042547265654d617008044b0100045601100004005509000000550900000215090059090000025d09005d09083870616c6c65745f7374616b696e6738556e6170706c696564536c61736808244163636f756e74496401001c42616c616e636501180014012476616c696461746f720001244163636f756e74496400010c6f776e18011c42616c616e63650001186f7468657273cd0801645665633c284163636f756e7449642c2042616c616e6365293e0001247265706f7274657273fc01385665633c4163636f756e7449643e0001187061796f757418011c42616c616e636500006109000004089101180065090c3870616c6c65745f7374616b696e6720736c617368696e6734536c617368696e675370616e7300001001287370616e5f696e6465781001245370616e496e6465780001286c6173745f7374617274100120457261496e6465780001486c6173745f6e6f6e7a65726f5f736c617368100120457261496e6465780001147072696f72690401345665633c457261496e6465783e000069090c3870616c6c65745f7374616b696e6720736c617368696e67285370616e5265636f7264041c42616c616e636501180008011c736c617368656418011c42616c616e6365000120706169645f6f757418011c42616c616e636500006d090000027109007109000004081039010075090c3870616c6c65745f7374616b696e67147479706573645065726d697373696f6e65644964656e7469747950726566730000080138696e74656e6465645f636f756e7410010c75333200013472756e6e696e675f636f756e7410010c753332000079090c3870616c6c65745f7374616b696e671870616c6c65741c56657273696f6e00000400080108753800007d09103870616c6c65745f7374616b696e671870616c6c65741870616c6c6574144572726f7204045400018c344e6f74436f6e74726f6c6c6572000004644e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f745374617368000104504e6f742061207374617368206163636f756e742e34416c7265616479426f6e64656400020460537461736820697320616c726561647920626f6e6465642e34416c726561647950616972656400030474436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d7074795461726765747300040460546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e646578000504404475706c696361746520696e6465782e44496e76616c6964536c617368496e64657800060484536c617368207265636f726420696e646578206f7574206f6620626f756e64732e40496e73756666696369656e74426f6e6400070c590143616e6e6f74206861766520612076616c696461746f72206f72206e6f6d696e61746f7220726f6c652c20776974682076616c7565206c657373207468616e20746865206d696e696d756d20646566696e65642062793d01676f7665726e616e6365202873656520604d696e56616c696461746f72426f6e646020616e6420604d696e4e6f6d696e61746f72426f6e6460292e20496620756e626f6e64696e67206973207468651501696e74656e74696f6e2c20606368696c6c6020666972737420746f2072656d6f7665206f6e65277320726f6c652061732076616c696461746f722f6e6f6d696e61746f722e304e6f4d6f72654368756e6b730008049043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b000904a043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e3046756e646564546172676574000a04c8417474656d7074696e6720746f2074617267657420612073746173682074686174207374696c6c206861732066756e64732e48496e76616c6964457261546f526577617264000b0458496e76616c69642065726120746f207265776172642e68496e76616c69644e756d6265724f664e6f6d696e6174696f6e73000c0478496e76616c6964206e756d626572206f66206e6f6d696e6174696f6e732e484e6f74536f72746564416e64556e69717565000d04804974656d7320617265206e6f7420736f7274656420616e6420756e697175652e38416c7265616479436c61696d6564000e0409015265776172647320666f72207468697320657261206861766520616c7265616479206265656e20636c61696d656420666f7220746869732076616c696461746f722e54496e636f7272656374486973746f72794465707468000f04c0496e636f72726563742070726576696f757320686973746f727920646570746820696e7075742070726f76696465642e58496e636f7272656374536c617368696e675370616e73001004b0496e636f7272656374206e756d626572206f6620736c617368696e67207370616e732070726f76696465642e2042616453746174650011043901496e7465726e616c20737461746520686173206265636f6d6520736f6d65686f7720636f7272757074656420616e6420746865206f7065726174696f6e2063616e6e6f7420636f6e74696e75652e38546f6f4d616e795461726765747300120494546f6f206d616e79206e6f6d696e6174696f6e207461726765747320737570706c6965642e244261645461726765740013043d0141206e6f6d696e6174696f6e207461726765742077617320737570706c69656420746861742077617320626c6f636b6564206f72206f7468657277697365206e6f7420612076616c696461746f722e4043616e6e6f744368696c6c4f74686572001404550154686520757365722068617320656e6f75676820626f6e6420616e6420746875732063616e6e6f74206265206368696c6c656420666f72636566756c6c7920627920616e2065787465726e616c20706572736f6e2e44546f6f4d616e794e6f6d696e61746f72730015084d0154686572652061726520746f6f206d616e79206e6f6d696e61746f727320696e207468652073797374656d2e20476f7665726e616e6365206e6565647320746f2061646a75737420746865207374616b696e67b473657474696e677320746f206b656570207468696e6773207361666520666f72207468652072756e74696d652e44546f6f4d616e7956616c696461746f7273001604d854686572652061726520746f6f206d616e792076616c696461746f722063616e6469646174657320696e207468652073797374656d2e40436f6d6d697373696f6e546f6f4c6f77001704e0436f6d6d697373696f6e20697320746f6f206c6f772e204d757374206265206174206c6561737420604d696e436f6d6d697373696f6e602e2c426f756e644e6f744d657400180458536f6d6520626f756e64206973206e6f74206d65742e6453746173684964656e74697479446f65734e6f744578697374001904d456616c696461746f72206f72206e6f6d696e61746f72207374617368206964656e7469747920646f6573206e6f742065786973742e7053746173684964656e746974794e6f745065726d697373696f6e6564001a04bc56616c696461746f722773207374617368206964656e74697479206973206e6f74207065726d697373696f6e65642e5453746173684964656e746974794e6f744344446564001b04a44e6f6d696e61746f7220737461736820686173206e6f7420676f6e65207468726f756768204344442e744964656e746974794973416c72656164795065726d697373696f6e6564001c04985065726d697373696f6e65642076616c696461746f7220616c7265616479206578697374732e504964656e7469747949734d697373696e67434444001d048c4964656e7469747920686173206e6f7420676f6e65207468726f75676874204344442e98496e74656e646564436f756e744973457863656564696e67436f6e73656e7375734c696d6974001e0435015768656e2074686520696e74656e646564206e756d626572206f662076616c696461746f727320746f2072756e206973203e3d20322f33206f66206076616c696461746f725f636f756e74602e404964656e746974794e6f74466f756e64001f04e44964656e7469747920776173206e6f7420666f756e6420696e20746865207065726d697373696f6e6564206964656e7469747920706f6f6c2e4456616c696461746f724e6f74466f756e64002004a44e6f2076616c696461746f722077617320666f756e6420666f722074686520676976656e206b65792e44436f6d6d697373696f6e546f6f486967680021049c56616c696461746f7220636f6d6d69697373696f6e2069732061626f7665206d6178696d756d2e4c436f6d6d697373696f6e556e6368616e676564002204e84e657720636f6d6d697373696f6e206d75737420626520646966666572656e742066726f6d2070726576696f757320636f6d6d697373696f6e2e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a09090981090c2873705f7374616b696e671c6f6666656e6365384f6666656e636544657461696c7308205265706f727465720100204f6666656e64657201d101000801206f6666656e646572d10101204f6666656e6465720001247265706f7274657273fc01345665633c5265706f727465723e0000850900000408ac300089090000028d09008d0900000408005906009109000004089509300095090c1c73705f636f72651863727970746f244b65795479706549640000040040011c5b75383b20345d000099090c3870616c6c65745f73657373696f6e1870616c6c6574144572726f7204045400011430496e76616c696450726f6f6600000460496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f7249640001049c4e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b65790002046452656769737465726564206475706c6963617465206b65792e184e6f4b657973000304a44e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e244e6f4163636f756e7400040419014b65792073657474696e67206163636f756e74206973206e6f74206c6976652c20736f206974277320696d706f737369626c6520746f206173736f6369617465206b6579732e04744572726f7220666f72207468652073657373696f6e2070616c6c65742e9d09083870616c6c65745f6772616e6470612c53746f726564537461746504044e01100110104c6976650000003050656e64696e6750617573650801307363686564756c65645f61741001044e00011464656c61791001044e000100185061757365640002003450656e64696e67526573756d650801307363686564756c65645f61741001044e00011464656c61791001044e00030000a109083870616c6c65745f6772616e6470614c53746f72656450656e64696e674368616e676508044e0110144c696d697400001001307363686564756c65645f61741001044e00011464656c61791001044e0001406e6578745f617574686f726974696573a509016c426f756e646564417574686f726974794c6973743c4c696d69743e000118666f72636564510601244f7074696f6e3c4e3e0000a5090c4c626f756e6465645f636f6c6c656374696f6e73407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401b501045300000400b10101185665633c543e0000a9090c3870616c6c65745f6772616e6470611870616c6c6574144572726f7204045400011c2c50617573654661696c65640000080501417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a42865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c65640001081101417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e67000204e8417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e000304bc43616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e60496e76616c69644b65794f776e65727368697050726f6f66000404310141206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c696445717569766f636174696f6e50726f6f660005043101416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f727400060415014120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909ad090c4c626f756e6465645f636f6c6c656374696f6e73407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401c501045300000400b10901185665633c543e0000b109000002c50100b50910346672616d655f737570706f727418747261697473106d69736334577261707065724f706171756504045401b909000800cd04000000b9090104540000b909084070616c6c65745f696d5f6f6e6c696e6564426f756e6465644f70617175654e6574776f726b53746174650c4c506565724964456e636f64696e674c696d697400584d756c746941646472456e636f64696e674c696d697400384164647265737365734c696d6974000008011c706565725f6964bd09019c5765616b426f756e6465645665633c75382c20506565724964456e636f64696e674c696d69743e00014865787465726e616c5f616464726573736573c109012d015765616b426f756e6465645665633c5765616b426f756e6465645665633c75382c204d756c746941646472456e636f64696e674c696d69743e2c204164647265737365734c696d69740a3e0000bd090c4c626f756e6465645f636f6c6c656374696f6e73407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401080453000004003001185665633c543e0000c1090c4c626f756e6465645f636f6c6c656374696f6e73407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401bd09045300000400c50901185665633c543e0000c509000002bd0900c9090c4070616c6c65745f696d5f6f6e6c696e651870616c6c6574144572726f7204045400010828496e76616c69644b6579000004604e6f6e206578697374656e74207075626c6963206b65792e4c4475706c696361746564486561727462656174000104544475706c696361746564206865617274626561742e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909cd090c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e646564566563080454012c045300000400c10401185665633c543e0000d109082c70616c6c65745f7375646f144572726f720404540001042c526571756972655375646f0000047c53656e646572206d75737420626520746865205375646f206163636f756e7404644572726f7220666f7220746865205375646f206d6f64756c65d5090c3070616c6c65745f6173736574147479706573485469636b6572526567697374726174696f6e0404540128000801146f776e65728001284964656e746974794964000118657870697279050101244f7074696f6e3c543e0000d9090c3070616c6c65745f6173736574147479706573605469636b6572526567697374726174696f6e436f6e6669670404540128000801446d61785f7469636b65725f6c656e677468080108753800014c726567697374726174696f6e5f6c656e677468050101244f7074696f6e3c543e0000dd090c3070616c6c65745f617373657414747970657330417373657444657461696c730000100130746f74616c5f737570706c7918011c42616c616e63650001246f776e65725f6469648001284964656e746974794964000124646976697369626c6539010110626f6f6c00012861737365745f74797065ed0101244173736574547970650000e10900000408a88000e50900000408a8110200e90900000408a8150200ed0900000408a8790200f10900000408a8550200f50900000408a8590200f9090000040880a800fd090000040880210100010a083070616c6c65745f61737365741c56657273696f6e0000040008010875380000050a0c3070616c6c65745f6173736574146572726f72144572726f720404540001bc30556e617574686f72697a65640000046c5468652075736572206973206e6f7420617574686f72697a65642e4c4173736574416c7265616479437265617465640001048c54686520746f6b656e2068617320616c7265616479206265656e20637265617465642e345469636b6572546f6f4c6f6e6700020490546865207469636b6572206c656e677468206973206f76657220746865206c696d69742e545469636b65724e6f74416c7068616e756d6572696300030498546865207469636b657220686173206e6f6e2d616c7068616e756d657269632070617274732e5c5469636b6572416c726561647952656769737465726564000404c4546865207469636b657220697320616c7265616479207265676973746572656420746f20736f6d656f6e6520656c73652e54546f74616c537570706c7941626f76654c696d69740005049054686520746f74616c20737570706c792069732061626f766520746865206c696d69742e2c4e6f537563684173736574000604cc4e6f20736563757269747920746f6b656e206173736f63696174656420746f2074686520676976656e2061737365742049442e34416c726561647946726f7a656e0007047054686520746f6b656e20697320616c72656164792066726f7a656e2e284e6f74416e4f776e6572000804984e6f7420616e206f776e6572206f662074686520746f6b656e206f6e20457468657265756d2e3c42616c616e63654f766572666c6f77000904a8416e206f766572666c6f77207768696c652063616c63756c6174696e67207468652062616c616e63652e4c546f74616c537570706c794f766572666c6f77000a04bc416e206f766572666c6f77207768696c652063616c63756c6174696e672074686520746f74616c20737570706c792e48496e76616c69644772616e756c6172697479000b045c416e20696e76616c6964206772616e756c61726974792e244e6f7446726f7a656e000c0464546865206173736574206d7573742062652066726f7a656e2e3c496e76616c69645472616e73666572000d04845472616e736665722076616c69646174696f6e20636865636b206661696c65642e4c496e73756666696369656e7442616c616e6365000e04945468652073656e6465722062616c616e6365206973206e6f742073756666696369656e742e544173736574416c7265616479446976697369626c65000f047c54686520746f6b656e20697320616c726561647920646976697369626c652e60496e76616c6964457468657265756d5369676e617475726500100494416e20696e76616c696420457468657265756d206045636473615369676e6174757265602e645469636b6572526567697374726174696f6e457870697265640011048c526567697374726174696f6e206f66207469636b65722068617320657870697265642e5053656e64657253616d6541735265636569766572001204845472616e736665727320746f2073656c6620617265206e6f7420616c6c6f776564244e6f53756368446f630013048854686520676976656e20446f63756d656e7420646f6573206e6f742065786973742e704d61784c656e6774684f6641737365744e616d654578636565646564001404bc4d6178696d756d206c656e677468206f66206173736574206e616d6520686173206265656e2065786365656465642e8446756e64696e67526f756e644e616d654d61784c656e6774684578636565646564001504ec4d6178696d756d206c656e677468206f66207468652066756e64696e6720726f756e64206e616d6520686173206265656e2065786365656465642e58496e76616c696441737365744964656e7469666965720016048c536f6d65206041737365744964656e746966696572602077617320696e76616c69642e84496e766573746f72556e697175656e657373436c61696d4e6f74416c6c6f776564001704e8496e766573746f7220556e697175656e65737320636c61696d7320617265206e6f7420616c6c6f77656420666f7220746869732061737365742e60496e76616c6964437573746f6d417373657454797065496400180470496e76616c69642060437573746f6d4173736574547970654964602e8841737365744d657461646174614e616d654d61784c656e677468457863656564656400190405014d6178696d756d206c656e677468206f6620746865206173736574206d657461646174612074797065206e616d6520686173206265656e2065786365656465642e8c41737365744d6574616461746156616c75654d61784c656e6774684578636565646564001a04f44d6178696d756d206c656e677468206f6620746865206173736574206d657461646174612076616c756520686173206265656e2065786365656465642e9441737365744d65746164617461547970654465664d61784c656e6774684578636565646564001b041d014d6178696d756d206c656e677468206f6620746865206173736574206d65746164617461207479706520646566696e6974696f6e20686173206265656e2065786365656465642e6441737365744d657461646174614b657949734d697373696e67001c04784173736574204d65746164617461206b6579206973206d697373696e672e6841737365744d6574616461746156616c756549734c6f636b6564001d047c4173736574204d657461646174612076616c7565206973206c6f636b65642e8841737365744d657461646174614c6f63616c4b6579416c7265616479457869737473001e04cc4173736574204d65746164617461204c6f63616c207479706520616c72656164792065786973747320666f722061737365742e8c41737365744d65746164617461476c6f62616c4b6579416c7265616479457869737473001f04a84173736574204d6574616461746120476c6f62616c207479706520616c7265616479206578697374732e5c5469636b65724669727374427974654e6f7456616c6964002004c85469636b6572732073686f756c642073746172742077697468206174206c65617374206f6e652076616c696420627974652e68556e65787065637465644e6f6e46756e6769626c65546f6b656e0021042101417474656d707420746f2063616c6c20616e2065787472696e7369632074686174206973206f6e6c79207065726d697474656420666f722066756e6769626c6520746f6b656e732e6c496e636f6d70617469626c654173736574547970655570646174650022047d01417474656d707420746f20757064617465207468652074797065206f662061206e6f6e2066756e6769626c6520746f6b656e20746f20612066756e6769626c6520746f6b656e206f7220746865206f74686572207761792061726f756e642e9841737365744d657461646174614b657942656c6f6e6773546f4e4654436f6c6c656374696f6e002304f4417474656d707420746f2064656c6574652061206b65792074686174206973206e656564656420666f7220616e204e465420636f6c6c656374696f6e2e6441737365744d6574616461746156616c75654973456d707479002404bc417474656d707420746f206c6f636b2061206d657461646174612076616c7565207468617420697320656d7074792e784e756d6265724f6641737365744d65646961746f72734578636565646564002504ec4e756d626572206f66206173736574206d65646961746f727320776f756c642065786365656420746865206d6178696d756d20616c6c6f7765642e58496e76616c69645469636b65724368617261637465720026041d01496e76616c6964207469636b657220636861726163746572202d2076616c6964207365743a2041602e2e605a60206030602e2e60396020605f6020602d6020602e6020602f602e68496e76616c69645472616e7366657246726f7a656e4173736574002704bc4661696c656420746f207472616e7366657220746865206173736574202d2061737365742069732066726f7a656e2e80496e76616c69645472616e73666572436f6d706c69616e63654661696c757265002804b84661696c656420746f207472616e7366657220616e204e4654202d20636f6d706c69616e6365206661696c65642e84496e76616c69645472616e73666572496e76616c69645265636569766572434444002904e44661696c656420746f207472616e7366657220746865206173736574202d20726563656976657220636464206973206e6f742076616c69642e7c496e76616c69645472616e73666572496e76616c696453656e646572434444002a04dc4661696c656420746f207472616e7366657220746865206173736574202d2073656e64657220636464206973206e6f742076616c69642e685469636b6572526567697374726174696f6e4e6f74466f756e64002b04fc546865207469636b657220726567697374726174696f6e206173736f63696174656420746f20746865207469636b657220776173206e6f7420666f756e642e785469636b65724973416c72656164794c696e6b6564546f416e4173736574002c04bc54686520676976656e207469636b657220697320616c7265616479206c696e6b656420746f20616e2061737365742e584173736574494447656e65726174696f6e4572726f72002d04cc416e20756e6578706563746564206572726f72207768656e2067656e65726174696e672061206e65772061737365742049442e6c5469636b65724e6f7452656769737465726564546f43616c6c6572002e04a0546865207469636b657220646f65736e27742062656c6f6e6720746f207468652063616c6c65722e00090a00000408990280000d0a0c6070616c6c65745f636f72706f726174655f616374696f6e7330646973747269627574696f6e1c56657273696f6e0000040008010875380000110a0c6070616c6c65745f636f72706f726174655f616374696f6e7330646973747269627574696f6e144572726f7204045400013c3043414e6f7442656e65666974000004d441206361706974616c20646973747269627574696f6e20776173206d61646520666f722061206e6f6e2d62656e656669742043412e34416c7265616479457869737473000104a84120646973747269627574696f6e20616c72656164792065786973747320666f7220746869732043412e4c4578706972794265666f72655061796d656e7400020829014120646973747269627574696f6e732070726f766964656420657870697279206461746520776173207374726963746c79206265666f726520697473207061796d656e7420646174652e2101496e206f7468657220776f7264732c2065766572797468696e6720746f206469737472696275746520776f756c6420696d6d6564696174656c7920626520666f726665697465642e44486f6c646572416c726561647950616964000304d454686520746f6b656e20686f6c6465722068617320616c7265616479206265656e20706169642074686569722062656e656669742e484e6f53756368446973747269627574696f6e000404c441206361706974616c20646973747269627574696f6e20646f65736e277420657869737420666f7220746869732043412e5843616e6e6f74436c61696d4265666f726553746172740005046101446973747269627574696f6e20616c6c6f746d656e742063616e6e6f7420626520636c61696d6564206173207468652063757272656e742074696d65206973206265666f72652073746172742d6f662d7061796d656e742e5843616e6e6f74436c61696d41667465724578706972790006046901446973747269627574696f6e27732065787069727920686173207061737365642e204449442063616e6e6f7420636c61696d20616e796d6f726520616e642068617320666f72666569746564207468652062656e65666974732e8042616c616e6365506572536861726550726f647563744f766572666c6f77656400070429014d756c7469706c69636174696f6e206f66207468652062616c616e636520776974682074686520706572207368617265207061796f757420616d6f756e74206f766572666c6f7765642e584e6f74446973747269627574696f6e43726561746f72000804c0444944206973206e6f7420746865206f6e652077686f20637265617465642074686520646973747269627574696f6e2e40416c72656164795265636c61696d6564000904d44449442077686f20637265617465642074686520646973747269627574696f6e20616c726561647920646964207265636c61696d2e284e6f7445787069726564000a04f0446973747269627574696f6e20686164206e6f742065787069726564207965742c206f722074686572652773206e6f2065787069727920646174652e4c446973747269627574696f6e53746172746564000b0401014120646973747269627574696f6e20686173206265656e206163746976617465642c20617320607061796d656e745f6174203c3d206e6f776020686f6c64732e6c496e73756666696369656e7452656d61696e696e67416d6f756e74000c042d014120646973747269627574696f6e2068617320696e73756666696369656e742072656d61696e696e6720616d6f756e74206f662063757272656e637920746f20646973747269627574652e60446973747269627574696f6e416d6f756e7449735a65726f000d0494446973747269627574696f6e2060616d6f756e74602063616e6e6f74206265207a65726f2e68446973747269627574696f6e506572536861726549735a65726f000e04a0446973747269627574696f6e20607065725f7368617265602063616e6e6f74206265207a65726f2e00150a00000408a8ad0200190a00000408150a80001d0a000002ad0200210a1064706f6c796d6573685f636f6d6d6f6e5f7574696c69746965731874726169747328636865636b706f696e743c4e657874436865636b706f696e747300000c011c6e6578745f61742801184d6f6d656e74000134746f74616c5f70656e64696e6728010c7536340001247363686564756c6573250a017042547265654d61703c5363686564756c6549642c204d6f6d656e743e0000250a042042547265654d617008044b01b10204560128000400290a000000290a0000022d0a002d0a00000408b1022800310a00000408a8b10200350a0c3070616c6c65745f617373657428636865636b706f696e741c56657273696f6e0000040008010875380000390a0c3070616c6c65745f617373657428636865636b706f696e74144572726f72040454000118384e6f537563685363686564756c65000004cc4120636865636b706f696e74207363686564756c6520646f6573206e6f7420657869737420666f72207468652061737365742e505363686564756c654e6f7452656d6f7661626c650001041d014120636865636b706f696e74207363686564756c65206973206e6f742072656d6f7661626c6520617320607265665f636f756e74287363686564756c655f696429203e2030602e685363686564756c65734f7665724d6178436f6d706c65786974790002042501546865206e6577207363686564756c6520776f756c642070757420746865206173736574206f76657220746865206d6178696d756d20636f6d706c657869747920616c6c6f7765642e3c5363686564756c654973456d7074790003047c43616e27742063726561746520616e20656d707479207363686564756c652e405363686564756c6546696e697368656400040494546865207363686564756c6520686173206e6f206d6f726520636865636b706f696e74732e745363686564756c6548617345787069726564436865636b706f696e747300050494546865207363686564756c6520686173206578706972656420636865636b706f696e74732e003d0a0c4c706f6c796d6573685f7072696d69746976657348636f6d706c69616e63655f6d616e616765723c4173736574436f6d706c69616e6365000008011870617573656439010110626f6f6c000130726571756972656d656e7473f10201685665633c436f6d706c69616e6365526571756972656d656e743e0000410a086470616c6c65745f636f6d706c69616e63655f6d616e616765721c56657273696f6e0000040008010875380000450a086470616c6c65745f636f6d706c69616e63655f6d616e61676572144572726f7204045400011c30556e617574686f72697a65640000045c55736572206973206e6f7420617574686f72697a65642e2c4469644e6f74457869737400010438446964206e6f742065786973742e78496e76616c6964436f6d706c69616e6365526571756972656d656e744964000204a0436f6d706c69616e636520726571756972656d656e7420696420646f65736e27742065786973742e84496e636f72726563744f7065726174696f6e4f6e54727573746564497373756572000304a04973737565722065786973742062757420747279696e6720746f2061646420697420616761696e2e7c4475706c6963617465436f6d706c69616e6365526571756972656d656e7473000404b0546865726520617265206475706c696361746520636f6d706c69616e636520726571756972656d656e74732e7c436f6d706c69616e6365526571756972656d656e74546f6f436f6d706c6578000504150154686520776f7273742063617365207363656e6172696f206f662074686520636f6d706c69616e636520726571756972656d656e7420697320746f6f20636f6d706c65782e4c5765696768744c696d697445786365656465640006040501546865206d6178696d756d20776569676874206c696d697420666f7220657865637574696e67207468652066756e6374696f6e207761732065786365656465642e00490a00000408a89d02004d0a086070616c6c65745f636f72706f726174655f616374696f6e731c56657273696f6e0000040008010875380000510a086070616c6c65745f636f72706f726174655f616374696f6e73144572726f7204045400012c3844657461696c73546f6f4c6f6e67000004d8546865206064657461696c7360206f66206120434120657863656564656420746865206d617820616c6c6f776564206c656e6774682e3c4475706c69636174654469645461780001082101412077697468686f6c64696e6720746178206f7665727269646520666f72206120676976656e204449442077617320737065636966696564206d6f7265207468616e206f6e63652e050154686520636861696e207265667573656420746f206d616b6520612063686f6963652c20616e642068656e63652074686572652077617320616e206572726f722e3c546f6f4d616e794469645461786573000204c8546f6f206d616e792077697468686f6c64696e6720746178206f76657272696465732077657265207370656369666965642e40546f6f4d616e79546172676574496473000304e4546f6f206d616e79206964656e74697469657320696e20605461726765744964656e746974696573602077657265207370656369666965642e484e6f53756368436865636b706f696e74496400040405014f6e204341206372656174696f6e2c206120636865636b706f696e74204944207761732070726f766964656420776869636820646f65736e27742065786973742e204e6f537563684341000504a44120434120776974682074686520676976656e2060434149646020646964206e6f742065786973742e304e6f5265636f7264446174650006048854686520434120646964206e6f7420686176652061207265636f726420646174652e505265636f7264446174654166746572537461727400070cdc412043412773207265636f7264206461746520776173207374726963746c792061667465722074686520227374617274222074696d652c8c7768657265202273746172742220697320636f6e7465787420646570656e64656e742e8101466f72206578616d706c652c20697420636f756c6420626520746865207374617274206f6620612062616c6c6f742c206f72207468652073746172742d6f662d7061796d656e7420696e206361706974616c20646973747269627574696f6e2e5c4465636c4461746541667465725265636f726444617465000804ec412043412773206465636c61726174696f6e206461746520776173207374726963746c7920616674657220697473207265636f726420646174652e404465636c44617465496e467574757265000904b4412043412773206465636c61726174696f6e2064617465206f636375727320696e20746865206675747572652e3c4e6f74546172676574656442794341000a046c434120646f6573206e6f742074617267657420746865204449442e00550a0000025d0300590a00000218005d0a0c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f741c56657273696f6e0000040008010875380000610a0c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f74144572726f720404540001382c43414e6f744e6f74696365000004e04120636f72706f726174652062616c6c6f7420776173206d61646520666f722061206e6f6e20604973737565724e6f74696365602043412e34416c7265616479457869737473000104b84120636f72706f726174652062616c6c6f7420616c72656164792065786973747320666f7220746869732043412e304e6f5375636842616c6c6f74000204b44120636f72706f726174652062616c6c6f7420646f65736e277420657869737420666f7220746869732043412e3453746172744166746572456e6400030411014120636f72706f726174652062616c6c6f7427732073746172742074696d6520776173207374726963746c79206166746572207468652062616c6c6f74277320656e642e2c4e6f774166746572456e640004040d014120636f72706f726174652062616c6c6f74277320656e642074696d6520776173207374726963746c79206265666f7265207468652063757272656e742074696d652e5c4e756d6265724f6643686f696365734f766572666c6f770005043901496620736f6d65206d6f74696f6e20696e206120636f72706f726174652062616c6c6f7420686173206d6f72652063686f69636573207468616e20776f756c642066697420696e2060753136602e50566f74696e67416c7265616479537461727465640006040101566f74696e67207374617274656420616c72656164792e20416d656e64696e6720612062616c6c6f74206973206e6f206c6f6e67657220706f737369626c652e40566f74696e674e6f745374617274656400070468566f74696e67206861736e27742073746172746564207965742e48566f74696e67416c7265616479456e64656400080454566f74696e6720656e64656420616c72656164792e3857726f6e67566f7465436f756e74000904150150726f7669646564206c697374206f662062616c616e63657320646f6573206e6f74206d617463682074686520746f74616c206e756d626572206f662063686f696365732e44496e73756666696369656e74566f746573000a043d01566f74696e6720706f7765722075736564206279206120444944206f6e2061206d6f74696f6e2065786365656473207468617420776869636820697320617661696c61626c6520746f207468656d2e444e6f5375636852435646616c6c6261636b000b04bc546865205243562066616c6c6261636b206f6620736f6d652063686f69636520646f6573206e6f742065786973742e3052435653656c664379636c65000c04b4546865205243562066616c6c6261636b20706f696e747320746f20746865206f726967696e2063686f6963652e345243564e6f74416c6c6f776564000d048c524356206973206e6f7420616c6c6f77656420666f7220746869732062616c6c6f742e00650a084870616c6c65745f7065726d697373696f6e73144572726f7204045400010448556e617574686f72697a656443616c6c6572000004ec5468652063616c6c6572206973206e6f7420617574686f72697a656420746f2063616c6c207468652063757272656e742065787472696e7369632e00690a082c70616c6c65745f7069707330506970734d65746164617461042c426c6f636b4e756d62657201100018010869646d030114506970496400010c75726c6102012c4f7074696f6e3c55726c3e00012c6465736372697074696f6e710301584f7074696f6e3c5069704465736372697074696f6e3e000128637265617465645f617410012c426c6f636b4e756d62657200014c7472616e73616374696f6e5f76657273696f6e10010c7533320001186578706972795901015c4d61796265426c6f636b3c426c6f636b4e756d6265723e00006d0a000004086d030000710a082c70616c6c65745f706970732c4465706f736974496e666f04244163636f756e7449640100000801146f776e65720001244163636f756e744964000118616d6f756e7418011c42616c616e63650000750a082c70616c6c65745f706970730c506970082050726f706f73616c010d06244163636f756e7449640100000c010869646d030114506970496400012070726f706f73616c0d06012050726f706f73616c00012070726f706f7365726503014c50726f706f7365723c4163636f756e7449643e0000790a082c70616c6c65745f7069707330566f74696e67526573756c740000100128617965735f636f756e7410010c753332000128617965735f7374616b6518011c42616c616e63650001286e6179735f636f756e7410010c7533320001286e6179735f7374616b6518011c42616c616e636500007d0a082c70616c6c65745f7069707310566f74650000080039010110626f6f6c000018011c42616c616e63650000810a082c70616c6c65745f7069707340536e617073686f744d65746164617461082c426c6f636b4e756d6265720110244163636f756e7449640100000c0128637265617465645f617410012c426c6f636b4e756d62657200011c6d6164655f62790001244163636f756e744964000108696481030128536e617073686f7449640000850a082c70616c6c65745f706970731c56657273696f6e0000040008010875380000890a082c70616c6c65745f70697073144572726f720404540001488452657363686564756c654e6f74427952656c65617365436f6f7264696e61746f7200000431014f6e6c79207468652047432072656c6561736520636f6f7264696e61746f7220697320616c6c6f77656420746f2072657363686564756c652070726f706f73616c20657865637574696f6e2e404e6f7446726f6d436f6d6d756e697479000108ec54686520676976656e20646973706174636861626c652063616c6c206973206e6f742076616c696420666f7220746869732070726f706f73616c2ecc5468652070726f706f73616c206d7573742062652066726f6d2074686520636f6d6d756e6974792c206275742069736e27742e384e6f744279436f6d6d6974746565000208ec54686520676976656e20646973706174636861626c652063616c6c206973206e6f742076616c696420666f7220746869732070726f706f73616c2eb45468652070726f706f73616c206d75737420626520627920636f6d6d756e6974792c206275742069736e27742e44546f6f4d616e794163746976655069707300030829015468652063757272656e74206e756d626572206f6620616374697665202870656e64696e67207c207363686564756c65642920504950732065786365656420746865206d6178696d756d9c616e64207468652070726f706f73616c206973206e6f74206279206120636f6d6d69747465652e40496e636f72726563744465706f7369740004049c50726f706f7365722073706563696669657320616e20696e636f7272656374206465706f7369744c496e73756666696369656e744465706f736974000504b450726f706f7365722063616e2774206166666f726420746f206c6f636b206d696e696d756d206465706f736974384e6f5375636850726f706f73616c000604705468652070726f706f73616c20646f6573206e6f742065786973742e4c4e6f7441436f6d6d69747465654d656d626572000704844e6f742070617274206f6620676f7665726e616e636520636f6d6d69747465652e60496e76616c6964467574757265426c6f636b4e756d626572000804d85768656e206120626c6f636b206e756d626572206973206c657373207468616e2063757272656e7420626c6f636b206e756d6265722e544e756d6265724f66566f74657345786365656465640009047c5768656e206e756d626572206f6620766f746573206f766572666c6f77732e685374616b65416d6f756e744f66566f7465734578636565646564000a04985768656e207374616b6520616d6f756e74206f66206120766f7465206f766572666c6f77732e584d697373696e6743757272656e744964656e74697479000b044c4d697373696e672063757272656e742044494458496e636f727265637450726f706f73616c5374617465000c049050726f706f73616c206973206e6f7420696e2074686520636f72726563742073746174653443616e6e6f74536b6970506970000d04fc5768656e20656e616374696e6720736e617073686f7420726573756c74732c20616e20756e736b69707061626c65205049502077617320736b69707065642e58536e617073686f74526573756c74546f6f4c61726765000e041501547269656420746f20656e61637420726573756c747320666f722074686520736e617073686f74207175657565206f766572666c6f77696e6720697473206c656e6774682e48536e617073686f7449644d69736d61746368000f045d01547269656420746f20656e61637420726573756c7420666f7220504950207769746820696420646966666572656e742066726f6d20746861742061742074686520706f736974696f6e20696e207468652071756575652e705363686564756c656450726f706f73616c446f65736e744578697374001004fc457865637574696f6e206f662061207363686564756c65642070726f706f73616c206661696c65642062656361757365206974206973206d697373696e672e6c50726f706f73616c4e6f74496e5363686564756c65645374617465001104fc412070726f706f73616c2074686174206973206e6f7420696e2061207363686564756c65642073746174652063616e6e6f742062652065786563757465642e008d0a0000040880f000910a0000040880a50300950a00000408e8a800990a0000040880e8009d0a00000408e8a10a00a10a00000408a8bd0300a50a084070616c6c65745f706f7274666f6c696f1c56657273696f6e0000040008010875380000a90a084070616c6c65745f706f7274666f6c696f144572726f7204045400014854506f7274666f6c696f446f65734e6f7445786973740000047054686520706f7274666f6c696f20646f65736e27742065786973742e70496e73756666696369656e74506f7274666f6c696f42616c616e63650001049c496e73756666696369656e742062616c616e636520666f722061207472616e73616374696f6e2e6844657374696e6174696f6e497353616d65506f7274666f6c696f000204e854686520736f7572636520616e642064657374696e6174696f6e20706f7274666f6c696f732073686f756c6420626520646966666572656e742e64506f7274666f6c696f4e616d65416c7265616479496e557365000304310154686520706f7274666f6c696f20636f756c646e27742062652072656e616d65642062656361757365207468652063686f73656e206e616d6520697320616c726561647920696e207573652e945365636f6e646172794b65794e6f74417574686f72697a6564466f72506f7274666f6c696f000404fc546865207365636f6e64617279206b6579206973206e6f7420617574686f72697a656420746f206163636573732074686520706f7274666f6c696f2873292e54556e617574686f72697a6564437573746f6469616e000504f454686520706f72666f6c696f277320637573746f6479206973207769746820736f6d656f6e65206f74686572207468616e207468652063616c6c65722e60496e73756666696369656e74546f6b656e734c6f636b6564000604bc43616e206e6f7420756e6c6f636b206d6f726520746f6b656e73207468616e207768617420617265206c6f636b656444506f7274666f6c696f4e6f74456d707479000704bc54686520706f7274666f6c696f207374696c6c2068617320736f6d652061737365742062616c616e6365206c6566746c446966666572656e744964656e74697479506f7274666f6c696f73000804b454686520706f7274666f6c696f732062656c6f6e6720746f20646966666572656e74206964656e746974696573604e6f4475706c6963617465417373657473416c6c6f776564000904804475706c696361746520617373657420616d6f6e6720746865206974656d732e584e46544e6f74466f756e64496e506f7274666f6c696f000a04a0546865204e465420646f6573206e6f7420657869737420696e2074686520706f7274666f6c696f2e404e4654416c72656164794c6f636b6564000b0468546865204e465420697320616c7265616479206c6f636b65642e304e46544e6f744c6f636b6564000c0478546865204e465420686173206e65766572206265656e206c6f636b65642e68496e76616c69645472616e736665724e46544e6f744f776e6564000d04c04f6e6c79206f776e6564204e4654732063616e206265206d6f766564206265747765656e20706f7274666f6c696f732e68496e76616c69645472616e736665724e465449734c6f636b6564000e04c04c6f636b6564204e4654732063616e206e6f74206265206d6f766564206265747765656e20706f7274666f6c696f732e34456d7074795472616e73666572000f04a0547279696e6720746f206d6f766520616e20616d6f756e74206f66207a65726f206173736574732e5c4d697373696e674f776e6572735065726d697373696f6e00100439015468652063616c6c657220646f65736e27742068617665207065726d697373696f6e20746f2063726561746520706f7274666f6c696f73206f6e20746865206f776e6572277320626568616c662ea0496e76616c69645472616e7366657253656e64657249644d61746368657352656365697665724964001104fc5468652073656e646572206964656e746974792063616e2774206265207468652073616d6520617320746865207265636569766572206964656e746974792e00ad0a084c70616c6c65745f70726f746f636f6c5f666565144572726f7204045400010c68496e73756666696369656e744163636f756e7442616c616e6365000004b0496e73756666696369656e74206163636f756e742062616c616e636520746f2070617920746865206665652e4c556e48616e646c6564496d62616c616e636573000104884e6f742061626c6520746f2068616e646c65642074686520696d62616c616e63657368496e73756666696369656e745375627369647942616c616e6365000204b0496e73756666696369656e7420737562736964792062616c616e636520746f2070617920746865206665652e00b10a0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401b50a045300000400c50a01185665633c543e0000b50a04184f7074696f6e04045401b90a0108104e6f6e6500000010536f6d650400b90a0000010000b90a084070616c6c65745f7363686564756c6572245363686564756c656414104e616d6501041043616c6c01bd0a2c426c6f636b4e756d62657201103450616c6c6574734f726967696e017907244163636f756e7449640100001401206d617962655f6964d10301304f7074696f6e3c4e616d653e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cbd0a011043616c6c0001386d617962655f706572696f646963110701944f7074696f6e3c7363686564756c653a3a506572696f643c426c6f636b4e756d6265723e3e0001186f726967696e7907013450616c6c6574734f726967696e0000bd0a10346672616d655f737570706f72741874726169747324707265696d616765731c426f756e646564040454010d06010c184c6567616379040110686173682c01104861736800000018496e6c696e650400c10a0134426f756e646564496e6c696e65000100184c6f6f6b7570080110686173682c01104861736800010c6c656e10010c75333200020000c10a0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e0000c50a000002b50a00c90a0c4070616c6c65745f7363686564756c65721870616c6c6574144572726f72040454000114404661696c6564546f5363686564756c65000004644661696c656420746f207363686564756c6520612063616c6c204e6f74466f756e640001047c43616e6e6f742066696e6420746865207363686564756c65642063616c6c2e5c546172676574426c6f636b4e756d626572496e50617374000204a4476976656e2074617267657420626c6f636b206e756d62657220697320696e2074686520706173742e4852657363686564756c654e6f4368616e6765000304f052657363686564756c65206661696c6564206265636175736520697420646f6573206e6f74206368616e6765207363686564756c65642074696d652e144e616d6564000404d0417474656d707420746f207573652061206e6f6e2d6e616d65642066756e6374696f6e206f6e2061206e616d6564207461736b2e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909cd0a0c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e741456656e7565000008011c63726561746f728001284964656e74697479496400012876656e75655f74797065e103012456656e7565547970650000d10a00000408d903890200d50a00000408d9030000d90a0000040880d90300dd0a0c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e742c496e737472756374696f6e08184d6f6d656e7401282c426c6f636b4e756d626572011000180138696e737472756374696f6e5f696489020134496e737472756374696f6e496400012076656e75655f6964f503013c4f7074696f6e3c56656e756549643e00013c736574746c656d656e745f74797065f903016c536574746c656d656e74547970653c426c6f636b4e756d6265723e000128637265617465645f6174050101384f7074696f6e3c4d6f6d656e743e00012874726164655f64617465050101384f7074696f6e3c4d6f6d656e743e00012876616c75655f64617465050101384f7074696f6e3c4d6f6d656e743e0000e10a000004088902e50300e50a0c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e74244c656753746174757304244163636f756e7449640100010c4050656e64696e67546f6b656e4c6f636b00000040457865637574696f6e50656e64696e6700010050457865637574696f6e546f4265536b697070656408000001244163636f756e744964000028010c75363400020000e90a000004088902e800ed0a0c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e744441666669726d6174696f6e53746174757300010c1c556e6b6e6f776e0000001c50656e64696e670001002041666669726d656400020000f10a00000408e8890200f50a00000408a8d90300f90a0c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e7444496e737472756374696f6e537461747573042c426c6f636b4e756d626572011001141c556e6b6e6f776e0000001c50656e64696e67000100184661696c65640002001c53756363657373040010012c426c6f636b4e756d6265720003002052656a6563746564040010012c426c6f636b4e756d62657200040000fd0a0000040889028000010b0c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e74644d65646961746f7241666669726d6174696f6e5374617475730404540128010c1c556e6b6e6f776e0000001c50656e64696e670001002041666669726d6564040118657870697279050101244f7074696f6e3c543e00020000050b084470616c6c65745f736574746c656d656e741c56657273696f6e0000040008010875380000090b084470616c6c65745f736574746c656d656e74144572726f720404540001ac30496e76616c696456656e75650000045456656e756520646f6573206e6f742065786973742e30556e617574686f72697a6564000104a853656e64657220646f6573206e6f742068617665207265717569726564207065726d697373696f6e732e58496e737472756374696f6e4e6f7441666669726d656400020488496e737472756374696f6e20686173206e6f74206265656e2061666669726d65642e48556e617574686f72697a65645369676e6572000304985369676e6572206973206e6f7420617574686f72697a6564206279207468652076656e75652e5452656365697074416c7265616479436c61696d6564000404545265636569707420616c726561647920757365642e44556e617574686f72697a656456656e7565000504a456656e756520646f6573206e6f742068617665207265717569726564207065726d697373696f6e732e5c496e737472756374696f6e4461746573496e76616c696400060474496e737472756374696f6e2068617320696e76616c696420646174657370496e737472756374696f6e536574746c65426c6f636b506173736564000704a8496e737472756374696f6e27732074617267657420736574746c6520626c6f636b20726561636865642e40496e76616c69645369676e6174757265000804784f6666636861696e207369676e617475726520697320696e76616c69642e4853616d6553656e64657252656365697665720009048453656e64657220616e6420726563656976657220617265207468652073616d652e44536574746c654f6e50617374426c6f636b000a0461015468652070726f766964656420736574746c656d656e7420626c6f636b206e756d62657220697320696e20746865207061737420616e642063616e6e6f74206265207573656420627920746865207363686564756c65722e6c556e657870656374656441666669726d6174696f6e537461747573000b0445015468652063757272656e7420696e737472756374696f6e2061666669726d6174696f6e2073746174757320646f6573206e6f7420737570706f7274207468652072657175657374656420616374696f6e2e404661696c6564546f5363686564756c65000c048c5363686564756c696e67206f6620616e20696e737472756374696f6e206661696c732e48556e6b6e6f776e496e737472756374696f6e000d0474496e737472756374696f6e2073746174757320697320756e6b6e6f776e4c5369676e6572416c7265616479457869737473000e04845369676e657220697320616c726561647920616464656420746f2076656e75652e485369676e6572446f65734e6f744578697374000f04745369676e6572206973206e6f7420616464656420746f2076656e75652e285a65726f416d6f756e7400100494496e737472756374696f6e206c656720616d6f756e742063616e2774206265207a65726f2e80496e737472756374696f6e536574746c65426c6f636b4e6f7452656163686564001104d8496e737472756374696f6e20736574746c656d656e7420626c6f636b20686173206e6f7420796574206265656e20726561636865642e4443616c6c657249734e6f74415061727479001204b85468652063616c6c6572206973206e6f742061207061727479206f66207468697320696e737472756374696f6e2e5c4d61784e756d6265724f664e46547345786365656465640013041501546865206e756d626572206f66206e667473206265696e67207472616e7366657272656420696e2074686520696e737472756374696f6e207761732065786365656465642e944e756d6265724f665472616e736665727265644e465473556e646572657374696d61746564001404f854686520676976656e206e756d626572206f66206e667473206265696e67207472616e736665727265642077617320756e646572657374696d617465642e6052656365697074466f72496e76616c69644c656754797065001504ec4f66662d636861696e2072656365697074732063616e206f6e6c79206265207573656420666f72206f66662d636861696e206c656720747970652e4c5765696768744c696d697445786365656465640016040501546865206d6178696d756d20776569676874206c696d697420666f7220657865637574696e67207468652066756e6374696f6e207761732065786365656465642e844d61784e756d6265724f6646756e6769626c654173736574734578636565646564001704cc546865206d6178696d756d206e756d626572206f662066756e6769626c6520617373657473207761732065786365656465642e844d61784e756d6265724f664f6666436861696e4173736574734578636565646564001804d0546865206d6178696d756d206e756d626572206f66206f66662d636861696e20617373657473207761732065786365656465642e9c4e756d6265724f6646756e6769626c655472616e7366657273556e646572657374696d61746564001904e854686520676976656e206e756d626572206f662066756e6769626c65207472616e73666572732077617320756e646572657374696d617465642e5c556e65787065637465644f4646436861696e4173736574001a04904173736574494420636f756c64206e6f7420626520666f756e64206f6e20636861696e2e644f6666436861696e417373657443616e7442654c6f636b6564001b04884f66662d436861696e206173736574732063616e6e6f74206265206c6f636b65642e9c4e756d6265724f664f6666436861696e5472616e7366657273556e646572657374696d61746564001c04ec54686520676976656e206e756d626572206f66206f66662d636861696e207472616e73666572732077617320756e646572657374696d617465642e2c4c65674e6f74466f756e64001d04884e6f206c656720776974682074686520676976656e2069642077617320666f756e6470496e70757457656967687449734c6573735468616e4d696e696d756d001e04cc54686520696e70757420776569676874206973206c657373207468616e20746865206d696e696d756d2072657175697265642e6c4d61784e756d6265724f6652656365697074734578636565646564001f04b0546865206d6178696d756d206e756d626572206f66207265636569707473207761732065786365656465642e884e6f74416c6c41666669726d6174696f6e73486176654265656e5265636569766564002004e054686572652061726520706172746965732077686f2068617665206e6f742061666669726d65642074686520696e737472756374696f6e2e90496e76616c6964496e737472756374696f6e537461747573466f72457865637574696f6e00210489014f6e6c79205b60496e737472756374696f6e5374617475733a3a50656e64696e67605d206f72205b60496e737472756374696f6e5374617475733a3a4661696c6564605d20696e737472756374696f6e732063616e2062652065786563757465642e8c4661696c6564546f52656c656173654c6f636b4f725472616e73666572417373657473002204150154686520696e737472756374696f6e206661696c656420746f2072656c65617365206173736574206c6f636b73206f72207472616e7366657220746865206173736574732e4c4475706c696361746552656365697074556964002304d04e6f206475706c6963617465207569642061726520616c6c6f77656420666f7220646966666572656e742072656365697074732e7452656365697074496e737472756374696f6e49644d6973736d61746368002404190154686520696e737472756374696f6e20696420696e20616c6c207265636569707473206d757374206d61746368207468652065787472696e73696320706172616d657465722e644d756c7469706c655265636569707473466f724f6e654c6567002504cc4d756c7469706c6520726563656970747320666f72207468652073616d65206c656720617265206e6f7420616c6c6f7765642e4c556e65787065637465644c656753746174757300260470416e20696e76616c696420686173206265656e20726561636865642e704e756d6265724f6656656e75655369676e6572734578636565646564002704c4546865206d6178696d756d206e756d626572206f662076656e7565207369676e657273207761732065786365656465642e5043616c6c657249734e6f74414d65646961746f72002804c05468652063616c6c6572206973206e6f742061206d65646961746f7220696e2074686520696e737472756374696f6e2e44496e76616c696445787069727944617465002904c4546865206d65646961746f722773206578706972792064617465206d75737420626520696e20746865206675747572652e684d65646961746f7241666669726d6174696f6e45787069726564002a04e854686520657870697279206461746520666f7220746865206d65646961746f7227732061666669726d6174696f6e20686173207061737365642e04844572726f727320666f722074686520536574746c656d656e74206d6f64756c652e0d0b0c4c626f756e6465645f636f6c6c656374696f6e7344626f756e6465645f62747265655f7365743c426f756e6465644254726565536574080454010d040453000004004507012c42547265655365743c543e0000110b00000408150b250400150b0c4c706f6c796d6573685f7072696d697469766573287374617469737469637328537461743173744b6579000008012061737365745f6964a8011c41737365744944000124737461745f747970650d04012053746174547970650000190b0c4c706f6c796d6573685f7072696d6974697665734c7472616e736665725f636f6d706c69616e63655c41737365745472616e73666572436f6d706c69616e6365040453000008011870617573656439010110626f6f6c000130726571756972656d656e74731d0b0194426f756e64656442547265655365743c5472616e73666572436f6e646974696f6e2c20533e00001d0b0c4c626f756e6465645f636f6c6c656374696f6e7344626f756e6465645f62747265655f7365743c426f756e64656442547265655365740804540139040453000004004d07012c42547265655365743c543e0000210b000004083d048000250b084470616c6c65745f737461746973746963731c56657273696f6e0000040008010875380000290b084470616c6c65745f73746174697374696373144572726f7204045400011c3c496e76616c69645472616e73666572000004545472616e73666572206e6f7420616c6c6f7765642e3c53746174547970654d697373696e67000104605374617454797065206973206e6f7420656e61626c65642e8453746174547970654e656564656442795472616e73666572436f6e646974696f6e000204a05374617454797065206973206e6565646564206279205472616e73666572436f6e646974696f6e2e6443616e6e6f7452656d6f76655374617454797065496e557365000304a84120537461747479706520697320696e2075736520616e642063616e27742062652072656d6f7665642e5053746174547970654c696d697452656163686564000404f4546865206c696d6974206f662053746174547970657320616c6c6f77656420666f7220616e20617373657420686173206265656e20726561636865642e745472616e73666572436f6e646974696f6e4c696d6974526561636865640005041901546865206c696d6974206f66205472616e73666572436f6e646974696f6e7320616c6c6f77656420666f7220616e20617373657420686173206265656e20726561636865642e4c5765696768744c696d697445786365656465640006040501546865206d6178696d756d20776569676874206c696d697420666f7220657865637574696e67207468652066756e6374696f6e207761732065786365656465642e046453746174697374696373206d6f64756c65206572726f72732e2d0b00000408a8490400310b082870616c6c65745f73746f1c56657273696f6e0000040008010875380000350b082870616c6c65745f73746f144572726f7204045400013030556e617574686f72697a6564000004a853656e64657220646f6573206e6f742068617665207265717569726564207065726d697373696f6e732e204f766572666c6f770001048c416e2061726974686d65746963206f7065726174696f6e206f766572666c6f7765642e6c496e73756666696369656e74546f6b656e7352656d61696e696e67000204804e6f7420656e6f75676820746f6b656e73206c65667420666f722073616c652e4846756e647261697365724e6f74466f756e640003045446756e64726169736572206e6f7420666f756e642e4446756e647261697365724e6f744c6976650004049c46756e64726169736572206973206569746865722066726f7a656e206f722073746f707065642e4046756e64726169736572436c6f736564000504ac46756e6472616973657220686173206265656e20636c6f7365642f73746f7070656420616c72656164792e4446756e6472616973657245787069726564000604d0496e746572616374696e67207769746820612066756e6472616973657220706173742074686520656e6420604d6f6d656e74602e30496e76616c696456656e756500070468416e20696e76616c69642076656e75652070726f76696465642e44496e76616c6964507269636554696572730008042501416e20696e646976696475616c20707269636520746965722077617320696e76616c6964206f72206120736574206f662070726963652074696572732077617320696e76616c69642e54496e76616c69644f66666572696e6757696e646f770009045d0157696e646f77202873746172742074696d652c20656e642074696d65292068617320696e76616c696420706172616d65746572732c20652e672073746172742074696d6520697320616674657220656e642074696d652e404d617850726963654578636565646564000a04bc5072696365206f662074686520696e766573746d656e7420657863656564656420746865206d61782070726963652e58496e766573746d656e74416d6f756e74546f6f4c6f77000b04e8496e766573746d656e7420616d6f756e74206973206c6f776572207468616e206d696e696d756d20696e766573746d656e7420616d6f756e742e04844572726f727320666f722074686520536574746c656d656e74206d6f64756c652e390b083c70616c6c65745f7472656173757279144572726f720404540001084c496e73756666696369656e7442616c616e63650000047850726f706f73657227732062616c616e636520697320746f6f206c6f772e3c496e76616c69644964656e7469747900010488496e76616c6964206964656e7469747920666f722064697362757273656d656e742e04784572726f7220666f7220746865207472656173757279206d6f64756c652e3d0b0c3870616c6c65745f7574696c6974791870616c6c6574144572726f7204045400011430546f6f4d616e7943616c6c730000045c546f6f206d616e792063616c6c7320626174636865642e40496e76616c69645369676e6174757265000108744f6666636861696e207369676e617475726520697320696e76616c696438504f4c594d455348206572726f72405461726765744364644d697373696e670002088054617267657420646f6573206e6f74206861766520612076616c69642043444438504f4c594d455348206572726f7230496e76616c69644e6f6e63650003106850726f7669646564206e6f6e63652077617320696e76616c696411014966207468652070726f7669646564206e6f6e6365203c2063757272656e74206e6f6e63652c207468652063616c6c2077617320616c72656164792065786563757465645d014966207468652070726f7669646564206e6f6e6365203e2063757272656e74206e6f6e63652c207468652063616c6c287329206265666f7265207468652063757272656e74206661696c656420746f206578656375746538504f4c594d455348206572726f725c556e61626c65546f4465726976654163636f756e744964000404984465636f64696e672064657269766174697665206163636f756e74204964206661696c65642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909410b082c70616c6c65745f62617365144572726f720404540001081c546f6f4c6f6e6700000880457863656564656420612067656e65726963206c656e677468206c696d69742e1d01546865206c696d697420636f756c6420626520666f7220616e7920736f7274206f66206c69737473206f66207468696e67732c20696e636c7564696e67206120737472696e672e3c436f756e7465724f766572666c6f77000118b85468652073657175656e636520636f756e74657220666f7220736f6d657468696e67206f766572666c6f7765642e001d015768656e20746869732068617070656e7320646570656e6473206f6e20652e672e2c20746865206361706163697479206f6620746865206964656e74696669657220747970652e3901466f72206578616d706c652c207765206d69676874206861766520607075622073747275637420506970496428753332293b602c207769746820607533323a3a4d4158602063617061636974792e5901496e2070726163746963652c207468657365206572726f72732077696c6c206e657665722068617070656e20627574206e6f20636f646520706174682073686f756c6420726573756c7420696e20612070616e69632cfc736f20746865736520636f726e6572206361736573206e65656420746f20626520636f7665726564207769746820616e206572726f722076617269616e742e00450b00000408a8350100490b085870616c6c65745f65787465726e616c5f6167656e74731c56657273696f6e00000400080108753800004d0b085870616c6c65745f65787465726e616c5f6167656e7473144572726f72040454000118204e6f537563684147000004f0416e20414720776974682074686520676976656e2060414749646020646964206e6f7420657869737420666f7220746865206041737365744944602e44556e617574686f72697a65644167656e74000104e8546865206167656e74206973206e6f7420617574686f72697a656420746f2063616c6c207468652063757272656e742065787472696e7369632e38416c7265616479416e4167656e74000204ec5468652070726f766964656420606167656e746020697320616c726561647920616e206167656e7420666f7220746865206041737365744944602e284e6f74416e4167656e74000304dc5468652070726f766964656420606167656e7460206973206e6f7420616e206167656e7420666f7220746865206041737365744944602e5452656d6f76696e674c61737446756c6c4167656e74000408e054686973206167656e7420697320746865206c6173742066756c6c206f6e652c20616e642069742773206265696e672072656d6f7665642c686d616b696e6720746865206173736574206f727068616e65642e845365636f6e646172794b65794e6f74417574686f72697a6564466f7241737365740005041d015468652063616c6c65722773207365636f6e64617279206b657920646f6573206e6f74206861766520746865207265717569726564206173736574207065726d697373696f6e2e00510b083870616c6c65745f72656c617965721c53756273696479040c416363010000080128706179696e675f6b657900010c41636300012472656d61696e696e6718011c42616c616e63650000550b083870616c6c65745f72656c61796572144572726f7204045400011c44557365724b65794364644d697373696e67000004cc5468652060757365725f6b657960206973206e6f7420617474616368656420746f2061204344442764206964656e746974792e4c506179696e674b65794364644d697373696e67000104cc5468652060757365725f6b657960206973206e6f7420617474616368656420746f2061204344442764206964656e746974792e2c4e6f506179696e674b6579000204ac5468652060757365725f6b65796020646f65736e2774206861766520612060706179696e675f6b6579602e304e6f74506179696e674b6579000304b05468652060757365725f6b65796020686173206120646966666572656e742060706179696e675f6b6579602e644e6f74417574686f72697a6564466f72506179696e674b6579000404b8546865207369676e6572206973206e6f7420617574686f72697a656420666f722060706179696e675f6b6579602e5c4e6f74417574686f72697a6564466f72557365724b6579000504b0546865207369676e6572206973206e6f7420617574686f72697a656420666f722060757365725f6b6579602e204f766572666c6f77000604b85468652072656d61696e696e6720504f4c595820666f722060757365725f6b657960206f766572666c6f7765642e00590b0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e00005d0b0c4070616c6c65745f636f6e747261637473107761736d405072656661625761736d4d6f64756c65040454000014016c696e737472756374696f6e5f776569676874735f76657273696f6ecd04010c75333200011c696e697469616ccd04010c75333200011c6d6178696d756dcd04010c753332000110636f6465610b014452656c61786564436f64655665633c543e00012c64657465726d696e69736dad07012c44657465726d696e69736d0000610b0c4c626f756e6465645f636f6c6c656374696f6e73407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401080453000004003001185665633c543e0000650b0c4070616c6c65745f636f6e747261637473107761736d244f776e6572496e666f04045400000c01146f776e65720001384163636f756e7449644f663c543e00011c6465706f736974d901013042616c616e63654f663c543e000120726566636f756e7424010c7536340000690b0c4070616c6c65745f636f6e7472616374731c73746f7261676530436f6e7472616374496e666f040454000020011c747269655f6964c10a011854726965496400013c6465706f7369745f6163636f756e746d0b01444465706f7369744163636f756e743c543e000124636f64655f686173682c012c436f6465486173683c543e00013473746f726167655f627974657310010c75333200013473746f726167655f6974656d7310010c75333200015073746f726167655f627974655f6465706f73697418013042616c616e63654f663c543e00015073746f726167655f6974656d5f6465706f73697418013042616c616e63654f663c543e00015073746f726167655f626173655f6465706f73697418013042616c616e63654f663c543e00006d0b0c4070616c6c65745f636f6e7472616374731c73746f72616765384465706f7369744163636f756e74040454000004000001384163636f756e7449644f663c543e0000710b0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401750b045300000400790b01185665633c543e0000750b0c4070616c6c65745f636f6e7472616374731c73746f726167653c44656c65746564436f6e7472616374000004011c747269655f6964c10a01185472696549640000790b000002750b007d0b0c4070616c6c65745f636f6e747261637473207363686564756c65205363686564756c6504045400000c01186c696d697473810b01184c696d69747300014c696e737472756374696f6e5f77656967687473850b0154496e737472756374696f6e576569676874733c543e00013c686f73745f666e5f77656967687473890b0140486f7374466e576569676874733c543e0000810b0c4070616c6c65745f636f6e747261637473207363686564756c65184c696d69747300002401306576656e745f746f7069637310010c75333200011c676c6f62616c7310010c7533320001186c6f63616c7310010c753332000128706172616d657465727310010c7533320001306d656d6f72795f706167657310010c7533320001287461626c655f73697a6510010c75333200013462725f7461626c655f73697a6510010c75333200012c7375626a6563745f6c656e10010c75333200012c7061796c6f61645f6c656e10010c7533320000850b0c4070616c6c65745f636f6e747261637473207363686564756c6548496e737472756374696f6e576569676874730404540000d8011c76657273696f6e10010c75333200012066616c6c6261636b10010c753332000120693634636f6e737410010c75333200011c6936346c6f616410010c75333200012069363473746f726510010c75333200011873656c65637410010c7533320001107223696610010c753332000108627210010c75333200011462725f696610010c75333200012062725f7461626c6510010c75333200014862725f7461626c655f7065725f656e74727910010c75333200011063616c6c10010c75333200013463616c6c5f696e64697265637410010c75333200015c63616c6c5f696e6469726563745f7065725f706172616d10010c75333200013863616c6c5f7065725f6c6f63616c10010c7533320001246c6f63616c5f67657410010c7533320001246c6f63616c5f73657410010c7533320001246c6f63616c5f74656510010c753332000128676c6f62616c5f67657410010c753332000128676c6f62616c5f73657410010c7533320001386d656d6f72795f63757272656e7410010c75333200012c6d656d6f72795f67726f7710010c753332000118693634636c7a10010c75333200011869363463747a10010c753332000124693634706f70636e7410010c75333200011869363465717a10010c753332000134693634657874656e647369333210010c753332000134693634657874656e647569333210010c7533320001286933327772617069363410010c753332000114693634657110010c7533320001146936346e6510010c7533320001186936346c747310010c7533320001186936346c747510010c75333200011869363467747310010c75333200011869363467747510010c7533320001186936346c657310010c7533320001186936346c657510010c75333200011869363467657310010c75333200011869363467657510010c75333200011869363461646410010c75333200011869363473756210010c7533320001186936346d756c10010c75333200011c6936346469767310010c75333200011c6936346469767510010c75333200011c69363472656d7310010c75333200011c69363472656d7510010c753332000118693634616e6410010c7533320001146936346f7210010c753332000118693634786f7210010c75333200011869363473686c10010c75333200011c6936347368727310010c75333200011c6936347368727510010c75333200011c693634726f746c10010c75333200011c693634726f747210010c7533320000890b0c4070616c6c65745f636f6e747261637473207363686564756c6534486f7374466e576569676874730404540000ec011863616c6c657220011857656967687400012c69735f636f6e7472616374200118576569676874000124636f64655f686173682001185765696768740001346f776e5f636f64655f6861736820011857656967687400014063616c6c65725f69735f6f726967696e20011857656967687400011c616464726573732001185765696768740001206761735f6c65667420011857656967687400011c62616c616e636520011857656967687400014476616c75655f7472616e7366657272656420011857656967687400013c6d696e696d756d5f62616c616e6365200118576569676874000130626c6f636b5f6e756d62657220011857656967687400010c6e6f772001185765696768740001347765696768745f746f5f66656520011857656967687400010c676173200118576569676874000114696e707574200118576569676874000138696e7075745f7065725f62797465200118576569676874000120722372657475726e20011857656967687400013c72657475726e5f7065725f627974652001185765696768740001247465726d696e61746520011857656967687400011872616e646f6d2001185765696768740001346465706f7369745f6576656e7420011857656967687400015c6465706f7369745f6576656e745f7065725f746f7069632001185765696768740001586465706f7369745f6576656e745f7065725f6279746520011857656967687400013464656275675f6d65737361676520011857656967687400015864656275675f6d6573736167655f7065725f6279746520011857656967687400012c7365745f73746f726167652001185765696768740001607365745f73746f726167655f7065725f6e65775f627974652001185765696768740001607365745f73746f726167655f7065725f6f6c645f627974652001185765696768740001347365745f636f64655f68617368200118576569676874000134636c6561725f73746f72616765200118576569676874000158636c6561725f73746f726167655f7065725f62797465200118576569676874000140636f6e7461696e735f73746f72616765200118576569676874000164636f6e7461696e735f73746f726167655f7065725f6279746520011857656967687400012c6765745f73746f726167652001185765696768740001506765745f73746f726167655f7065725f6279746520011857656967687400013074616b655f73746f7261676520011857656967687400015474616b655f73746f726167655f7065725f627974652001185765696768740001207472616e7366657220011857656967687400011063616c6c20011857656967687400013464656c65676174655f63616c6c20011857656967687400015c63616c6c5f7472616e736665725f73757263686172676520011857656967687400015063616c6c5f7065725f636c6f6e65645f6279746520011857656967687400012c696e7374616e7469617465200118576569676874000178696e7374616e74696174655f7472616e736665725f737572636861726765200118576569676874000168696e7374616e74696174655f7065725f696e7075745f62797465200118576569676874000164696e7374616e74696174655f7065725f73616c745f62797465200118576569676874000134686173685f736861325f323536200118576569676874000158686173685f736861325f3235365f7065725f6279746520011857656967687400013c686173685f6b656363616b5f323536200118576569676874000160686173685f6b656363616b5f3235365f7065725f6279746520011857656967687400013c686173685f626c616b65325f323536200118576569676874000160686173685f626c616b65325f3235365f7065725f6279746520011857656967687400013c686173685f626c616b65325f313238200118576569676874000160686173685f626c616b65325f3132385f7065725f6279746520011857656967687400013465636473615f7265636f76657220011857656967687400015065636473615f746f5f6574685f616464726573732001185765696768740001407265656e7472616e63655f636f756e742001185765696768740001606163636f756e745f7265656e7472616e63655f636f756e7420011857656967687400014c696e7374616e74696174696f6e5f6e6f6e636520011857656967687400008d0b0c4070616c6c65745f636f6e7472616374731870616c6c6574144572726f7204045400017058496e76616c69645363686564756c6556657273696f6e000004010141206e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652063757272656e74206f6e652e40496e76616c696443616c6c466c6167730001043501496e76616c696420636f6d62696e6174696f6e206f6620666c61677320737570706c69656420746f20607365616c5f63616c6c60206f7220607365616c5f64656c65676174655f63616c6c602e204f75744f66476173000204b854686520657865637574656420636f6e7472616374206578686175737465642069747320676173206c696d69742e504f7574707574427566666572546f6f536d616c6c0003040101546865206f75747075742062756666657220737570706c69656420746f206120636f6e7472616374204150492063616c6c2077617320746f6f20736d616c6c2e385472616e736665724661696c65640004083501506572666f726d696e672074686520726571756573746564207472616e73666572206661696c65642e2050726f6261626c7920626563617573652074686572652069736e277420656e6f75676894667265652062616c616e636520696e207468652073656e6465722773206163636f756e742e4c4d617843616c6c4465707468526561636865640005082101506572666f726d696e6720612063616c6c207761732064656e6965642062656361757365207468652063616c6c696e67206465707468207265616368656420746865206c696d6974946f6620776861742069732073706563696669656420696e20746865207363686564756c652e40436f6e74726163744e6f74466f756e64000604bc4e6f20636f6e74726163742077617320666f756e64206174207468652073706563696669656420616464726573732e30436f6465546f6f4c617267650007083d0154686520636f646520737570706c69656420746f2060696e7374616e74696174655f776974685f636f646560206578636565647320746865206c696d69742073706563696669656420696e207468654463757272656e74207363686564756c652e30436f64654e6f74466f756e64000804c44e6f20636f646520636f756c6420626520666f756e642061742074686520737570706c69656420636f646520686173682e2c4f75744f66426f756e647300090425014120627566666572206f757473696465206f662073616e64626f78206d656d6f7279207761732070617373656420746f206120636f6e7472616374204150492066756e6374696f6e2e384465636f64696e674661696c6564000a042901496e7075742070617373656420746f206120636f6e7472616374204150492066756e6374696f6e206661696c656420746f206465636f646520617320657870656374656420747970652e3c436f6e747261637454726170706564000b0488436f6e7472616374207472617070656420647572696e6720657865637574696f6e2e3456616c7565546f6f4c61726765000c04cc5468652073697a6520646566696e656420696e2060543a3a4d617856616c756553697a6560207761732065786365656465642e605465726d696e617465645768696c655265656e7472616e74000d0819015465726d696e6174696f6e206f66206120636f6e7472616374206973206e6f7420616c6c6f776564207768696c652074686520636f6e747261637420697320616c7265616479e06f6e207468652063616c6c20737461636b2e2043616e2062652074726967676572656420627920607365616c5f7465726d696e617465602e38496e707574466f72776172646564000e044101607365616c5f63616c6c6020666f72776172646564207468697320636f6e74726163747320696e7075742e204974207468657265666f7265206973206e6f206c6f6e67657220617661696c61626c652e5052616e646f6d5375626a656374546f6f4c6f6e67000f04d8546865207375626a6563742070617373656420746f20607365616c5f72616e646f6d60206578636565647320746865206c696d69742e34546f6f4d616e79546f706963730010041d0154686520616d6f756e74206f6620746f706963732070617373656420746f20607365616c5f6465706f7369745f6576656e747360206578636565647320746865206c696d69742e404e6f436861696e457874656e73696f6e00110c450154686520636861696e20646f6573206e6f742070726f76696465206120636861696e20657874656e73696f6e2e2043616c6c696e672074686520636861696e20657874656e73696f6e20726573756c74734d01696e2074686973206572726f722e204e6f74652074686174207468697320757375616c6c79202073686f756c646e27742068617070656e206173206465706c6f79696e67207375636820636f6e7472616374733069732072656a65637465642e4444656c6574696f6e517565756546756c6c001214010152656d6f76616c206f66206120636f6e7472616374206661696c65642062656361757365207468652064656c6574696f6e2071756575652069732066756c6c2e00b8546869732063616e2068617070656e207768656e2063616c6c696e6720607365616c5f7465726d696e617465602e4d015468652071756575652069732066696c6c65642062792064656c6574696e6720636f6e74726163747320616e6420656d7074696564206279206120666978656420616d6f756e74206561636820626c6f636b2e2101547279696e6720616761696e20647572696e6720616e6f7468657220626c6f636b20697320746865206f6e6c792077617920746f207265736f6c766520746869732069737375652e444475706c6963617465436f6e7472616374001304c84120636f6e74726163742077697468207468652073616d65204163636f756e74496420616c7265616479206578697374732e5c5465726d696e61746564496e436f6e7374727563746f7200140cb84120636f6e74726163742073656c66206465737472756374656420696e2069747320636f6e7374727563746f722e00d0546869732063616e2062652074726967676572656420627920612063616c6c20746f20607365616c5f7465726d696e617465602e405265656e7472616e636544656e6965640015040d01412063616c6c20747269656420746f20696e766f6b65206120636f6e7472616374207468617420697320666c6167676564206173206e6f6e2d7265656e7472616e742e7053746f726167654465706f7369744e6f74456e6f75676846756e647300160421014f726967696e20646f65736e2774206861766520656e6f7567682062616c616e636520746f20706179207468652072657175697265642073746f72616765206465706f736974732e7053746f726167654465706f7369744c696d69744578686175737465640017040d014d6f72652073746f72616765207761732063726561746564207468616e20616c6c6f776564206279207468652073746f72616765206465706f736974206c696d69742e24436f6465496e5573650018044901436f64652072656d6f76616c207761732064656e69656420626563617573652074686520636f6465206973207374696c6c20696e20757365206279206174206c65617374206f6e6520636f6e74726163742e40436f6e74726163745265766572746564001910250154686520636f6e74726163742072616e20746f20636f6d706c6574696f6e20627574206465636964656420746f20726576657274206974732073746f72616765206368616e6765732e4901506c65617365206e6f746520746861742074686973206572726f72206973206f6e6c792072657475726e65642066726f6d2065787472696e736963732e205768656e2063616c6c6564206469726563746c795d016f72207669612052504320616e20604f6b602077696c6c2062652072657475726e65642e20496e20746869732063617365207468652063616c6c6572206e6565647320746f20696e73706563742074686520666c616773c4746f2064657465726d696e652077686574686572206120726576657273696f6e206861732074616b656e20706c6163652e30436f646552656a6563746564001a20450154686520636f6e7472616374277320636f64652077617320666f756e6420746f20626520696e76616c696420647572696e672076616c69646174696f6e206f7220696e737472756d656e746174696f6e2e004d01546865206d6f7374206c696b656c79206361757365206f662074686973206973207468617420616e20415049207761732075736564207768696368206973206e6f7420737570706f72746564206279207468654d016e6f64652e205468697320686170656e7320696620616e206f6c646572206e6f6465206973207573656420776974682061206e65772076657273696f6e206f6620696e6b212e20547279207570646174696e67a8796f7572206e6f646520746f20746865206e657765737420617661696c61626c652076657273696f6e2e00510141206d6f72652064657461696c6564206572726f722063616e20626520666f756e64206f6e20746865206e6f646520636f6e736f6c65206966206465627567206d657373616765732061726520656e61626c6564a8627920737570706c79696e6720602d6c72756e74696d653a3a636f6e7472616374733d6465627567602e3c496e64657465726d696e6973746963001b042101416e20696e64657465726d697374696320636f646520776173207573656420696e206120636f6e746578742077686572652074686973206973206e6f74207065726d69747465642e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909910b0848706f6c796d6573685f636f6e7472616374731c56657273696f6e0000040008010875380000950b0848706f6c796d6573685f636f6e747261637473144572726f7204045400013034496e76616c696446756e634964000004a4496e76616c6964206066756e635f6964602070726f76696465642066726f6d20636f6e74726163742e48496e76616c696452756e74696d6543616c6c0001049c4661696c656420746f206465636f646520612076616c6964206052756e74696d6543616c6c602e445265616453746f726167654661696c6564000204fc605265616453746f7261676560206661696c656420746f2077726974652076616c756520696e746f2074686520636f6e74726163742773206275666665722e54446174614c65667441667465724465636f64696e67000304d444617461206c65667420696e20696e707574207768656e206465636f64696e6720617267756d656e7473206f6620612063616c6c2e34496e4c656e546f6f4c617267650004043901496e70757420646174612074686174206120636f6e747261637420706173736564207768656e207573696e672074686520436861696e457874656e73696f6e2077617320746f6f206c617267652e384f75744c656e546f6f4c61726765000504ec4f757470757420646174612072657475726e65642066726f6d2074686520436861696e457874656e73696f6e2077617320746f6f206c617267652e68496e7374616e746961746f72576974684e6f4964656e74697479000608b04120636f6e74726163742077617320617474656d7074656420746f20626520696e7374616e7469617465642c0d01627574206e6f206964656e746974792077617320676976656e20746f206173736f636961746520746865206e657720636f6e74726163742773206b657920776974682e4452756e74696d6543616c6c44656e696564000704cc45787472696e736963206973206e6f7420616c6c6f77656420746f2062652063616c6c656420627920636f6e7472616374732e5043616c6c65724e6f74415072696d6172794b6579000804805468652063616c6c6572206973206e6f742061207072696d617279206b65792e544d697373696e674b65795065726d697373696f6e73000904985365636f6e64617279206b6579207065726d697373696f6e7320617265206d697373696e672e4c496e76616c6964436861696e56657273696f6e000a049c4f6e6c792066757475726520636861696e2076657273696f6e732061726520616c6c6f7765642e4c4e6f5570677261646573537570706f72746564000b04d4546865726520617265206e6f2061706920757067726164657320737570706f7274656420666f722074686520636f6e74726163742e00990b083c70616c6c65745f707265696d616765345265717565737453746174757308244163636f756e74496401001c42616c616e6365011801082c556e72657175657374656408011c6465706f736974d1080150284163636f756e7449642c2042616c616e63652900010c6c656e10010c753332000000245265717565737465640c011c6465706f7369749d0b01704f7074696f6e3c284163636f756e7449642c2042616c616e6365293e000114636f756e7410010c75333200010c6c656e5106012c4f7074696f6e3c7533323e000100009d0b04184f7074696f6e04045401d1080108104e6f6e6500000010536f6d650400d1080000010000a10b000004082c1000a50b0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401080453000004003001185665633c543e0000a90b0c3c70616c6c65745f707265696d6167651870616c6c6574144572726f7204045400011818546f6f426967000004a0507265696d61676520697320746f6f206c6172676520746f2073746f7265206f6e2d636861696e2e30416c72656164794e6f746564000104a4507265696d6167652068617320616c7265616479206265656e206e6f746564206f6e2d636861696e2e344e6f74417574686f72697a6564000204c85468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e2e204e6f744e6f746564000304fc54686520707265696d6167652063616e6e6f742062652072656d6f7665642073696e636520697420686173206e6f7420796574206265656e206e6f7465642e2452657175657374656400040409014120707265696d616765206d6179206e6f742062652072656d6f766564207768656e20746865726520617265206f75747374616e64696e672072657175657374732e304e6f745265717565737465640005042d0154686520707265696d61676520726571756573742063616e6e6f742062652072656d6f7665642073696e6365206e6f206f75747374616e64696e672072657175657374732065786973742e04b5010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f6d61696e2d646f63732f6275696c642f6576656e74732d6572726f72732f290a0909096f6620746869732070616c6c65742e0a090909ad0b0c4c706f6c796d6573685f7072696d6974697665730c6e6674344e4654436f6c6c656374696f6e00000801086964a104013c4e4654436f6c6c656374696f6e496400012061737365745f6964a8011c417373657449440000b10b04204254726565536574040454017902000400d907000000b50b00000408b90b790200b90b00000408a104bd0300bd0b082870616c6c65745f6e66741c56657273696f6e0000040008010875380000c10b082870616c6c65745f6e6674144572726f7204045400016c3c42616c616e63654f766572666c6f77000004a8416e206f766572666c6f77207768696c652063616c63756c6174696e67207468652062616c616e63652e4042616c616e6365556e646572666c6f77000104ac416e20756e646572666c6f77207768696c652063616c63756c6174696e67207468652062616c616e63652e68436f6c6c656374696f6e416c7265647952656769737465726564000204e05468652061737365745f696420697320616c7265616479206173736f63696174656420746f20616e204e465420636f6c6c656374696f6e2e48436f6c6c656374696f6e4e6f74466f756e6400030488546865204e465420636f6c6c656374696f6e20646f6573206e6f742065786973742e504475706c69636174654d657461646174614b6579000404d841206475706c6963617465206d65746164617461206b657920686173206265656e2070617373656420617320706172616d657465722e3c4475706c6963617465644e46544964000504784475706c69636174652069647320617265206e6f7420616c6c6f7765642e40496e76616c69644173736574547970650006049c546865206173736574206d757374206265206f662074797065206e6f6e2d66756e6769626c652e60496e76616c69644d657461646174614174747269627574650007048d0145697468657220746865206e756d626572206f66206b657973206f7220746865206b6579206964656e74696669657220646f6573206e6f74206d6174636820746865206b65797320646566696e656420666f722074686520636f6c6c656374696f6e2e90496e76616c69644e46545472616e73666572436f6c6c656374696f6e4e6f74466f756e64000804d44661696c656420746f207472616e7366657220616e204e4654202d204e465420636f6c6c656374696f6e206e6f7420666f756e642e7c496e76616c69644e46545472616e7366657253616d65506f7274666f6c696f00090409014661696c656420746f207472616e7366657220616e204e4654202d20617474656d707420746f206d6f766520746f207468652073616d6520706f7274666f6c696f2e74496e76616c69644e46545472616e736665724e46544e6f744f776e6564000a04dc4661696c656420746f207472616e7366657220616e204e4654202d204e4654206e6f7420666f756e6420696e20706f7274666f6c696f2e7c496e76616c69644e46545472616e73666572436f756e744f766572666c6f77000b04e84661696c656420746f207472616e7366657220616e204e4654202d206964656e7469747920636f756e7420776f756c64206f766572666c6f772e8c496e76616c69644e46545472616e73666572436f6d706c69616e63654661696c757265000c04b84661696c656420746f207472616e7366657220616e204e4654202d20636f6d706c69616e6365206661696c65642e74496e76616c69644e46545472616e7366657246726f7a656e4173736574000d04b04661696c656420746f207472616e7366657220616e204e4654202d2061737365742069732066726f7a656e2e8c496e76616c69644e46545472616e73666572496e73756666696369656e74436f756e74000e043d014661696c656420746f207472616e7366657220616e204e4654202d20746865206e756d626572206f66206e66747320696e20746865206964656e7469747920697320696e73756666696369656e742e5c4d61784e756d6265724f664b6579734578636565646564000f04c4546865206d6178696d756d206e756d626572206f66206d65746164617461206b657973207761732065786365656465642e744d61784e756d6265724f664e4654735065724c656745786365656465640010041501546865206d6178696d756d206e756d626572206f66206e667473206265696e67207472616e7366657272656420696e206f6e65206c6567207761732065786365656465642e2c4e46544e6f74466f756e640011045c546865204e465420646f6573206e6f742065786973742e5c556e726567697374657265644d657461646174614b6579001204e84174206c65617374206f6e65206f6620746865206d65746164617461206b65797320686173206e6f74206265656e20726567697374657265642e245a65726f436f756e74001304a44974206973206e6f7420706f737369626c6520746f207472616e7366657272207a65726f206e66742e38537570706c794f766572666c6f77001404c4416e206f766572666c6f77207768696c652063616c63756c6174696e6720746865207570646174656420737570706c792e3c537570706c79556e646572666c6f77001504c8416e20756e646572666c6f77207768696c652063616c63756c6174696e6720746865207570646174656420737570706c792e74496e76616c69644e46545472616e736665724e465449734c6f636b6564001604a84661696c656420746f207472616e7366657220616e204e4654202d206e6674206973206c6f636b65642eac496e76616c69644e46545472616e7366657253656e64657249644d61746368657352656365697665724964001704fc5468652073656e646572206964656e746974792063616e2774206265207468652073616d6520617320746865207265636569766572206964656e746974792e90496e76616c69644e46545472616e73666572496e76616c69645265636569766572434444001804805468652072656365697665722068617320616e20696e76616c6964204344442e88496e76616c69644e46545472616e73666572496e76616c696453656e646572434444001904785468652073656e6465722068617320616e20696e76616c6964204344442e38496e76616c696441737365744944001a04c854686572652773206e6f206173736574206173736f63696174656420746f2074686520676976656e2061737365745f69642e00c50b089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f7068617365345265616479536f6c7574696f6e04045400000c0120737570706f727473c90b01b0426f756e646564537570706f7274733c543a3a4163636f756e7449642c20543a3a4d617857696e6e6572733e00011473636f7265ad040134456c656374696f6e53636f726500011c636f6d70757465a904013c456c656374696f6e436f6d707574650000c90b0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401c508045300000400c10801185665633c543e0000cd0b089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f706861736534526f756e64536e617073686f740404540000080118766f74657273d10b013c5665633c566f7465724f663c543e3e00011c74617267657473fc01445665633c543a3a4163636f756e7449643e0000d10b000002d50b00d50b0000040c0028410900d90b0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401dd0b045300000400e10b01185665633c543e0000dd0b0000040cad04101000e10b000002dd0b00e50b0c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f7068617365187369676e6564405369676e65645375626d697373696f6e0c244163636f756e74496401001c42616c616e6365011820536f6c7574696f6e01ed070010010c77686f0001244163636f756e74496400011c6465706f73697418011c42616c616e63650001307261775f736f6c7574696f6ee9070154526177536f6c7574696f6e3c536f6c7574696f6e3e00012063616c6c5f66656518011c42616c616e63650000e90b0c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c6574144572726f720404540001386850726544697370617463684561726c795375626d697373696f6e000004645375626d697373696f6e2077617320746f6f206561726c792e6c507265446973706174636857726f6e6757696e6e6572436f756e740001048857726f6e67206e756d626572206f662077696e6e6572732070726573656e7465642e6450726544697370617463685765616b5375626d697373696f6e000204905375626d697373696f6e2077617320746f6f207765616b2c2073636f72652d776973652e3c5369676e6564517565756546756c6c0003044901546865207175657565207761732066756c6c2c20616e642074686520736f6c7574696f6e20776173206e6f7420626574746572207468616e20616e79206f6620746865206578697374696e67206f6e65732e585369676e656443616e6e6f745061794465706f73697400040494546865206f726967696e206661696c656420746f2070617920746865206465706f7369742e505369676e6564496e76616c69645769746e657373000504a05769746e657373206461746120746f20646973706174636861626c6520697320696e76616c69642e4c5369676e6564546f6f4d756368576569676874000604b8546865207369676e6564207375626d697373696f6e20636f6e73756d657320746f6f206d756368207765696768743c4f637743616c6c57726f6e67457261000704984f4357207375626d697474656420736f6c7574696f6e20666f722077726f6e6720726f756e645c4d697373696e67536e617073686f744d65746164617461000804a8536e617073686f74206d657461646174612073686f756c6420657869737420627574206469646e27742e58496e76616c69645375626d697373696f6e496e646578000904d06053656c663a3a696e736572745f7375626d697373696f6e602072657475726e656420616e20696e76616c696420696e6465782e3843616c6c4e6f74416c6c6f776564000a04985468652063616c6c206973206e6f7420616c6c6f776564206174207468697320706f696e742e3846616c6c6261636b4661696c6564000b044c5468652066616c6c6261636b206661696c65642c426f756e644e6f744d6574000c0448536f6d6520626f756e64206e6f74206d657438546f6f4d616e7957696e6e657273000d049c5375626d697474656420736f6c7574696f6e2068617320746f6f206d616e792077696e6e657273040d014572726f72206f66207468652070616c6c657420746861742063616e2062652072657475726e656420696e20726573706f6e736520746f20646973706174636865732eed0b084470616c6c65745f746573745f7574696c73144572726f7204045400010000f10b102873705f72756e74696d651c67656e657269634c756e636865636b65645f65787472696e73696348556e636865636b656445787472696e736963101c416464726573730185051043616c6c010d06245369676e617475726501210714457874726101f50b00040030000000f50b00000420f90bfd0b010c050c0d0c110c190c1d0c00f90b10306672616d655f73797374656d28657874656e73696f6e7348636865636b5f737065635f76657273696f6e40436865636b5370656356657273696f6e04045400000000fd0b10306672616d655f73797374656d28657874656e73696f6e7340636865636b5f74785f76657273696f6e38436865636b547856657273696f6e04045400000000010c10306672616d655f73797374656d28657874656e73696f6e7334636865636b5f67656e6573697330436865636b47656e6573697304045400000000050c10306672616d655f73797374656d28657874656e73696f6e733c636865636b5f6d6f7274616c69747938436865636b4d6f7274616c69747904045400000400090c010c4572610000090c102873705f72756e74696d651c67656e657269630c6572610c4572610001010420496d6d6f7274616c0000001c4d6f7274616c31040008000001001c4d6f7274616c32040008000002001c4d6f7274616c33040008000003001c4d6f7274616c34040008000004001c4d6f7274616c35040008000005001c4d6f7274616c36040008000006001c4d6f7274616c37040008000007001c4d6f7274616c38040008000008001c4d6f7274616c3904000800000900204d6f7274616c313004000800000a00204d6f7274616c313104000800000b00204d6f7274616c313204000800000c00204d6f7274616c313304000800000d00204d6f7274616c313404000800000e00204d6f7274616c313504000800000f00204d6f7274616c313604000800001000204d6f7274616c313704000800001100204d6f7274616c313804000800001200204d6f7274616c313904000800001300204d6f7274616c323004000800001400204d6f7274616c323104000800001500204d6f7274616c323204000800001600204d6f7274616c323304000800001700204d6f7274616c323404000800001800204d6f7274616c323504000800001900204d6f7274616c323604000800001a00204d6f7274616c323704000800001b00204d6f7274616c323804000800001c00204d6f7274616c323904000800001d00204d6f7274616c333004000800001e00204d6f7274616c333104000800001f00204d6f7274616c333204000800002000204d6f7274616c333304000800002100204d6f7274616c333404000800002200204d6f7274616c333504000800002300204d6f7274616c333604000800002400204d6f7274616c333704000800002500204d6f7274616c333804000800002600204d6f7274616c333904000800002700204d6f7274616c343004000800002800204d6f7274616c343104000800002900204d6f7274616c343204000800002a00204d6f7274616c343304000800002b00204d6f7274616c343404000800002c00204d6f7274616c343504000800002d00204d6f7274616c343604000800002e00204d6f7274616c343704000800002f00204d6f7274616c343804000800003000204d6f7274616c343904000800003100204d6f7274616c353004000800003200204d6f7274616c353104000800003300204d6f7274616c353204000800003400204d6f7274616c353304000800003500204d6f7274616c353404000800003600204d6f7274616c353504000800003700204d6f7274616c353604000800003800204d6f7274616c353704000800003900204d6f7274616c353804000800003a00204d6f7274616c353904000800003b00204d6f7274616c363004000800003c00204d6f7274616c363104000800003d00204d6f7274616c363204000800003e00204d6f7274616c363304000800003f00204d6f7274616c363404000800004000204d6f7274616c363504000800004100204d6f7274616c363604000800004200204d6f7274616c363704000800004300204d6f7274616c363804000800004400204d6f7274616c363904000800004500204d6f7274616c373004000800004600204d6f7274616c373104000800004700204d6f7274616c373204000800004800204d6f7274616c373304000800004900204d6f7274616c373404000800004a00204d6f7274616c373504000800004b00204d6f7274616c373604000800004c00204d6f7274616c373704000800004d00204d6f7274616c373804000800004e00204d6f7274616c373904000800004f00204d6f7274616c383004000800005000204d6f7274616c383104000800005100204d6f7274616c383204000800005200204d6f7274616c383304000800005300204d6f7274616c383404000800005400204d6f7274616c383504000800005500204d6f7274616c383604000800005600204d6f7274616c383704000800005700204d6f7274616c383804000800005800204d6f7274616c383904000800005900204d6f7274616c393004000800005a00204d6f7274616c393104000800005b00204d6f7274616c393204000800005c00204d6f7274616c393304000800005d00204d6f7274616c393404000800005e00204d6f7274616c393504000800005f00204d6f7274616c393604000800006000204d6f7274616c393704000800006100204d6f7274616c393804000800006200204d6f7274616c393904000800006300244d6f7274616c31303004000800006400244d6f7274616c31303104000800006500244d6f7274616c31303204000800006600244d6f7274616c31303304000800006700244d6f7274616c31303404000800006800244d6f7274616c31303504000800006900244d6f7274616c31303604000800006a00244d6f7274616c31303704000800006b00244d6f7274616c31303804000800006c00244d6f7274616c31303904000800006d00244d6f7274616c31313004000800006e00244d6f7274616c31313104000800006f00244d6f7274616c31313204000800007000244d6f7274616c31313304000800007100244d6f7274616c31313404000800007200244d6f7274616c31313504000800007300244d6f7274616c31313604000800007400244d6f7274616c31313704000800007500244d6f7274616c31313804000800007600244d6f7274616c31313904000800007700244d6f7274616c31323004000800007800244d6f7274616c31323104000800007900244d6f7274616c31323204000800007a00244d6f7274616c31323304000800007b00244d6f7274616c31323404000800007c00244d6f7274616c31323504000800007d00244d6f7274616c31323604000800007e00244d6f7274616c31323704000800007f00244d6f7274616c31323804000800008000244d6f7274616c31323904000800008100244d6f7274616c31333004000800008200244d6f7274616c31333104000800008300244d6f7274616c31333204000800008400244d6f7274616c31333304000800008500244d6f7274616c31333404000800008600244d6f7274616c31333504000800008700244d6f7274616c31333604000800008800244d6f7274616c31333704000800008900244d6f7274616c31333804000800008a00244d6f7274616c31333904000800008b00244d6f7274616c31343004000800008c00244d6f7274616c31343104000800008d00244d6f7274616c31343204000800008e00244d6f7274616c31343304000800008f00244d6f7274616c31343404000800009000244d6f7274616c31343504000800009100244d6f7274616c31343604000800009200244d6f7274616c31343704000800009300244d6f7274616c31343804000800009400244d6f7274616c31343904000800009500244d6f7274616c31353004000800009600244d6f7274616c31353104000800009700244d6f7274616c31353204000800009800244d6f7274616c31353304000800009900244d6f7274616c31353404000800009a00244d6f7274616c31353504000800009b00244d6f7274616c31353604000800009c00244d6f7274616c31353704000800009d00244d6f7274616c31353804000800009e00244d6f7274616c31353904000800009f00244d6f7274616c3136300400080000a000244d6f7274616c3136310400080000a100244d6f7274616c3136320400080000a200244d6f7274616c3136330400080000a300244d6f7274616c3136340400080000a400244d6f7274616c3136350400080000a500244d6f7274616c3136360400080000a600244d6f7274616c3136370400080000a700244d6f7274616c3136380400080000a800244d6f7274616c3136390400080000a900244d6f7274616c3137300400080000aa00244d6f7274616c3137310400080000ab00244d6f7274616c3137320400080000ac00244d6f7274616c3137330400080000ad00244d6f7274616c3137340400080000ae00244d6f7274616c3137350400080000af00244d6f7274616c3137360400080000b000244d6f7274616c3137370400080000b100244d6f7274616c3137380400080000b200244d6f7274616c3137390400080000b300244d6f7274616c3138300400080000b400244d6f7274616c3138310400080000b500244d6f7274616c3138320400080000b600244d6f7274616c3138330400080000b700244d6f7274616c3138340400080000b800244d6f7274616c3138350400080000b900244d6f7274616c3138360400080000ba00244d6f7274616c3138370400080000bb00244d6f7274616c3138380400080000bc00244d6f7274616c3138390400080000bd00244d6f7274616c3139300400080000be00244d6f7274616c3139310400080000bf00244d6f7274616c3139320400080000c000244d6f7274616c3139330400080000c100244d6f7274616c3139340400080000c200244d6f7274616c3139350400080000c300244d6f7274616c3139360400080000c400244d6f7274616c3139370400080000c500244d6f7274616c3139380400080000c600244d6f7274616c3139390400080000c700244d6f7274616c3230300400080000c800244d6f7274616c3230310400080000c900244d6f7274616c3230320400080000ca00244d6f7274616c3230330400080000cb00244d6f7274616c3230340400080000cc00244d6f7274616c3230350400080000cd00244d6f7274616c3230360400080000ce00244d6f7274616c3230370400080000cf00244d6f7274616c3230380400080000d000244d6f7274616c3230390400080000d100244d6f7274616c3231300400080000d200244d6f7274616c3231310400080000d300244d6f7274616c3231320400080000d400244d6f7274616c3231330400080000d500244d6f7274616c3231340400080000d600244d6f7274616c3231350400080000d700244d6f7274616c3231360400080000d800244d6f7274616c3231370400080000d900244d6f7274616c3231380400080000da00244d6f7274616c3231390400080000db00244d6f7274616c3232300400080000dc00244d6f7274616c3232310400080000dd00244d6f7274616c3232320400080000de00244d6f7274616c3232330400080000df00244d6f7274616c3232340400080000e000244d6f7274616c3232350400080000e100244d6f7274616c3232360400080000e200244d6f7274616c3232370400080000e300244d6f7274616c3232380400080000e400244d6f7274616c3232390400080000e500244d6f7274616c3233300400080000e600244d6f7274616c3233310400080000e700244d6f7274616c3233320400080000e800244d6f7274616c3233330400080000e900244d6f7274616c3233340400080000ea00244d6f7274616c3233350400080000eb00244d6f7274616c3233360400080000ec00244d6f7274616c3233370400080000ed00244d6f7274616c3233380400080000ee00244d6f7274616c3233390400080000ef00244d6f7274616c3234300400080000f000244d6f7274616c3234310400080000f100244d6f7274616c3234320400080000f200244d6f7274616c3234330400080000f300244d6f7274616c3234340400080000f400244d6f7274616c3234350400080000f500244d6f7274616c3234360400080000f600244d6f7274616c3234370400080000f700244d6f7274616c3234380400080000f800244d6f7274616c3234390400080000f900244d6f7274616c3235300400080000fa00244d6f7274616c3235310400080000fb00244d6f7274616c3235320400080000fc00244d6f7274616c3235330400080000fd00244d6f7274616c3235340400080000fe00244d6f7274616c3235350400080000ff00000d0c10306672616d655f73797374656d28657874656e73696f6e732c636865636b5f6e6f6e636528436865636b4e6f6e636504045400000400cd040120543a3a496e6465780000110c0c4c706f6c796d6573685f657874656e73696f6e7330636865636b5f7765696768742c436865636b57656967687404045400000400150c011443573c543e0000150c10306672616d655f73797374656d28657874656e73696f6e7330636865636b5f7765696768742c436865636b57656967687404045400000000190c086870616c6c65745f7472616e73616374696f6e5f7061796d656e74604368617267655472616e73616374696f6e5061796d656e7404045400000400d901013042616c616e63654f663c543e00001d0c084870616c6c65745f7065726d697373696f6e734453746f726543616c6c4d6574616461746104045400000000210c0c60706f6c796d6573685f72756e74696d655f646576656c6f701c72756e74696d651c52756e74696d6500000000cc1853797374656d011853797374656d401c4163636f756e7401010402000c4101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e8205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e3845787472696e736963436f756e74000010040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2c426c6f636b57656967687401001c180000000000000488205468652063757272656e742077656967687420666f722074686520626c6f636b2e40416c6c45787472696e736963734c656e000010040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010405102c8000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101040510300400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d6265720100101000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801002c80000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e18446967657374010034040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301004404001ca0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e001d01204e4f54453a20546865206974656d20697320756e626f756e6420616e642073686f756c64207468657265666f7265206e657665722062652072656164206f6e20636861696e2ed020497420636f756c64206f746865727769736520696e666c6174652074686520506f562073697a65206f66206120626c6f636b2e002d01204576656e747320686176652061206c6172676520696e2d6d656d6f72792073697a652e20426f7820746865206576656e747320746f206e6f7420676f206f75742d6f662d6d656d6f7279fc206a75737420696e206361736520736f6d656f6e65207374696c6c207265616473207468656d2066726f6d2077697468696e207468652072756e74696d652e284576656e74436f756e74010010100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f70696373010104022cc5040400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e484c61737452756e74696d65557067726164650000c90404000455012053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e545570677261646564546f553332526566436f756e74010039010400044d012054727565206966207765206861766520757067726164656420736f207468617420607479706520526566436f756e74602069732060753332602e2046616c7365202864656661756c7429206966206e6f742e605570677261646564546f547269706c65526566436f756e74010039010400085d012054727565206966207765206861766520757067726164656420736f2074686174204163636f756e74496e666f20636f6e7461696e73207468726565207479706573206f662060526566436f756e74602e2046616c736548202864656661756c7429206966206e6f742e38457865637574696f6e50686173650000bd04040004882054686520657865637574696f6e207068617365206f662074686520626c6f636b2e01d10401501830426c6f636b57656967687473e10401020700c817a804000b00204aa9d10113ffffffffffffffff02daf89a00010b80914b872e011366666666666666a6010b0098f73e5d0113ffffffffffffffbf01000002daf89a00010b80199ef1a2011366666666666666e6010b00204aa9d10113ffffffffffffffff01070088526a7413000000000000004002daf89a0000000004d020426c6f636b20262065787472696e7369637320776569676874733a20626173652076616c75657320616e64206c696d6974732e2c426c6f636b4c656e677468f10430000078000000a0000000a00004a820546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e38426c6f636b48617368436f756e74101000100000045501204d6178696d756d206e756d626572206f6620626c6f636b206e756d62657220746f20626c6f636b2068617368206d617070696e677320746f206b65657020286f6c64657374207072756e6564206669727374292e204462576569676874f9044080f0fa020000000000c2eb0b000000000409012054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e1c56657273696f6efd04d10430706f6c796d6573685f64657630706f6c796d6573685f64657601000000c0cf6a000000000058df6acb689907609b0400000037e397fc7c91f5e40100000040fe3ad401f8959a06000000d2bc9897eed08f1503000000f78b278be53f454c02000000ed99c5acb25eedf503000000cbca25e39f14238702000000687ad44ad37f03c201000000bc9d89904f5b923f0100000068b66ba122c93fa70200000037c8bb1350a9a2a802000000f3ff14d5ab52705902000000ab3c0572291feb8b0100000018ef58a3b67ba77001000000329342994773047f01000000001a0b29f17d01f401000000f28e8080b6e2dfd004000000bb6ba9053c5c9d7804000000595ac34c5ea1f5fe010000009ea061a615cee2fe0200000053df5001418f3b460200000098cf18c375950e1f0200000007000000010484204765742074686520636861696e27732063757272656e742076657273696f6e2e28535335385072656669785d03082a0014a8205468652064657369676e61746564205353353820707265666978206f66207468697320636861696e2e0039012054686973207265706c6163657320746865202273733538466f726d6174222070726f7065727479206465636c6172656420696e2074686520636861696e20737065632e20526561736f6e20697331012074686174207468652072756e74696d652073686f756c64206b6e6f772061626f7574207468652070726566697820696e206f7264657220746f206d616b6520757365206f662069742061737020616e206964656e746966696572206f662074686520636861696e2e011105001042616265011042616265442845706f6368496e64657801002820000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f726974696573010015050400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f740100250520000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f740100250520000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e65737301000480000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e6050656e64696e6745706f6368436f6e6669674368616e67650000290504000461012050656e64696e672065706f636820636f6e66696775726174696f6e206368616e676520746861742077696c6c206265206170706c696564207768656e20746865206e6578742065706f636820697320656e61637465642e384e65787452616e646f6d6e657373010004800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e3c4e657874417574686f7269746965730100150504000460204e6578742065706f636820617574686f7269746965732e305365676d656e74496e6465780100101000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f8205765206d616b6520612074726164652d6f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101040510350504000415012054574f582d4e4f54453a20605365676d656e74496e6465786020697320616e20696e6372656173696e6720696e74656765722c20736f2074686973206973206f6b61792e2c496e697469616c697a656400003d0504000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e4c417574686f7256726652616e646f6d6e6573730100d10304001015012054686973206669656c642073686f756c6420616c7761797320626520706f70756c6174656420647572696e6720626c6f636b2070726f63657373696e6720756e6c6573731901207365636f6e6461727920706c61696e20736c6f74732061726520656e61626c65642028776869636820646f6e277420636f6e7461696e206120565246206f7574707574292e0049012049742069732073657420696e20606f6e5f66696e616c697a65602c206265666f72652069742077696c6c20636f6e7461696e207468652076616c75652066726f6d20746865206c61737420626c6f636b2e2845706f636853746172740100cd03200000000000000000145d012054686520626c6f636b206e756d62657273207768656e20746865206c61737420616e642063757272656e742065706f6368206861766520737461727465642c20726573706563746976656c7920604e2d316020616e641420604e602e4901204e4f54453a20576520747261636b207468697320697320696e206f7264657220746f20616e6e6f746174652074686520626c6f636b206e756d626572207768656e206120676976656e20706f6f6c206f66590120656e74726f7079207761732066697865642028692e652e20697420776173206b6e6f776e20746f20636861696e206f6273657276657273292e2053696e63652065706f6368732061726520646566696e656420696e590120736c6f74732c207768696368206d617920626520736b69707065642c2074686520626c6f636b206e756d62657273206d6179206e6f74206c696e6520757020776974682074686520736c6f74206e756d626572732e204c6174656e657373010010100000000014d820486f77206c617465207468652063757272656e7420626c6f636b20697320636f6d706172656420746f2069747320706172656e742e001501205468697320656e74727920697320706f70756c617465642061732070617274206f6620626c6f636b20657865637574696f6e20616e6420697320636c65616e65642075701101206f6e20626c6f636b2066696e616c697a6174696f6e2e205175657279696e6720746869732073746f7261676520656e747279206f757473696465206f6620626c6f636bb020657865637574696f6e20636f6e746578742073686f756c6420616c77617973207969656c64207a65726f2e2c45706f6368436f6e6669670000510504000861012054686520636f6e66696775726174696f6e20666f72207468652063757272656e742065706f63682e2053686f756c64206e6576657220626520604e6f6e656020617320697420697320696e697469616c697a656420696e242067656e657369732e3c4e65787445706f6368436f6e666967000051050400082d012054686520636f6e66696775726174696f6e20666f7220746865206e6578742065706f63682c20604e6f6e65602069662074686520636f6e6669672077696c6c206e6f74206368616e6765e82028796f752063616e2066616c6c6261636b20746f206045706f6368436f6e6669676020696e737465616420696e20746861742063617365292e34536b697070656445706f6368730100550504002029012041206c697374206f6620746865206c6173742031303020736b69707065642065706f63687320616e642074686520636f72726573706f6e64696e672073657373696f6e20696e64657870207768656e207468652065706f63682077617320736b69707065642e0031012054686973206973206f6e6c79207573656420666f722076616c69646174696e672065717569766f636174696f6e2070726f6f66732e20416e2065717569766f636174696f6e2070726f6f663501206d75737420636f6e7461696e732061206b65792d6f776e6572736869702070726f6f6620666f72206120676976656e2073657373696f6e2c207468657265666f7265207765206e656564206139012077617920746f2074696520746f6765746865722073657373696f6e7320616e642065706f636820696e64696365732c20692e652e207765206e65656420746f2076616c69646174652074686174290120612076616c696461746f722077617320746865206f776e6572206f66206120676976656e206b6579206f6e206120676976656e2073657373696f6e2c20616e64207768617420746865b0206163746976652065706f636820696e6465782077617320647572696e6720746861742073657373696f6e2e016105000c3445706f63684475726174696f6e28202c010000000000000cec2054686520616d6f756e74206f662074696d652c20696e20736c6f74732c207468617420656163682065706f63682073686f756c64206c6173742e1901204e4f54453a2043757272656e746c79206974206973206e6f7420706f737369626c6520746f206368616e6765207468652065706f6368206475726174696f6e20616674657221012074686520636861696e2068617320737461727465642e20417474656d7074696e6720746f20646f20736f2077696c6c20627269636b20626c6f636b2070726f64756374696f6e2e444578706563746564426c6f636b54696d652820701700000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e384d6178417574686f7269746965731010a08601000488204d6178206e756d626572206f6620617574686f72697469657320616c6c6f776564017505012454696d657374616d70012454696d657374616d70080c4e6f7701002820000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e2444696455706461746501003901040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f0179050004344d696e696d756d506572696f642820b80b000000000000104d0120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a5d0120706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c5d012067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c206265a020646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e00021c496e6469636573011c496e646963657304204163636f756e747300010402107d050400048820546865206c6f6f6b75702066726f6d20696e64657820746f206163636f756e742e0181050174041c4465706f736974184040420f0000000000000000000000000004ac20546865206465706f736974206e656564656420666f7220726573657276696e6720616e20696e6465782e0189050328417574686f72736869700128417574686f72736869700418417574686f720000000400046420417574686f72206f662063757272656e7420626c6f636b2e00000000042042616c616e636573012042616c616e6365730834546f74616c49737375616e6365010018400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e144c6f636b7301010402008d05040008b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e019905017804484578697374656e7469616c4465706f73697418400000000000000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e019d0505485472616e73616374696f6e5061796d656e7401485472616e73616374696f6e5061796d656e7408444e6578744665654d756c7469706c6965720100a10540000064a7b3b6e00d0000000000000000003853746f7261676556657273696f6e0100a50504000000019008485472616e73616374696f6e42797465466565184064000000000000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e2c576569676874546f466565a9055c040000000000000000000000000000000049b400000001040d012054686520706f6c796e6f6d69616c2074686174206973206170706c69656420696e206f7264657220746f20646572697665206665652066726f6d207765696768742e0006204964656e7469747901204964656e7469747960284469645265636f7264730001040680b1050400045420444944202d3e206964656e7469747920696e666f2c497344696446726f7a656e01010406803901040004e420444944202d3e20626f6f6c207468617420696e64696361746573206966207365636f6e64617279206b657973206172652066726f7a656e2e3043757272656e74506179657200000004000401012049742073746f726573207468652063757272656e74206761732066656520706179657220666f72207468652063757272656e74207472616e73616374696f6e18436c61696d730001080502b5050101040004f020285461726765742049442c20636c61696d20747970652920286973737565722c73636f706529202d3e204173736f63696174656420636c61696d7330437573746f6d436c61696d73000104051901300400049420437573746f6d436c61696d547970654964202d3e20537472696e6720636f6e7374616e744c437573746f6d436c61696d73496e7665727365000104023019010400049420537472696e6720636f6e7374616e74202d3e20437573746f6d436c61696d54797065496454437573746f6d436c61696d496453657175656e6365010019011000000000047820546865206e6578742060437573746f6d436c61696d547970654964602e284b65795265636f7264730001040500c1050400042901204d61702066726f6d204163636f756e74496420746f20604b65795265636f726460207468617420686f6c647320746865206b65792773207479706520616e64206964656e746974792e5c4b657945787472696e7369635065726d697373696f6e730001040500b8040004a42041207365636f6e64617279206b657927732065787472696e736963207065726d697373696f6e732e4c4b657941737365745065726d697373696f6e730001040500a4040004942041207365636f6e64617279206b65792773206173736574207065726d697373696f6e732e5c4b6579506f7274666f6c696f5065726d697373696f6e730001040500e4040004a42041207365636f6e64617279206b6579277320706f7274666f6c696f207065726d697373696f6e732e1c4469644b6579730101080605c505390104000401012041207265766572736520646f75626c65206d617020746f20616c6c6f772066696e64696e6720616c6c206b65797320666f7220616e206964656e746974792e444d756c7469507572706f73654e6f6e636501002820000000000000000004bc204e6f6e636520746f20656e7375726520756e6971756520616374696f6e732e207374617274732066726f6d20312e684f6666436861696e417574686f72697a6174696f6e4e6f6e636501010406802820000000000000000004c820417574686f72697a6174696f6e206e6f6e636520706572204964656e746974792e20496e697469616c6c7920697320302e38417574686f72697a6174696f6e730001080205c905d105040004b020416c6c20617574686f72697a6174696f6e73207468617420616e206964656e746974792f6b6579206861734c417574686f72697a6174696f6e73476976656e0101080605d505cd0584000000000000000000000000000000000000000000000000000000000000000000044d0120416c6c20617574686f72697a6174696f6e73207468617420616e206964656e746974792068617320676976656e2e2028417574686f72697a65722c20617574685f6964202d3e20617574686f72697a6564297043646441757468466f725072696d6172794b6579526f746174696f6e010039010400085d01204120636f6e66696720666c616720746861742c206966207365742c20696e7374727563747320616e20617574686f72697a6174696f6e2066726f6d2061204344442070726f766964657220696e206f7264657220746f9c206368616e676520746865207072696d617279206b6579206f6620616e206964656e746974792e3853746f7261676556657273696f6e0100d905040004442053746f726167652076657273696f6e2e484163636f756e744b6579526566436f756e740101040200282000000000000000001cc420486f77206d616e7920227374726f6e6722207265666572656e63657320746f20746865206163636f756e74206b65792e00fc205374726f6e67207265666572656e6365732077696c6c20626c6f636b2061206b65792066726f6d206c656176696e672069742773206964656e746974792e00cc2050616c6c657473207573696e6720227374726f6e6722207265666572656e63657320746f206163636f756e74206b6579733aac202a2052656c617965723a20466f722060757365725f6b65796020616e642060706179696e675f6b6579600024506172656e74446964000104068080040004c020506172656e74206964656e7469747920696620746865204449442069732061206368696c64204964656e746974792e204368696c644469640101080606dd053901040004050120416c6c206368696c64206964656e746974696573206f66206120706172656e742028692e6520506172656e744449442c204368696c644449442c207472756529484e756d6265724f66476976656e4175746873010104068010100000000004ec20547261636b20746865206e756d626572206f6620617574686f72697a6174696f6e7320676976656e2062792065616368206964656e746974792e584f75746461746564417574686f72697a6174696f6e7300010402cd0528040004bc20547261636b7320616c6c20617574686f72697a6174696f6e732074686174206d7573742062652064656c657465643443757272656e74417574684964010028200000000000000000047c20436f6e74726f6c732074686520617574686f72697a6174696f6e2069642e01e105019408344d6178476976656e41757468731010000400000030496e697469616c504f4c59581840000000000000000000000000000000000001f905074c4364645365727669636550726f7669646572730138496e7374616e63653247726f75700c344163746976654d656d6265727301004501040004ec205468652063757272656e74202261637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e3c496e6163746976654d656d626572730100fd05040004f4205468652063757272656e742022696e61637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e484163746976654d656d626572734c696d6974010010100000000004c4204c696d6974206f6620686f77206d616e79202261637469766522206d656d626572732074686572652063616e2062652e010506013d01000109060844506f6c796d657368436f6d6d69747465650148496e7374616e636531436f6d6d6974746565242450726f706f73616c730100c104040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f66000104062c0d06040004882041637475616c2070726f706f73616c20666f72206120676976656e20686173682e18566f74696e67000104062cd908040004d420506f6c796d657368566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e74010010100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100450104000498205468652063757272656e74206d656d62657273206f662074686520636f6d6d69747465652e34566f74655468726573686f6c640100cd03200000000000000000048020566f7465207468726573686f6c6420666f7220616e20617070726f76616c2e4852656c65617365436f6f7264696e61746f72000080040004542052656c6561736520636f6f7264696e61746f722e3045787069726573416674657201005901040104a42054696d6520616674657220776869636820612070726f706f73616c2077696c6c206578706972652e3853746f7261676556657273696f6e0100dd08040004442053746f726167652076657273696f6e2e0111060149010001e108094c436f6d6d69747465654d656d626572736869700138496e7374616e63653147726f75700c344163746976654d656d6265727301004501040004ec205468652063757272656e74202261637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e3c496e6163746976654d656d626572730100fd05040004f4205468652063757272656e742022696e61637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e484163746976654d656d626572734c696d6974010010100000000004c4204c696d6974206f6620686f77206d616e79202261637469766522206d656d626572732074686572652063616e2062652e011506015d010001e5080a48546563686e6963616c436f6d6d69747465650148496e7374616e636533436f6d6d6974746565242450726f706f73616c730100c104040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f66000104062c0d06040004882041637475616c2070726f706f73616c20666f72206120676976656e20686173682e18566f74696e67000104062cd908040004d420506f6c796d657368566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e74010010100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100450104000498205468652063757272656e74206d656d62657273206f662074686520636f6d6d69747465652e34566f74655468726573686f6c640100cd03200000000000000000048020566f7465207468726573686f6c6420666f7220616e20617070726f76616c2e4852656c65617365436f6f7264696e61746f72000080040004542052656c6561736520636f6f7264696e61746f722e3045787069726573416674657201005901040104a42054696d6520616674657220776869636820612070726f706f73616c2077696c6c206578706972652e3853746f7261676556657273696f6e0100dd08040004442053746f726167652076657273696f6e2e0119060165010001e9080b70546563686e6963616c436f6d6d69747465654d656d626572736869700138496e7374616e63653347726f75700c344163746976654d656d6265727301004501040004ec205468652063757272656e74202261637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e3c496e6163746976654d656d626572730100fd05040004f4205468652063757272656e742022696e61637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e484163746976654d656d626572734c696d6974010010100000000004c4204c696d6974206f6620686f77206d616e79202261637469766522206d656d626572732074686572652063616e2062652e011d06016d010001ed080c4055706772616465436f6d6d69747465650148496e7374616e636534436f6d6d6974746565242450726f706f73616c730100c104040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f66000104062c0d06040004882041637475616c2070726f706f73616c20666f72206120676976656e20686173682e18566f74696e67000104062cd908040004d420506f6c796d657368566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e74010010100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100450104000498205468652063757272656e74206d656d62657273206f662074686520636f6d6d69747465652e34566f74655468726573686f6c640100cd03200000000000000000048020566f7465207468726573686f6c6420666f7220616e20617070726f76616c2e4852656c65617365436f6f7264696e61746f72000080040004542052656c6561736520636f6f7264696e61746f722e3045787069726573416674657201005901040104a42054696d6520616674657220776869636820612070726f706f73616c2077696c6c206578706972652e3853746f7261676556657273696f6e0100dd08040004442053746f726167652076657273696f6e2e0121060175010001f1080d6855706772616465436f6d6d69747465654d656d626572736869700138496e7374616e63653447726f75700c344163746976654d656d6265727301004501040004ec205468652063757272656e74202261637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e3c496e6163746976654d656d626572730100fd05040004f4205468652063757272656e742022696e61637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e484163746976654d656d626572734c696d6974010010100000000004c4204c696d6974206f6620686f77206d616e79202261637469766522206d656d626572732074686572652063616e2062652e012506017d010001f5080e204d756c746953696701204d756c74695369673c344d756c74695369674e6f6e6365010028200000000000000000042101204e6f6e636520746f20656e7375726520756e69717565204d756c746953696720616464726573736573206172652067656e6572617465643b207374617274732066726f6d20312e3c4d756c74695369675369676e6572730101080605f9083901040004cc205369676e657273206f662061206d756c74697369672e20286d756c74697369672c207369676e657229203d3e20626f6f6c2e3c4e756d6265724f665369676e65727301010406002820000000000000000004cc204e756d626572206f6620617070726f7665642f6163636570746564207369676e657273206f662061206d756c74697369672e544d756c74695369675369676e73526571756972656401010406002820000000000000000004e020436f6e6669726d6174696f6e73207265717569726564206265666f72652070726f63657373696e672061206d756c74697369672074782e384e65787450726f706f73616c49640101040600282000000000000000000cc4204e6578742070726f706f73616c20696420666f722061206d756c74697369672e20205374617274732066726f6d20302e0074206d756c7469736967203d3e206e6578742070726f706f73616c2069642450726f706f73616c730001080505fd080d0604000cb82050726f706f73616c732070726573656e74656420666f7220766f74696e6720746f2061206d756c74697369672e00b4206d756c7469736967202d3e2070726f706f73616c206964203d3e204f7074696f6e3c50726f706f73616c3e2e14566f74657301010805050109390104000c8820496e646976696475616c206d756c7469736967207369676e657220766f7465732e00ac20286d756c74697369672c2070726f706f73616c5f696429202d3e207369676e6572203d3e20766f74652e24506179696e67446964000104060080040010090120546865206d756c7469736967277320706179696e67206964656e746974792e2020546865207072696d617279206b6579206f662074686973206964656e74697479f8207061797320746865207472616e73616374696f6e2f70726f746f63616c2066656573206f6620746865206d756c74697369672070726f706f73616c732e0080206d756c7469736967202d3e204f7074696f6e3c4964656e7469747949643e2e2041646d696e446964000104060080040010050120546865206d756c746973696727732061646d696e206964656e746974792e2020546865207072696d617279206b6579206f662074686973206964656e7469747994206861732061646d696e20636f6e74726f6c206f76657220746865206d756c74697369672e0080206d756c7469736967202d3e204f7074696f6e3c4964656e7469747949643e2e4850726f706f73616c566f7465436f756e74730001080505fd08050904000ce82054686520636f756e74206f6620617070726f76616c732f72656a656374696f6e73206f662061206d756c74697369672070726f706f73616c2e00d8206d756c7469736967202d3e2070726f706f73616c206964203d3e204f7074696f6e3c50726f706f73616c566f7465436f756e743e2e3850726f706f73616c5374617465730001080505fd08090904000c8420546865207374617465206f662061206d756c74697369672070726f706f73616c00c8206d756c7469736967202d3e2070726f706f73616c206964203d3e204f7074696f6e3c50726f706f73616c53746174653e2e40457865637574696f6e5265656e74727901003901040004882050726f706f73616c20657865637574696f6e207265656e7472792067756172642e4041757468546f50726f706f73616c49640001080505fd082804000cbc2050656e64696e67206a6f696e206964656e7469747920617574686f72697a6174696f6e2070726f706f73616c732e00b0206d756c7469736967202d3e2061757468206964203d3e204f7074696f6e3c70726f706f73616c2069643e2e485472616e73616374696f6e56657273696f6e010010100000000004f420546865206c617374207472616e73616374696f6e2076657273696f6e2c207573656420666f7220606f6e5f72756e74696d655f75706772616465602e3853746f7261676556657273696f6e01000d09040004442053746f726167652076657273696f6e2e01290601850104284d61785369676e657273101032000000040501204d6178696d756d206e756d626572206f66207369676e65727320746861742063616e2062652061646465642f72656d6f76656420696e206f6e652063616c6c2e0111090f1842726964676501184272696467652828436f6e74726f6c6c657200000004000c410120546865206d756c7469736967206163636f756e74206f66207468652062726964676520636f6e74726f6c6c65722e205468652067656e65736973207369676e65727320616363657074207468656972450120617574686f72697a6174696f6e7320616e64206172652061626c6520746f206765742074686569722070726f706f73616c732064656c6976657265642e20546865206272696467652063726561746f729c207472616e736665727320736f6d6520504f4c5920746f207468656972206964656e746974792e3c427269646765547844657461696c73010108020215091909d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000859012044657461696c73206f6620627269646765207472616e73616374696f6e73206964656e7469666965642077697468207061697273206f662074686520726563697069656e74206163636f756e7420616e64207468656820627269646765207472616e73616374696f6e206e6f6e63652e1441646d696e0000000400043c205468652061646d696e206b65792e1846726f7a656e01003901040004bc2057686574686572206f72206e6f742074686520627269646765206f7065726174696f6e2069732066726f7a656e2e30467265657a6541646d696e7301010402003901040004090120467265657a65206272696467652061646d696e732e20205468657365206163636f756e74732063616e206f6e6c7920667265657a6520746865206272696467652e2054696d656c6f636b0100101000000000083d012054686520627269646765207472616e73616374696f6e2074696d656c6f636b20706572696f642c20696e20626c6f636b732c2073696e63652074686520616363657074616e6365206f66207468653101207472616e73616374696f6e2070726f706f73616c20647572696e67207768696368207468652061646d696e206b65792063616e20667265657a6520746865207472616e73616374696f6e2e2c4272696467654c696d69740100210950000000000000000000000000000000000000000008290120546865206d6178696d756d206e756d626572206f66206272696467656420504f4c595820706572206964656e746974792077697468696e20612073657420696e74657276616c206f66f820626c6f636b732e204669656c64733a20504f4c595820616d6f756e7420616e642074686520626c6f636b20696e74657276616c206475726174696f6e2e30506f6c7978427269646765640101040680210950000000000000000000000000000000000000000008510120416d6f756e74206f6620504f4c5958206272696467656420627920746865206964656e7469747920696e206c61737420626c6f636b20696e74657276616c2e204669656c64733a2074686520627269646765649420616d6f756e7420616e6420746865206c61737420696e74657276616c206e756d6265722e4c4272696467654c696d69744578656d7074656401010405803901040004c0204964656e746974696573206e6f7420636f6e73747261696e65642062792074686520627269646765206c696d69742e3853746f7261676556657273696f6e01002509040004442053746f726167652076657273696f6e2e00000000101c5374616b696e67011c5374616b696e67a43856616c696461746f72436f756e740100101000000000049c2054686520696465616c206e756d626572206f66206163746976652076616c696461746f72732e544d696e696d756d56616c696461746f72436f756e740100101000000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100fc04000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010405000004000c0101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e404d696e4e6f6d696e61746f72426f6e64010018400000000000000000000000000000000004210120546865206d696e696d756d2061637469766520626f6e6420746f206265636f6d6520616e64206d61696e7461696e2074686520726f6c65206f662061206e6f6d696e61746f722e404d696e56616c696461746f72426f6e64010018400000000000000000000000000000000004210120546865206d696e696d756d2061637469766520626f6e6420746f206265636f6d6520616e64206d61696e7461696e2074686520726f6c65206f6620612076616c696461746f722e484d696e696d756d4163746976655374616b65010018400000000000000000000000000000000004110120546865206d696e696d756d20616374697665206e6f6d696e61746f72207374616b65206f6620746865206c617374207375636365737366756c20656c656374696f6e2e344d696e436f6d6d697373696f6e0100910110000000000ce820546865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e20746861742076616c696461746f72732063616e207365742e00802049662073657420746f206030602c206e6f206c696d6974206578697374732e184c6564676572000104020029090400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e1450617965650101040500350604000ce42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e2856616c696461746f7273010104050095010800000c450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e50436f756e746572466f7256616c696461746f7273010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170484d617856616c696461746f7273436f756e7400001004000c310120546865206d6178696d756d2076616c696461746f7220636f756e74206265666f72652077652073746f7020616c6c6f77696e67206e65772076616c696461746f727320746f206a6f696e2e00d0205768656e20746869732076616c7565206973206e6f74207365742c206e6f206c696d6974732061726520656e666f726365642e284e6f6d696e61746f727300010405003d09040048750120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f207468656972206e6f6d696e6174696f6e20707265666572656e6365732c206e616d656c79207468652076616c696461746f72732074686174582074686579207769736820746f20737570706f72742e003901204e6f7465207468617420746865206b657973206f6620746869732073746f72616765206d6170206d69676874206265636f6d65206e6f6e2d6465636f6461626c6520696e2063617365207468656d01205b60436f6e6669673a3a4d61784e6f6d696e6174696f6e73605d20636f6e66696775726174696f6e206973206465637265617365642e20496e2074686973207261726520636173652c207468657365206e6f6d696e61746f7273650120617265207374696c6c206578697374656e7420696e2073746f726167652c207468656972206b657920697320636f727265637420616e64207265747269657661626c652028692e652e2060636f6e7461696e735f6b657960710120696e6469636174657320746861742074686579206578697374292c206275742074686569722076616c75652063616e6e6f74206265206465636f6465642e205468657265666f72652c20746865206e6f6e2d6465636f6461626c656d01206e6f6d696e61746f72732077696c6c206566666563746976656c79206e6f742d65786973742c20756e74696c20746865792072652d7375626d697420746865697220707265666572656e6365732073756368207468617420697401012069732077697468696e2074686520626f756e6473206f6620746865206e65776c79207365742060436f6e6669673a3a4d61784e6f6d696e6174696f6e73602e006101205468697320696d706c696573207468617420603a3a697465725f6b65797328292e636f756e7428296020616e6420603a3a6974657228292e636f756e74282960206d696768742072657475726e20646966666572656e746d012076616c75657320666f722074686973206d61702e204d6f72656f7665722c20746865206d61696e20603a3a636f756e7428296020697320616c69676e656420776974682074686520666f726d65722c206e616d656c79207468656c206e756d626572206f66206b65797320746861742065786973742e006d01204c6173746c792c20696620616e79206f6620746865206e6f6d696e61746f7273206265636f6d65206e6f6e2d6465636f6461626c652c20746865792063616e206265206368696c6c656420696d6d6564696174656c7920766961b8205b6043616c6c3a3a6368696c6c5f6f74686572605d20646973706174636861626c6520627920616e796f6e652e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e50436f756e746572466f724e6f6d696e61746f7273010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170484d61784e6f6d696e61746f7273436f756e7400001004000c310120546865206d6178696d756d206e6f6d696e61746f7220636f756e74206265666f72652077652073746f7020616c6c6f77696e67206e65772076616c696461746f727320746f206a6f696e2e00d0205768656e20746869732076616c7565206973206e6f74207365742c206e6f206c696d6974732061726520656e666f726365642e2843757272656e744572610000100400105c205468652063757272656e742065726120696e6465782e006501205468697320697320746865206c617465737420706c616e6e6564206572612c20646570656e64696e67206f6e20686f77207468652053657373696f6e2070616c6c657420717565756573207468652076616c696461746f7280207365742c206974206d6967687420626520616374697665206f72206e6f742e2441637469766545726100004509040010d820546865206163746976652065726120696e666f726d6174696f6e2c20697420686f6c647320696e64657820616e642073746172742e0059012054686520616374697665206572612069732074686520657261206265696e672063757272656e746c792072657761726465642e2056616c696461746f7220736574206f66207468697320657261206d757374206265ac20657175616c20746f205b6053657373696f6e496e746572666163653a3a76616c696461746f7273605d2e5445726173537461727453657373696f6e496e6465780001040510100400103101205468652073657373696f6e20696e646578206174207768696368207468652065726120737461727420666f7220746865206c6173742060484953544f52595f44455054486020657261732e006101204e6f74653a205468697320747261636b7320746865207374617274696e672073657373696f6e2028692e652e2073657373696f6e20696e646578207768656e20657261207374617274206265696e672061637469766529f020666f7220746865206572617320696e20605b43757272656e74457261202d20484953544f52595f44455054482c2043757272656e744572615d602e2c457261735374616b65727301010805054909d5010c0000001878204578706f73757265206f662076616c696461746f72206174206572612e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e48457261735374616b657273436c697070656401010805054909d5010c0000002c9820436c6970706564204578706f73757265206f662076616c696461746f72206174206572612e00590120546869732069732073696d696c617220746f205b60457261735374616b657273605d20627574206e756d626572206f66206e6f6d696e61746f7273206578706f736564206973207265647563656420746f20746865dc2060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732e1d0120284e6f74653a20746865206669656c642060746f74616c6020616e6420606f776e60206f6620746865206578706f737572652072656d61696e7320756e6368616e676564292ef42054686973206973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e005d012054686973206973206b657965642066697374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e484572617356616c696461746f7250726566730101080505490995010800001411012053696d696c617220746f2060457261735374616b657273602c207468697320686f6c64732074686520707265666572656e636573206f662076616c696461746f72732e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4c4572617356616c696461746f7252657761726400010405101804000c09012054686520746f74616c2076616c696461746f7220657261207061796f757420666f7220746865206c6173742060484953544f52595f44455054486020657261732e0021012045726173207468617420686176656e27742066696e697368656420796574206f7220686173206265656e2072656d6f76656420646f65736e27742068617665207265776172642e4045726173526577617264506f696e747301010405104d0914000000000008ac205265776172647320666f7220746865206c6173742060484953544f52595f44455054486020657261732e250120496620726577617264206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207265776172642069732072657475726e65642e3845726173546f74616c5374616b65010104051018400000000000000000000000000000000008ec2054686520746f74616c20616d6f756e74207374616b656420666f7220746865206c6173742060484953544f52595f44455054486020657261732e1d0120496620746f74616c206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207374616b652069732072657475726e65642e20466f72636545726101009d0104000454204d6f6465206f662065726120666f7263696e672e4c536c6173685265776172644672616374696f6e0100910110000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401001840000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010405105909040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100c50404001025012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e00c8204d75737420636f6e7461696e7320696e666f726d6174696f6e20666f72206572617320666f72207468652072616e67653abc20605b6163746976655f657261202d20626f756e64696e675f6475726174696f6e3b206163746976655f6572615d604c56616c696461746f72536c617368496e457261000108050549096109040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e4572610001080505490918040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e73000104050065090400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c6173680101040515096909800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e5443757272656e74506c616e6e656453657373696f6e01001010000000000ce820546865206c61737420706c616e6e65642073657373696f6e207363686564756c6564206279207468652073657373696f6e2070616c6c65742e0071012054686973206973206261736963616c6c7920696e2073796e632077697468207468652063616c6c20746f205b6070616c6c65745f73657373696f6e3a3a53657373696f6e4d616e616765723a3a6e65775f73657373696f6e605d2e4c4f6666656e64696e6756616c696461746f727301006d09040024690120496e6469636573206f662076616c696461746f727320746861742068617665206f6666656e64656420696e20746865206163746976652065726120616e6420776865746865722074686579206172652063757272656e746c79282064697361626c65642e00690120546869732076616c75652073686f756c642062652061207375706572736574206f662064697361626c65642076616c696461746f72732073696e6365206e6f7420616c6c206f6666656e636573206c65616420746f2074686571012076616c696461746f72206265696e672064697361626c65642028696620746865726520776173206e6f20736c617368292e2054686973206973206e656564656420746f20747261636b207468652070657263656e74616765206f6649012076616c696461746f727320746861742068617665206f6666656e64656420696e207468652063757272656e74206572612c20656e737572696e672061206e65772065726120697320666f72636564206966750120604f6666656e64696e6756616c696461746f72735468726573686f6c646020697320726561636865642e205468652076656320697320616c77617973206b65707420736f7274656420736f20746861742077652063616e2066696e6471012077686574686572206120676976656e2076616c696461746f72206861732070726576696f75736c79206f6666656e646564207573696e672062696e617279207365617263682e204974206765747320636c6561726564207768656e38207468652065726120656e64732e384368696c6c5468726573686f6c6400003d0604000c510120546865207468726573686f6c6420666f72207768656e2075736572732063616e2073746172742063616c6c696e6720606368696c6c5f6f746865726020666f72206f746865722076616c696461746f7273202f5901206e6f6d696e61746f72732e20546865207468726573686f6c6420697320636f6d706172656420746f207468652061637475616c206e756d626572206f662076616c696461746f7273202f206e6f6d696e61746f72732901202860436f756e74466f722a602920696e207468652073797374656d20636f6d706172656420746f2074686520636f6e66696775726564206d61782028604d61782a436f756e7460292e505065726d697373696f6e65644964656e7469747900010405807509040004ec20456e74697469657320746861742061726520616c6c6f77656420746f2072756e206f70657261746f722f76616c696461746f72206e6f6465732e48536c617368696e67416c6c6f776564466f720100a101040204b420536c617368696e672073776974636820666f722076616c696461746f72732026204e6f6d696e61746f72732e5856616c696461746f72436f6d6d697373696f6e436170010091011000000000049d0120416c6c6f777320666c65786962696c69747920696e20636f6d6d697373696f6e2e2045766572792076616c696461746f722068617320636f6d6d697373696f6e20746861742073686f756c6420626520696e207468652072616e6765205b302c204361705d2e58506f6c796d65736853746f7261676556657273696f6e01007909040000013106018d0128384d61784e6f6d696e6174696f6e7310101000000004b4204d6178696d756d206e756d626572206f66206e6f6d696e6174696f6e7320706572206e6f6d696e61746f722e30486973746f72794465707468101054000000508c204e756d626572206f66206572617320746f206b65657020696e20686973746f72792e00e820466f6c6c6f77696e6720696e666f726d6174696f6e206973206b65707420666f72206572617320696e20605b63757272656e745f657261202d090120486973746f727944657074682c2063757272656e745f6572615d603a2060457261735374616b657273602c2060457261735374616b657273436c6970706564602c050120604572617356616c696461746f725072656673602c20604572617356616c696461746f72526577617264602c206045726173526577617264506f696e7473602cac206045726173546f74616c5374616b65602c206045726173537461727453657373696f6e496e646578602c8420605374616b696e674c65646765722e636c61696d65645f72657761726473602e00e4204d757374206265206d6f7265207468616e20746865206e756d626572206f6620657261732064656c617965642062792073657373696f6e2ef820492e652e2061637469766520657261206d75737420616c7761797320626520696e20686973746f72792e20492e652e20606163746976655f657261203ec42063757272656e745f657261202d20686973746f72795f646570746860206d7573742062652067756172616e746565642e001101204966206d6967726174696e6720616e206578697374696e672070616c6c65742066726f6d2073746f726167652076616c756520746f20636f6e6669672076616c75652cec20746869732073686f756c642062652073657420746f2073616d652076616c7565206f72206772656174657220617320696e2073746f726167652e001501204e6f74653a2060486973746f727944657074686020697320757365642061732074686520757070657220626f756e6420666f72207468652060426f756e646564566563601101206974656d20605374616b696e674c65646765722e636c61696d65645f72657761726473602e2053657474696e6720746869732076616c7565206c6f776572207468616ed820746865206578697374696e672076616c75652063616e206c65616420746f20696e636f6e73697374656e6369657320696e20746865150120605374616b696e674c65646765726020616e642077696c6c206e65656420746f2062652068616e646c65642070726f7065726c7920696e2061206d6967726174696f6e2ef020546865207465737420607265647563696e675f686973746f72795f64657074685f616272757074602073686f77732074686973206566666563742e3853657373696f6e735065724572611010030000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e10100700000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e48536c61736844656665724475726174696f6e101004000000100101204e756d626572206f662065726173207468617420736c6173686573206172652064656665727265642062792c20616674657220636f6d7075746174696f6e2e000d0120546869732073686f756c64206265206c657373207468616e2074686520626f6e64696e67206475726174696f6e2e2053657420746f203020696620736c617368657315012073686f756c64206265206170706c69656420696d6d6564696174656c792c20776974686f7574206f70706f7274756e69747920666f7220696e74657276656e74696f6e2e804d61784e6f6d696e61746f72526577617264656450657256616c696461746f7210100004000010f820546865206d6178696d756d206e756d626572206f66206e6f6d696e61746f727320726577617264656420666f7220656163682076616c696461746f722e00510120466f7220656163682076616c696461746f72206f6e6c79207468652060244d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732063616e390120636c61696d207468656972207265776172642e2054686973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e484d6178556e6c6f636b696e674368756e6b7310102000000028050120546865206d6178696d756d206e756d626572206f662060756e6c6f636b696e6760206368756e6b732061205b605374616b696e674c6564676572605d2063616e090120686176652e204566666563746976656c792064657465726d696e657320686f77206d616e7920756e6971756520657261732061207374616b6572206d61792062653820756e626f6e64696e6720696e2e00f8204e6f74653a20604d6178556e6c6f636b696e674368756e6b736020697320757365642061732074686520757070657220626f756e6420666f722074686501012060426f756e64656456656360206974656d20605374616b696e674c65646765722e756e6c6f636b696e67602e2053657474696e6720746869732076616c75650501206c6f776572207468616e20746865206578697374696e672076616c75652063616e206c65616420746f20696e636f6e73697374656e6369657320696e20746865090120605374616b696e674c65646765726020616e642077696c6c206e65656420746f2062652068616e646c65642070726f7065726c7920696e20612072756e74696d650501206d6967726174696f6e2e20546865207465737420607265647563696e675f6d61785f756e6c6f636b696e675f6368756e6b735f616272757074602073686f7773342074686973206566666563742e5c4d617856616c696461746f725065724964656e74697479a502101009050008e8204d6178696d756d20616d6f756e74206f662076616c696461746f727320746861742063616e2072756e20627920616e206964656e746974792ef82049742077696c6c206265204d617856616c696461746f725065724964656e74697479202a2053656c663a3a76616c696461746f725f636f756e7428292e844d61785661726961626c65496e666c6174696f6e546f74616c49737375616e636518400080c6a47e8d03000000000000000000041501204d6178696d756d20616d6f756e74206f6620746f74616c2069737375616e63652061667465722077686963682066697865642072657761726473206b69636b7320696e2e444669786564596561726c79526577617264184000c0444a547f0000000000000000000004390120596561726c7920746f74616c2072657761726420616d6f756e7420746861742067657473206469737472696275746564207768656e2066697865642072657761726473206b69636b7320696e2e017d0911204f6666656e63657301204f6666656e6365730c1c5265706f727473000104052c8109040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e58436f6e63757272656e745265706f727473496e64657801010805058509c1040400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e64657801010405ac30040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e0001a5010000121c53657373696f6e011c53657373696f6e1c2856616c696461746f72730100fc0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e646578010010100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e67656401003901040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b657973010089090400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f7273010069040400148020496e6469636573206f662064697361626c65642076616c696461746f72732e003d01205468652076656320697320616c77617973206b65707420736f7274656420736f20746861742077652063616e2066696e642077686574686572206120676976656e2076616c696461746f722069733d012064697361626c6564207573696e672062696e617279207365617263682e204974206765747320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e73642061206e657720736574206f66206964656e7469746965732e204e6578744b657973000104050059060400049c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e204b65794f776e657200010405910900040004090120546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e01550601a901000199091348417574686f72697479446973636f766572790000000000141c4772616e647061011c4772616e6470611814537461746501009d0904000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e67650000a109040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000010040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c65640000cd030400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e745365744964010028200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e00010405281004002859012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f722077686963682069747368206d656d62657273207765726520726573706f6e7369626c652e0045012054686973206973206f6e6c79207573656420666f722076616c69646174696e672065717569766f636174696f6e2070726f6f66732e20416e2065717569766f636174696f6e2070726f6f66206d7573744d0120636f6e7461696e732061206b65792d6f776e6572736869702070726f6f6620666f72206120676976656e2073657373696f6e2c207468657265666f7265207765206e65656420612077617920746f20746965450120746f6765746865722073657373696f6e7320616e64204752414e44504120736574206964732c20692e652e207765206e65656420746f2076616c6964617465207468617420612076616c696461746f7241012077617320746865206f776e6572206f66206120676976656e206b6579206f6e206120676976656e2073657373696f6e2c20616e642077686174207468652061637469766520736574204944207761735420647572696e6720746861742073657373696f6e2e00b82054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e01610601ad0108384d6178417574686f7269746965731010a0860100045c204d617820417574686f72697469657320696e20757365584d6178536574496453657373696f6e456e74726965732820150000000000000018390120546865206d6178696d756d206e756d626572206f6620656e747269657320746f206b65657020696e207468652073657420696420746f2073657373696f6e20696e646578206d617070696e672e0031012053696e6365207468652060536574496453657373696f6e60206d6170206973206f6e6c79207573656420666f722076616c69646174696e672065717569766f636174696f6e73207468697329012076616c75652073686f756c642072656c61746520746f2074686520626f6e64696e67206475726174696f6e206f66207768617465766572207374616b696e672073797374656d2069733501206265696e6720757365642028696620616e79292e2049662065717569766f636174696f6e2068616e646c696e67206973206e6f7420656e61626c6564207468656e20746869732076616c7565342063616e206265207a65726f2e01a9091528486973746f726963616c00000000001620496d4f6e6c696e650120496d4f6e6c696e651038486561727462656174416674657201001010000000002c1d012054686520626c6f636b206e756d6265722061667465722077686963682069742773206f6b20746f2073656e64206865617274626561747320696e207468652063757272656e74242073657373696f6e2e0025012041742074686520626567696e6e696e67206f6620656163682073657373696f6e20776520736574207468697320746f20612076616c756520746861742073686f756c642066616c6c350120726f7567686c7920696e20746865206d6964646c65206f66207468652073657373696f6e206475726174696f6e2e20546865206964656120697320746f206669727374207761697420666f721901207468652076616c696461746f727320746f2070726f64756365206120626c6f636b20696e207468652063757272656e742073657373696f6e2c20736f207468617420746865a820686561727462656174206c61746572206f6e2077696c6c206e6f74206265206e65636573736172792e00390120546869732076616c75652077696c6c206f6e6c79206265207573656420617320612066616c6c6261636b206966207765206661696c20746f2067657420612070726f7065722073657373696f6e2d012070726f677265737320657374696d6174652066726f6d20604e65787453657373696f6e526f746174696f6e602c2061732074686f736520657374696d617465732073686f756c642062650101206d6f7265206163637572617465207468656e207468652076616c75652077652063616c63756c61746520666f7220604865617274626561744166746572602e104b6579730100ad09040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730001080505cd03b5090400083d0120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206053657373696f6e496e6465786020616e64206041757468496e6465786020746fb02060577261707065724f70617175653c426f756e6465644f70617175654e6574776f726b53746174653e602e38417574686f726564426c6f636b730101080505490910100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206056616c696461746f7249643c543e6020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e018d0601c1010440556e7369676e65645072696f726974792820ffffffffffffffff10f0204120636f6e66696775726174696f6e20666f722062617365207072696f72697479206f6620756e7369676e6564207472616e73616374696f6e732e0015012054686973206973206578706f73656420736f20746861742069742063616e2062652074756e656420666f7220706172746963756c61722072756e74696d652c207768656eb4206d756c7469706c652070616c6c6574732073656e6420756e7369676e6564207472616e73616374696f6e732e01c909176052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100cd0904000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e0000000018105375646f01105375646f040c4b6579000000040004842054686520604163636f756e74496460206f6620746865207375646f206b65792e01ad0601e5010001d10919144173736574011441737365748460556e697175655469636b6572526567697374726174696f6e000104022101d5090400042d01204d6170732065616368205b605469636b6572605d20746f2069747320726567697374726174696f6e2064657461696c7320285b605469636b6572526567697374726174696f6e605d292e305469636b6572436f6e6669670100d9090800000425012052657475726e73205b605469636b6572526567697374726174696f6e436f6e666967605d20666f7220617373657373696e672069662061207469636b65722069732076616c69642e1841737365747300010402a8dd09040004e4204d6170732065616368205b6041737365744944605d20746f2069747320756e6465726c696e67205b60417373657444657461696c73605d2e2841737365744e616d657300010402a8f901040004d8204d6170732065616368205b6041737365744944605d20746f2069747320756e6465726c696e67205b6041737365744e616d65605d2e2442616c616e63654f660101080206e10918400000000000000000000000000000000004190120547261636b732074686520746f74616c205b6042616c616e6365605d20666f722065616368205b6041737365744944605d20706572205b604964656e746974794964605d2e4041737365744964656e7469666965727301010402a8fd010400041901204d6170732065616368205b6041737365744944605d20746f20697473206173736574206964656e7469666965727320285b6041737365744964656e746966696572605d292e50437573746f6d54797065496453657175656e63650100f10110000000000cc420546865206e65787420604173736574547970653a3a437573746f6d6020494420696e207468652073657175656e63652e00d0204e756d6265727320696e207468652073657175656e63652073746172742066726f6d203120726174686572207468616e20302e2c437573746f6d547970657301010405f10130040004f8204d61707320637573746f6d20617373657420747970652069647320746f20746865207265676973746572656420737472696e6720636f6e74656e74732e48437573746f6d5479706573496e76657273650001040230f101040004610120496e7665727365206d6170206f662060437573746f6d5479706573602c2066726f6d207265676973746572656420737472696e6720636f6e74656e747320746f20637573746f6d2061737365742074797065206964732e3046756e64696e67526f756e6401010402a811020400044101204d6170732065616368205b6041737365744944605d20746f20746865206e616d65206f662069747320666f756e64696e6720726f756e6420285b6046756e64696e67526f756e644e616d65605d292e50497373756564496e46756e64696e67526f756e6401010402e5091840000000000000000000000000000000000479012054686520746f74616c205b6042616c616e6365605d206f6620746f6b656e732069737375656420696e20616c6c207265636f726465642066756e64696e6720726f756e647320285b6046756e64696e67526f756e644e616d65605d292e1846726f7a656e01010402a83901040004b1012052657475726e7320607472756560206966207472616e736665727320666f722074686520746f6b656e206173736f63696174656420746f205b6041737365744944605d206172652066726f7a656e2e204f74686572776973652c2072657475726e73206066616c7365602e384173736574446f63756d656e74730001080205e90919020400049c20416c6c205b60446f63756d656e74605d20617474616368656420746f20616e2061737365742e604173736574446f63756d656e7473496453657175656e636501010402a81502100000000004a0205b60446f63756d656e744964605d20636f756e74657220706572205b6041737365744944605d2e4c41737365744d6574616461746156616c7565730001080205ed0945020400047c204d65746174646174612076616c75657320666f7220616e2061737365742e6441737365744d6574616461746156616c756544657461696c730001080205ed094d02040004a02044657461696c7320666f7220616e2061737365742773204d657461646174612076616c7565732e6c41737365744d657461646174614c6f63616c4e616d65546f4b65790001080202f109590204000488204173736574204d65746164617461204c6f63616c204e616d65202d3e204b65792e7041737365744d65746164617461476c6f62616c4e616d65546f4b657900010402550275020400048c204173736574204d6574616461746120476c6f62616c204e616d65202d3e204b65792e6c41737365744d657461646174614c6f63616c4b6579546f4e616d650001080205f509550204000488204173736574204d65746164617461204c6f63616c204b6579202d3e204e616d652e7041737365744d65746164617461476c6f62616c4b6579546f4e616d6500010405750255020400048c204173736574204d6574616461746120476c6f62616c204b6579202d3e204e616d652e5c41737365744d657461646174614c6f63616c53706563730001080205f5095d0204000480204173736574204d65746164617461204c6f63616c204b65792073706563732e6041737365744d65746164617461476c6f62616c53706563730001040575025d0204000484204173736574204d6574616461746120476c6f62616c204b65792073706563732e6c4173736574734578656d707446726f6d41666669726d6174696f6e01010402a839010400041d012041206c697374206f66206173736574732074686174206578656d707420616c6c2075736572732066726f6d2061666669726d696e672069747320726563656976656d656e742e40507265417070726f76656441737365740101080602f9093901040004250120416c6c20617373657473207468617420646f6e2774206e65656420616e2061666669726d6174696f6e20746f20626520726563656976656420627920616e206964656e746974792e484d616e6461746f72794d65646961746f727301010402a8b906040004c820546865206c697374206f66206d616e6461746f7279206d65646961746f727320666f72206576657279207469636b65722e7043757272656e7441737365744d657461646174614c6f63616c4b657900010402a85902040004e420546865206c617374205b6041737365744d657461646174614c6f63616c4b6579605d207573656420666f72205b6041737365744944605d2e7443757272656e7441737365744d65746164617461476c6f62616c4b657900007502040004ec20546865206c617374205b6041737365744d65746164617461476c6f62616c4b6579605d207573656420666f72206120676c6f62616c206b65792e485469636b6572734f776e65644279557365720101080602fd0939010400047420416c6c207469636b657273206f776e6564206279206120757365722e645365637572697479546f6b656e734f776e65644279557365720101080602f90939010400049420416c6c20736563757269747920746f6b656e73206f776e6564206279206120757365722e34417373657449445469636b657200010402a82101040004d8204d61707320616c6c205b6041737365744944605d207468617420617265206d617070656420746f2061205b605469636b6572605d2e345469636b657241737365744944000104022101a8040004dc204d61707320616c6c205b605469636b6572605d207468617420617265206c696e6b656420746f20616e205b6041737365744944605d2e2841737365744e6f6e6365010104060028200000000000000000040101204120706572206163636f756e74206e6f6e63652074686174206973207573656420666f722067656e65726174696e6720616e205b6041737365744944605d2e3853746f7261676556657273696f6e0100010a040004442053746f726167652076657273696f6e2e01b10601e901184841737365744e616d654d61784c656e677468101080000000006446756e64696e67526f756e644e616d654d61784c656e677468101080000000006841737365744d657461646174614e616d654d61784c656e677468101000010000006c41737365744d6574616461746156616c75654d61784c656e677468101000200000007441737365744d65746164617461547970654465664d61784c656e67746810100020000000444d617841737365744d65646961746f72731010040000000001050a1a4c4361706974616c446973747269627574696f6e014c4361706974616c446973747269627574696f6e0c34446973747269627574696f6e73000104029902a10204000c350120416c6c206361706974616c20646973747269627574696f6e732c207469656420746f207468656972207265737065637469766520636f72706f7261746520616374696f6e732028434173292e005c20284341496429203d3e20446973747269627574696f6e28486f6c6465725061696401010402090a390104000c8c2048617320616e20617373657420686f6c646572206265656e2070616964207965743f00a42028434149642c2044494429202d3e2057617320444944207061696420696e2074686520434149643f3853746f7261676556657273696f6e01000d0a040004442053746f726167652076657273696f6e2e01bd060191020001110a1b28436865636b706f696e740128436865636b706f696e74302c546f74616c537570706c790101080205150a1840000000000000000000000000000000000cb420546f74616c20737570706c79206f662074686520746f6b656e2061742074686520636865636b706f696e742e00010120285b6041737365744944605d2c20636865636b706f696e74496429202d3e20746f74616c20737570706c7920617420676976656e20636865636b706f696e741c42616c616e63650101080205190a1840000000000000000000000000000000000c882042616c616e6365206f66206120444944206174206120636865636b706f696e742e00190120285b6041737365744944605d2c206469642c20636865636b706f696e7420494429202d3e2042616c616e6365206f66206120444944206174206120636865636b706f696e7450436865636b706f696e74496453657175656e636501010402a8ad02200000000000000000108c20436865636b706f696e74732049442067656e657261746f722073657175656e63652ea8204944206f6620666972737420636865636b706f696e74206973203120696e7374656164206f6620302e009020285b6041737365744944605d29202d3e206e6f2e206f6620636865636b706f696e74733842616c616e6365557064617465730101080205e1091d0a040008bc20436865636b706f696e747320776865726520612044494427732062616c616e63652077617320757064617465642e050120285b6041737365744944605d2c2064696429202d3e205b636865636b706f696e7420494420776865726520757365722062616c616e6365206368616e6765645d2854696d657374616d70730101080205150a28200000000000000000185c20436865636b706f696e742074696d657374616d70732e000901204576657279207363686564756c652d6f726967696e6174656420636865636b706f696e74206d6170732069747320494420746f20697473206475652074696d652e210120457665727920636865636b706f696e74206d616e75616c6c792063726561746564206d6170732069747320494420746f207468652074696d65206f66207265636f7264696e672e00e420285b6041737365744944605d29202d3e2028636865636b706f696e7420494429202d3e20636865636b706f696e742074696d657374616d70585363686564756c65734d6178436f6d706c657869747901002820000000000000000004e420546865206d6178696d756d20636f6d706c657869747920616c6c6f77656420666f7220616e2061737365742773207363686564756c65732e485363686564756c65496453657175656e636501010402a8b1022000000000000000000cb020436865636b706f696e74207363686564756c652049442073657175656e636520666f72206173736574732e007420285b6041737365744944605d29202d3e207363686564756c65204944544361636865644e657874436865636b706f696e747300010402a8210a040014a820436163686564206e65787420636865636b706f696e7420666f722065616368207363686564756c652e002d012054686973206973207573656420746f20717569636b6c792066696e6420746865206e65787420636865636b706f696e742066726f6d20612061737365742773207363686564756c65732e008820285b6041737365744944605d29202d3e206e65787420636865636b706f696e7473505363686564756c6564436865636b706f696e74730001080205310ab50204000c5c205363686564756c656420636865636b706f696e74732e00cc20285b6041737365744944605d2c207363686564756c6520494429202d3e207363686564756c6520636865636b706f696e7473405363686564756c65526566436f756e740101080205310a10100000000020010120486f77206d616e7920227374726f6e6722207265666572656e6365732061726520746865726520746f206120676976656e20605363686564756c654964603f00fc205468652070726573656e6365206f66206120227374726f6e6722207265666572656e63652c20696e207468652073656e7365206f66206052633c543e602ce020656e7461696c73207468617420746865207265666572656e636564207363686564756c652063616e6e6f742062652072656d6f7665642ed820546875732c206173206c6f6e6720617320607374726f6e675f7265665f636f756e74287363686564756c655f696429203e2030602cac206072656d6f76655f7363686564756c65287363686564756c655f696429602077696c6c206572726f722e00bc20285b6041737365744944605d2c207363686564756c6520494429202d3e207374726f6e672072656620636f756e74385363686564756c65506f696e74730101080205310a1d0a04000cc420416c6c2074686520636865636b706f696e7473206120676976656e207363686564756c65206f726967696e617465642e00b820285b6041737365744944605d2c207363686564756c6520494429202d3e205b636865636b706f696e742049445d3853746f7261676556657273696f6e0100350a040004442053746f726167652076657273696f6e2e01c50601a9020001390a1c44436f6d706c69616e63654d616e616765720144436f6d706c69616e63654d616e616765720c404173736574436f6d706c69616e63657301010402a83d0a08000004f420436f6d706c69616e636520666f7220616e20617373657420285b6041737365744944605d202d3e205b604173736574436f6d706c69616e6365605d294854727573746564436c61696d49737375657201010402a8dd02040004f0204c697374206f66207472757374656420636c61696d20697373756572205b6041737365744944605d202d3e20497373756572204964656e746974793853746f7261676556657273696f6e0100410a040004442053746f726167652076657273696f6e2e01c90601c10204584d6178436f6e646974696f6e436f6d706c65786974791010320000000001450a1d3c436f72706f72617465416374696f6e013c436f72706f72617465416374696f6e24404d617844657461696c734c656e67746801001010000000001c5d012044657465726d696e657320746865206d6178696d756d206e756d626572206f6620627974657320746861742074686520667265652d666f726d206064657461696c7360206f6620612043412063616e2073746f72652e002901204e6f746520746861742074686973206973206e6f7420746865206e756d626572206f662060636861726073206f7220746865206e756d626572206f66205b6772617068656d65735d2e4101205768696c652074686973206d617920626520756e6e61747572616c20696e207465726d73206f662068756d616e20756e6465727374616e64696e67206f66206120746578742773206c656e6774682c6501206974206d6f726520636c6f73656c79207265666c656374732061637475616c2073746f7261676520636f73747320286027612760206973206368656170657220746f2073746f7265207468616e20616e20656d6f6a69292e00d0205b6772617068656d65735d3a2068747470733a2f2f656e2e77696b6970656469612e6f72672f77696b692f4772617068656d655c44656661756c745461726765744964656e74697469657301010402a8f90208000110ec20546865206964656e7469746965732074617267657465642062792064656661756c7420666f722043417320666f7220746869732061737365742c8c2065697468657220746f206265206578636c75646564206f7220696e636c756465642e007c202841737365744944203d3e20746172676574206964656e746974696573295444656661756c7457697468686f6c64696e6754617801010402a8a502100000000020a901205468652064656661756c7420616d6f756e74206f662074617820746f2077697468686f6c6420282277697468686f6c64696e6720746178222c2057542920666f722074686973206173736574207768656e20646973747269627574696e67206469766964656e64732e00350120546f20756e6465727374616e642077697468686f6c64696e67207461782c20652e672e2c206c6574277320617373756d65207468617420796f7520686f6c642041434d45207368617265732ec42041434d45206e6f77206465636964657320746f2064697374726962757465203130302053454b20746f20416c6963652e590120416c696365206c6976657320696e2053776564656e2c20736f20536b617474657665726b6574202874686520537765646973682074617820617574686f72697479292077616e747320333025206f6620746861742e5d01205468656e2074686f736520313030202a2033302520617265207769746868656c642066726f6d20416c6963652c20616e642041434d452077696c6c2073656e64207468656d20746f20536b617474657665726b65742e006c202841737365744944203d3e202520746f2077697468686f6c64294444696457697468686f6c64696e6754617801010402a819030400104d012054686520616d6f756e74206f662074617820746f2077697468686f6c6420282277697468686f6c64696e6720746178222c2057542920666f722061206365727461696e20417373657449442078204449442e6d0120496620616e20656e7472792065786973747320666f722061206365727461696e204449442c206974206f7665727269646573207468652064656661756c7420696e206044656661756c7457697468686f6c64696e67546178602e008c202841737365744944203d3e205b286469642c202520746f2077697468686f6c64295d304341496453657175656e636501010402a89d02100000000008b820546865206e657874207065722d60417373657449446020434120494420696e207468652073657175656e63652e5101205468652066756c6c20494420697320646566696e6564206173206120636f6d62696e6174696f6e206f662060417373657449446020616e642061206e756d62657220696e20746869732073657175656e63652e40436f72706f72617465416374696f6e730001080205490a05030400146c20416c6c207265636f72646564204341732074687573206661722ea4204f6e6c792067656e6572696320696e666f726d6174696f6e2069732073746f72656420686572652e7d01205370656369666963206043414b696e6460732c20652e672e2c2062656e656669747320616e6420636f72706f726174652062616c6c6f74732c206d617920757365206164646974696f6e616c206f6e2d636861696e2073746f726167652e00b8202841737365744944203d3e206c6f63616c204944203d3e2074686520636f72706f7261746520616374696f6e29244341446f634c696e6b0101040299022503040014d0204173736f63696174696f6e732066726f6d2043417320746f2060446f63756d656e74607320766961207468656972204944732e5c202843414964203d3e205b446f63756d656e7449645d29000901205468652060436f72706f72617465416374696f6e7360206d61702073746f726573206041737365744944203d3e204c6f63616c4964203d3e20546865204341602c290120736f2077652063616e20696e666572206041737365744944203d3e2043414964602e205468657265666f72652c20776520646f6e2774206e656564206120646f75626c65206d61702e1c44657461696c730101040299022103040008e8204173736f6369617465732064657461696c7320696e20667265652d666f726d207465787420776974682061204341206279206974732049442e50202843414964203d3e20434144657461696c73293853746f7261676556657273696f6e01004d0a040004442053746f726167652076657273696f6e2e01cd0601f50208304d61785461726765744964731010e803000000284d6178446964576874731010e80300000001510a1e3c436f72706f7261746542616c6c6f74013c436f72706f7261746542616c6c6f741c144d65746173000104029902310304000c80204d65746164617461206f66206120636f72706f726174652062616c6c6f742e005420284341496429203d3e2042616c6c6f744d6574612854696d6552616e6765730001040299022d03040010e42054696d652064657461696c73206f66206120636f72706f726174652062616c6c6f74206173736f636961746564207769746820612043412ed0205468652074696d657374616d70732064656e6f7465207768656e20766f74696e672073746172747320616e642073746f70732e006820284341496429203d3e2042616c6c6f7454696d6552616e6765404d6f74696f6e4e756d43686f69636573010104029902550a040024c82053746f72657320686f77206d616e792063686f696365732074686572652061726520696e2065616368206d6f74696f6e2e00250120417420616c6c2074696d65732c2074686520696e76617269616e7420686f6c6473207468617420606d6f74696f6e5f63686f696365735b6964785d6020697320657175616c20746f310120606d657461732e756e7772617028292e6d6f74696f6e735b6964785d2e63686f696365732e6c656e2829602e20546861742069732c2074686973206973206a75737420612063616368652c1101207573656420746f2061766f6964206665746368696e6720616c6c20746865206d6f74696f6e732077697468207468656972206173736f6369617465642074657874732e0001012060753136602063686f696365732073686f756c64206265206d6f7265207468616e20656e6f75676820746f20666974207265616c207573652063617365732e00b020284341496429203d3e204e756d626572206f662063686f6963657320696e2065616368206d6f74696f6e2e0c5243560101040299023901040010dc2049732072616e6b65642063686f69636520766f74696e6720285243562920656e61626c656420666f7220746869732062616c6c6f743f650120466f7220616e20756e6465727374616e64696e67206f6620686f77205243562069732068616e646c65642c20736565206e6f7465206f6e206042616c6c6f74566f7465602773206066616c6c6261636b60206669656c642e003c20284341496429203d3e20626f6f6c1c526573756c7473010104029902590a04001cb02053746f7265732074686520746f74616c20766f74652074616c6c79206f6e20656163682063686f6963652e006820524356206973206e6f74206163636f756e74656420666f722cd02061732074686572652061726520746f6f206d616e792077616e747320746f20696e74657270726574207468652067726170682c9c20616e64206265636175736520697420776f756c64206e6f7420626520656666696369656e742e008420284341496429203d3e205b63757272656e7420766f746520776569676874735d14566f7465730101080206090a5103040018ac2053746f726573206561636820444944277320766f74657320696e206120676976656e2062616c6c6f742ef8205365652074686520646f63756d656e746174696f6e206f66206042616c6c6f74566f74656020666f72206e6f746573206f6e2073656d616e746963732e008420284341496429203d3e202844494429203d3e205b766f7465207765696768745d001d012055736572206d75737420656e746572203020766f746520776569676874206966207468657920646f6e27742077616e7420746f20766f746520666f7220612063686f6963652e3853746f7261676556657273696f6e01005d0a040004442053746f726167652076657273696f6e2e01e5060129030001610a1f2c5065726d697373696f6e730000000001650a201050697073011050697073584c5072756e65486973746f726963616c5069707301003901040004fc2044657465726d696e6573207768657468657220686973746f726963616c20504950206461746120697320706572736973746564206f722072656d6f766564584d696e696d756d50726f706f73616c4465706f7369740100184000000000000000000000000000000000041d0120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f7220636f6d6d756e69747920504950206372656174696f6e2e5844656661756c74456e6163746d656e74506572696f6401001010000000000439012044656661756c7420656e6163746d656e7420706572696f6420746861742077696c6c2062652075736520616674657220612070726f706f73616c2069732061636365707465642062792047432e4050656e64696e6750697045787069727901005901040108f420486f77206d616e7920626c6f636b732077696c6c2069742074616b652c2061667465722061206050656e64696e67602050495020657870697265732cf420617373756d696e6720697420686173206e6f74207472616e736974696f6e656420746f20616e6f74686572206050726f706f73616c5374617465603f3c4d6178506970536b6970436f756e740100080400048901204d6178696d756d2074696d65732061205049502063616e20626520736b6970706564206265666f72652074726967676572696e67206043616e6e6f74536b69705069706020696e2060656e6163745f736e617073686f745f726573756c7473602e384163746976655069704c696d6974010010100000000008c420546865206d6178696d756d20616c6c6f776564206e756d62657220666f722060416374697665506970436f756e74602e0101204f6e636520726561636865642c206e657720504950732063616e6e6f742062652070726f706f73656420627920636f6d6d756e697479206d656d626572732e34506970496453657175656e636501006d0310000000000409012050726f706f73616c7320736f206661722e2069642063616e206265207573656420746f206b65657020747261636b206f662050495073206f66662d636861696e2e48536e617073686f74496453657175656e6365010081031000000000041d0120536e617073686f747320736f206661722e2069642063616e206265207573656420746f206b65657020747261636b206f6620736e617073686f7473206f66662d636861696e2e38416374697665506970436f756e74010010100000000004c820546f74616c20636f756e74206f662063757272656e742070656e64696e67206f72207363686564756c656420504950732e4050726f706f73616c4d65746164617461000104056d03690a0400049820546865206d65746164617461206f6620746865206163746976652070726f706f73616c732e204465706f7369747300010805056d0a710a040008842054686f73652077686f2068617665206c6f636b65642061206465706f7369742e8c2070726f706f73616c202869642c2070726f706f73657229202d3e206465706f7369742450726f706f73616c73000104056d03750a040008c42041637475616c2070726f706f73616c20666f72206120676976656e2069642c20696620697427732063757272656e742e602070726f706f73616c206964202d3e2070726f706f73616c3850726f706f73616c526573756c74010104056d03790aa00000000000000000000000000000000000000000000000000000000000000000000000000000000008d420506f6c796d657368566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e682070726f706f73616c206964202d3e20766f746520636f756e743450726f706f73616c566f74657300010805056d0a7d0a040008050120566f746573207065722050726f706f73616c20616e64206163636f756e742e205573656420746f2061766f696420646f75626c6520766f74652069737375652e7c202870726f706f73616c2069642c206163636f756e7429202d3e20566f746534506970546f5363686564756c65000104056d0310040004fc204d617073205049507320746f2074686520626c6f636b20617420776869636820746865792077696c6c2062652065786563757465642c20696620616e792e244c697665517565756501008503040018cc2041206c697665207072696f7269747920717565756520286c6f77657374207072696f7269747920617420696e646578203029a0206f662070656e64696e67205049507320757020746f2074686520616374697665206c696d69742ef4205072696f7269747920697320646566696e65642062792074686520607765696768746020696e207468652060536e617073686f74746564506970602e00450120556e6c696b652060536e617073686f745175657565602c2074686973207175657565206973206c6976652c2067657474696e6720757064617465642077697468206561636820766f746520636173742e2d012054686520736e617073686f74206973207468657265666f726520657373656e7469616c6c79206120706f696e742d696e2d74696d6520636c6f6e65206f6620746869732071756575652e34536e617073686f74517565756501008503040014590120546865207072696f7269747920717565756520286c6f77657374207072696f7269747920617420696e646578203029206f6620504950732061742074686520706f696e74206f6620736e617073686f7474696e672ef4205072696f7269747920697320646566696e65642062792074686520607765696768746020696e207468652060536e617073686f74746564506970602e000901204120717565756564205049502063616e20626520736b69707065642e20446f696e6720736f2062756d70732074686520607069705f736b69705f636f756e74602e3501204f6e636520612028636f6e666967757261626c652920746872657368686f6c642069732065786365656465642c2061205049502063616e6e6f7420626520736b697070656420616761696e2e30536e617073686f744d6574610000810a040004bc20546865206d65746164617461206f662074686520736e617073686f742c206966207468657265206973206f6e652e30506970536b6970436f756e74010104056d0308040008d020546865206e756d626572206f662074696d65732061206365727461696e2050495020686173206265656e20736b69707065642e3501204f6e636520612028636f6e666967757261626c652920746872657368686f6c642069732065786365656465642c2061205049502063616e6e6f7420626520736b697070656420616761696e2e34436f6d6d69747465655069707301009d03040008d420416c6c206578697374696e672050495073207768657265207468652070726f706f736572206973206120636f6d6d69747465652e39012054686973206c6973742069732061206361636865206f6620616c6c2069647320696e206050726f706f73616c73602077697468206050726f706f7365723a3a436f6d6d6974746565285f29602e3850726f706f73616c537461746573000104056d037d030400087c2050726f706f73616c20737461746520666f72206120676976656e2069642e742070726f706f73616c206964202d3e2070726f706f73616c53746174653853746f7261676556657273696f6e0100850a04000001e9060161030001890a2124506f7274666f6c696f0124506f7274666f6c696f344c4e657874506f7274666f6c696f4e756d6265720101040680f020010000000000000004cc20546865206e65787420706f7274666f6c696f2073657175656e6365206e756d626572206f6620616e206964656e746974792e28506f7274666f6c696f7300010806058d0aa50304000c41012054686520736574206f66206578697374696e6720706f7274666f6c696f732077697468207468656972206e616d65732e2049662061206365727461696e2070616972206f6620612044494420616e64590120706f7274666f6c696f206e756d626572206d61707320746f20604e6f6e6560207468656e2073756368206120706f7274666f6c696f20646f65736e27742065786973742e20436f6e76657273656c792c206966206135012070616972206d61707320746f2060536f6d65286e616d652960207468656e2073756368206120706f7274666f6c696f2065786973747320616e642069732063616c6c656420606e616d65602e304e616d65546f4e756d6265720001080602910af0040008e420496e7665727365206d6170206f662060506f7274666f6c696f7360207573656420746f20656e737572652062696a6563746976697469792ca420616e6420756e697175656e657373206f66206e616d657320696e2060506f7274666f6c696f73602e4c506f7274666f6c696f4173736574436f756e7401010405e82820000000000000000004fc20486f77206d616e79206173736574732077697468206e6f6e2d7a65726f2062616c616e6365207468697320706f7274666f6c696f20636f6e7461696e732e58506f7274666f6c696f417373657442616c616e6365730101080502950a1840000000000000000000000000000000000488205468652061737365742062616c616e636573206f6620706f7274666f6c696f732e54506f7274666f6c696f4c6f636b65644173736574730101080502950a18400000000000000000000000000000000008a020416d6f756e74206f6620617373657473206c6f636b656420696e206120706f7274666f6c696f2e2d01205468657365206173736574732073686f7720757020696e20706f7274666f6c696f2062616c616e6365206275742063616e206e6f74206265207472616e7366657272656420617761792e48506f7274666f6c696f437573746f6469616e00010405e88004000481012054686520637573746f6469616e206f66206120706172746963756c617220706f7274666f6c696f2e204e6f6e6520696d706c696573207468617420746865206964656e74697479206f776e65722069732074686520637573746f6469616e2e4c506f7274666f6c696f73496e437573746f64790101080605990a390104000c550120547261636b7320616c6c2074686520706f7274666f6c696f7320696e20637573746f6479206f66206120706172746963756c6172206964656e746974792e204f6e6c79207573656420627920746865205549732ea501205768656e206074727565602069732073746f726564206173207468652076616c756520666f72206120676976656e2060286469642c2070696429602c206974206d65616e73207468617420607069646020697320696e20637573746f6479206f662060646964602ea501206066616c7365602076616c75657320617265206e65766572206578706c696369746c792073746f72656420696e20746865206d61702c20616e642061726520696e737465616420696e6665727265642062792074686520616273656e6365206f662061206b65792e30506f7274666f6c696f4e465401010805029d0a39010400049420546865206e6674206173736f63696174656420746f2074686520706f7274666f6c696f2e48506f7274666f6c696f4c6f636b65644e465401010805029d0a39010400049820416c6c206c6f636b6564206e667420666f72206120676976656e20706f7274666f6c696f2e54507265417070726f766564506f7274666f6c696f730101080502950a3901040004450120416c6c20706f7274666f6c696f73207468617420646f6e2774206e65656420746f2061666669726d2074686520726563656976656d656e74206f66206120676976656e205b6041737365744944605d2e44416c6c6f776564437573746f6469616e730101080606dd0539010400043d0120437573746f6469616e7320616c6c6f77656420746f2063726561746520616e642074616b6520637573746f6479206f6620706f7274666f6c696f73206f6e20616e206964277320626568616c662e3853746f7261676556657273696f6e0100a50a040004442053746f726167652076657273696f6e2e01f90601a1030001a90a222c50726f746f636f6c466565012c50726f746f636f6c4665650820426173654665657301010405090718400000000000000000000000000000000004150120546865206d617070696e67206f66206f7065726174696f6e206e616d657320746f2074686520626173652066656573206f662074686f7365206f7065726174696f6e732e2c436f656666696369656e740100c503200100000001000000041501205468652066656520636f656666696369656e74206173206120706f73697469766520726174696f6e616c20286e756d657261746f722c2064656e6f6d696e61746f72292e01050701c1030001ad0a23245363686564756c657201245363686564756c65720c3c496e636f6d706c65746553696e6365000010040000184167656e64610101040510b10a0400044d01204974656d7320746f2062652065786563757465642c20696e64657865642062792074686520626c6f636b206e756d626572207468617420746865792073686f756c64206265206578656375746564206f6e2e184c6f6f6b75700001040504cd03040010f8204c6f6f6b75702066726f6d2061206e616d6520746f2074686520626c6f636b206e756d62657220616e6420696e646578206f6620746865207461736b2e00590120466f72207633202d3e207634207468652070726576696f75736c7920756e626f756e646564206964656e7469746965732061726520426c616b65322d3235362068617368656420746f20666f726d2074686520763430206964656e7469746965732e010d0701c90308344d6178696d756d57656967687420400b00806e87740113cccccccccccccccc04290120546865206d6178696d756d207765696768742074686174206d6179206265207363686564756c65642070657220626c6f636b20666f7220616e7920646973706174636861626c65732e504d61785363686564756c6564506572426c6f636b101032000000041d0120546865206d6178696d756d206e756d626572206f66207363686564756c65642063616c6c7320696e2074686520717565756520666f7220612073696e676c6520626c6f636b2e01c90a2428536574746c656d656e740128536574746c656d656e74582456656e7565496e666f00010405d903cd0a0400049820496e666f2061626f757420612076656e75652e2076656e75655f6964202d3e2076656e75651c44657461696c7301010405d903dd03040008e420467265652d666f726d20746578742061626f757420612076656e75652e2076656e75655f6964202d3e206056656e756544657461696c736060204f6e6c79206e656564656420666f72207468652055492e4456656e7565496e737472756374696f6e730101080505d10a550100107020496e737472756374696f6e7320756e64657220612076656e75652e60204f6e6c79206e656564656420666f72207468652055492e00842076656e75655f6964202d3e20696e737472756374696f6e5f6964202d3e2028293056656e75655369676e6572730101080505d50a3901040004e4205369676e65727320616c6c6f776564206279207468652076656e75652e202876656e75655f69642c207369676e657229202d3e20626f6f6c285573657256656e7565730101080505d90a550100147101204172726179206f662076656e756573206372656174656420627920616e206964656e746974792e204f6e6c79206e656564656420666f72207468652055492e204964656e746974794964202d3e205665633c76656e75655f69643e782056656e7565732063726561746520627920616e206964656e746974792e60204f6e6c79206e656564656420666f72207468652055492e0060206964656e74697479202d3e2076656e75655f696420282948496e737472756374696f6e44657461696c73010104058902dd0a34000000000000000000000000000411012044657461696c732061626f757420616e20696e737472756374696f6e2e20696e737472756374696f6e5f6964202d3e20696e737472756374696f6e5f64657461696c7350496e737472756374696f6e4c65675374617475730101080505e10ae50a040004310120537461747573206f662061206c656720756e64657220616e20696e737472756374696f6e2e2028696e737472756374696f6e5f69642c206c65675f696429202d3e204c656753746174757364496e737472756374696f6e41666669726d7350656e64696e6701010405890228200000000000000000048101204e756d626572206f662061666669726d6174696f6e732070656e64696e67206265666f726520696e737472756374696f6e2069732065786563757465642e20696e737472756374696f6e5f6964202d3e2061666669726d5f70656e64696e673c41666669726d7352656365697665640101080505e90aed0a040004990120547261636b732061666669726d6174696f6e7320726563656976656420666f7220616e20696e737472756374696f6e2e2028696e737472756374696f6e5f69642c20636f756e7465725f706172747929202d3e2041666669726d6174696f6e537461747573405573657241666669726d6174696f6e730101080505f10aed0a04000855012048656c70732061207573657220747261636b2074686569722070656e64696e6720696e737472756374696f6e7320616e642061666669726d6174696f6e7320286f6e6c79206e656564656420666f72205549292ed42028636f756e7465725f70617274792c20696e737472756374696f6e5f696429202d3e2041666669726d6174696f6e537461747573305265636569707473557365640101080502fd083901040004150120547261636b7320726564656d7074696f6e206f662072656365697074732e20287369676e65722c20726563656970745f75696429202d3e20726563656970745f757365643856656e756546696c746572696e6701010402a83901040004010220547261636b73206966206120746f6b656e2068617320656e61626c65642066696c746572696e672076656e75657320746861742063616e2063726561746520696e737472756374696f6e7320696e766f6c76696e6720746865697220746f6b656e2e2041737365744944202d3e2066696c746572696e675f656e61626c65643856656e7565416c6c6f774c6973740101080205f50a3901040008c1012056656e75657320746861742061726520616c6c6f77656420746f2063726561746520696e737472756374696f6e7320696e766f6c76696e67206120706172746963756c61722061737365742e204f6e6c7920757365642069662066696c746572696e6720697320656e61626c65642e8c20285b6041737365744944605d2c2076656e75655f696429202d3e20616c6c6f7765643056656e7565436f756e7465720100d903200000000000000000041901204e756d626572206f662076656e75657320696e207468652073797374656d202849742773206f6e65206d6f7265207468616e207468652061637475616c206e756d6265722948496e737472756374696f6e436f756e74657201008902200000000000000000043101204e756d626572206f6620696e737472756374696f6e7320696e207468652073797374656d202849742773206f6e65206d6f7265207468616e207468652061637475616c206e756d6265722940496e737472756374696f6e4d656d6f73000104058902880400044420496e737472756374696f6e206d656d6f4c496e737472756374696f6e5374617475736573010104058902f90a040004e820496e737472756374696f6e2073746174757365732e20696e737472756374696f6e5f6964202d3e20496e737472756374696f6e5374617475733c496e737472756374696f6e4c6567730001080505e10a0104040004ec204c65677320756e64657220616e20696e737472756374696f6e2e2028696e737472756374696f6e5f69642c206c65675f696429202d3e204c6567504f6666436861696e41666669726d6174696f6e730101080505e10aed0a040004d90120547261636b73207468652061666669726d6174696f6e2073746174757320666f72206f6666636861696e206c65677320696e206120696e737472756374696f6e2e205b6028496e737472756374696f6e49642c204c6567496429605d202d3e205b6041666669726d6174696f6e537461747573605d504e756d6265724f6656656e75655369676e65727301010405d90310100000000004b420547261636b7320746865206e756d626572206f66207369676e65727320656163682076656e7565206861732e80496e737472756374696f6e4d65646961746f727341666669726d6174696f6e730101080506fd0a010b040004a8205468652073746174757320666f7220746865206d65646961746f72732061666669726d6174696f6e2e3853746f7261676556657273696f6e0100050b040004442053746f726167652076657273696f6e2e01150701d50314644d61784e756d6265724f664f6666436861696e41737365747310100a00000000644d61784e756d6265724f6646756e6769626c6541737365747310100a00000000544d61784e756d6265724f664e4654735065724c656710100a000000003c4d61784e756d6265724f664e465473101064000000005c4d61784e756d6265724f6656656e75655369676e6572731010320000000001090b25285374617469737469637301285374617469737469637314404163746976654173736574537461747301010402a80d0b040004c4204d617073206120736574206f66205b605374617454797065605d20666f722065616368205b6041737365744944605d2e28417373657453746174730101080202110b18400000000000000000000000000000000004342041737365742073746174732e6041737365745472616e73666572436f6d706c69616e63657301010402a8190b08000004d820546865205b6041737365745472616e73666572436f6d706c69616e6365605d20666f722065616368205b6041737365744944605d2e7c5472616e73666572436f6e646974696f6e4578656d7074456e7469746965730101080202210b3901040004c420456e746974696573206578656d70742066726f6d2061205472616e7366657220436f6d706c69616e63652072756c652e3853746f7261676556657273696f6e0100250b0400046c2053746f72616765206d6967726174696f6e2076657273696f6e2e01410701050408404d61785374617473506572417373657410100a00000000744d61785472616e73666572436f6e646974696f6e7350657241737365741010040000000001290b260c53746f010c53746f102c46756e647261697365727300010802052d0b5104040008b020416c6c2066756e64726169736572732074686174206172652063757272656e746c792072756e6e696e672e9c2028417373657449442c2066756e647261697365725f696429202d3e2046756e647261697365723c46756e64726169736572436f756e7401010402a84904200000000000000000049c20546f74616c2066756e6472616973657273206372656174656420666f72206120746f6b656e2e3c46756e647261697365724e616d657300010802052d0b4d04040008b4204e616d6520666f72207468652046756e647261697365722e204f6e6c792075736564206f6666636861696e2eb02028417373657449442c2066756e647261697365725f696429202d3e2046756e64726169736572206e616d653853746f7261676556657273696f6e0100310b0400046c2053746f72616765206d6967726174696f6e2076657273696f6e2e0151070145040001350b27205472656173757279000161070161040001390b281c5574696c697479011c5574696c69747904184e6f6e6365730101040500282000000000000000000858204e6f6e636520666f72206072656c61795f7478602e4420504f4c594d4553483a2061646465642e016d07016504044c626174636865645f63616c6c735f6c696d69741010aa2a000004a820546865206c696d6974206f6e20746865206e756d626572206f6620626174636865642063616c6c732e013d0b2910426173650001910701750404184d61784c656e1010000800000001410b2a3845787465726e616c4167656e7473013845787465726e616c4167656e747318304147496453657175656e636501010402a83501100000000010a820546865206e657874207065722d617373657420414720494420696e207468652073657175656e63652e005101205468652066756c6c20494420697320646566696e6564206173206120636f6d62696e6174696f6e206f662060417373657449446020616e642061206e756d62657220696e20746869732073657175656e63652c90207768696368207374617274732066726f6d20312c20726174686572207468616e20302e1c4167656e744f660101080202f909550100040d01204d61707320616e206167656e742028604964656e746974794964602920746f20616c6c2061737365747320746865792062656c6f6e6720746f2c20696620616e792e3047726f75704f664167656e740001080205e10931010400043d01204d617073206167656e74732028604964656e746974794964602920666f7220616e2060417373657449446020746f207768617420414720746865792062656c6f6e6720746f2c20696620616e792e344e756d46756c6c4167656e747301010402a810100000000004e4204d61707320616e2060417373657449446020746f20746865206e756d626572206f66206046756c6c60206167656e747320666f722069742e4047726f75705065726d697373696f6e730001080205450bb8040004650120466f7220637573746f6d20414773206f6620616e206041737365744944602c206d61707320746f2077686174207065726d697373696f6e7320616e206167656e7420696e207468617420414720776f756c6420686176652e3853746f7261676556657273696f6e0100490b040000019507017d0400014d0b2b1c52656c61796572011c52656c6179657204245375627369646965730001040200510b040018ec20546865207375627369647920666f7220612060757365725f6b657960206966207468657920617265206265696e6720737562736964697365642c882061732061206d61702060757365725f6b657960203d3e206053756273696479602e0009012041206b65792063616e206f6e6c792068617665206f6e65207375627369647920617420612074696d652e2020546f206368616e67652073756273696469736572731d012061206b6579206e6565647320746f2063616c6c206072656d6f76655f706179696e675f6b65796020746f2072656d6f7665207468652063757272656e7420737562736964792ca4206265666f726520746865792063616e206163636570742061206e657720737562736964697365722e0199070181040001550b2c24436f6e7472616374730124436f6e74726163747318305072697374696e65436f6465000104062c590b04000465012041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2c436f646553746f72616765000104062c5d0b04000465012041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e2c4f776e6572496e666f4f66000104062c650b0400040d012041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420697473206f776e657220696e666f726d6174696f6e2e144e6f6e6365010028200000000000000000581d0120546869732069732061202a2a6d6f6e6f746f6e69632a2a20636f756e74657220696e6372656d656e746564206f6e20636f6e747261637420696e7374616e74696174696f6e2e0005012054686973206973207573656420696e206f7264657220746f2067656e657261746520756e6971756520747269652069647320666f7220636f6e7472616374732e2901205468652074726965206964206f662061206e657720636f6e74726163742069732063616c63756c617465642066726f6d2068617368286163636f756e745f69642c206e6f6e6365292e350120546865206e6f6e63652069732072657175697265642062656361757365206f74686572776973652074686520666f6c6c6f77696e672073657175656e636520776f756c64206c65616420746f84206120706f737369626c6520636f6c6c6973696f6e206f662073746f726167653a006820312e204372656174652061206e657720636f6e74726163742e6c20322e205465726d696e6174652074686520636f6e74726163742efc20332e20496d6d6564696174656c792072656372656174652074686520636f6e74726163742077697468207468652073616d65206163636f756e745f69642e00450120546869732069732062616420626563617573652074686520636f6e74656e7473206f6620612074726965206172652064656c65746564206c617a696c7920616e64207468657265206d6967687420626559012073746f72616765206f6620746865206f6c6420696e7374616e74696174696f6e207374696c6c20696e206974207768656e20746865206e657720636f6e747261637420697320637265617465642e20506c656173655901206e6f746520746861742077652063616e2774207265706c6163652074686520636f756e7465722062792074686520626c6f636b206e756d6265722062656361757365207468652073657175656e63652061626f766551012063616e2068617070656e20696e207468652073616d6520626c6f636b2e20576520616c736f2063616e2774206b65657020746865206163636f756e7420636f756e74657220696e206d656d6f7279206f6e6c79490120626563617573652073746f7261676520697320746865206f6e6c792077617920746f20636f6d6d756e6963617465206163726f737320646966666572656e742065787472696e7369637320696e20746865302073616d6520626c6f636b2e001c2023204e6f7465003d0120446f206e6f742075736520697420746f2064657465726d696e6520746865206e756d626572206f6620636f6e7472616374732e20497420776f6e27742062652064656372656d656e74656420696664206120636f6e74726163742069732064657374726f7965642e38436f6e7472616374496e666f4f660001040500690b04000ca82054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e3444656c6574696f6e51756575650100710b040010c8204576696374656420636f6e7472616374732074686174206177616974206368696c6420747269652064656c6574696f6e2e004901204368696c6420747269652064656c6574696f6e2069732061206865617679206f7065726174696f6e20646570656e64696e67206f6e2074686520616d6f756e74206f662073746f72616765206974656d7359012073746f72656420696e207361696420747269652e205468657265666f72652074686973206f7065726174696f6e20697320706572666f726d6564206c617a696c7920696e20606f6e5f696e697469616c697a65602e019d0701850424205363686564756c657d0b2d080400000000010000000400008000000010000000001000000001000020000000004000000400000000000000ae0800007a1300005a140000d8040000fa1a0000f1080000cd0a0000b312000025000000198e0000dcad0000e208000032020000e807000033090000b60700005c180000021f00007510000061abc700660d0000200c0000f40b0000e60c0000fb0c0000270c0000070c0000c1070000a408000052080000fe070000b2080000660800000a07000049070000140800001f080000900800005508000012080000230e0000290f0000e30e0000980e0000ac0700004208000052070000960800001807000077080000830700005b0700003e541900008ee2e00c00e2e6260d00561d230000966f080000be9a1900008e2619000012608d0000467b19000056d01900009e03190000dedb1a0000be235d00009a7906000096521200008901000e619406004902000384906c79002e7a980000e6420d0100e6c5673c00410800862c0d00008d0a00ee12223d007a5d010000a257010000a29a408100c6cd193d00b25801000076ed1f0d00d94c0082042f0d00255a00a2e8253d002a67010000b69d106c001689e1ff00f2cb179300e2707200009901000360ec12b0006a674e0700d91300e11300f6ea160000c90b00fece2f0000052a003a64290000a910002eac200000ad1000462ced0a00fa668f0200aa3b080000e2581200006ede060000046820436f7374207363686564756c6520616e64206c696d6974732e4844656c6574696f6e517565756544657074681010000400003c090120546865206d6178696d756d206e756d626572206f6620636f6e74726163747320746861742063616e2062652070656e64696e6720666f722064656c6574696f6e2e003d01205768656e206120636f6e74726163742069732064656c657465642062792063616c6c696e6720607365616c5f7465726d696e61746560206974206265636f6d657320696e61636365737369626c654d0120696d6d6564696174656c792c20627574207468652064656c6574696f6e206f66207468652073746f72616765206974656d732069742068617320616363756d756c6174656420697320706572666f726d65642901206c617465722e2054686520636f6e74726163742069732070757420696e746f207468652064656c6574696f6e2071756575652e205468697320646566696e657320686f77206d616e795d0120636f6e7472616374732063616e20626520717565756564207570206174207468652073616d652074696d652e2049662074686174206c696d6974206973207265616368656420607365616c5f7465726d696e6174656015012077696c6c206661696c2e2054686520616374696f6e206d757374206265207265747269656420696e2061206c6174657220626c6f636b20696e207468617420636173652e00b82054686520726561736f6e7320666f72206c696d6974696e6720746865207175657565206465707468206172653a00590120312e2054686520717565756520697320696e2073746f7261676520696e206f7264657220746f2062652070657273697374656e74206265747765656e20626c6f636b732e2057652077616e7420746f206c696d6974b4200974686520616d6f756e74206f662073746f7261676520746861742063616e20626520636f6e73756d65642e4d0120322e205468652071756575652069732073746f72656420696e206120766563746f7220616e64206e6565647320746f206265206465636f64656420617320612077686f6c65207768656e2072656164696e674501090969742061742074686520656e64206f66206561636820626c6f636b2e204c6f6e676572207175657565732074616b65206d6f72652077656967687420746f206465636f646520616e642068656e6365e809096c696d69742074686520616d6f756e74206f66206974656d7320746861742063616e2062652064656c657465642070657220626c6f636b2e4c44656c6574696f6e5765696768744c696d6974201c070088526a7400184d0120546865206d6178696d756d20616d6f756e74206f662077656967687420746861742063616e20626520636f6e73756d65642070657220626c6f636b20666f72206c617a7920747269652072656d6f76616c2e005d012054686520616d6f756e74206f66207765696768742074686174206973206465646963617465642070657220626c6f636b20746f20776f726b206f6e207468652064656c6574696f6e2071756575652e204c617267657245012076616c75657320616c6c6f77206d6f72652074726965206b65797320746f2062652064656c6574656420696e206561636820626c6f636b20627574207265647563652074686520616d6f756e74206f664101207765696768742074686174206973206c65667420666f72207472616e73616374696f6e732e20536565205b6053656c663a3a44656c6574696f6e51756575654465707468605d20666f72206d6f72659820696e666f726d6174696f6e2061626f7574207468652064656c6574696f6e2071756575652e384465706f73697450657242797465184060ea00000000000000000000000000001411012054686520616d6f756e74206f662062616c616e636520612063616c6c65722068617320746f2070617920666f7220656163682062797465206f662073746f726167652e001c2023204e6f7465002901204368616e67696e6720746869732076616c756520666f7220616e206578697374696e6720636861696e206d69676874206e65656420612073746f72616765206d6967726174696f6e2e384465706f7369745065724974656d1840f04902000000000000000000000000001405012054686520616d6f756e74206f662062616c616e636520612063616c6c65722068617320746f2070617920666f7220656163682073746f72616765206974656d2e001c2023204e6f7465002901204368616e67696e6720746869732076616c756520666f7220616e206578697374696e6720636861696e206d69676874206e65656420612073746f72616765206d6967726174696f6e2e284d6178436f64654c656e101000ec01001c5d0120546865206d6178696d756d206c656e677468206f66206120636f6e747261637420636f646520696e2062797465732e2054686973206c696d6974206170706c69657320746f2074686520696e737472756d656e74656451012076657273696f6e206f662074686520636f64652e205468657265666f72652060696e7374616e74696174655f776974685f636f6465602063616e206661696c206576656e207768656e20737570706c79696e679c2061207761736d2062696e6172792062656c6f772074686973206d6178696d756d2073697a652e005901205468652076616c75652073686f756c642062652063686f73656e206361726566756c6c792074616b696e6720696e746f20746865206163636f756e7420746865206f766572616c6c206d656d6f7279206c696d6974f020796f75722072756e74696d65206861732c2061732077656c6c20617320746865205b6d6178696d756d20616c6c6f7765642063616c6c737461636b5d012064657074685d28236173736f636961746564747970652e43616c6c537461636b292e204c6f6f6b20696e746f207468652060696e746567726974795f7465737428296020666f7220736f6d6520696e7369676874732e404d617853746f726167654b65794c656e10108000000004e020546865206d6178696d756d20616c6c6f7761626c65206c656e67746820696e20627974657320666f722073746f72616765206b6579732e5c556e73616665556e737461626c65496e7465726661636539010400241101204d616b6520636f6e74726163742063616c6c61626c652066756e6374696f6e73206d61726b65642061732060235b756e737461626c655d6020617661696c61626c652e003d0120436f6e7472616374732074686174207573652060235b756e737461626c655d602066756e6374696f6e7320776f6e27742062652061626c6520746f2062652075706c6f6164656420756e6c657373450120746869732069732073657420746f206074727565602e2054686973206973206f6e6c79206d65616e7420666f7220746573746e65747320616e6420646576206e6f64657320696e206f7264657220746f78206578706572696d656e742077697468206e65772066656174757265732e00282023205761726e696e6700c020446f202a2a6e6f742a2a2073657420746f20607472756560206f6e2070726f64756374696f6e7320636861696e732e444d617844656275674275666665724c656e10100000200004c420546865206d6178696d756d206c656e677468206f66207468652064656275672062756666657220696e2062797465732e018d0b2e44506f6c796d657368436f6e7472616374730144506f6c796d657368436f6e747261637473105043616c6c52756e74696d6557686974656c6973740101040695043901040004f42057686974656c697374206f662065787472696e7369637320616c6c6f77656420746f2062652063616c6c65642066726f6d20636f6e7472616374732e3853746f7261676556657273696f6e0100910b040004442053746f726167652076657273696f6e2e384170694e65787455706772616465000104058d04bd070400040d012053746f7265732074686520636861696e2076657273696f6e20616e6420636f6465206861736820666f7220746865206e65787420636861696e20757067726164652e3843757272656e7441706948617368000104058d04c107040004a82053746f7265732074686520636f6465206861736820666f72207468652063757272656e74206170692e01b1070189040001950b2f20507265696d6167650120507265696d6167650824537461747573466f72000104062c990b0400049020546865207265717565737420737461747573206f66206120676976656e20686173682e2c507265696d616765466f7200010406a10ba50b04000001c5070199040001a90b300c4e6674010c4e465428304e756d6265724f664e4654730101080206e10928200000000000000000049c2054686520746f74616c206e756d626572206f66204e46547320706572206964656e746974792e3c436f6c6c656374696f6e417373657401010402a8a10420000000000000000004bc2054686520636f6c6c656374696f6e20696420636f72726573706f6e64696e6720746f20656163682061737365742e28436f6c6c656374696f6e01010402a104ad0b6000000000000000000000000000000000000000000000000004c820416c6c20636f6c6c656374696f6e2064657461696c7320666f72206120676976656e20636f6c6c656374696f6e2069642e38436f6c6c656374696f6e4b65797301010402a104b10b040004d020416c6c206d616e6461746f7279206d65746164617461206b65797320666f72206120676976656e20636f6c6c656374696f6e2e344d6574616461746156616c75650101080202b50b4502040004450120546865206d657461646174612076616c7565206f6620616e206e667420676976656e2069747320636f6c6c656374696f6e2069642c20746f6b656e20696420616e64206d65746164617461206b65792e404e465473496e436f6c6c656374696f6e01010402a82820000000000000000004a42054686520746f74616c206e756d626572206f66204e46547320696e206120636f6c6c656374696f6e204e46544f776e65720001080202a10ae80400046c20547261636b7320746865206f776e6572206f6620616e204e46543043757272656e744e4654496400010402a104bd030400048820546865206c61737420604e4654496460207573656420666f7220616e204e46542e4c43757272656e74436f6c6c656374696f6e49640000a104040004c820546865206c61737420604e4654436f6c6c656374696f6e496460207573656420666f72206120636f6c6c656374696f6e2e3853746f7261676556657273696f6e0100bd0b040004442053746f726167652076657273696f6e2e01c907019d0408644d61784e756d6265724f66436f6c6c656374696f6e4b6579730804ff00504d61784e756d6265724f664e465473436f756e7410100a0000000001c10b3168456c656374696f6e50726f76696465724d756c746950686173650168456c656374696f6e50726f76696465724d756c746950686173652814526f756e64010010100100000018ac20496e7465726e616c20636f756e74657220666f7220746865206e756d626572206f6620726f756e64732e00550120546869732069732075736566756c20666f722064652d6475706c69636174696f6e206f66207472616e73616374696f6e73207375626d697474656420746f2074686520706f6f6c2c20616e642067656e6572616c6c20646961676e6f7374696373206f66207468652070616c6c65742e004d012054686973206973206d6572656c7920696e6372656d656e746564206f6e6365207065722065766572792074696d65207468617420616e20757073747265616d2060656c656374602069732063616c6c65642e3043757272656e7450686173650100b1040400043c2043757272656e742070686173652e38517565756564536f6c7574696f6e0000c50b0400043d012043757272656e74206265737420736f6c7574696f6e2c207369676e6564206f7220756e7369676e65642c2071756575656420746f2062652072657475726e65642075706f6e2060656c656374602e20536e617073686f740000cd0b04000c7020536e617073686f742064617461206f662074686520726f756e642e005d01205468697320697320637265617465642061742074686520626567696e6e696e67206f6620746865207369676e656420706861736520616e6420636c65617265642075706f6e2063616c6c696e672060656c656374602e38446573697265645461726765747300001004000ccc2044657369726564206e756d626572206f66207461726765747320746f20656c65637420666f72207468697320726f756e642e00a8204f6e6c7920657869737473207768656e205b60536e617073686f74605d2069732070726573656e742e40536e617073686f744d657461646174610000b90804000c9820546865206d65746164617461206f6620746865205b60526f756e64536e617073686f74605d00a8204f6e6c7920657869737473207768656e205b60536e617073686f74605d2069732070726573656e742e645369676e65645375626d697373696f6e4e657874496e646578010010100000000024010120546865206e65787420696e64657820746f2062652061737369676e656420746f20616e20696e636f6d696e67207369676e6564207375626d697373696f6e2e007501204576657279206163636570746564207375626d697373696f6e2069732061737369676e6564206120756e6971756520696e6465783b207468617420696e64657820697320626f756e6420746f207468617420706172746963756c61726501207375626d697373696f6e20666f7220746865206475726174696f6e206f662074686520656c656374696f6e2e204f6e20656c656374696f6e2066696e616c697a6174696f6e2c20746865206e65787420696e6465782069733020726573657420746f20302e0069012057652063616e2774206a7573742075736520605369676e65645375626d697373696f6e496e64696365732e6c656e2829602c206265636175736520746861742773206120626f756e646564207365743b20706173742069747359012063617061636974792c2069742077696c6c2073696d706c792073617475726174652e2057652063616e2774206a7573742069746572617465206f76657220605369676e65645375626d697373696f6e734d6170602cf4206265636175736520697465726174696f6e20697320736c6f772e20496e73746561642c2077652073746f7265207468652076616c756520686572652e5c5369676e65645375626d697373696f6e496e64696365730100d90b0400186d01204120736f727465642c20626f756e64656420766563746f72206f6620602873636f72652c20626c6f636b5f6e756d6265722c20696e64657829602c20776865726520656163682060696e6465786020706f696e747320746f2061782076616c756520696e20605369676e65645375626d697373696f6e73602e007101205765206e65766572206e65656420746f2070726f63657373206d6f7265207468616e20612073696e676c65207369676e6564207375626d697373696f6e20617420612074696d652e205369676e6564207375626d697373696f6e7375012063616e206265207175697465206c617267652c20736f2077652772652077696c6c696e6720746f207061792074686520636f7374206f66206d756c7469706c6520646174616261736520616363657373657320746f206163636573732101207468656d206f6e6520617420612074696d6520696e7374656164206f662072656164696e6720616e64206465636f64696e6720616c6c206f66207468656d206174206f6e63652e505369676e65645375626d697373696f6e734d61700001040510e50b04001c7420556e636865636b65642c207369676e656420736f6c7574696f6e732e00690120546f676574686572207769746820605375626d697373696f6e496e6469636573602c20746869732073746f726573206120626f756e64656420736574206f6620605369676e65645375626d697373696f6e7360207768696c65ec20616c6c6f77696e6720757320746f206b656570206f6e6c7920612073696e676c65206f6e6520696e206d656d6f727920617420612074696d652e0069012054776f78206e6f74653a20746865206b6579206f6620746865206d617020697320616e206175746f2d696e6372656d656e74696e6720696e6465782077686963682075736572732063616e6e6f7420696e7370656374206f72f4206166666563743b2077652073686f756c646e2774206e65656420612063727970746f67726170686963616c6c7920736563757265206861736865722e544d696e696d756d556e7472757374656453636f72650000ad040400105d0120546865206d696e696d756d2073636f7265207468617420656163682027756e747275737465642720736f6c7574696f6e206d7573742061747461696e20696e206f7264657220746f20626520636f6e7369646572656428206665617369626c652e00b82043616e206265207365742076696120607365745f6d696e696d756d5f756e747275737465645f73636f7265602e01e50701a5044c34556e7369676e6564506861736510104b0000000480204475726174696f6e206f662074686520756e7369676e65642070686173652e2c5369676e656450686173651010000000000478204475726174696f6e206f6620746865207369676e65642070686173652e544265747465725369676e65645468726573686f6c6491011000000000084d0120546865206d696e696d756d20616d6f756e74206f6620696d70726f76656d656e7420746f2074686520736f6c7574696f6e2073636f7265207468617420646566696e6573206120736f6c7574696f6e2061737820226265747465722220696e20746865205369676e65642070686173652e5c426574746572556e7369676e65645468726573686f6c64910110a0860100084d0120546865206d696e696d756d20616d6f756e74206f6620696d70726f76656d656e7420746f2074686520736f6c7574696f6e2073636f7265207468617420646566696e6573206120736f6c7574696f6e2061738020226265747465722220696e2074686520556e7369676e65642070686173652e384f6666636861696e52657065617410100500000010b42054686520726570656174207468726573686f6c64206f6620746865206f6666636861696e20776f726b65722e00610120466f72206578616d706c652c20696620697420697320352c2074686174206d65616e732074686174206174206c65617374203520626c6f636b732077696c6c20656c61707365206265747765656e20617474656d7074738420746f207375626d69742074686520776f726b6572277320736f6c7574696f6e2e3c4d696e657254785072696f726974792820feffffffffffff7f04250120546865207072696f72697479206f662074686520756e7369676e6564207472616e73616374696f6e207375626d697474656420696e2074686520756e7369676e65642d7068617365505369676e65644d61785375626d697373696f6e731010000000001ce4204d6178696d756d206e756d626572206f66207369676e6564207375626d697373696f6e7320746861742063616e206265207175657565642e005501204974206973206265737420746f2061766f69642061646a757374696e67207468697320647572696e6720616e20656c656374696f6e2c20617320697420696d706163747320646f776e73747265616d2064617461650120737472756374757265732e20496e20706172746963756c61722c20605369676e65645375626d697373696f6e496e64696365733c543e6020697320626f756e646564206f6e20746869732076616c75652e20496620796f75f42075706461746520746869732076616c756520647572696e6720616e20656c656374696f6e2c20796f75205f6d7573745f20656e7375726520746861744d0120605369676e65645375626d697373696f6e496e64696365732e6c656e282960206973206c657373207468616e206f7220657175616c20746f20746865206e65772076616c75652e204f74686572776973652cf020617474656d70747320746f207375626d6974206e657720736f6c7574696f6e73206d617920636175736520612072756e74696d652070616e69632e3c5369676e65644d6178576569676874200800001494204d6178696d756d20776569676874206f662061207369676e656420736f6c7574696f6e2e005d01204966205b60436f6e6669673a3a4d696e6572436f6e666967605d206973206265696e6720696d706c656d656e74656420746f207375626d6974207369676e656420736f6c7574696f6e7320286f757473696465206f663d0120746869732070616c6c6574292c207468656e205b604d696e6572436f6e6669673a3a736f6c7574696f6e5f776569676874605d206973207573656420746f20636f6d7061726520616761696e73743020746869732076616c75652e405369676e65644d6178526566756e647310100000000004190120546865206d6178696d756d20616d6f756e74206f6620756e636865636b656420736f6c7574696f6e7320746f20726566756e64207468652063616c6c2066656520666f722e405369676e656452657761726442617365184000000000000000000000000000000000048820426173652072657761726420666f722061207369676e656420736f6c7574696f6e445369676e65644465706f7369744261736518400000000000000000000000000000000004902042617365206465706f73697420666f722061207369676e656420736f6c7574696f6e2e445369676e65644465706f7369744279746518400000000000000000000000000000000004a0205065722d62797465206465706f73697420666f722061207369676e656420736f6c7574696f6e2e4c5369676e65644465706f73697457656967687418400000000000000000000000000000000004a8205065722d776569676874206465706f73697420666f722061207369676e656420736f6c7574696f6e2e444d6178456c656374696e67566f746572731010409c00000c5d0120546865206d6178696d756d206e756d626572206f6620656c656374696e6720766f7465727320746f2070757420696e2074686520736e617073686f742e20417420746865206d6f6d656e742c20736e617073686f7473590120617265206f6e6c79206f76657220612073696e676c6520626c6f636b2c20627574206f6e6365206d756c74692d626c6f636b20656c656374696f6e732061726520696e74726f647563656420746865792077696c6c842074616b6520706c616365206f766572206d756c7469706c6520626c6f636b732e4c4d6178456c65637461626c65546172676574735d0308102704010120546865206d6178696d756d206e756d626572206f6620656c65637461626c65207461726765747320746f2070757420696e2074686520736e617073686f742e284d617857696e6e6572731010e803000010350120546865206d6178696d756d206e756d626572206f662077696e6e65727320746861742063616e20626520656c656374656420627920746869732060456c656374696f6e50726f7669646572604020696d706c656d656e746174696f6e2e005101204e6f74653a2054686973206d75737420616c776179732062652067726561746572206f7220657175616c20746f2060543a3a4461746150726f76696465723a3a646573697265645f746172676574732829602e384d696e65724d61784c656e677468101000006c0000384d696e65724d617857656967687420400b80c933df29011366666666666666a600544d696e65724d6178566f746573506572566f7465721010100000000001e90b3224546573745574696c730124546573745574696c730001d50801b9040001ed0bc8f10b042040436865636b5370656356657273696f6ef90b1038436865636b547856657273696f6efd0b1030436865636b47656e65736973010c2c38436865636b4d6f7274616c697479050c2c28436865636b4e6f6e63650d0c55012c436865636b576569676874110c5501604368617267655472616e73616374696f6e5061796d656e74190c55014453746f726543616c6c4d657461646174611d0c5501210c","id":"1"} \ No newline at end of file +{"jsonrpc":"2.0","id":"1","result":"0x6d6574610e4d0c000c1c73705f636f72651863727970746f2c4163636f756e7449643332000004000401205b75383b2033325d0000040000032000000008000800000503000c08306672616d655f73797374656d2c4163636f756e74496e666f08144e6f6e636501102c4163636f756e74446174610114001401146e6f6e63651001144e6f6e6365000124636f6e73756d657273100120526566436f756e7400012470726f766964657273100120526566436f756e7400012c73756666696369656e7473100120526566436f756e740001106461746114012c4163636f756e74446174610000100000050500140c3c70616c6c65745f62616c616e6365731474797065732c4163636f756e7444617461041c42616c616e63650118001001106672656518011c42616c616e6365000120726573657276656418011c42616c616e636500011866726f7a656e18011c42616c616e6365000114666c6167731c01284578747261466c61677300001800000507001c0c3c70616c6c65745f62616c616e636573147479706573284578747261466c61677300000400180110753132380000200000050000240c346672616d655f737570706f7274206469737061746368405065724469737061746368436c6173730404540128000c01186e6f726d616c2801045400012c6f7065726174696f6e616c280104540001246d616e6461746f7279280104540000280c2873705f77656967687473247765696768745f76321857656967687400000801207265665f74696d652c010c75363400012870726f6f665f73697a652c010c75363400002c000006300030000005060034083c7072696d69746976655f74797065731048323536000004000401205b75383b2033325d00003800000208003c102873705f72756e74696d651c67656e65726963186469676573741844696765737400000401106c6f677340013c5665633c4469676573744974656d3e000040000002440044102873705f72756e74696d651c67656e6572696318646967657374284469676573744974656d0001142850726552756e74696d650800480144436f6e73656e737573456e67696e654964000038011c5665633c75383e00060024436f6e73656e7375730800480144436f6e73656e737573456e67696e654964000038011c5665633c75383e000400105365616c0800480144436f6e73656e737573456e67696e654964000038011c5665633c75383e000500144f74686572040038011c5665633c75383e0000006452756e74696d65456e7669726f6e6d656e745570646174656400080000480000030400000008004c00000250005008306672616d655f73797374656d2c4576656e745265636f7264080445015404540134000c01147068617365a904011450686173650001146576656e7454010445000118746f70696373ad0401185665633c543e0000540c60706f6c796d6573685f72756e74696d655f646576656c6f701c72756e74696d653052756e74696d654576656e740001ac1853797374656d04005801706672616d655f73797374656d3a3a4576656e743c52756e74696d653e0000001c496e6469636573040080017870616c6c65745f696e64696365733a3a4576656e743c52756e74696d653e0003002042616c616e636573040084017c70616c6c65745f62616c616e6365733a3a4576656e743c52756e74696d653e000500485472616e73616374696f6e5061796d656e7404009401a870616c6c65745f7472616e73616374696f6e5f7061796d656e743a3a4576656e743c52756e74696d653e000600204964656e74697479040098017c70616c6c65745f6964656e746974793a3a4576656e743c52756e74696d653e0007004c4364645365727669636550726f7669646572730400450101d470616c6c65745f67726f75703a3a4576656e743c52756e74696d652c2070616c6c65745f67726f75703a3a496e7374616e6365323e00080044506f6c796d657368436f6d6d697474656504004d0101f470616c6c65745f636f6d6d69747465653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6d6d69747465653a3a496e7374616e6365313e0009004c436f6d6d69747465654d656d6265727368697004005d0101d470616c6c65745f67726f75703a3a4576656e743c52756e74696d652c2070616c6c65745f67726f75703a3a496e7374616e6365313e000a0048546563686e6963616c436f6d6d69747465650400610101f470616c6c65745f636f6d6d69747465653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6d6d69747465653a3a496e7374616e6365333e000b0070546563686e6963616c436f6d6d69747465654d656d626572736869700400650101d470616c6c65745f67726f75703a3a4576656e743c52756e74696d652c2070616c6c65745f67726f75703a3a496e7374616e6365333e000c004055706772616465436f6d6d69747465650400690101f470616c6c65745f636f6d6d69747465653a3a4576656e743c52756e74696d652c2070616c6c65745f636f6d6d69747465653a3a496e7374616e6365343e000d006855706772616465436f6d6d69747465654d656d6265727368697004006d0101d470616c6c65745f67726f75703a3a4576656e743c52756e74696d652c2070616c6c65745f67726f75703a3a496e7374616e6365343e000e00204d756c746953696704007101017c70616c6c65745f6d756c74697369673a3a4576656e743c52756e74696d653e000f002856616c696461746f727304007901018470616c6c65745f76616c696461746f72733a3a4576656e743c52756e74696d653e0010001c5374616b696e6704008501017870616c6c65745f7374616b696e673a3a4576656e743c52756e74696d653e001100204f6666656e63657304009d01015870616c6c65745f6f6666656e6365733a3a4576656e740012001c53657373696f6e0400a101017870616c6c65745f73657373696f6e3a3a4576656e743c52756e74696d653e0013001c4772616e6470610400a501015470616c6c65745f6772616e6470613a3a4576656e7400150020496d4f6e6c696e650400b501018070616c6c65745f696d5f6f6e6c696e653a3a4576656e743c52756e74696d653e001700105375646f0400d501016c70616c6c65745f7375646f3a3a4576656e743c52756e74696d653e0019001441737365740400d901017070616c6c65745f61737365743a3a4576656e743c52756e74696d653e001a004c4361706974616c446973747269627574696f6e0400810201ac70616c6c65745f6361706974616c5f646973747269627574696f6e3a3a4576656e743c52756e74696d653e001b0028436865636b706f696e7404009902018470616c6c65745f636865636b706f696e743a3a4576656e743c52756e74696d653e001c0044436f6d706c69616e63654d616e616765720400b10201a470616c6c65745f636f6d706c69616e63655f6d616e616765723a3a4576656e743c52756e74696d653e001d003c436f72706f72617465416374696f6e0400e50201a070616c6c65745f636f72706f726174655f616374696f6e733a3a4576656e743c52756e74696d653e001e003c436f72706f7261746542616c6c6f7404001903019c70616c6c65745f636f72706f726174655f62616c6c6f743a3a4576656e743c52756e74696d653e001f00105069707304005103016c70616c6c65745f706970733a3a4576656e743c52756e74696d653e00210024506f7274666f6c696f04009103018070616c6c65745f706f7274666f6c696f3a3a4576656e743c52756e74696d653e0022002c50726f746f636f6c4665650400b103018c70616c6c65745f70726f746f636f6c5f6665653a3a4576656e743c52756e74696d653e002300245363686564756c65720400b903018070616c6c65745f7363686564756c65723a3a4576656e743c52756e74696d653e00240028536574746c656d656e740400c503018470616c6c65745f736574746c656d656e743a3a4576656e743c52756e74696d653e00250028537461746973746963730400f503018470616c6c65745f737461746973746963733a3a4576656e743c52756e74696d653e0026000c53746f04003504016870616c6c65745f73746f3a3a4576656e743c52756e74696d653e00270020547265617375727904005504017c70616c6c65745f74726561737572793a3a4576656e743c52756e74696d653e0028001c5574696c69747904005904017870616c6c65745f7574696c6974793a3a4576656e743c52756e74696d653e002900104261736504005d04014870616c6c65745f626173653a3a4576656e74002a003845787465726e616c4167656e747304006504019870616c6c65745f65787465726e616c5f6167656e74733a3a4576656e743c52756e74696d653e002b001c52656c6179657204006904017870616c6c65745f72656c617965723a3a4576656e743c52756e74696d653e002c0024436f6e74726163747304006d04018070616c6c65745f636f6e7472616374733a3a4576656e743c52756e74696d653e002e0044506f6c796d657368436f6e747261637473040079040188706f6c796d6573685f636f6e7472616374733a3a4576656e743c52756e74696d653e002f0020507265696d61676504008904017c70616c6c65745f707265696d6167653a3a4576656e743c52756e74696d653e0030000c4e667404008d04016870616c6c65745f6e66743a3a4576656e743c52756e74696d653e00310068456c656374696f6e50726f76696465724d756c746950686173650400950401d070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173653a3a4576656e743c52756e74696d653e00320000580c306672616d655f73797374656d1870616c6c6574144576656e740404540001204045787472696e7369635375636365737304013464697370617463685f696e666f5c014444697370617463684576656e74496e666f00000490416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c656408013864697370617463685f6572726f7268013444697370617463684572726f7200013464697370617463685f696e666f5c014444697370617463684576656e74496e666f00010450416e2065787472696e736963206661696c65642e2c436f64655570646174656400020450603a636f6465602077617320757064617465642e284e65774163636f756e7404011c6163636f756e74000130543a3a4163636f756e7449640003046841206e6577206163636f756e742077617320637265617465642e344b696c6c65644163636f756e7404011c6163636f756e74000130543a3a4163636f756e74496400040458416e206163636f756e7420776173207265617065642e2052656d61726b656408011873656e646572000130543a3a4163636f756e7449640001106861736834011c543a3a48617368000504704f6e206f6e2d636861696e2072656d61726b2068617070656e65642e4455706772616465417574686f72697a6564080124636f64655f6861736834011c543a3a48617368000134636865636b5f76657273696f6e200110626f6f6c00060468416e20757067726164652077617320617574686f72697a65642e8052656a6563746564496e76616c6964417574686f72697a656455706772616465080124636f64655f6861736834011c543a3a486173680001146572726f7268013444697370617463684572726f720007041101416e20696e76616c696420617574686f72697a65642075706772616465207761732072656a6563746564207768696c6520747279696e6720746f206170706c792069742e04704576656e7420666f72207468652053797374656d2070616c6c65742e5c08306672616d655f73797374656d4444697370617463684576656e74496e666f00000c0118776569676874280118576569676874000114636c6173736001344469737061746368436c617373000120706179735f666565640110506179730000600c346672616d655f737570706f7274206469737061746368344469737061746368436c61737300010c184e6f726d616c0000002c4f7065726174696f6e616c000100244d616e6461746f727900020000640c346672616d655f737570706f727420646973706174636810506179730001080c596573000000084e6f0001000068082873705f72756e74696d653444697370617463684572726f7200013c144f746865720000003043616e6e6f744c6f6f6b7570000100244261644f726967696e000200184d6f64756c6504006c012c4d6f64756c654572726f7200030044436f6e73756d657252656d61696e696e670004002c4e6f50726f76696465727300050040546f6f4d616e79436f6e73756d65727300060014546f6b656e0400700128546f6b656e4572726f720007002841726974686d65746963040074013c41726974686d657469634572726f72000800345472616e73616374696f6e616c04007801485472616e73616374696f6e616c4572726f7200090024457868617573746564000a0028436f7272757074696f6e000b002c556e617661696c61626c65000c0038526f6f744e6f74416c6c6f776564000d00105472696504007c0124547269654572726f72000e00006c082873705f72756e74696d652c4d6f64756c654572726f720000080114696e64657808010875380001146572726f7248018c5b75383b204d41585f4d4f44554c455f4552524f525f454e434f4445445f53495a455d000070082873705f72756e74696d6528546f6b656e4572726f720001284046756e6473556e617661696c61626c65000000304f6e6c7950726f76696465720001003042656c6f774d696e696d756d0002003043616e6e6f7443726561746500030030556e6b6e6f776e41737365740004001846726f7a656e0005002c556e737570706f727465640006004043616e6e6f74437265617465486f6c64000700344e6f74457870656e6461626c650008001c426c6f636b65640009000074083473705f61726974686d657469633c41726974686d657469634572726f7200010c24556e646572666c6f77000000204f766572666c6f77000100384469766973696f6e42795a65726f0002000078082873705f72756e74696d65485472616e73616374696f6e616c4572726f72000108304c696d6974526561636865640000001c4e6f4c61796572000100007c0c2873705f72756e74696d653070726f76696e675f7472696524547269654572726f7200013840496e76616c69645374617465526f6f7400000048496e636f6d706c65746544617461626173650001005056616c75654174496e636f6d706c6574654b6579000200304465636f6465724572726f720003002c496e76616c696448617368000400304475706c69636174654b65790005003845787472616e656f75734e6f64650006003c45787472616e656f757356616c75650007005c45787472616e656f7573486173685265666572656e636500080054496e76616c69644368696c645265666572656e63650009003456616c75654d69736d61746368000a003c496e636f6d706c65746550726f6f66000b0030526f6f744d69736d61746368000c002c4465636f64654572726f72000d0000800c3870616c6c65745f696e64696365731870616c6c6574144576656e7404045400011034496e64657841737369676e656408010c77686f000130543a3a4163636f756e744964000114696e64657810013c543a3a4163636f756e74496e6465780000047441206163636f756e7420696e646578207761732061737369676e65642e28496e6465784672656564040114696e64657810013c543a3a4163636f756e74496e646578000104bc41206163636f756e7420696e64657820686173206265656e2066726565642075702028756e61737369676e6564292e2c496e64657846726f7a656e080114696e64657810013c543a3a4163636f756e74496e64657800010c77686f000130543a3a4163636f756e744964000204e841206163636f756e7420696e64657820686173206265656e2066726f7a656e20746f206974732063757272656e74206163636f756e742049442e304465706f736974506f6b656410010c77686f000130543a3a4163636f756e744964000114696e64657810013c543a3a4163636f756e74496e64657800012c6f6c645f6465706f73697418013042616c616e63654f663c543e00012c6e65775f6465706f73697418013042616c616e63654f663c543e000304e841206465706f73697420746f207265736572766520616e20696e64657820686173206265656e20706f6b65642f7265636f6e736964657265642e047c54686520604576656e746020656e756d206f6620746869732070616c6c6574840c3c70616c6c65745f62616c616e6365731870616c6c6574144576656e7408045400044900015c1c456e646f77656408011c6163636f756e74000130543a3a4163636f756e744964000130667265655f62616c616e6365180128543a3a42616c616e6365000004b8416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e20447573744c6f737408011c6163636f756e74000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650001083d01416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742c78726573756c74696e6720696e20616e206f75747269676874206c6f73732e205472616e736665720c011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650002044c5472616e73666572207375636365656465642e2842616c616e636553657408010c77686f000130543a3a4163636f756e74496400011066726565180128543a3a42616c616e636500030468412062616c616e6365207761732073657420627920726f6f742e20526573657276656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000404e0536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e28556e726573657276656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000504e8536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e4852657365727665526570617472696174656410011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e636500014864657374696e6174696f6e5f7374617475738801185374617475730006084d01536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742ed846696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652e1c4465706f73697408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000704d8536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e20576974686472617708010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650008041d01536f6d6520616d6f756e74207761732077697468647261776e2066726f6d20746865206163636f756e742028652e672e20666f72207472616e73616374696f6e2066656573292e1c536c617368656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650009040101536f6d6520616d6f756e74207761732072656d6f7665642066726f6d20746865206163636f756e742028652e672e20666f72206d69736265686176696f72292e184d696e74656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000a049c536f6d6520616d6f756e7420776173206d696e74656420696e746f20616e206163636f756e742e184275726e656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000b049c536f6d6520616d6f756e7420776173206275726e65642066726f6d20616e206163636f756e742e2453757370656e64656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000c041501536f6d6520616d6f756e74207761732073757370656e6465642066726f6d20616e206163636f756e74202869742063616e20626520726573746f726564206c61746572292e20526573746f72656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000d04a4536f6d6520616d6f756e742077617320726573746f72656420696e746f20616e206163636f756e742e20557067726164656404010c77686f000130543a3a4163636f756e744964000e0460416e206163636f756e74207761732075706772616465642e18497373756564040118616d6f756e74180128543a3a42616c616e6365000f042d01546f74616c2069737375616e63652077617320696e637265617365642062792060616d6f756e74602c206372656174696e6720612063726564697420746f2062652062616c616e6365642e2452657363696e646564040118616d6f756e74180128543a3a42616c616e63650010042501546f74616c2069737375616e636520776173206465637265617365642062792060616d6f756e74602c206372656174696e672061206465627420746f2062652062616c616e6365642e184c6f636b656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e636500110460536f6d652062616c616e636520776173206c6f636b65642e20556e6c6f636b656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e636500120468536f6d652062616c616e63652077617320756e6c6f636b65642e1846726f7a656e08010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e636500130460536f6d652062616c616e6365207761732066726f7a656e2e1854686177656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e636500140460536f6d652062616c616e636520776173207468617765642e4c546f74616c49737375616e6365466f7263656408010c6f6c64180128543a3a42616c616e636500010c6e6577180128543a3a42616c616e6365001504ac5468652060546f74616c49737375616e6365602077617320666f72636566756c6c79206368616e6765642e405472616e73666572576974684d656d6f10011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650001106d656d6f8c013c4f7074696f6e3c543a3a4d656d6f3e001604745472616e736665722077697468206d656d6f207375636365656465642e047c54686520604576656e746020656e756d206f6620746869732070616c6c65748814346672616d655f737570706f72741874726169747318746f6b656e73106d6973633442616c616e63655374617475730001081046726565000000205265736572766564000100008c04184f7074696f6e04045401900108104e6f6e6500000010536f6d65040090000001000090084c706f6c796d6573685f7072696d697469766573104d656d6f000004000401205b75383b2033325d0000940c6870616c6c65745f7472616e73616374696f6e5f7061796d656e741870616c6c6574144576656e74040454000104485472616e73616374696f6e466565506169640c010c77686f000130543a3a4163636f756e74496400012861637475616c5f66656518013042616c616e63654f663c543e00010c74697018013042616c616e63654f663c543e000008590141207472616e73616374696f6e20666565206061637475616c5f666565602c206f662077686963682060746970602077617320616464656420746f20746865206d696e696d756d20696e636c7573696f6e206665652c5c686173206265656e2070616964206279206077686f602e047c54686520604576656e746020656e756d206f6620746869732070616c6c6574980c3c70616c6c65745f6964656e746974791870616c6c6574144576656e7404045400015428446964437265617465640c009c01284964656e7469747949640000000130543a3a4163636f756e7449640000a0017c5665633c5365636f6e646172794b65793c543a3a4163636f756e7449643e3e00000c444964656e7469747920637265617465642e0088284449442c207072696d617279206b65792c207365636f6e64617279206b65797329485365636f6e646172794b657973416464656408009c01284964656e7469747949640000a0017c5665633c5365636f6e646172794b65793c543a3a4163636f756e7449643e3e00010c845365636f6e64617279206b65797320616464656420746f206964656e746974792e003c284449442c206e6577206b65797329505365636f6e646172794b65797352656d6f76656408009c01284964656e7469747949640000050101445665633c543a3a4163636f756e7449643e00020c945365636f6e64617279206b6579732072656d6f7665642066726f6d206964656e746974792e0080284449442c20746865206b657973207468617420676f742072656d6f76656429605365636f6e646172794b65794c6566744964656e7469747908009c01284964656e7469747949640000000130543a3a4163636f756e74496400030c9041207365636f6e64617279206b6579206c656674207468656972206964656e746974792e0050284449442c207365636f6e64617279206b657929785365636f6e646172794b65795065726d697373696f6e735570646174656410009c01284964656e7469747949640000000130543a3a4163636f756e7449640000a8012c5065726d697373696f6e730000a8012c5065726d697373696f6e7300040c885365636f6e64617279206b6579207065726d697373696f6e7320757064617465642e000d01284449442c2075706461746564207365636f6e64617279206b65792c2070726576696f7573207065726d697373696f6e732c206e6577207065726d697373696f6e7329445072696d6172794b6579557064617465640c009c01284964656e7469747949640000000130543a3a4163636f756e7449640000000130543a3a4163636f756e74496400050c805072696d617279206b6579206f66206964656e74697479206368616e6765642e00a4284449442c206f6c64207072696d617279206b6579206163636f756e742049442c206e65772049442928436c61696d416464656408009c01284964656e7469747949640000090101344964656e74697479436c61696d00060c60436c61696d20616464656420746f206964656e746974792e0030284449442c20636c61696d2930436c61696d5265766f6b656408009c01284964656e7469747949640000090101344964656e74697479436c61696d00070c70436c61696d207265766f6b65642066726f6d206964656e746974792e0030284449442c20636c61696d294841737365744469645265676973746572656408009c01284964656e7469747949640000290101185469636b657200080c7041737365742773206964656e7469747920726567697374657265642e004c284173736574204449442c207469636b65722948417574686f72697a6174696f6e416464656418009c01284964656e7469747949640000310101484f7074696f6e3c4964656e7469747949643e0000350101504f7074696f6e3c543a3a4163636f756e7449643e000030010c75363400003901017c417574686f72697a6174696f6e446174613c543a3a4163636f756e7449643e00000d0101444f7074696f6e3c543a3a4d6f6d656e743e00090c604e657720617574686f72697a6174696f6e2061646465642e00310128617574686f72697365645f62792c207461726765745f6469642c207461726765745f6b65792c20617574685f69642c20617574686f72697a6174696f6e5f646174612c206578706972792950417574686f72697a6174696f6e5265766f6b65640c00310101484f7074696f6e3c4964656e7469747949643e0000350101504f7074696f6e3c543a3a4163636f756e7449643e000030010c753634000a0ca0417574686f72697a6174696f6e207265766f6b65642062792074686520617574686f72697a65722e00b828617574686f72697a65645f6964656e746974792c20617574686f72697a65645f6b65792c20617574685f69642954417574686f72697a6174696f6e52656a65637465640c00310101484f7074696f6e3c4964656e7469747949643e0000350101504f7074696f6e3c543a3a4163636f756e7449643e000030010c753634000b0cd8417574686f72697a6174696f6e2072656a65637465642062792074686520757365722077686f2077617320617574686f72697a65642e00b828617574686f72697a65645f6964656e746974792c20617574686f72697a65645f6b65792c20617574685f69642954417574686f72697a6174696f6e436f6e73756d65640c00310101484f7074696f6e3c4964656e7469747949643e0000350101504f7074696f6e3c543a3a4163636f756e7449643e000030010c753634000c0c5c417574686f72697a6174696f6e20636f6e73756d65642e00b828617574686f72697a65645f6964656e746974792c20617574686f72697a65645f6b65792c20617574685f69642978417574686f72697a6174696f6e52657472794c696d6974526561636865640c00310101484f7074696f6e3c4964656e7469747949643e0000350101504f7074696f6e3c543a3a4163636f756e7449643e000030010c753634000d0cb0416363657074696e6720417574686f72697a6174696f6e207265747279206c696d697420726561636865642e00b828617574686f72697a65645f6964656e746974792c20617574686f72697a65645f6b65792c20617574685f69642988436464526571756972656d656e74466f725072696d6172794b6579557064617465640400200110626f6f6c000e0cc443444420726571756972656d656e7420666f72207570646174696e67207072696d617279206b6579206368616e6765642e0044286e65775f726571756972656d656e742950436464436c61696d73496e76616c69646174656408009c01284964656e7469747949640000300124543a3a4d6f6d656e74000f10410143444420636c61696d732067656e65726174656420627920604964656e74697479496460202861204344442050726f7669646572292068617665206265656e20696e76616c6964617465642066726f6d24604d6f6d656e74602e0094284344442070726f7669646572204449442c2064697361626c652066726f6d2064617465294c5365636f6e646172794b65797346726f7a656e04009c01284964656e74697479496400100cc4416c6c205365636f6e64617279206b657973206f6620746865206964656e74697479204944206172652066726f7a656e2e00142844494429545365636f6e646172794b657973556e66726f7a656e04009c01284964656e74697479496400110ccc416c6c205365636f6e64617279206b657973206f6620746865206964656e746974792049442061726520756e66726f7a656e2e0014284449442950437573746f6d436c61696d5479706541646465640c009c01284964656e746974794964000021010144437573746f6d436c61696d547970654964000038011c5665633c75383e00120c8041206e657720437573746f6d436c61696d54797065207761732061646465642e003c284449442c2069642c2054797065293c4368696c64446964437265617465640c009c01284964656e74697479496400009c01284964656e7469747949640000000130543a3a4163636f756e74496400130c5c4368696c64206964656e7469747920637265617465642e009028506172656e74204449442c204368696c64204449442c207072696d617279206b657929404368696c64446964556e6c696e6b65640c009c01284964656e74697479496400009c01284964656e74697479496400009c01284964656e74697479496400140cb44368696c64206964656e7469747920756e6c696e6b65642066726f6d20706172656e74206964656e746974792e008c2843616c6c6572204449442c20506172656e74204449442c204368696c642044494429047c54686520604576656e746020656e756d206f6620746869732070616c6c65749c0c4c706f6c796d6573685f7072696d6974697665732c6964656e746974795f6964284964656e746974794964000004000401385b75383b20555549445f4c454e5d0000a0000002a400a40c4c706f6c796d6573685f7072696d697469766573347365636f6e646172795f6b6579305365636f6e646172794b657904244163636f756e74496401000008010c6b65790001244163636f756e74496400012c7065726d697373696f6e73a8012c5065726d697373696f6e730000a80c4c706f6c796d6573685f7072696d697469766573347365636f6e646172795f6b65792c5065726d697373696f6e7300000c01146173736574ac014041737365745065726d697373696f6e7300012465787472696e736963c0015045787472696e7369635065726d697373696f6e73000124706f7274666f6c696fec0150506f7274666f6c696f5065726d697373696f6e730000ac0c4c706f6c796d6573685f7072696d69746976657318737562736574445375627365745265737472696374696f6e04044101b0010c1457686f6c650000001454686573650400b8012c42547265655365743c413e000100184578636570740400b8012c42547265655365743c413e00020000b00c4c706f6c796d6573685f7072696d6974697665731461737365741c4173736574496400000400b401205b75383b2031365d0000b4000003100000000800b80420425472656553657404045401b0000400bc000000bc000002b000c00c4c706f6c796d6573685f7072696d697469766573347365636f6e646172795f6b65795045787472696e7369635065726d697373696f6e7300010c1457686f6c650000001454686573650400c4019c42547265654d61703c50616c6c65744e616d652c2050616c6c65745065726d697373696f6e733e000100184578636570740400c4019c42547265654d61703c50616c6c65744e616d652c2050616c6c65745065726d697373696f6e733e00020000c4042042547265654d617008044b01c8045601d0000400e4000000c8084c706f6c796d6573685f7072696d6974697665732850616c6c65744e616d6500000400cc0118537472696e670000cc0000050200d00c4c706f6c796d6573685f7072696d697469766573347365636f6e646172795f6b65794450616c6c65745065726d697373696f6e73000004012865787472696e73696373d4013845787472696e7369634e616d65730000d40c4c706f6c796d6573685f7072696d69746976657318737562736574445375627365745265737472696374696f6e04044101d8010c1457686f6c650000001454686573650400dc012c42547265655365743c413e000100184578636570740400dc012c42547265655365743c413e00020000d8084c706f6c796d6573685f7072696d6974697665733445787472696e7369634e616d6500000400cc0118537472696e670000dc0420425472656553657404045401d8000400e0000000e0000002d800e4000002e800e800000408c8d000ec0c4c706f6c796d6573685f7072696d69746976657318737562736574445375627365745265737472696374696f6e04044101f0010c1457686f6c650000001454686573650400fc012c42547265655365743c413e000100184578636570740400fc012c42547265655365743c413e00020000f00c4c706f6c796d6573685f7072696d6974697665732c6964656e746974795f69642c506f7274666f6c696f4964000008010c6469649c01284964656e7469747949640001106b696e64f40134506f7274666f6c696f4b696e640000f40c4c706f6c796d6573685f7072696d6974697665732c6964656e746974795f696434506f7274666f6c696f4b696e640001081c44656661756c7400000010557365720400f8013c506f7274666f6c696f4e756d62657200010000f80c4c706f6c796d6573685f7072696d6974697665732c6964656e746974795f69643c506f7274666f6c696f4e756d6265720000040030010c7536340000fc0420425472656553657404045401f000040001010000000101000002f0000501000002000009010c4c706f6c796d6573685f7072696d697469766573386964656e746974795f636c61696d344964656e74697479436c61696d0000140130636c61696d5f6973737565729c01284964656e74697479496400013469737375616e63655f646174653001184d6f6d656e740001406c6173745f7570646174655f646174653001184d6f6d656e740001186578706972790d0101384f7074696f6e3c4d6f6d656e743e000114636c61696d11010114436c61696d00000d0104184f7074696f6e04045401300108104e6f6e6500000010536f6d65040030000001000011010c4c706f6c796d6573685f7072696d697469766573386964656e746974795f636c61696d14436c61696d000128284163637265646974656404001501011453636f706500000024416666696c6961746504001501011453636f7065000100244275794c6f636b757004001501011453636f70650002002853656c6c4c6f636b757004001501011453636f706500030050437573746f6d657244756544696c6967656e63650400190101144364644964000400404b6e6f77596f7572437573746f6d657204001501011453636f7065000500304a7572697364696374696f6e08001d01012c436f756e747279436f646500001501011453636f7065000600204578656d7074656404001501011453636f70650007001c426c6f636b656404001501011453636f706500080018437573746f6d080021010144437573746f6d436c61696d5479706549640000250101344f7074696f6e3c53636f70653e0009000015010c4c706f6c796d6573685f7072696d697469766573386964656e746974795f636c61696d1453636f706500010c204964656e7469747904009c01284964656e7469747949640000001441737365740400b0011c4173736574496400010018437573746f6d040038011c5665633c75383e0002000019010c4c706f6c796d6573685f7072696d697469766573186364645f6964144364644964000004000401205b75383b2033325d00001d010c4c706f6c796d6573685f7072696d697469766573306a7572697364696374696f6e2c436f756e747279436f64650001e90308414600000008415800010008414c00020008445a00030008415300040008414400050008414f000600084149000700084151000800084147000900084152000a0008414d000b00084157000c00084155000d00084154000e0008415a000f0008425300100008424800110008424400120008424200130008425900140008424500150008425a00160008424a00170008424d00180008425400190008424f001a00084241001b00084257001c00084256001d00084252001e00085647001f0008494f00200008424e002100084247002200084246002300084249002400084b4800250008434d002600084341002700084356002800084b59002900084346002a00085444002b0008434c002c0008434e002d0008484b002e00084d4f002f0008435800300008434300310008434f003200084b4d00330008434700340008434400350008434b003600084352003700084349003800084852003900084355003a00084359003b0008435a003c0008444b003d0008444a003e0008444d003f0008444f00400008454300410008454700420008535600430008475100440008455200450008454500460008455400470008464b00480008464f00490008464a004a00084649004b00084652004c00084746004d00085046004e00085446004f0008474100500008474d00510008474500520008444500530008474800540008474900550008475200560008474c005700084744005800084750005900084755005a00084754005b00084747005c0008474e005d00084757005e00084759005f0008485400600008484d00610008564100620008484e00630008485500640008495300650008494e006600084944006700084952006800084951006900084945006a0008494d006b0008494c006c00084954006d00084a4d006e00084a50006f00084a45007000084a4f007100084b5a007200084b45007300084b49007400084b50007500084b52007600084b57007700084b47007800084c41007900084c56007a00084c42007b00084c53007c00084c52007d00084c59007e00084c49007f00084c54008000084c55008100084d4b008200084d47008300084d57008400084d59008500084d56008600084d4c008700084d54008800084d48008900084d51008a00084d52008b00084d55008c00085954008d00084d58008e0008464d008f00084d44009000084d43009100084d4e009200084d45009300084d53009400084d41009500084d5a009600084d4d009700084e41009800084e52009900084e50009a00084e4c009b0008414e009c00084e43009d00084e5a009e00084e49009f00084e4500a000084e4700a100084e5500a200084e4600a300084d5000a400084e4f00a500084f4d00a60008504b00a70008505700a80008505300a90008504100aa0008504700ab0008505900ac0008504500ad0008504800ae0008504e00af0008504c00b00008505400b10008505200b20008514100b30008524500b40008524f00b50008525500b60008525700b70008424c00b80008534800b900084b4e00ba00084c4300bb00084d4600bc0008504d00bd0008564300be0008575300bf0008534d00c00008535400c10008534100c20008534e00c30008525300c40008534300c50008534c00c60008534700c70008534b00c80008534900c90008534200ca0008534f00cb00085a4100cc0008475300cd0008535300ce0008455300cf00084c4b00d00008534400d10008535200d20008534a00d30008535a00d40008534500d50008434800d60008535900d70008545700d80008544a00d90008545a00da0008544800db0008544c00dc0008544700dd0008544b00de0008544f00df0008545400e00008544e00e10008545200e20008544d00e30008544300e40008545600e50008554700e60008554100e70008414500e80008474200e90008555300ea0008554d00eb0008555900ec0008555a00ed0008565500ee0008564500ef0008564e00f00008564900f10008574600f20008454800f30008594500f400085a4d00f500085a5700f60008425100f70008435700f80008535800f9000021010c4c706f6c796d6573685f7072696d697469766573386964656e746974795f636c61696d44437573746f6d436c61696d5479706549640000040010010c7533320000250104184f7074696f6e0404540115010108104e6f6e6500000010536f6d6504001501000001000029010c4c706f6c796d6573685f7072696d697469766573187469636b6572185469636b6572000004002d0101405b75383b205449434b45525f4c454e5d00002d010000030c0000000800310104184f7074696f6e040454019c0108104e6f6e6500000010536f6d6504009c0000010000350104184f7074696f6e04045401000108104e6f6e6500000010536f6d65040000000001000039010c4c706f6c796d6573685f7072696d69746976657334617574686f72697a6174696f6e44417574686f72697a6174696f6e4461746104244163636f756e74496401000128604174746573745072696d6172794b6579526f746174696f6e04009c01284964656e74697479496400000040526f746174655072696d6172794b6579000100385472616e736665725469636b65720400290101185469636b6572000200444164644d756c74695369675369676e657204000001244163636f756e744964000300585472616e7366657241737365744f776e6572736869700400b0011c41737365744964000400304a6f696e4964656e746974790400a8012c5065726d697373696f6e7300050040506f7274666f6c696f437573746f64790400f0012c506f7274666f6c696f49640006002c4265636f6d654167656e740800b0011c4173736574496400003d0101284167656e7447726f75700007004c41646452656c61796572506179696e674b65790c000001244163636f756e74496400000001244163636f756e744964000018011c42616c616e63650008006c526f746174655072696d6172794b6579546f5365636f6e646172790400a8012c5065726d697373696f6e73000900003d010c4c706f6c796d6573685f7072696d697469766573146167656e74284167656e7447726f75700001141046756c6c00000018437573746f6d04004101011041474964000100284578636570744d65746100020034506f6c796d657368563143414100030034506f6c796d65736856315049410004000041010c4c706f6c796d6573685f7072696d697469766573146167656e7410414749640000040010010c753332000045010c3070616c6c65745f67726f75701870616c6c6574144576656e7408045400044900011c2c4d656d626572416464656408009c01284964656e74697479496400009c01284964656e746974794964000008e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e6c63616c6c6572204449442c204e6577206d656d626572204449442e344d656d62657252656d6f76656408009c01284964656e74697479496400009c01284964656e746974794964000108e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2ea063616c6c6572204449442c206d656d626572204449442074686174206765742072656d6f7665642e344d656d6265725265766f6b656408009c01284964656e74697479496400009c01284964656e746974794964000208e454686520676976656e206d656d62657220686173206265656e207265766f6b65642061742073706563696669632074696d652d7374616d702ea063616c6c6572204449442c206d656d62657220444944207468617420676574207265766f6b65642e384d656d62657273537761707065640c009c01284964656e74697479496400009c01284964656e74697479496400009c01284964656e746974794964000308d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e9463616c6c6572204449442c2052656d6f766564204449442c204e657720616464204449442e304d656d62657273526573657408009c01284964656e74697479496400004901013c5665633c4964656e7469747949643e0004081501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e8063616c6c6572204449442c204c697374206f66206e6577206d656d626572732e484163746976654c696d69744368616e6765640c009c01284964656e746974794964000010012c4d656d626572436f756e74000010012c4d656d626572436f756e740005042d01546865206c696d6974206f6620686f77206d616e7920616374697665206d656d626572732074686572652063616e20626520636f6e63757272656e746c7920776173206368616e6765642e1444756d6d7900060855015068616e746f6d206d656d6265722c206e6576657220757365642e2020546869732063616e2062652072656d6f766564206e6f772e20204652414d4520763220646f65736e2774207265717569726520746869732e34544f444f3a2072656d6f76652e047c54686520604576656e746020656e756d206f6620746869732070616c6c657449010000029c004d010c4070616c6c65745f636f6d6d69747465651870616c6c6574144576656e740804540004490001282050726f706f7365640c009c01284964656e746974794964000010013450726f706f73616c496e64657800003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a48617368000008890141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292ed8506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20696e6465782c2070726f706f73616c20686173682e14566f7465641c009c01284964656e746974794964000010013450726f706f73616c496e64657800003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a486173680000200110626f6f6c000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400010c050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e674901612074616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e950163616c6c6572204449442c2050726f706f73616c20696e6465782c2050726f706f73616c20686173682c2063757272656e7420766f74652c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e34566f746552657472616374656410009c01284964656e746974794964000010013450726f706f73616c496e64657800003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a486173680000200110626f6f6c000208cc4120766f7465206f6e2061206d6f74696f6e2028676976656e20686173682920686173206265656e207265747261637465642e050163616c6c6572204449442c2050726f706f73616c496e6465782c2050726f706f73616c20686173682c20766f7465207468617420776173207265747261637465642846696e616c566f7465731400310101484f7074696f6e3c4964656e7469747949643e000010013450726f706f73616c496e64657800003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4861736800004901013c5665633c4964656e7469747949643e00004901013c5665633c4964656e7469747949643e0003089046696e616c20766f746573206f6e2061206d6f74696f6e2028676976656e206861736829f863616c6c6572204449442c2050726f706f73616c496e6465782c2050726f706f73616c20686173682c2079657320766f746572732c206e6f20766f74657220417070726f7665641400310101484f7074696f6e3c4964656e7469747949643e00003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a48617368000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400040c090141206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c6420776974682074686520666f6c6c6f77696e67410174616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e2052656a65637465641400310101484f7074696f6e3c4964656e7469747949643e00003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a48617368000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400050c090141206d6f74696f6e207761732072656a656374656420627920746865207265717569726564207468726573686f6c6420776974682074686520666f6c6c6f77696e67410174616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e2045786563757465640c00310101484f7074696f6e3c4964656e7469747949643e00003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a486173680000510101384469737061746368526573756c74000608390141206d6f74696f6e207761732065786563757465643b20604469737061746368526573756c746020697320604f6b28282929602069662072657475726e656420776974686f7574206572726f722e0d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c20726573756c74206f662070726f706f73616c2064697370617463682e6452656c65617365436f6f7264696e61746f72557064617465640400310101484f7074696f6e3c4964656e7469747949643e0007089452656c6561736520636f6f7264696e61746f7220686173206265656e20757064617465642eac506172616d65746572733a20444944206f66207468652072656c6561736520636f6f7264696e61746f722e4c4578706972657341667465725570646174656408009c01284964656e7469747949640000590101744d61796265426c6f636b3c426c6f636b4e756d626572466f723c543e3e0008089850726f706f73616c206578706972792074696d6520686173206265656e20757064617465642ec4506172616d65746572733a2063616c6c6572204449442c206e6577206578706972792074696d652028696620616e79292e50566f74655468726573686f6c64557064617465640c009c01284964656e746974794964000010010c753332000010010c75333200090884566f74696e67207468726573686f6c6420686173206265656e2075706461746564b8506172616d65746572733a2063616c6c6572204449442c206e756d657261746f722c2064656e6f6d696e61746f72047c54686520604576656e746020656e756d206f6620746869732070616c6c657451010418526573756c74080454015501044501680108084f6b04005501000000000c4572720400680000010000550100000400005901084c706f6c796d6573685f7072696d697469766573284d61796265426c6f636b042c426c6f636b4e756d6265720110010810536f6d65040010012c426c6f636b4e756d626572000000104e6f6e65000100005d010c3070616c6c65745f67726f75701870616c6c6574144576656e7408045400044900011c2c4d656d626572416464656408009c01284964656e74697479496400009c01284964656e746974794964000008e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e6c63616c6c6572204449442c204e6577206d656d626572204449442e344d656d62657252656d6f76656408009c01284964656e74697479496400009c01284964656e746974794964000108e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2ea063616c6c6572204449442c206d656d626572204449442074686174206765742072656d6f7665642e344d656d6265725265766f6b656408009c01284964656e74697479496400009c01284964656e746974794964000208e454686520676976656e206d656d62657220686173206265656e207265766f6b65642061742073706563696669632074696d652d7374616d702ea063616c6c6572204449442c206d656d62657220444944207468617420676574207265766f6b65642e384d656d62657273537761707065640c009c01284964656e74697479496400009c01284964656e74697479496400009c01284964656e746974794964000308d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e9463616c6c6572204449442c2052656d6f766564204449442c204e657720616464204449442e304d656d62657273526573657408009c01284964656e74697479496400004901013c5665633c4964656e7469747949643e0004081501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e8063616c6c6572204449442c204c697374206f66206e6577206d656d626572732e484163746976654c696d69744368616e6765640c009c01284964656e746974794964000010012c4d656d626572436f756e74000010012c4d656d626572436f756e740005042d01546865206c696d6974206f6620686f77206d616e7920616374697665206d656d626572732074686572652063616e20626520636f6e63757272656e746c7920776173206368616e6765642e1444756d6d7900060855015068616e746f6d206d656d6265722c206e6576657220757365642e2020546869732063616e2062652072656d6f766564206e6f772e20204652414d4520763220646f65736e2774207265717569726520746869732e34544f444f3a2072656d6f76652e047c54686520604576656e746020656e756d206f6620746869732070616c6c657461010c4070616c6c65745f636f6d6d69747465651870616c6c6574144576656e740804540004490001282050726f706f7365640c009c01284964656e746974794964000010013450726f706f73616c496e64657800003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a48617368000008890141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292ed8506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20696e6465782c2070726f706f73616c20686173682e14566f7465641c009c01284964656e746974794964000010013450726f706f73616c496e64657800003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a486173680000200110626f6f6c000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400010c050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e674901612074616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e950163616c6c6572204449442c2050726f706f73616c20696e6465782c2050726f706f73616c20686173682c2063757272656e7420766f74652c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e34566f746552657472616374656410009c01284964656e746974794964000010013450726f706f73616c496e64657800003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a486173680000200110626f6f6c000208cc4120766f7465206f6e2061206d6f74696f6e2028676976656e20686173682920686173206265656e207265747261637465642e050163616c6c6572204449442c2050726f706f73616c496e6465782c2050726f706f73616c20686173682c20766f7465207468617420776173207265747261637465642846696e616c566f7465731400310101484f7074696f6e3c4964656e7469747949643e000010013450726f706f73616c496e64657800003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4861736800004901013c5665633c4964656e7469747949643e00004901013c5665633c4964656e7469747949643e0003089046696e616c20766f746573206f6e2061206d6f74696f6e2028676976656e206861736829f863616c6c6572204449442c2050726f706f73616c496e6465782c2050726f706f73616c20686173682c2079657320766f746572732c206e6f20766f74657220417070726f7665641400310101484f7074696f6e3c4964656e7469747949643e00003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a48617368000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400040c090141206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c6420776974682074686520666f6c6c6f77696e67410174616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e2052656a65637465641400310101484f7074696f6e3c4964656e7469747949643e00003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a48617368000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400050c090141206d6f74696f6e207761732072656a656374656420627920746865207265717569726564207468726573686f6c6420776974682074686520666f6c6c6f77696e67410174616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e2045786563757465640c00310101484f7074696f6e3c4964656e7469747949643e00003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a486173680000510101384469737061746368526573756c74000608390141206d6f74696f6e207761732065786563757465643b20604469737061746368526573756c746020697320604f6b28282929602069662072657475726e656420776974686f7574206572726f722e0d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c20726573756c74206f662070726f706f73616c2064697370617463682e6452656c65617365436f6f7264696e61746f72557064617465640400310101484f7074696f6e3c4964656e7469747949643e0007089452656c6561736520636f6f7264696e61746f7220686173206265656e20757064617465642eac506172616d65746572733a20444944206f66207468652072656c6561736520636f6f7264696e61746f722e4c4578706972657341667465725570646174656408009c01284964656e7469747949640000590101744d61796265426c6f636b3c426c6f636b4e756d626572466f723c543e3e0008089850726f706f73616c206578706972792074696d6520686173206265656e20757064617465642ec4506172616d65746572733a2063616c6c6572204449442c206e6577206578706972792074696d652028696620616e79292e50566f74655468726573686f6c64557064617465640c009c01284964656e746974794964000010010c753332000010010c75333200090884566f74696e67207468726573686f6c6420686173206265656e2075706461746564b8506172616d65746572733a2063616c6c6572204449442c206e756d657261746f722c2064656e6f6d696e61746f72047c54686520604576656e746020656e756d206f6620746869732070616c6c657465010c3070616c6c65745f67726f75701870616c6c6574144576656e7408045400044900011c2c4d656d626572416464656408009c01284964656e74697479496400009c01284964656e746974794964000008e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e6c63616c6c6572204449442c204e6577206d656d626572204449442e344d656d62657252656d6f76656408009c01284964656e74697479496400009c01284964656e746974794964000108e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2ea063616c6c6572204449442c206d656d626572204449442074686174206765742072656d6f7665642e344d656d6265725265766f6b656408009c01284964656e74697479496400009c01284964656e746974794964000208e454686520676976656e206d656d62657220686173206265656e207265766f6b65642061742073706563696669632074696d652d7374616d702ea063616c6c6572204449442c206d656d62657220444944207468617420676574207265766f6b65642e384d656d62657273537761707065640c009c01284964656e74697479496400009c01284964656e74697479496400009c01284964656e746974794964000308d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e9463616c6c6572204449442c2052656d6f766564204449442c204e657720616464204449442e304d656d62657273526573657408009c01284964656e74697479496400004901013c5665633c4964656e7469747949643e0004081501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e8063616c6c6572204449442c204c697374206f66206e6577206d656d626572732e484163746976654c696d69744368616e6765640c009c01284964656e746974794964000010012c4d656d626572436f756e74000010012c4d656d626572436f756e740005042d01546865206c696d6974206f6620686f77206d616e7920616374697665206d656d626572732074686572652063616e20626520636f6e63757272656e746c7920776173206368616e6765642e1444756d6d7900060855015068616e746f6d206d656d6265722c206e6576657220757365642e2020546869732063616e2062652072656d6f766564206e6f772e20204652414d4520763220646f65736e2774207265717569726520746869732e34544f444f3a2072656d6f76652e047c54686520604576656e746020656e756d206f6620746869732070616c6c657469010c4070616c6c65745f636f6d6d69747465651870616c6c6574144576656e740804540004490001282050726f706f7365640c009c01284964656e746974794964000010013450726f706f73616c496e64657800003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a48617368000008890141206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292ed8506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20696e6465782c2070726f706f73616c20686173682e14566f7465641c009c01284964656e746974794964000010013450726f706f73616c496e64657800003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a486173680000200110626f6f6c000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400010c050141206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e674901612074616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e950163616c6c6572204449442c2050726f706f73616c20696e6465782c2050726f706f73616c20686173682c2063757272656e7420766f74652c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e34566f746552657472616374656410009c01284964656e746974794964000010013450726f706f73616c496e64657800003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a486173680000200110626f6f6c000208cc4120766f7465206f6e2061206d6f74696f6e2028676976656e20686173682920686173206265656e207265747261637465642e050163616c6c6572204449442c2050726f706f73616c496e6465782c2050726f706f73616c20686173682c20766f7465207468617420776173207265747261637465642846696e616c566f7465731400310101484f7074696f6e3c4964656e7469747949643e000010013450726f706f73616c496e64657800003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4861736800004901013c5665633c4964656e7469747949643e00004901013c5665633c4964656e7469747949643e0003089046696e616c20766f746573206f6e2061206d6f74696f6e2028676976656e206861736829f863616c6c6572204449442c2050726f706f73616c496e6465782c2050726f706f73616c20686173682c2079657320766f746572732c206e6f20766f74657220417070726f7665641400310101484f7074696f6e3c4964656e7469747949643e00003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a48617368000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400040c090141206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c6420776974682074686520666f6c6c6f77696e67410174616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e2052656a65637465641400310101484f7074696f6e3c4964656e7469747949643e00003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a48617368000010012c4d656d626572436f756e74000010012c4d656d626572436f756e74000010012c4d656d626572436f756e7400050c090141206d6f74696f6e207761732072656a656374656420627920746865207265717569726564207468726573686f6c6420776974682074686520666f6c6c6f77696e67410174616c6c79202879657320766f7465732c206e6f20766f74657320616e6420746f74616c20736561747320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c2079617920766f746520636f756e742c206e617920766f746520636f756e742c20746f74616c2073656174732e2045786563757465640c00310101484f7074696f6e3c4964656e7469747949643e00003401843c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a486173680000510101384469737061746368526573756c74000608390141206d6f74696f6e207761732065786563757465643b20604469737061746368526573756c746020697320604f6b28282929602069662072657475726e656420776974686f7574206572726f722e0d01506172616d65746572733a2063616c6c6572204449442c2070726f706f73616c20686173682c20726573756c74206f662070726f706f73616c2064697370617463682e6452656c65617365436f6f7264696e61746f72557064617465640400310101484f7074696f6e3c4964656e7469747949643e0007089452656c6561736520636f6f7264696e61746f7220686173206265656e20757064617465642eac506172616d65746572733a20444944206f66207468652072656c6561736520636f6f7264696e61746f722e4c4578706972657341667465725570646174656408009c01284964656e7469747949640000590101744d61796265426c6f636b3c426c6f636b4e756d626572466f723c543e3e0008089850726f706f73616c206578706972792074696d6520686173206265656e20757064617465642ec4506172616d65746572733a2063616c6c6572204449442c206e6577206578706972792074696d652028696620616e79292e50566f74655468726573686f6c64557064617465640c009c01284964656e746974794964000010010c753332000010010c75333200090884566f74696e67207468726573686f6c6420686173206265656e2075706461746564b8506172616d65746572733a2063616c6c6572204449442c206e756d657261746f722c2064656e6f6d696e61746f72047c54686520604576656e746020656e756d206f6620746869732070616c6c65746d010c3070616c6c65745f67726f75701870616c6c6574144576656e7408045400044900011c2c4d656d626572416464656408009c01284964656e74697479496400009c01284964656e746974794964000008e054686520676976656e206d656d626572207761732061646465643b2073656520746865207472616e73616374696f6e20666f722077686f2e6c63616c6c6572204449442c204e6577206d656d626572204449442e344d656d62657252656d6f76656408009c01284964656e74697479496400009c01284964656e746974794964000108e854686520676976656e206d656d626572207761732072656d6f7665643b2073656520746865207472616e73616374696f6e20666f722077686f2ea063616c6c6572204449442c206d656d626572204449442074686174206765742072656d6f7665642e344d656d6265725265766f6b656408009c01284964656e74697479496400009c01284964656e746974794964000208e454686520676976656e206d656d62657220686173206265656e207265766f6b65642061742073706563696669632074696d652d7374616d702ea063616c6c6572204449442c206d656d62657220444944207468617420676574207265766f6b65642e384d656d62657273537761707065640c009c01284964656e74697479496400009c01284964656e74697479496400009c01284964656e746974794964000308d854776f206d656d62657273207765726520737761707065643b2073656520746865207472616e73616374696f6e20666f722077686f2e9463616c6c6572204449442c2052656d6f766564204449442c204e657720616464204449442e304d656d62657273526573657408009c01284964656e74697479496400004901013c5665633c4964656e7469747949643e0004081501546865206d656d62657273686970207761732072657365743b2073656520746865207472616e73616374696f6e20666f722077686f20746865206e6577207365742069732e8063616c6c6572204449442c204c697374206f66206e6577206d656d626572732e484163746976654c696d69744368616e6765640c009c01284964656e746974794964000010012c4d656d626572436f756e74000010012c4d656d626572436f756e740005042d01546865206c696d6974206f6620686f77206d616e7920616374697665206d656d626572732074686572652063616e20626520636f6e63757272656e746c7920776173206368616e6765642e1444756d6d7900060855015068616e746f6d206d656d6265722c206e6576657220757365642e2020546869732063616e2062652072656d6f766564206e6f772e20204652414d4520763220646f65736e2774207265717569726520746869732e34544f444f3a2072656d6f76652e047c54686520604576656e746020656e756d206f6620746869732070616c6c657471010c3c70616c6c65745f6d756c74697369671870616c6c6574144576656e740404540001383c4d756c74695369674372656174656414012863616c6c65725f6469649c01284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e74496400011863616c6c6572000130543a3a4163636f756e74496400011c7369676e6572737501019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e000134736967735f726571756972656430010c7536340000047041204d756c746973696720686173206265656e20637265617465642e3450726f706f73616c41646465640c012863616c6c65725f646964310101484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e74496400012c70726f706f73616c5f696430010c7536340001049441204d756c74697369672070726f706f73616c20686173206265656e20637265617465642e4050726f706f73616c457865637574656410012863616c6c65725f646964310101484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e74496400012c70726f706f73616c5f696430010c753634000118726573756c74510101384469737061746368526573756c740002049841204d756c74697369672070726f706f73616c20686173206265656e2065786563757465642e4c4d756c74695369675369676e657241646465640c012863616c6c65725f6469649c01284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e7449640001187369676e6572000130543a3a4163636f756e744964000304a841206e6577207369676e657220686173206265656e20616464656420746f2061204d756c74697369672e644d756c74695369675369676e657273417574686f72697a65640c012863616c6c65725f6469649c01284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e74496400011c7369676e6572737501019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e000404e84e6577206b6579732068617665206265656e20617574686f72697a656420746f206265207369676e657273206f6e2061204d756c74697369672e584d756c74695369675369676e65727352656d6f7665640c012863616c6c65725f6469649c01284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e74496400011c7369676e6572737501019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e000504a85369676e6572732068617665206265656e2072656d6f7665642066726f6d2061204d756c74697369672e784d756c74695369675369676e65727352657175697265644368616e6765640c012863616c6c65725f646964310101484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e744964000134736967735f726571756972656430010c753634000604e041204d756c746973696720686173206368616e67656420697473207265717569726564206e756d626572206f6620617070726f76616c732e5050726f706f73616c417070726f76616c566f746510012863616c6c65725f646964310101484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e7449640001187369676e6572000130543a3a4163636f756e74496400012c70726f706f73616c5f696430010c753634000704c841207369676e65722068617320766f74656420746f20617070726f76652061204d756c74697369672070726f706f73616c2e5450726f706f73616c52656a656374696f6e566f746510012863616c6c65725f646964310101484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e7449640001187369676e6572000130543a3a4163636f756e74496400012c70726f706f73616c5f696430010c753634000804c441207369676e65722068617320766f74656420746f2072656a6563742061204d756c74697369672070726f706f73616c2e4050726f706f73616c417070726f7665640c012863616c6c65725f646964310101484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e74496400012c70726f706f73616c5f696430010c7536340009049841204d756c74697369672070726f706f73616c20686173206265656e20617070726f7665642e4050726f706f73616c52656a65637465640c012863616c6c65725f646964310101484f7074696f6e3c4964656e7469747949643e0001206d756c7469736967000130543a3a4163636f756e74496400012c70726f706f73616c5f696430010c753634000a049841204d756c74697369672070726f706f73616c20686173206265656e2072656a65637465642e484d756c7469536967416464656441646d696e0c012863616c6c65725f6469649c01284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e74496400012461646d696e5f6469649c01284964656e746974794964000b048841204d756c74697369672068617320616464656420616e2061646d696e204449442e504d756c746953696752656d6f76656441646d696e0c012863616c6c65725f6469649c01284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e74496400012461646d696e5f6469649c01284964656e746974794964000c049841204d756c7469736967206861732072656d6f76656420697427732061646d696e204449442e604d756c746953696752656d6f766564506179696e674469640c012863616c6c65725f6469649c01284964656e7469747949640001206d756c7469736967000130543a3a4163636f756e744964000128706179696e675f6469649c01284964656e746974794964000d049c41204d756c7469736967206861732072656d6f766564206974277320706179696e67204449442e047c54686520604576656e746020656e756d206f6620746869732070616c6c657475010c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e6465645665630804540100045300000400050101185665633c543e000079010c4470616c6c65745f76616c696461746f72731870616c6c6574144576656e7404045400011c244e6f6d696e617465640c01486e6f6d696e61746f725f6964656e746974799c01284964656e7469747949640001147374617368000130543a3a4163636f756e74496400011c74617267657473050101445665633c543a3a4163636f756e7449643e0000048c55736572206861732075706461746564207468656972206e6f6d696e6174696f6e732e645065726d697373696f6e65644964656e74697479416464656408015c676f7665726e616e63655f636f756e63696c6c5f6469649c01284964656e74697479496400014c76616c696461746f72735f6964656e746974799c01284964656e746974794964000104f0416e206964656e74697479206861732069737375656420612063616e64696461637920666f72206265636f6d696e6720612076616c696461746f722e6c5065726d697373696f6e65644964656e7469747952656d6f76656408015c676f7665726e616e63655f636f756e63696c6c5f6469649c01284964656e74697479496400014c76616c696461746f72735f6964656e746974799c01284964656e7469747949640002040d01416e206964656e7469747920686173206265656e2072656d6f7665642066726f6d20746865207065726d697373696f6e6564206964656e74697469657320706f6f6c2e54496e76616c6964617465644e6f6d696e61746f72730c015c676f7665726e616e63655f636f756e63696c6c5f6469649c01284964656e74697479496400016c676f7665726e616e63655f636f756e63696c6c5f6163636f756e749c01284964656e746974794964000148657870697265645f6e6f6d696e61746f7273050101445665633c543a3a4163636f756e7449643e0003041d0152656d6f766520746865206e6f6d696e61746f72732066726f6d207468652076616c6964206e6f6d696e61746f7273207768656e2074686572652043444420657870697265642e64536c617368696e67416c6c6f776564466f724368616e67656404013c736c617368696e675f7377697463687d010138536c617368696e6753776974636800040488536c617368696e6720616c6c6f77656420686173206265656e20757064617465642e885265776172645061796d656e745363686564756c696e67496e7465727275707465640c01286163636f756e745f6964000130543a3a4163636f756e74496400010c657261100120457261496e6465780001146572726f7268013444697370617463684572726f7200050478526577617264207363686564756c696e6720696e7465727275707465642e50436f6d6d697373696f6e436170557064617465640c015c676f7665726e616e63655f636f756e63696c6c5f6469649c01284964656e7469747949640001486f6c645f636f6d6d697373696f6e5f6361708101011c50657262696c6c0001486e65775f636f6d6d697373696f6e5f6361708101011c50657262696c6c00060480436f6d6d697373696f6e2063617020686173206265656e20757064617465642e047c54686520604576656e746020656e756d206f6620746869732070616c6c65747d010c4470616c6c65745f76616c696461746f727314747970657338536c617368696e6753776974636800010c2456616c696461746f720000005456616c696461746f72416e644e6f6d696e61746f72000100104e6f6e650002000081010c3473705f61726974686d65746963287065725f7468696e67731c50657262696c6c0000040010010c75333200008501103870616c6c65745f7374616b696e671870616c6c65741870616c6c6574144576656e7404045400014c1c457261506169640c01246572615f696e646578100120457261496e64657800014076616c696461746f725f7061796f757418013042616c616e63654f663c543e00012472656d61696e64657218013042616c616e63654f663c543e000008550154686520657261207061796f757420686173206265656e207365743b207468652066697273742062616c616e6365206973207468652076616c696461746f722d7061796f75743b20746865207365636f6e64206973c07468652072656d61696e6465722066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642e2052657761726465640c01147374617368000130543a3a4163636f756e744964000110646573748901017c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e000118616d6f756e7418013042616c616e63654f663c543e0001040d01546865206e6f6d696e61746f7220686173206265656e207265776172646564206279207468697320616d6f756e7420746f20746869732064657374696e6174696f6e2e1c536c61736865640801187374616b6572000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e0002041d0141207374616b6572202876616c696461746f72206f72206e6f6d696e61746f722920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e34536c6173685265706f727465640c012476616c696461746f72000130543a3a4163636f756e7449640001206672616374696f6e8101011c50657262696c6c000124736c6173685f657261100120457261496e64657800030859014120736c61736820666f722074686520676976656e2076616c696461746f722c20666f722074686520676976656e2070657263656e74616765206f66207468656972207374616b652c2061742074686520676976656e54657261206173206265656e207265706f727465642e684f6c64536c617368696e675265706f727444697363617264656404013473657373696f6e5f696e64657810013053657373696f6e496e6465780004081901416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c64446e6f742062652070726f6365737365642e385374616b657273456c65637465640005048441206e657720736574206f66207374616b6572732077617320656c65637465642e18426f6e6465640801147374617368000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000610d0416e206163636f756e742068617320626f6e646564207468697320616d6f756e742e205c5b73746173682c20616d6f756e745c5d004d014e4f54453a2054686973206576656e74206973206f6e6c7920656d6974746564207768656e2066756e64732061726520626f6e64656420766961206120646973706174636861626c652e204e6f7461626c792c210169742077696c6c206e6f7420626520656d697474656420666f72207374616b696e672072657761726473207768656e20746865792061726520616464656420746f207374616b652e20556e626f6e6465640801147374617368000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e00070490416e206163636f756e742068617320756e626f6e646564207468697320616d6f756e742e2457697468647261776e0801147374617368000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e0008085901416e206163636f756e74206861732063616c6c6564206077697468647261775f756e626f6e6465646020616e642072656d6f76656420756e626f6e64696e67206368756e6b7320776f727468206042616c616e6365606466726f6d2074686520756e6c6f636b696e672071756575652e184b69636b65640801246e6f6d696e61746f72000130543a3a4163636f756e7449640001147374617368000130543a3a4163636f756e744964000904b441206e6f6d696e61746f7220686173206265656e206b69636b65642066726f6d20612076616c696461746f722e545374616b696e67456c656374696f6e4661696c6564000a04ac54686520656c656374696f6e206661696c65642e204e6f206e65772065726120697320706c616e6e65642e1c4368696c6c65640401147374617368000130543a3a4163636f756e744964000b042101416e206163636f756e74206861732073746f707065642070617274696369706174696e672061732065697468657220612076616c696461746f72206f72206e6f6d696e61746f722e345061796f7574537461727465641001246572615f696e646578100120457261496e64657800013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400011070616765100110506167650001106e6578748d0101304f7074696f6e3c506167653e000c045901412050616765206f66207374616b6572732072657761726473206172652067657474696e6720706169642e20606e6578746020697320604e6f6e656020696620616c6c2070616765732061726520636c61696d65642e4456616c696461746f7250726566735365740801147374617368000130543a3a4163636f756e74496400011470726566739101013856616c696461746f725072656673000d0498412076616c696461746f72206861732073657420746865697220707265666572656e6365732e68536e617073686f74566f7465727353697a65457863656564656404011073697a6510010c753332000e0468566f746572732073697a65206c696d697420726561636865642e6c536e617073686f745461726765747353697a65457863656564656404011073697a6510010c753332000f046c546172676574732073697a65206c696d697420726561636865642e20466f7263654572610401106d6f64659901011c466f7263696e670010047441206e657720666f72636520657261206d6f646520776173207365742e64436f6e74726f6c6c65724261746368446570726563617465640401206661696c7572657310010c753332001104a45265706f7274206f66206120636f6e74726f6c6c6572206261746368206465707265636174696f6e2e4043757272656e63794d696772617465640801147374617368000130543a3a4163636f756e744964000138666f7263655f776974686472617718013042616c616e63654f663c543e00120855015374616b696e672062616c616e6365206d696772617465642066726f6d206c6f636b7320746f20686f6c64732c207769746820616e792062616c616e6365207468617420636f756c64206e6f742062652068656c644c697320666f7263652077697468647261776e2e047c54686520604576656e746020656e756d206f6620746869732070616c6c65748901083870616c6c65745f7374616b696e674452657761726444657374696e6174696f6e04244163636f756e74496401000114185374616b656400000014537461736800010028436f6e74726f6c6c65720002001c4163636f756e7404000001244163636f756e744964000300104e6f6e65000400008d0104184f7074696f6e04045401100108104e6f6e6500000010536f6d6504001000000100009101083870616c6c65745f7374616b696e673856616c696461746f7250726566730000080128636f6d6d697373696f6e9501011c50657262696c6c00011c626c6f636b6564200110626f6f6c000095010000068101009901083870616c6c65745f7374616b696e671c466f7263696e67000110284e6f74466f7263696e6700000020466f7263654e657700010024466f7263654e6f6e650002002c466f726365416c77617973000300009d010c3c70616c6c65745f6f6666656e6365731870616c6c6574144576656e740001041c4f6666656e63650801106b696e64b401104b696e6400012074696d65736c6f743801384f706171756554696d65536c6f7400000c5101546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e643501286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e4c5c5b6b696e642c2074696d65736c6f745c5d2e04304576656e747320747970652ea1010c3870616c6c65745f73657373696f6e1870616c6c6574144576656e7404045400010c284e657753657373696f6e04013473657373696f6e5f696e64657810013053657373696f6e496e64657800000839014e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f74207468659c626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e4456616c696461746f7244697361626c656404012476616c696461746f72000138543a3a56616c696461746f7249640001047056616c696461746f7220686173206265656e2064697361626c65642e4856616c696461746f725265656e61626c656404012476616c696461746f72000138543a3a56616c696461746f7249640002047856616c696461746f7220686173206265656e2072652d656e61626c65642e047c54686520604576656e746020656e756d206f6620746869732070616c6c6574a5010c3870616c6c65745f6772616e6470611870616c6c6574144576656e7400010c384e6577417574686f726974696573040134617574686f726974795f736574a9010134417574686f726974794c6973740000048c4e657720617574686f726974792073657420686173206265656e206170706c6965642e185061757365640001049843757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640002049c43757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e047c54686520604576656e746020656e756d206f6620746869732070616c6c6574a901000002ad0100ad0100000408b1013000b1010c5073705f636f6e73656e7375735f6772616e6470610c617070185075626c69630000040004013c656432353531393a3a5075626c69630000b5010c4070616c6c65745f696d5f6f6e6c696e651870616c6c6574144576656e7404045400010c444865617274626561745265636569766564040130617574686f726974795f6964b9010138543a3a417574686f726974794964000004c041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f726974794964602e1c416c6c476f6f64000104d041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504011c6f66666c696e65bd01016c5665633c4964656e74696669636174696f6e5475706c653c543e3e000204290141742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e652076616c696461746f722077617320666f756e6420746f206265206f66666c696e652e047c54686520604576656e746020656e756d206f6620746869732070616c6c6574b901104070616c6c65745f696d5f6f6e6c696e651c737232353531392c6170705f73723235353139185075626c69630000040004013c737232353531393a3a5075626c69630000bd01000002c10100c1010000040800c50100c501082873705f7374616b696e67204578706f7375726508244163636f756e74496401001c42616c616e63650118000c0114746f74616cc901011c42616c616e636500010c6f776ec901011c42616c616e63650001186f7468657273cd0101ac5665633c496e646976696475616c4578706f737572653c4163636f756e7449642c2042616c616e63653e3e0000c9010000061800cd01000002d10100d101082873705f7374616b696e6748496e646976696475616c4578706f7375726508244163636f756e74496401001c42616c616e636501180008010c77686f0001244163636f756e74496400011476616c7565c901011c42616c616e63650000d5010c2c70616c6c65745f7375646f1870616c6c6574144576656e7404045400010c14537564696404012c7375646f5f726573756c74510101384469737061746368526573756c740000048841207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d284b65794368616e6765640401286f6c645f7375646f6572350101504f7074696f6e3c543a3a4163636f756e7449643e0001043901546865205c5b7375646f65725c5d206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c696564206966206f6e6520657869737465642e285375646f4173446f6e6504012c7375646f5f726573756c74510101384469737061746368526573756c740002048841207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d047c54686520604576656e746020656e756d206f6620746869732070616c6c6574d9010c3070616c6c65745f61737365741870616c6c6574144576656e740404540001803041737365744372656174656420009c01284964656e7469747949640000b0011c417373657449640000200110626f6f6c0000dd01012441737365745479706500009c01284964656e7469747949640000e901012441737365744e616d650000ed0101505665633c41737365744964656e7469666965723e0000fd0101604f7074696f6e3c46756e64696e67526f756e644e616d653e000008804576656e7420666f72206372656174696f6e206f66207468652061737365742ec50163616c6c6572204449442f206f776e6572204449442c20417373657449642c2064697669736962696c6974792c20617373657420747970652c2062656e6566696369617279204449442c206173736574206e616d652c206964656e746966696572732c2066756e64696e6720726f756e64484964656e74696669657273557064617465640c009c01284964656e7469747949640000b0011c417373657449640000ed0101505665633c41737365744964656e7469666965723e000108d44576656e7420656d6974746564207768656e20616e7920746f6b656e206964656e746966696572732061726520757064617465642e110163616c6c6572204449442c20417373657449642c206120766563746f72206f6620286964656e74696669657220747970652c206964656e7469666965722076616c7565294c44697669736962696c6974794368616e6765640c009c01284964656e7469747949640000b0011c417373657449640000200110626f6f6c000208844576656e7420666f72206368616e676520696e2064697669736962696c6974792e8463616c6c6572204449442c20417373657449642c2064697669736962696c697479405469636b6572526567697374657265640c009c01284964656e7469747949640000290101185469636b657200000d0101444f7074696f6e3c543a3a4d6f6d656e743e0003087c456d6974207768656e207469636b657220697320726567697374657265642eec63616c6c657220444944202f207469636b6572206f776e6572206469642c207469636b65722c207469636b6572206f776e65722c20657870697279445469636b65725472616e736665727265640c009c01284964656e7469747949640000290101185469636b657200009c01284964656e74697479496400040880456d6974207768656e207469636b6572206973207472616e736665727265642ed063616c6c657220444944202f207469636b6572207472616e7366657272656420746f204449442c207469636b65722c2066726f6d6441737365744f776e6572736869705472616e736665727265640c009c01284964656e7469747949640000b0011c4173736574496400009c01284964656e746974794964000508a4456d6974207768656e20746f6b656e206f776e657273686970206973207472616e736665727265642ef863616c6c657220444944202f20746f6b656e206f776e657273686970207472616e7366657272656420746f204449442c20417373657449642c2066726f6d2c417373657446726f7a656e08009c01284964656e7469747949640000b0011c41737365744964000608a4416e206576656e7420656d6974746564207768656e20616e2061737365742069732066726f7a656e2e7c506172616d657465723a2063616c6c6572204449442c20417373657449642e344173736574556e66726f7a656e08009c01284964656e7469747949640000b0011c41737365744964000708ac416e206576656e7420656d6974746564207768656e20616e20617373657420697320756e66726f7a656e2e7c506172616d657465723a2063616c6c6572204449442c20417373657449642e30417373657452656e616d65640c009c01284964656e7469747949640000b0011c417373657449640000e901012441737365744e616d65000808a4416e206576656e7420656d6974746564207768656e206120746f6b656e2069732072656e616d65642ec0506172616d65746572733a2063616c6c6572204449442c20417373657449642c206e657720746f6b656e206e616d652e3c46756e64696e67526f756e645365740c009c01284964656e7469747949640000b0011c4173736574496400000102014046756e64696e67526f756e644e616d650009081101416e206576656e74206361727279696e6720746865206e616d65206f66207468652063757272656e742066756e64696e6720726f756e64206f6620616e2061737365742ed0506172616d65746572733a2063616c6c6572204449442c20417373657449642c2066756e64696e6720726f756e64206e616d652e34446f63756d656e74416464656410009c01284964656e7469747949640000b0011c41737365744964000005020128446f63756d656e744964000009020120446f63756d656e74000a048c41206e657720646f63756d656e7420617474616368656420746f20616e2061737365743c446f63756d656e7452656d6f7665640c009c01284964656e7469747949640000b0011c41737365744964000005020128446f63756d656e744964000b04804120646f63756d656e742072656d6f7665642066726f6d20616e20617373657448436f6e74726f6c6c65725472616e7366657210009c01284964656e7469747949640000b0011c417373657449640000f0012c506f7274666f6c696f4964000018011c42616c616e6365000c08b44576656e7420666f72207768656e206120666f72636564207472616e736665722074616b657320706c6163652e3d0163616c6c6572204449442f20636f6e74726f6c6c6572204449442c20457874656e73696f6e52656d6f7665642c20506f7274666f6c696f206f6620746f6b656e20686f6c6465722c2076616c75652e54437573746f6d4173736574547970654578697374730c009c01284964656e7469747949640000e1010144437573746f6d4173736574547970654964000038011c5665633c75383e000d08b04120637573746f6d206173736574207479706520616c726561647920657869737473206f6e2d636861696e2e310163616c6c6572204449442c20746865204944206f662074686520637573746f6d20617373657420747970652c2074686520737472696e6720636f6e74656e747320726567697374657265642e64437573746f6d417373657454797065526567697374657265640c009c01284964656e7469747949640000e1010144437573746f6d4173736574547970654964000038011c5665633c75383e000e08b04120637573746f6d2061737365742074797065207761732072656769737465726564206f6e2d636861696e2e310163616c6c6572204449442c20746865204944206f662074686520637573746f6d20617373657420747970652c2074686520737472696e6720636f6e74656e747320726567697374657265642e5453657441737365744d6574616461746156616c756510009c01284964656e7469747949640000b0011c4173736574496400003502014841737365744d6574616461746156616c75650000390201ac4f7074696f6e3c41737365744d6574616461746156616c756544657461696c3c543a3a4d6f6d656e743e3e000f0864536574206173736574206d657461646174612076616c75652ef42843616c6c6572204449442c20417373657449642c206d657461646174612076616c75652c206f7074696f6e616c2076616c75652064657461696c73297053657441737365744d6574616461746156616c756544657461696c730c009c01284964656e7469747949640000b0011c4173736574496400003d02018c41737365744d6574616461746156616c756544657461696c3c543a3a4d6f6d656e743e001008dc536574206173736574206d657461646174612076616c75652064657461696c7320286578706972652c206c6f636b20737461747573292e902843616c6c6572204449442c20417373657449642c2076616c75652064657461696c732978526567697374657241737365744d657461646174614c6f63616c5479706514009c01284964656e7469747949640000b0011c4173736574496400004502014441737365744d657461646174614e616d6500004902015441737365744d657461646174614c6f63616c4b657900004d02014441737365744d65746164617461537065630011088c5265676973746572206173736574206d65746164617461206c6f63616c20747970652e09012843616c6c6572204449442c20417373657449642c204c6f63616c2074797065206e616d652c204c6f63616c2074797065206b65792c2074797065207370656373297c526567697374657241737365744d65746164617461476c6f62616c547970650c004502014441737365744d657461646174614e616d6500006502015841737365744d65746164617461476c6f62616c4b657900004d02014441737365744d6574616461746153706563001208905265676973746572206173736574206d6574616461746120676c6f62616c20747970652ebc28476c6f62616c2074797065206e616d652c20476c6f62616c2074797065206b65792c207479706520737065637329404173736574547970654368616e6765640c009c01284964656e7469747949640000b0011c417373657449640000dd010124417373657454797065001308cc416e206576656e7420656d6974746564207768656e207468652074797065206f6620616e206173736574206368616e6765642ec0506172616d65746572733a2063616c6c6572204449442c20417373657449642c206e657720746f6b656e20747970652e5c4c6f63616c4d657461646174614b657944656c657465640c009c01284964656e7469747949640000b0011c4173736574496400004902015441737365744d657461646174614c6f63616c4b6579001408f0416e206576656e7420656d6974746564207768656e2061206c6f63616c206d65746164617461206b657920686173206265656e2072656d6f7665642eac506172616d65746572733a2063616c6c657220417373657449642c204c6f63616c2074797065206e616d65504d6574616461746156616c756544656c657465640c009c01284964656e7469747949640000b0011c4173736574496400006902014041737365744d657461646174614b6579001508f8416e206576656e7420656d6974746564207768656e2061206c6f63616c206d657461646174612076616c756520686173206265656e2072656d6f7665642eac506172616d65746572733a2063616c6c657220417373657449642c204c6f63616c2074797065206e616d654c417373657442616c616e63655570646174656418009c01284964656e7469747949640000b0011c41737365744964000018011c42616c616e636500006d02014c4f7074696f6e3c506f7274666f6c696f49643e00006d02014c4f7074696f6e3c506f7274666f6c696f49643e000071020154506f7274666f6c696f557064617465526561736f6e00160ce4456d6974746564207768656e20546f6b656e732077657265206973737565642c2072656465656d6564206f72207472616e736665727265642e3502436f6e7461696e7320746865205b604964656e746974794964605d206f66207468652072656365697665722f6973737565722f72656465656d65722c20746865205b6041737365744964605d20666f722074686520746f6b656e2c207468652062616c616e6365207468617420776173206973737565642f7472616e736665727265642f72656465656d65642cb101746865205b60506f7274666f6c696f4964605d206f662074686520736f757263652c20746865205b60506f7274666f6c696f4964605d206f66207468652064657374696e6174696f6e20616e6420746865205b60506f7274666f6c696f557064617465526561736f6e605d2e64417373657441666669726d6174696f6e4578656d7074696f6e0400b0011c417373657449640017086d01416e20617373657420686173206265656e20616464656420746f20746865206c697374206f662070726520617072726f76656420726563656976656d656e74202876616c696420666f7220616c6c206964656e746974696573292ec8506172616d65746572733a205b6041737365744964605d206f66207468652070726520617070726f7665642061737365742e7c52656d6f7665417373657441666669726d6174696f6e4578656d7074696f6e0400b0011c417373657449640018087d01416e20617373657420686173206265656e2072656d6f7665642066726f6d20746865206c697374206f662070726520617072726f76656420726563656976656d656e74202876616c696420666f7220616c6c206964656e746974696573292e94506172616d65746572733a205b6041737365744964605d206f66207468652061737365742e40507265417070726f766564417373657408009c01284964656e7469747949640000b0011c417373657449640019081d01416e206964656e746974792068617320616464656420616e20617373657420746f20746865206c697374206f662070726520617072726f76656420726563656976656d656e742e3101506172616d65746572733a205b604964656e746974794964605d206f662063616c6c65722c205b6041737365744964605d206f66207468652070726520617070726f7665642061737365742e5852656d6f7665507265417070726f766564417373657408009c01284964656e7469747949640000b0011c41737365744964001a082501416e206964656e74697479206861732072656d6f76656420616e20617373657420746f20746865206c697374206f662070726520617072726f76656420726563656976656d656e742efc506172616d65746572733a205b604964656e746974794964605d206f662063616c6c65722c205b6041737365744964605d206f66207468652061737365742e4c41737365744d65646961746f727341646465640c009c01284964656e7469747949640000b0011c4173736574496400007d02015042547265655365743c4964656e7469747949643e001b08d8416e206964656e7469747920686173206164646564206d616e6461746f7279206d65646961746f727320746f20616e2061737365742e9101506172616d65746572733a205b604964656e746974794964605d206f662063616c6c65722c205b6041737365744964605d206f66207468652061737365742c20746865206964656e74697479206f6620616c6c206d65646961746f72732061646465642e5441737365744d65646961746f727352656d6f7665640c009c01284964656e7469747949640000b0011c4173736574496400007d02015042547265655365743c4964656e7469747949643e001c08c0416e206964656e74697479206861732072656d6f766564206d65646961746f72732066726f6d20616e2061737365742e9901506172616d65746572733a205b604964656e746974794964605d206f662063616c6c65722c205b6041737365744964605d206f66207468652061737365742c20746865206964656e74697479206f6620616c6c206d65646961746f72732072656d6f7665642e4c5469636b65724c696e6b6564546f41737365740c009c01284964656e7469747949640000290101185469636b65720000b0011c41737365744964001d08b0416e206964656e7469747920686173206c696e6b65642061207469636b657220746f20616e2061737365742e8101506172616d65746572733a205b604964656e746974794964605d206f662063616c6c65722c205b605469636b6572605d206f66207468652061737365742c20746865206173736574206964656e746966696572205b6041737365744964605d2e5c5469636b6572556e6c696e6b656446726f6d41737365740c009c01284964656e7469747949640000290101185469636b65720000b0011c41737365744964001e08c0416e206964656e746974792068617320756e6c696e6b65642061207469636b65722066726f6d20616e2061737365742e7101506172616d65746572733a205b604964656e746974794964605d206f662063616c6c65722c20756e6c696e6b6564205b605469636b6572605d2c20746865206173736574206964656e746966696572205b6041737365744964605d2e64476c6f62616c4d65746164617461537065635570646174656408004502014441737365744d657461646174614e616d6500004d02014441737365744d6574616461746153706563001f08b0417373657420476c6f62616c204d65746164617461205370656320686173206265656e20557064617465642e6501506172616d65746572733a205b6041737365744d657461646174614e616d65605d206f6620746865206d657461646174612c205b6041737365744d6574616461746153706563605d206f6620746865206d657461646174612e047c54686520604576656e746020656e756d206f6620746869732070616c6c6574dd010c4c706f6c796d6573685f7072696d6974697665731461737365742441737365745479706500013030457175697479436f6d6d6f6e0000003c45717569747950726566657272656400010024436f6d6d6f646974790002002c4669786564496e636f6d6500030010524549540004001046756e6400050054526576656e7565536861726541677265656d656e74000600445374727563747572656450726f64756374000700284465726976617469766500080018437573746f6d0400e1010144437573746f6d417373657454797065496400090028537461626c65436f696e000a002c4e6f6e46756e6769626c650400e501013c4e6f6e46756e6769626c6554797065000b0000e1010c4c706f6c796d6573685f7072696d69746976657314617373657444437573746f6d41737365745479706549640000040010010c7533320000e5010c4c706f6c796d6573685f7072696d6974697665731461737365743c4e6f6e46756e6769626c655479706500011028446572697661746976650000002c4669786564496e636f6d650001001c496e766f69636500020018437573746f6d0400e1010144437573746f6d417373657454797065496400030000e9010c4c706f6c796d6573685f7072696d6974697665731461737365742441737365744e616d650000040038011c5665633c75383e0000ed01000002f10100f1010c4c706f6c796d6573685f7072696d6974697665734061737365745f6964656e7469666965723c41737365744964656e7469666965720001141443555349500400f501011c5b75383b20395d0000001043494e530400f501011c5b75383b20395d000100104953494e04002d0101205b75383b2031325d0002000c4c45490400f90101205b75383b2032305d000300104649474904002d0101205b75383b2031325d00040000f501000003090000000800f901000003140000000800fd0104184f7074696f6e0404540101020108104e6f6e6500000010536f6d6504000102000001000001020c4c706f6c796d6573685f7072696d6974697665731461737365744046756e64696e67526f756e644e616d650000040038011c5665633c75383e000005020c4c706f6c796d6573685f7072696d69746976657320646f63756d656e7428446f63756d656e7449640000040010010c753332000009020c4c706f6c796d6573685f7072696d69746976657320646f63756d656e7420446f63756d656e74000014010c7572690d02012c446f63756d656e74557269000130636f6e74656e745f6861736811020130446f63756d656e74486173680001106e616d6529020130446f63756d656e744e616d65000120646f635f747970652d0201504f7074696f6e3c446f63756d656e74547970653e00012c66696c696e675f646174650d0101384f7074696f6e3c4d6f6d656e743e00000d020c4c706f6c796d6573685f7072696d69746976657320646f63756d656e742c446f63756d656e745572690000040038011c5665633c75383e000011020c4c706f6c796d6573685f7072696d69746976657334646f63756d656e745f6861736830446f63756d656e7448617368000124104e6f6e6500000010483531320400150201205b75383b2036345d00010010483338340400190201205b75383b2034385d000200104833323004001d0201205b75383b2034305d000300104832353604000401205b75383b2033325d00040010483232340400210201205b75383b2032385d00050010483139320400250201205b75383b2032345d00060010483136300400f90101205b75383b2032305d00070010483132380400b401205b75383b2031365d00080000150200000340000000080019020000033000000008001d0200000328000000080021020000031c0000000800250200000318000000080029020c4c706f6c796d6573685f7072696d69746976657320646f63756d656e7430446f63756d656e744e616d650000040038011c5665633c75383e00002d0204184f7074696f6e0404540131020108104e6f6e6500000010536f6d6504003102000001000031020c4c706f6c796d6573685f7072696d69746976657320646f63756d656e7430446f63756d656e74547970650000040038011c5665633c75383e000035020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174614841737365744d6574616461746156616c75650000040038011c5665633c75383e0000390204184f7074696f6e040454013d020108104e6f6e6500000010536f6d6504003d0200000100003d020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174616041737365744d6574616461746156616c756544657461696c04184d6f6d656e740130000801186578706972650d0101384f7074696f6e3c4d6f6d656e743e00012c6c6f636b5f7374617475734102017c41737365744d657461646174614c6f636b5374617475733c4d6f6d656e743e000041020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174615c41737365744d657461646174614c6f636b53746174757304184d6f6d656e740130010c20556e6c6f636b6564000000184c6f636b65640001002c4c6f636b6564556e74696c04003001184d6f6d656e740002000045020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174614441737365744d657461646174614e616d650000040038011c5665633c75383e000049020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174615441737365744d657461646174614c6f63616c4b65790000040030010c75363400004d020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174614441737365744d657461646174615370656300000c010c75726c5102012c4f7074696f6e3c55726c3e00012c6465736372697074696f6e590201804f7074696f6e3c41737365744d657461646174614465736372697074696f6e3e000120747970655f6465666102013c4f7074696f6e3c5665633c75383e3e0000510204184f7074696f6e0404540155020108104e6f6e6500000010536f6d650400550200000100005502084c706f6c796d6573685f7072696d6974697665730c55726c0000040038011c5665633c75383e0000590204184f7074696f6e040454015d020108104e6f6e6500000010536f6d6504005d0200000100005d020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174616041737365744d657461646174614465736372697074696f6e0000040038011c5665633c75383e0000610204184f7074696f6e04045401380108104e6f6e6500000010536f6d65040038000001000065020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174615841737365744d65746164617461476c6f62616c4b65790000040030010c753634000069020c4c706f6c796d6573685f7072696d6974697665733861737365745f6d657461646174614041737365744d657461646174614b657900010818476c6f62616c04006502015841737365744d65746164617461476c6f62616c4b6579000000144c6f63616c04004902015441737365744d657461646174614c6f63616c4b6579000100006d0204184f7074696f6e04045401f00108104e6f6e6500000010536f6d650400f0000001000071020c4c706f6c796d6573685f7072696d69746976657324706f7274666f6c696f54506f7274666f6c696f557064617465526561736f6e0001101849737375656404014866756e64696e675f726f756e645f6e616d65fd0101604f7074696f6e3c46756e64696e67526f756e644e616d653e0000002052656465656d65640001002c5472616e73666572726564080138696e737472756374696f6e5f6964750201544f7074696f6e3c496e737472756374696f6e49643e000140696e737472756374696f6e5f6d656d6f8c01304f7074696f6e3c4d656d6f3e00020048436f6e74726f6c6c65725472616e7366657200030000750204184f7074696f6e0404540179020108104e6f6e6500000010536f6d6504007902000001000079020c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e7434496e737472756374696f6e49640000040030010c75363400007d0204204254726565536574040454019c00040049010000008102106070616c6c65745f636f72706f726174655f616374696f6e7330646973747269627574696f6e1870616c6c6574144576656e740404540001101c437265617465640c00850201204576656e7444696400008902011043414964000091020130446973747269627574696f6e000010b841206361706974616c20646973747269627574696f6e2c20776974682064657461696c7320696e636c756465642c31017761732063726561746564206279207468652044494420287065726d697373696f6e6564206167656e742920666f7220746865204341206964656e746966696564206279206043414964602e00a8284167656e74204449442c20434127732049442c20646973747269627574696f6e2064657461696c73293842656e65666974436c61696d65641800850201204576656e744469640000850201204576656e7444696400008902011043414964000091020130446973747269627574696f6e000018011c42616c616e636500009502010c54617800010c51014120746f6b656e20686f6c64657227732062656e65666974206f662061206361706974616c20646973747269627574696f6e20666f722074686520676976656e206043414964602077617320636c61696d65642e0091012843616c6c6572204449442c20486f6c6465722f436c61696d616e74204449442c20434127732049442c207570646174656420646973747269627574696f6e2064657461696c732c2044494427732062656e656669742c20444944277320746178202529245265636c61696d65640c00850201204576656e7444696400008902011043414964000018011c42616c616e636500020c9853746174732066726f6d2060707573685f62656e65666974602077617320656d69747465642e001501284167656e74204449442c20434127732049442c206d61782072657175657374656420444944732c2070726f63657373656420444944732c206661696c65642044494473291c52656d6f7665640800850201204576656e744469640000890201104341496400030c8c41206361706974616c20646973747269627574696f6e207761732072656d6f7665642e0050284167656e74204449442c204341277320494429047c54686520604576656e746020656e756d206f6620746869732070616c6c657485020c4c706f6c796d6573685f7072696d697469766573286576656e745f6f6e6c79244576656e744f6e6c79040454019c0004009c01045400008902086070616c6c65745f636f72706f726174655f616374696f6e731043414964000008012061737365745f6964b0011c417373657449640001206c6f63616c5f69648d0201244c6f63616c4341496400008d02086070616c6c65745f636f72706f726174655f616374696f6e73244c6f63616c434149640000040010010c753332000091020c6070616c6c65745f636f72706f726174655f616374696f6e7330646973747269627574696f6e30446973747269627574696f6e000020011066726f6df0012c506f7274666f6c696f496400012063757272656e6379b0011c417373657449640001247065725f736861726518011c42616c616e6365000118616d6f756e7418011c42616c616e636500012472656d61696e696e6718011c42616c616e63650001247265636c61696d6564200110626f6f6c0001287061796d656e745f61743001184d6f6d656e74000128657870697265735f61740d0101384f7074696f6e3c4d6f6d656e743e000095020c3473705f61726974686d65746963287065725f7468696e67731c5065726d696c6c0000040010010c75333200009902103070616c6c65745f617373657428636865636b706f696e741870616c6c6574144576656e7404045400011044436865636b706f696e74437265617465641400310101484f7074696f6e3c4964656e7469747949643e0000b0011c4173736574496400009d020130436865636b706f696e7449640000180170706f6c796d6573685f7072696d6974697665733a3a42616c616e636500003001184d6f6d656e7400000c644120636865636b706f696e742077617320637265617465642e0021012863616c6c6572204449442c20417373657449642c20636865636b706f696e742049442c20746f74616c20737570706c792c20636865636b706f696e742074696d657374616d7029844d6178696d756d5363686564756c6573436f6d706c65786974794368616e67656408009c01284964656e746974794964000030010c75363400010c2501546865206d6178696d756d20636f6d706c657869747920666f7220616e206172626974726172792061737365742773207363686564756c652073657420776173206368616e6765642e0064284743204449442c20746865206e6577206d6178696d756d293c5363686564756c654372656174656410009c01284964656e7469747949640000b0011c417373657449640000a10201285363686564756c6549640000a502014c5363686564756c65436865636b706f696e747300020c884120636865636b706f696e74207363686564756c652077617320637265617465642e00b02863616c6c6572204449442c20417373657449642c207363686564756c652069642c207363686564756c65293c5363686564756c6552656d6f76656410009c01284964656e7469747949640000b0011c417373657449640000a10201285363686564756c6549640000a502014c5363686564756c65436865636b706f696e747300030c884120636865636b706f696e74207363686564756c65207761732072656d6f7665642e00b02863616c6c6572204449442c20417373657449642c207363686564756c652069642c207363686564756c6529047c54686520604576656e746020656e756d206f6620746869732070616c6c65749d020c4c706f6c796d6573685f7072696d69746976657314617373657430436865636b706f696e7449640000040030010c7536340000a1021064706f6c796d6573685f636f6d6d6f6e5f7574696c69746965731874726169747328636865636b706f696e74285363686564756c6549640000040030010c7536340000a5021064706f6c796d6573685f636f6d6d6f6e5f7574696c69746965731874726169747328636865636b706f696e744c5363686564756c65436865636b706f696e7473000004011c70656e64696e67a902014042547265655365743c4d6f6d656e743e0000a902042042547265655365740404540130000400ad02000000ad020000023000b1020c6470616c6c65745f636f6d706c69616e63655f6d616e616765721870616c6c6574144576656e7404045400012470436f6d706c69616e6365526571756972656d656e74437265617465640c009c01284964656e7469747949640000b0011c417373657449640000b5020154436f6d706c69616e6365526571756972656d656e74000008cc456d6974746564207768656e206e657720636f6d706c69616e636520726571756972656d656e7420697320637265617465642eb42863616c6c6572204449442c20417373657449642c20436f6d706c69616e6365526571756972656d656e74292e70436f6d706c69616e6365526571756972656d656e7452656d6f7665640c009c01284964656e7469747949640000b0011c41737365744964000010010c753332000108c4456d6974746564207768656e206120636f6d706c69616e636520726571756972656d656e742069732072656d6f7665642e982863616c6c6572204449442c20417373657449642c20726571756972656d656e745f6964292e5c4173736574436f6d706c69616e63655265706c616365640c009c01284964656e7469747949640000b0011c417373657449640000e10201685665633c436f6d706c69616e6365526571756972656d656e743e000208b4456d6974746564207768656e20616e20617373657420636f6d706c69616e6365206973207265706c616365642ed8506172616d65746572733a2063616c6c6572204449442c20417373657449642c206e657720617373657420636f6d706c69616e63652e504173736574436f6d706c69616e6365526573657408009c01284964656e7469747949640000b0011c41737365744964000308e0456d6974746564207768656e20616e20617373657420636f6d706c69616e6365206f6620612061737365745f69642069732072657365742e582863616c6c6572204449442c2041737365744964292e584173736574436f6d706c69616e6365526573756d656408009c01284964656e7469747949640000b0011c417373657449640004080901456d6974746564207768656e20616e20617373657420636f6d706c69616e636520666f72206120676976656e2061737365745f6964206765747320726573756d652e582863616c6c6572204449442c2041737365744964292e544173736574436f6d706c69616e636550617573656408009c01284964656e7469747949640000b0011c417373657449640005080901456d6974746564207768656e20616e20617373657420636f6d706c69616e636520666f72206120676976656e2061737365745f69642067657473207061757365642e582863616c6c6572204449442c2041737365744964292e70436f6d706c69616e6365526571756972656d656e744368616e6765640c009c01284964656e7469747949640000b0011c417373657449640000b5020154436f6d706c69616e6365526571756972656d656e74000608e0456d6974746564207768656e20636f6d706c69616e636520726571756972656d656e7420676574206d6f6469666965642f6368616e67652eb42863616c6c6572204449442c20417373657449642c20436f6d706c69616e6365526571756972656d656e74292e785472757374656444656661756c74436c61696d49737375657241646465640c009c01284964656e7469747949640000b0011c417373657449640000d1020134547275737465644973737565720007081d01456d6974746564207768656e2064656661756c7420636c61696d20697373756572206c69737420666f72206120676976656e2061737365745f696420676574732061646465642eac2863616c6c6572204449442c20417373657449642c2041646465642054727573746564497373756572292e805472757374656444656661756c74436c61696d49737375657252656d6f7665640c009c01284964656e7469747949640000b0011c4173736574496400009c01284964656e7469747949640008082101456d6974746564207768656e2064656661756c7420636c61696d20697373756572206c69737420666f72206120676976656e2061737365745f6964206765742072656d6f7665642eb42863616c6c6572204449442c20417373657449642c2052656d6f7665642054727573746564497373756572292e047c54686520604576656e746020656e756d206f6620746869732070616c6c6574b5020c4c706f6c796d6573685f7072696d69746976657348636f6d706c69616e63655f6d616e6167657254436f6d706c69616e6365526571756972656d656e7400000c014473656e6465725f636f6e646974696f6e73b90201385665633c436f6e646974696f6e3e00014c72656365697665725f636f6e646974696f6e73b90201385665633c436f6e646974696f6e3e000108696410010c7533320000b902000002bd0200bd020c4c706f6c796d6573685f7072696d69746976657324636f6e646974696f6e24436f6e646974696f6e0000080138636f6e646974696f6e5f74797065c1020134436f6e646974696f6e5479706500011c69737375657273cd0201485665633c547275737465644973737565723e0000c1020c4c706f6c796d6573685f7072696d69746976657324636f6e646974696f6e34436f6e646974696f6e5479706500011424497350726573656e74040011010114436c61696d000000204973416273656e74040011010114436c61696d0001001c4973416e794f660400c50201285665633c436c61696d3e0002002049734e6f6e654f660400c50201285665633c436c61696d3e0003002849734964656e746974790400c90201385461726765744964656e7469747900040000c502000002110100c9020c4c706f6c796d6573685f7072696d69746976657324636f6e646974696f6e385461726765744964656e746974790001083445787465726e616c4167656e7400000020537065636966696304009c01284964656e74697479496400010000cd02000002d10200d1020c4c706f6c796d6573685f7072696d69746976657324636f6e646974696f6e345472757374656449737375657200000801186973737565729c01284964656e74697479496400012c747275737465645f666f72d502012854727573746564466f720000d5020c4c706f6c796d6573685f7072696d69746976657324636f6e646974696f6e2854727573746564466f720001080c416e790000002053706563696669630400d90201385665633c436c61696d547970653e00010000d902000002dd0200dd020c4c706f6c796d6573685f7072696d697469766573386964656e746974795f636c61696d24436c61696d54797065000128284163637265646974656400000024416666696c69617465000100244275794c6f636b75700002002853656c6c4c6f636b757000030050437573746f6d657244756544696c6967656e6365000400404b6e6f77596f7572437573746f6d6572000500304a7572697364696374696f6e000600204578656d707465640007001c426c6f636b656400080018437573746f6d040021010144437573746f6d436c61696d54797065496400090000e102000002b50200e5020c6070616c6c65745f636f72706f726174655f616374696f6e731870616c6c6574144576656e740404540001205c4d617844657461696c734c656e6774684368616e67656408009c01284964656e746974794964000010010c753332000008d4546865206d6178696d756d206c656e677468206f66206064657461696c736020696e20627974657320776173206368616e6765642e50284743204449442c206e6577206c656e677468297844656661756c745461726765744964656e7469746965734368616e6765640c009c01284964656e7469747949640000b0011c417373657449640000e90201405461726765744964656e746974696573000108f054686520736574206f662064656661756c7420605461726765744964656e7469746965736020666f7220746865206173736574206368616e6765642ea8284167656e74204449442c20417373657449642c204e6577205461726765744964656e746974696573297044656661756c7457697468686f6c64696e675461784368616e6765640c009c01284964656e7469747949640000b0011c4173736574496400009502010c546178000208c85468652064656661756c742077697468686f6c64696e672074617820666f7220746865206173736574206368616e6765642e78284167656e74204449442c20417373657449642c204e657720546178292e6044696457697468686f6c64696e675461784368616e67656410009c01284964656e7469747949640000b0011c4173736574496400009c01284964656e7469747949640000f102012c4f7074696f6e3c5461783e000308f05468652077697468686f6c64696e672074617820737065636966696320746f20612044494420666f7220746865206173736574206368616e6765642ea4284167656e74204449442c20417373657449642c205461786564204449442c204e657720546178292e2c4341496e697469617465641000850201204576656e74446964000089020110434149640000f502013c436f72706f72617465416374696f6e000011030124434144657461696c730004084c412043412077617320696e697469617465642ea8284167656e74204449442c2043412069642c207468652043412c207468652043412064657461696c73293443414c696e6b6564546f446f630c009c01284964656e7469747949640000890201104341496400001503013c5665633c446f63756d656e7449643e000508844120434120776173206c696e6b656420746f206120736574206f6620646f63732eac284167656e74204449442c2043412049642c204c697374206f6620646f63206964656e746966696572732924434152656d6f7665640800850201204576656e74446964000089020110434149640006084441204341207761732072656d6f7665642e48284167656e74204449442c20434120496429445265636f7264446174654368616e6765640c00850201204576656e74446964000089020110434149640000f502013c436f72706f72617465416374696f6e0007046c412043412773207265636f72642064617465206368616e6765642e047c54686520604576656e746020656e756d206f6620746869732070616c6c6574e902086070616c6c65745f636f72706f726174655f616374696f6e73405461726765744964656e74697469657300000801286964656e7469746965734901013c5665633c4964656e7469747949643e00012474726561746d656e74ed02013c54617267657454726561746d656e740000ed02086070616c6c65745f636f72706f726174655f616374696f6e733c54617267657454726561746d656e740001081c496e636c7564650000001c4578636c75646500010000f10204184f7074696f6e0404540195020108104e6f6e6500000010536f6d65040095020000010000f502086070616c6c65745f636f72706f726174655f616374696f6e733c436f72706f72617465416374696f6e00001801106b696e64f902011843414b696e640001246465636c5f646174653001184d6f6d656e7400012c7265636f72645f64617465fd0201484f7074696f6e3c5265636f7264446174653e00011c74617267657473e90201405461726765744964656e74697469657300015c64656661756c745f77697468686f6c64696e675f7461789502010c54617800013c77697468686f6c64696e675f746178090301585665633c284964656e7469747949642c20546178293e0000f902086070616c6c65745f636f72706f726174655f616374696f6e731843414b696e64000114485072656469637461626c6542656e6566697400000050556e7072656469637461626c6542656e65666974000100304973737565724e6f746963650002003852656f7267616e697a6174696f6e000300144f7468657200040000fd0204184f7074696f6e0404540101030108104e6f6e6500000010536f6d650400010300000100000103086070616c6c65745f636f72706f726174655f616374696f6e73285265636f7264446174650000080110646174653001184d6f6d656e74000128636865636b706f696e74050301304341436865636b706f696e7400000503086070616c6c65745f636f72706f726174655f616374696f6e73304341436865636b706f696e74000108245363686564756c65640800a10201285363686564756c654964000030010c753634000000204578697374696e6704009d020130436865636b706f696e7449640001000009030000020d03000d03000004089c9502001103086070616c6c65745f636f72706f726174655f616374696f6e7324434144657461696c730000040038011c5665633c75383e000015030000020502001903106070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f741870616c6c6574144576656e740404540001181c4372656174656414009c01284964656e7469747949640000890201104341496400001d03013c42616c6c6f7454696d6552616e676500002103012842616c6c6f744d6574610000200110626f6f6c00000c7c4120636f72706f726174652062616c6c6f742077617320637265617465642e001501284167656e74204449442c20434127732049442c20566f74696e672073746172742f656e642c2042616c6c6f74206d657461646174612c2052435620656e61626c65643f2920566f7465436173740c009c01284964656e7469747949640000890201104341496400004103013c5665633c42616c6c6f74566f74653e00010c984120766f746520776173206361737420696e206120636f72706f726174652062616c6c6f742e006028766f746572204449442c20434149642c20566f746573293052616e67654368616e6765640c009c01284964656e7469747949640000890201104341496400001d03013c42616c6c6f7454696d6552616e676500020cd04120636f72706f726174652062616c6c6f74206368616e676564206974732073746172742f656e6420646174652072616e67652e0098284167656e74204449442c20434127732049442c20566f74696e672073746172742f656e64292c4d6574614368616e6765640c009c01284964656e7469747949640000890201104341496400002103012842616c6c6f744d65746100030ca04120636f72706f726174652062616c6c6f74206368616e67656420697473206d657461646174612e0088284167656e74204449442c20434127732049442c204e6577206d6574616461746129285243564368616e6765640c009c01284964656e746974794964000089020110434149640000200110626f6f6c00040cac4120636f72706f726174652062616c6c6f74206368616e676564206974732052435620737570706f72742e0084284167656e74204449442c20434127732049442c204e657720737570706f7274291c52656d6f7665640800850201204576656e744469640000890201104341496400050c7c4120636f72706f726174652062616c6c6f74207761732072656d6f7665642e0050284167656e74204449442c204341277320494429047c54686520604576656e746020656e756d206f6620746869732070616c6c65741d030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f743c42616c6c6f7454696d6552616e6765000008011473746172743001184d6f6d656e7400010c656e643001184d6f6d656e74000021030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f742842616c6c6f744d65746100000801147469746c652503012c42616c6c6f745469746c6500011c6d6f74696f6e732903012c5665633c4d6f74696f6e3e000025030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f742c42616c6c6f745469746c650000040038011c5665633c75383e000029030000022d03002d030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f74184d6f74696f6e00000c01147469746c653103012c4d6f74696f6e5469746c65000124696e666f5f6c696e6b350301384d6f74696f6e496e666f4c696e6b00011c63686f69636573390301405665633c43686f6963655469746c653e000031030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f742c4d6f74696f6e5469746c650000040038011c5665633c75383e000035030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f74384d6f74696f6e496e666f4c696e6b0000040038011c5665633c75383e000039030000023d03003d030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f742c43686f6963655469746c650000040038011c5665633c75383e0000410300000245030045030c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f742842616c6c6f74566f74650000080114706f77657218011c42616c616e636500012066616c6c6261636b4903012c4f7074696f6e3c7531363e0000490304184f7074696f6e040454014d030108104e6f6e6500000010536f6d6504004d0300000100004d03000005040051030c2c70616c6c65745f706970731870616c6c6574144576656e7404045400015050486973746f726963616c506970735072756e65640c009c01284964656e7469747949640000200110626f6f6c0000200110626f6f6c00001894486973746f726963616c2050495073205072756e696e6720686173206265656e207365742e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722ebc2d2060626f6f6c603a20546865206f6c642076616c7565206f6620746865207072756e696e672073657474696e672ebc2d2060626f6f6c603a20546865206e65772076616c7565206f6620746865207072756e696e672073657474696e672e3c50726f706f73616c4372656174656420009c01284964656e74697479496400005503015850726f706f7365723c543a3a4163636f756e7449643e00005d0301145069704964000018011c42616c616e636500005102012c4f7074696f6e3c55726c3e0000610301584f7074696f6e3c5069704465736372697074696f6e3e0000590101744d61796265426c6f636b3c426c6f636b4e756d626572466f723c543e3e00006903013050726f706f73616c4461746100012ccc41205049502077617320637265617465642077697468206120737065636966696564206042616c616e636560207374616b652e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722ed02d206050726f706f7365723c543a3a4163636f756e7449643e603a205468652070726f706f736572206f6620746865205049502e742d20605069704964603a20546865204944206f6620746865205049502e802d206042616c616e6365603a20546865206465706f73697420616d6f756e742ec42d20604f7074696f6e3c55726c3e603a205468652055524c20666f722070726f706f73616c2064697363757373696f6e2ef02d20604f7074696f6e3c5069704465736372697074696f6e3e603a20546865206465736372697074696f6e206f66207468652070726f706f73616c2e01012d20604d61796265426c6f636b3c543a3a426c6f636b4e756d6265723e603a20546865206578706972792074696d65206f66207468652070726f706f73616c2eac2d206050726f706f73616c44617461603a205468652064617461206f66207468652070726f706f73616c2e5050726f706f73616c5374617465557064617465640c009c01284964656e74697479496400005d030114506970496400006d03013450726f706f73616c537461746500021890546865207374617465206f6620612070726f706f73616c2077617320757064617465642e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722e742d20605069704964603a20546865204944206f6620746865205049502ec42d206050726f706f73616c5374617465603a20546865206e6577207374617465206f66207468652070726f706f73616c2e14566f74656414009c01284964656e7469747949640000000130543a3a4163636f756e74496400005d03011450697049640000200110626f6f6c000018011c42616c616e63650003207c416e206163636f756e7420766f746564206f6e20612070726f706f73616c2e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722ea42d2060543a3a4163636f756e744964603a20546865206163636f756e74207468617420766f7465642e742d20605069704964603a20546865204944206f6620746865205049502ec42d2060626f6f6c603a2054686520766f746520287472756520666f72206179652c2066616c736520666f72206e6179292eb02d206042616c616e6365603a20546865206465706f73697420616d6f756e74206f662074686520766f74652e24506970436c6f7365640c009c01284964656e74697479496400005d03011450697049640000200110626f6f6c0004184441205049502077617320636c6f7365642e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722e742d20605069704964603a20546865204944206f6620746865205049502ec02d2060626f6f6c603a20496e64696361746573207768657468657220746865206461746120776173207072756e65642e48457865637574696f6e5363686564756c65640c009c01284964656e74697479496400005d03011450697049640000100144426c6f636b4e756d626572466f723c543e0005189454686520657865637574696f6e206f6620612050495020776173207363686564756c65642e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722e742d20605069704964603a20546865204944206f6620746865205049502e39012d2060426c6f636b4e756d626572603a2054686520626c6f636b206e756d6265722061742077686963682074686520504950206973207363686564756c656420666f7220657865637574696f6e2e7444656661756c74456e6163746d656e74506572696f644368616e6765640c009c01284964656e7469747949640000100144426c6f636b4e756d626572466f723c543e0000100144426c6f636b4e756d626572466f723c543e000618a45468652064656661756c7420656e6163746d656e7420706572696f6420776173206368616e6765642e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722ea82d2060426c6f636b4e756d626572603a20546865206f6c6420656e6163746d656e7420706572696f642ea82d2060426c6f636b4e756d626572603a20546865206e657720656e6163746d656e7420706572696f642e744d696e696d756d50726f706f73616c4465706f7369744368616e6765640c009c01284964656e746974794964000018011c42616c616e6365000018011c42616c616e6365000718d4546865206d696e696d756d206465706f73697420616d6f756e7420666f722070726f706f73616c7320776173206368616e6765642e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722e902d206042616c616e6365603a20546865206f6c64206465706f73697420616d6f756e742e902d206042616c616e6365603a20546865206e6577206465706f73697420616d6f756e742e5c50656e64696e675069704578706972794368616e6765640c009c01284964656e7469747949640000590101744d61796265426c6f636b3c426c6f636b4e756d626572466f723c543e3e0000590101744d61796265426c6f636b3c426c6f636b4e756d626572466f723c543e3e000818b4546865206578706972792074696d6520666f722070656e64696e67205049507320776173206368616e6765642e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722ed02d20604d61796265426c6f636b3c543a3a426c6f636b4e756d6265723e603a20546865206f6c64206578706972792074696d652ed02d20604d61796265426c6f636b3c543a3a426c6f636b4e756d6265723e603a20546865206e6577206578706972792074696d652e584d6178506970536b6970436f756e744368616e6765640c009c01284964656e7469747949640000080130536b6970706564436f756e740000080130536b6970706564436f756e74000918f4546865206d6178696d756d206e756d626572206f662074696d65732061205049502063616e20626520736b697070656420776173206368616e6765642e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722e942d2060536b6970706564436f756e74603a20546865206f6c6420736b697020636f756e742e942d2060536b6970706564436f756e74603a20546865206e657720736b697020636f756e742e544163746976655069704c696d69744368616e6765640c009c01284964656e746974794964000010010c753332000010010c753332000a18b8546865206d6178696d756d206e756d626572206f6620616374697665205049507320776173206368616e6765642e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722e882d2060753332603a20546865206f6c642061637469766520504950206c696d69742e882d2060753332603a20546865206e65772061637469766520504950206c696d69742e3850726f706f73616c526566756e640c009c01284964656e74697479496400005d0301145069704964000018011c42616c616e6365000b1860412070726f706f73616c2077617320726566756e6465642e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722e742d20605069704964603a20546865204944206f6620746865205049502e9c2d206042616c616e6365603a2054686520746f74616c20616d6f756e7420726566756e6465642e3c536e617073686f74436c656172656408009c01284964656e746974794964000071030128536e617073686f744964000c146454686520736e617073686f742077617320636c65617265642e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722e9c2d2060536e617073686f744964603a20546865204944206f662074686520736e617073686f742e34536e617073686f7454616b656e0c009c01284964656e746974794964000071030128536e617073686f74496400007503014c5665633c536e617073686f747465645069703e000d186441206e657720736e617073686f74207761732074616b656e2e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722e9c2d2060536e617073686f744964603a20546865204944206f662074686520736e617073686f742ee82d20605665633c536e617073686f747465645069703e603a20546865206c697374206f66205049507320696e2074686520736e617073686f742e28506970536b69707065640c009c01284964656e74697479496400005d03011450697049640000080130536b6970706564436f756e74000e18a0412050495020696e2074686520736e617073686f742071756575652077617320736b69707065642e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722e742d20605069704964603a20546865204944206f6620746865205049502e942d2060536b6970706564436f756e74603a20546865206e657720736b697020636f756e742e58536e617073686f74526573756c7473456e616374656414009c01284964656e7469747949640000810301484f7074696f6e3c536e617073686f7449643e0000850301685665633c2850697049642c20536b6970706564436f756e74293e00008d0301285665633c50697049643e00008d0301285665633c50697049643e000f20e4526573756c7473207765726520656e616374656420666f7220736f6d65205049507320696e2074686520736e617073686f742071756575652e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722edc2d20604f7074696f6e3c536e617073686f7449643e603a20546865204944206f662074686520736e617073686f742c20696620616e792e51012d20605665633c2850697049642c20536b6970706564436f756e74293e603a20546865206c697374206f6620736b697070656420504950732077697468207468656972206e657720736b697020636f756e74732ea82d20605665633c50697049643e603a20546865206c697374206f662072656a656374656420504950732ea82d20605665633c50697049643e603a20546865206c697374206f6620617070726f76656420504950732e64457865637574696f6e5363686564756c696e674661696c65640c009c01284964656e74697479496400005d03011450697049640000100144426c6f636b4e756d626572466f723c543e0010180d015363686564756c696e67206f66207468652050495020666f7220657865637574696f6e206661696c656420696e20746865207363686564756c65722070616c6c65742e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722e742d20605069704964603a20546865204944206f6620746865205049502e3d012d2060426c6f636b4e756d626572603a2054686520626c6f636b206e756d626572206174207768696368207468652050495020776173207363686564756c656420666f7220657865637574696f6e2e3c4578706972795363686564756c65640c009c01284964656e74697479496400005d03011450697049640000100144426c6f636b4e756d626572466f723c543e001118985468652050495020686173206265656e207363686564756c656420666f72206578706972792e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722e742d20605069704964603a20546865204944206f6620746865205049502e2d012d2060426c6f636b4e756d626572603a2054686520626c6f636b206e756d6265722061742077686963682074686520504950206973207363686564756c656420666f72206578706972792e584578706972795363686564756c696e674661696c65640c009c01284964656e74697479496400005d03011450697049640000100144426c6f636b4e756d626572466f723c543e00121801015363686564756c696e67206f66207468652050495020666f7220657870697279206661696c656420696e20746865207363686564756c65722070616c6c65742e002c506172616d65746572733a982d20604964656e746974794964603a2054686520444944206f66207468652063616c6c65722e742d20605069704964603a20546865204944206f6620746865205049502e31012d2060426c6f636b4e756d626572603a2054686520626c6f636b206e756d626572206174207768696368207468652050495020776173207363686564756c656420666f72206578706972792e64457865637574696f6e43616e63656c6c696e674661696c656404005d0301145069704964001310f043616e63656c6c696e67207468652050495020657865637574696f6e206661696c656420696e20746865207363686564756c65722070616c6c65742e002c506172616d65746572733a742d20605069704964603a20546865204944206f6620746865205049502e047c54686520604576656e746020656e756d206f6620746869732070616c6c657455030c2c70616c6c65745f706970731474797065732050726f706f73657204244163636f756e7449640100010824436f6d6d756e69747904000001244163636f756e74496400000024436f6d6d6974746565040059030124436f6d6d69747465650001000059030c2c70616c6c65745f7069707314747970657324436f6d6d697474656500010824546563686e6963616c0000001c55706772616465000100005d030c2c70616c6c65745f706970731474797065731450697049640000040010010c7533320000610304184f7074696f6e0404540165030108104e6f6e6500000010536f6d6504006503000001000065030c2c70616c6c65745f70697073147479706573385069704465736372697074696f6e0000040038011c5665633c75383e000069030c2c70616c6c65745f706970731474797065733050726f706f73616c4461746100010810486173680400340110483235360000002050726f706f73616c040038011c5665633c75383e000100006d030c2c70616c6c65745f706970731474797065733450726f706f73616c53746174650001181c50656e64696e670000002052656a6563746564000100245363686564756c6564000200184661696c65640003002045786563757465640004001c457870697265640005000071030c2c70616c6c65745f7069707314747970657328536e617073686f7449640000040010010c7533320000750300000279030079030c2c70616c6c65745f7069707314747970657338536e617073686f74746564506970000008010869645d03011450697049640001187765696768747d03013c28626f6f6c2c2042616c616e63652900007d0300000408201800810304184f7074696f6e0404540171030108104e6f6e6500000010536f6d6504007103000001000085030000028903008903000004085d0308008d030000025d030091030c4070616c6c65745f706f7274666f6c696f1870616c6c6574144576656e7404045400012840506f7274666f6c696f437265617465640c009c01284964656e7469747949640000f8013c506f7274666f6c696f4e756d626572000095030134506f7274666f6c696f4e616d65000018b054686520706f7274666f6c696f20686173206265656e207375636365737366756c6c7920637265617465642e00302320506172616d6574657273302a206f726967696e20444944482a20706f7274666f6c696f206e756d626572402a20706f7274666f6c696f206e616d6540506f7274666f6c696f44656c6574656408009c01284964656e7469747949640000f8013c506f7274666f6c696f4e756d626572000114b054686520706f7274666f6c696f20686173206265656e207375636365737366756c6c792072656d6f7665642e00302320506172616d6574657273302a206f726967696e20444944482a20706f7274666f6c696f206e756d62657240506f7274666f6c696f52656e616d65640c009c01284964656e7469747949640000f8013c506f7274666f6c696f4e756d626572000095030134506f7274666f6c696f4e616d65000218fc54686520706f7274666f6c696f206964656e746966696564207769746820606e756d6020686173206265656e2072656e616d656420746f20606e616d65602e00302320506172616d6574657273302a206f726967696e20444944482a20706f7274666f6c696f206e756d626572402a20706f7274666f6c696f206e616d653855736572506f7274666f6c696f7308009c01284964656e7469747949640000990301945665633c28506f7274666f6c696f4e756d6265722c20506f7274666f6c696f4e616d65293e000314d4416c6c206e6f6e2d64656661756c7420706f7274666f6c696f206e756d6265727320616e64206e616d6573206f662061204449442e00302320506172616d6574657273302a206f726967696e20444944742a20766563746f72206f66206e756d6265722d6e616d6520706169727364506f7274666f6c696f437573746f6469616e4368616e6765640c009c01284964656e7469747949640000f0012c506f7274666f6c696f496400009c01284964656e746974794964000418f4437573746f6479206f66206120706f7274666f6c696f20686173206265656e20676976656e20746f206120646966666572656e74206964656e7469747900302320506172616d6574657273302a206f726967696e20444944382a20706f7274666f6c696f206964642a20706f7274666f6c696f20637573746f6469616e206469646c46756e64734d6f7665644265747765656e506f7274666f6c696f7314009c01284964656e7469747949640000f0012c506f7274666f6c696f49640000f0012c506f7274666f6c696f49640000a103013c46756e644465736372697074696f6e00008c01304f7074696f6e3c4d656d6f3e0005208c46756e64732068617665206d6f766564206265747765656e20706f7274666f6c696f7300302320506172616d6574657273342a204f726967696e204449442e4c2a20536f7572636520706f7274666f6c696f2e602a2044657374696e6174696f6e20706f7274666f6c696f2e882a205468652074797065206f662066756e64207468617420776173206d6f7665642e742a204f7074696f6e616c206d656d6f20666f7220746865206d6f76652e50507265417070726f766564506f7274666f6c696f0c009c01284964656e7469747949640000f0012c506f7274666f6c696f49640000b0011c41737365744964000618e44120706f7274666f6c696f206861732070726520617070726f7665642074686520726563656976656d656e74206f6620616e2061737365742e00302320506172616d65746572737c2a205b604964656e746974794964605d206f66207468652063616c6c65722e21012a205b60506f7274666f6c696f4964605d20746861742077696c6c20726563656976652061737365747320776974686f7574206578706c696369742061666669726d6174696f6e2e29012a205b6041737365744964605d206f6620746865206173736574207468617420686173206265656e206578656d70742066726f6d206578706c696369742061666669726d6174696f6e2e685265766f6b65507265417070726f766564506f7274666f6c696f0c009c01284964656e7469747949640000f0012c506f7274666f6c696f49640000b0011c41737365744964000718c44120706f7274666f6c696f206861732072656d6f7665642074686520617070726f76616c206f6620616e2061737365742e00302320506172616d65746572737c2a205b604964656e746974794964605d206f66207468652063616c6c65722ed02a205b60506f7274666f6c696f4964605d207468617420686164206974732070726520617070726f76616c207265766f6b65642ef42a205b6041737365744964605d206f6620746865206173736574207468617420686164206974732070726520617070726f76616c207265766f6b65642e7c416c6c6f774964656e74697479546f437265617465506f7274666f6c696f7308009c01284964656e74697479496400009c01284964656e746974794964000814b0416c6c6f7720616e6f74686572206964656e7469747920746f2063726561746520706f7274666f6c696f732e00302320506172616d65746572737c2a205b604964656e746974794964605d206f66207468652063616c6c65722eb82a205b604964656e746974794964605d20616c6c6f77656420746f2063726561746520706f7274666f6c696f732e805265766f6b65437265617465506f7274666f6c696f735065726d697373696f6e08009c01284964656e74697479496400009c01284964656e746974794964000914e85265766f6b6520616e6f74686572206964656e746974696573207065726d697373696f6e20746f2063726561746520706f7274666f6c696f732e00302320506172616d65746572737c2a205b604964656e746974794964605d206f66207468652063616c6c65722ef42a205b604964656e746974794964605d207065726d697373696f6e7320746f2063726561746520706f7274666f6c696f73206973207265766f6b65642e047c54686520604576656e746020656e756d206f6620746869732070616c6c657495030c4c706f6c796d6573685f7072696d6974697665732c6964656e746974795f696434506f7274666f6c696f4e616d650000040038011c5665633c75383e000099030000029d03009d0300000408f8950300a1030c4c706f6c796d6573685f7072696d69746976657324706f7274666f6c696f3c46756e644465736372697074696f6e0001082046756e6769626c6508012061737365745f6964b0011c41737365744964000118616d6f756e7418011c42616c616e63650000002c4e6f6e46756e6769626c650400a50301104e46547300010000a5030c4c706f6c796d6573685f7072696d6974697665730c6e6674104e465473000008012061737365745f6964b0011c4173736574496400010c696473a90301285665633c4e465449643e0000a903000002ad0300ad030c4c706f6c796d6573685f7072696d6974697665730c6e6674144e465449640000040030010c7536340000b1030c4c70616c6c65745f70726f746f636f6c5f6665651870616c6c6574144576656e7404045400010c1846656553657408009c01284964656e746974794964000018011c42616c616e6365000004845468652070726f746f636f6c20666565206f6620616e206f7065726174696f6e2e38436f656666696369656e7453657408009c01284964656e7469747949640000b5030120506f73526174696f000104505468652066656520636f656666696369656e742e28466565436861726765640800000130543a3a4163636f756e744964000018011c42616c616e63650002043046656520636861726765642e047c54686520604576656e746020656e756d206f6620746869732070616c6c6574b503084c706f6c796d6573685f7072696d69746976657320506f73526174696f0000080010010c753332000010010c7533320000b9030c4070616c6c65745f7363686564756c65721870616c6c6574144576656e74040454000128245363686564756c65640801107768656e100144426c6f636b4e756d626572466f723c543e000114696e64657810010c753332000004505363686564756c656420736f6d65207461736b2e2043616e63656c65640801107768656e100144426c6f636b4e756d626572466f723c543e000114696e64657810010c7533320001044c43616e63656c656420736f6d65207461736b2e28446973706174636865640c01107461736bbd0301785461736b416464726573733c426c6f636b4e756d626572466f723c543e3e0001086964c10301404f7074696f6e3c5461736b4e616d653e000118726573756c74510101384469737061746368526573756c74000204544469737061746368656420736f6d65207461736b2e2052657472795365741001107461736bbd0301785461736b416464726573733c426c6f636b4e756d626572466f723c543e3e0001086964c10301404f7074696f6e3c5461736b4e616d653e000118706572696f64100144426c6f636b4e756d626572466f723c543e00011c726574726965730801087538000304a0536574206120726574727920636f6e66696775726174696f6e20666f7220736f6d65207461736b2e38526574727943616e63656c6c65640801107461736bbd0301785461736b416464726573733c426c6f636b4e756d626572466f723c543e3e0001086964c10301404f7074696f6e3c5461736b4e616d653e000404ac43616e63656c206120726574727920636f6e66696775726174696f6e20666f7220736f6d65207461736b2e3c43616c6c556e617661696c61626c650801107461736bbd0301785461736b416464726573733c426c6f636b4e756d626572466f723c543e3e0001086964c10301404f7074696f6e3c5461736b4e616d653e00050429015468652063616c6c20666f72207468652070726f7669646564206861736820776173206e6f7420666f756e6420736f20746865207461736b20686173206265656e2061626f727465642e38506572696f6469634661696c65640801107461736bbd0301785461736b416464726573733c426c6f636b4e756d626572466f723c543e3e0001086964c10301404f7074696f6e3c5461736b4e616d653e0006043d0154686520676976656e207461736b2077617320756e61626c6520746f2062652072656e657765642073696e636520746865206167656e64612069732066756c6c206174207468617420626c6f636b2e2c52657472794661696c65640801107461736bbd0301785461736b416464726573733c426c6f636b4e756d626572466f723c543e3e0001086964c10301404f7074696f6e3c5461736b4e616d653e0007085d0154686520676976656e207461736b2077617320756e61626c6520746f20626520726574726965642073696e636520746865206167656e64612069732066756c6c206174207468617420626c6f636b206f722074686572659c776173206e6f7420656e6f7567682077656967687420746f2072657363686564756c652069742e545065726d616e656e746c794f7665727765696768740801107461736bbd0301785461736b416464726573733c426c6f636b4e756d626572466f723c543e3e0001086964c10301404f7074696f6e3c5461736b4e616d653e000804f054686520676976656e207461736b2063616e206e657665722062652065786563757465642073696e6365206974206973206f7665727765696768742e404167656e6461496e636f6d706c6574650401107768656e100144426c6f636b4e756d626572466f723c543e000904844167656e646120697320696e636f6d706c6574652066726f6d20607768656e602e04304576656e747320747970652ebd0300000408101000c10304184f7074696f6e04045401040108104e6f6e6500000010536f6d650400040000010000c5030c4470616c6c65745f736574746c656d656e741870616c6c6574144576656e740404540001603056656e75654372656174656410009c01284964656e7469747949640000c903011c56656e756549640000cd03013056656e756544657461696c730000d103012456656e756554797065000004ec41206e65772076656e756520686173206265656e206372656174656420286469642c2076656e75655f69642c2064657461696c732c2074797065294c56656e756544657461696c73557064617465640c009c01284964656e7469747949640000c903011c56656e756549640000cd03013056656e756544657461696c730001041501416e206578697374696e672076656e756527732064657461696c7320686173206265656e207570646174656420286469642c2076656e75655f69642c2064657461696c73294056656e756554797065557064617465640c009c01284964656e7469747949640000c903011c56656e756549640000d103012456656e756554797065000204fc416e206578697374696e672076656e75652773207479706520686173206265656e207570646174656420286469642c2076656e75655f69642c2074797065294c496e737472756374696f6e41666669726d65640c009c01284964656e7469747949640000f0012c506f7274666f6c696f4964000079020134496e737472756374696f6e49640003040501416e20696e737472756374696f6e20686173206265656e2061666669726d656420286469642c20706f7274666f6c696f2c20696e737472756374696f6e5f6964295041666669726d6174696f6e57697468647261776e0c009c01284964656e7469747949640000f0012c506f7274666f6c696f4964000079020134496e737472756374696f6e49640004040901416e2061666669726d6174696f6e20686173206265656e2077697468647261776e20286469642c20706f7274666f6c696f2c20696e737472756374696f6e5f6964294c496e737472756374696f6e52656a656374656408009c01284964656e746974794964000079020134496e737472756374696f6e4964000504d8416e20696e737472756374696f6e20686173206265656e2072656a656374656420286469642c20696e737472756374696f6e5f6964293852656365697074436c61696d656418009c01284964656e746974794964000079020134496e737472756374696f6e49640000d50301144c65674964000030010c7536340000000130543a3a4163636f756e7449640000d903015c4f7074696f6e3c526563656970744d657461646174613e0006047d0141207265636569707420686173206265656e20636c61696d656420286469642c20696e737472756374696f6e5f69642c206c65675f69642c20726563656970745f7569642c207369676e65722c2072656365697074206d65746164617461293856656e756546696c746572696e670c009c01284964656e7469747949640000b0011c417373657449640000200110626f6f6c0007046d0156656e75652066696c746572696e6720686173206265656e20656e61626c6564206f722064697361626c656420666f7220616e20617373657420286469642c20417373657449642c2066696c746572696e675f656e61626c6564293456656e756573416c6c6f7765640c009c01284964656e7469747949640000b0011c417373657449640000e10301305665633c56656e756549643e000804e056656e75657320616464656420746f20616c6c6f77206c69737420286469642c20417373657449642c207665633c76656e75655f69643e293456656e756573426c6f636b65640c009c01284964656e7469747949640000b0011c417373657449640000e10301305665633c56656e756549643e000904e056656e75657320616464656420746f20626c6f636b206c69737420286469642c20417373657449642c207665633c76656e75655f69643e29484c65674661696c6564457865637574696f6e0c009c01284964656e746974794964000079020134496e737472756374696f6e49640000d50301144c65674964000a04dc457865637574696f6e206f662061206c6567206661696c656420286469642c20696e737472756374696f6e5f69642c206c65675f6964294c496e737472756374696f6e457865637574656408009c01284964656e746974794964000079020134496e737472756374696f6e4964000b04d8496e737472756374696f6e206578656375746564207375636365737366756c6c79286469642c20696e737472756374696f6e5f6964294456656e7565556e617574686f72697a65640c009c01284964656e7469747949640000b0011c417373657449640000c903011c56656e75654964000c04050156656e7565206e6f742070617274206f662074686520746f6b656e277320616c6c6f77206c69737420286469642c20417373657449642c2076656e75655f696429405363686564756c696e674661696c6564080079020134496e737472756374696f6e4964000068013444697370617463684572726f72000d04805363686564756c696e67206f6620696e737472756374696f6e206661696c732e58496e737472756374696f6e52657363686564756c656408009c01284964656e746974794964000079020134496e737472756374696f6e4964000e086c496e737472756374696f6e2069732072657363686564756c65642e702863616c6c6572204449442c20696e737472756374696f6e5f6964294c56656e75655369676e6572735570646174656410009c01284964656e7469747949640000c903011c56656e756549640000050101445665633c543a3a4163636f756e7449643e0000200110626f6f6c000f044901416e206578697374696e672076656e75652773207369676e65727320686173206265656e207570646174656420286469642c2076656e75655f69642c207369676e6572732c207570646174655f747970652968536574746c656d656e744d616e75616c6c79457865637574656408009c01284964656e746974794964000079020134496e737472756374696f6e496400100498536574746c656d656e74206d616e75616c6c7920657865637574656420286469642c2069642948496e737472756374696f6e4372656174656420009c01284964656e7469747949640000e503013c4f7074696f6e3c56656e756549643e000079020134496e737472756374696f6e49640000e9030184536574746c656d656e74547970653c426c6f636b4e756d626572466f723c543e3e00000d0101444f7074696f6e3c543a3a4d6f6d656e743e00000d0101444f7074696f6e3c543a3a4d6f6d656e743e0000ed0301205665633c4c65673e00008c01304f7074696f6e3c4d656d6f3e0011088841206e657720696e737472756374696f6e20686173206265656e20637265617465645101286469642c2076656e75655f69642c20696e737472756374696f6e5f69642c20736574746c656d656e745f747970652c2074726164655f646174652c2076616c75655f646174652c206c6567732c206d656d6f29684661696c6564546f45786563757465496e737472756374696f6e080079020134496e737472756374696f6e4964000068013444697370617463684572726f72001204784661696c656420746f206578656375746520696e737472756374696f6e2e80496e737472756374696f6e4175746f6d61746963616c6c7941666669726d65640c009c01284964656e7469747949640000f0012c506f7274666f6c696f4964000079020134496e737472756374696f6e4964001308bc416e20696e737472756374696f6e20686173206265656e206175746f6d61746963616c6c792061666669726d65642ed101506172616d65746572733a205b604964656e746974794964605d206f66207468652063616c6c65722c205b60506f7274666f6c696f4964605d206f66207468652072656365697665722c20616e64205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e2e6c4d65646961746f7241666669726d6174696f6e52656365697665640c009c01284964656e746974794964000079020134496e737472756374696f6e496400000d0101444f7074696f6e3c543a3a4d6f6d656e743e001408a8416e20696e737472756374696f6e206861732061666669726d65642062792061206d65646961746f722e5101506172616d65746572733a205b604964656e746974794964605d206f6620746865206d65646961746f7220616e64205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e2e704d65646961746f7241666669726d6174696f6e57697468647261776e08009c01284964656e746974794964000079020134496e737472756374696f6e4964001508f0416e20696e737472756374696f6e2061666669726d6174696f6e20686173206265656e2077697468647261776e2062792061206d65646961746f722e5101506172616d65746572733a205b604964656e746974794964605d206f6620746865206d65646961746f7220616e64205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e2e50496e737472756374696f6e4d65646961746f7273080079020134496e737472756374696f6e496400007d02015042547265655365743c4964656e7469747949643e001608bc416e20696e737472756374696f6e2077697468206d65646961746f727320686173206265656e20637265617465642e6501506172616d65746572733a205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e20616e6420746865205b604964656e746974794964605d206f6620616c6c206d65646961746f72732e44496e737472756374696f6e4c6f636b656408009c01284964656e746974794964000079020134496e737472756374696f6e4964001714e0416e20696e737472756374696f6e20686173206265656e2073756365737366756c6c79206c6f636b656420666f7220657865637574696f6e002c506172616d65746572733ac42d20604964656e746974794964603a20546865205b604964656e746974794964605d206f66207468652063616c6c65722ef02d2060496e737472756374696f6e4964603a20546865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e2e047c54686520604576656e746020656e756d206f6620746869732070616c6c6574c9030c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e741c56656e756549640000040030010c7536340000cd030c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e743056656e756544657461696c730000040038011c5665633c75383e0000d1030c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e742456656e756554797065000110144f7468657200000030446973747269627574696f6e0001000c53746f0002002045786368616e676500030000d5030c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e74144c656749640000040030010c7536340000d90304184f7074696f6e04045401dd030108104e6f6e6500000010536f6d650400dd030000010000dd030c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e743c526563656970744d65746164617461000004000401205b75383b2033325d0000e103000002c90300e50304184f7074696f6e04045401c9030108104e6f6e6500000010536f6d650400c9030000010000e9030c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e7438536574746c656d656e7454797065042c426c6f636b4e756d626572011001104c536574746c654f6e41666669726d6174696f6e00000034536574746c654f6e426c6f636b040010012c426c6f636b4e756d62657200010030536574746c654d616e75616c040010012c426c6f636b4e756d6265720002003c536574746c6541667465724c6f636b00030000ed03000002f10300f1030c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e740c4c656700010c2046756e6769626c6510011873656e646572f0012c506f7274666f6c696f49640001207265636569766572f0012c506f7274666f6c696f496400012061737365745f6964b0011c41737365744964000118616d6f756e7418011c42616c616e63650000002c4e6f6e46756e6769626c650c011873656e646572f0012c506f7274666f6c696f49640001207265636569766572f0012c506f7274666f6c696f49640001106e667473a50301104e465473000100204f6666436861696e10013c73656e6465725f6964656e746974799c01284964656e74697479496400014472656365697665725f6964656e746974799c01284964656e7469747949640001187469636b6572290101185469636b6572000118616d6f756e7418011c42616c616e636500020000f5030c4470616c6c65745f737461746973746963731870616c6c6574144576656e740404540001183853746174547970657341646465640c009c01284964656e7469747949640000b0011c417373657449640000f90301345665633c53746174547970653e00000c685374617420747970657320616464656420746f2061737365742e00842843616c6c6572204449442c20417373657449642c2053746174207479706573294053746174547970657352656d6f7665640c009c01284964656e7469747949640000b0011c417373657449640000f90301345665633c53746174547970653e00010c78537461742074797065732072656d6f7665642066726f6d2061737365742e00842843616c6c6572204449442c20417373657449642c20537461742074797065732944417373657453746174735570646174656410009c01284964656e7469747949640000b0011c417373657449640000fd030120537461745479706500000d04013c5665633c537461745570646174653e00020c50417373657420737461747320757064617465642e00a42843616c6c6572204449442c20417373657449642c205374617420747970652c2055706461746573296853657441737365745472616e73666572436f6d706c69616e63650c009c01284964656e7469747949640000b0011c417373657449640000250401585665633c5472616e73666572436f6e646974696f6e3e00030ca0536574205472616e7366657220636f6d706c69616e63652072756c657320666f722061737365742e00a82843616c6c6572204449442c20417373657449642c205472616e7366657220636f6e646974696f6e7329805472616e73666572436f6e646974696f6e4578656d7074696f6e7341646465640c009c01284964656e74697479496400002d0401685472616e73666572436f6e646974696f6e4578656d70744b657900004901013c5665633c4964656e7469747949643e00040c150141646420604964656e7469747949646073206578656d707420666f72207472616e7366657220636f6e646974696f6e73206d61746368696e67206578656d7074206b65792e00882843616c6c6572204449442c204578656d7074206b65792c20456e74697469657329885472616e73666572436f6e646974696f6e4578656d7074696f6e7352656d6f7665640c009c01284964656e74697479496400002d0401685472616e73666572436f6e646974696f6e4578656d70744b657900004901013c5665633c4964656e7469747949643e00050c210152656d6f766520604964656e7469747949646073206578656d707420666f72207472616e7366657220636f6e646974696f6e73206d61746368696e67206578656d7074206b65792e00882843616c6c6572204449442c204578656d7074206b65792c20456e74697469657329047c54686520604576656e746020656e756d206f6620746869732070616c6c6574f903000002fd0300fd030c4c706f6c796d6573685f7072696d697469766573287374617469737469637320537461745479706500000801386f7065726174696f6e5f7479706501040128537461744f7054797065000130636c61696d5f6973737565720504017c4f7074696f6e3c28436c61696d547970652c204964656e746974794964293e000001040c4c706f6c796d6573685f7072696d697469766573287374617469737469637328537461744f705479706500010814436f756e740000001c42616c616e636500010000050404184f7074696f6e0404540109040108104e6f6e6500000010536f6d65040009040000010000090400000408dd029c000d0400000211040011040c4c706f6c796d6573685f7072696d6974697665732873746174697374696373285374617455706461746500000801106b6579321504012853746174326e644b657900011476616c7565210401304f7074696f6e3c753132383e000015040c4c706f6c796d6573685f7072696d69746976657328737461746973746963732853746174326e644b65790001082c4e6f436c61696d5374617400000014436c61696d04001904012453746174436c61696d0001000019040c4c706f6c796d6573685f7072696d69746976657328737461746973746963732453746174436c61696d00010c28416363726564697465640400200110626f6f6c00000024416666696c696174650400200110626f6f6c000100304a7572697364696374696f6e04001d04014c4f7074696f6e3c436f756e747279436f64653e000200001d0404184f7074696f6e040454011d010108104e6f6e6500000010536f6d6504001d010000010000210404184f7074696f6e04045401180108104e6f6e6500000010536f6d650400180000010000250400000229040029040c4c706f6c796d6573685f7072696d6974697665734c7472616e736665725f636f6d706c69616e6365445472616e73666572436f6e646974696f6e000110404d6178496e766573746f72436f756e74040030010c753634000000504d6178496e766573746f724f776e65727368697004009502012850657263656e7461676500010028436c61696d436f756e7410001904012453746174436c61696d00009c01284964656e746974794964000030010c75363400000d01012c4f7074696f6e3c7536343e00020038436c61696d4f776e65727368697010001904012453746174436c61696d00009c01284964656e74697479496400009502012850657263656e7461676500009502012850657263656e74616765000300002d040c4c706f6c796d6573685f7072696d6974697665734c7472616e736665725f636f6d706c69616e6365685472616e73666572436f6e646974696f6e4578656d70744b657900000c012061737365745f6964b0011c417373657449640001086f7001040128537461744f7054797065000128636c61696d5f74797065310401444f7074696f6e3c436c61696d547970653e0000310404184f7074696f6e04045401dd020108104e6f6e6500000010536f6d650400dd02000001000035040c2870616c6c65745f73746f1870616c6c6574144576656e7404045400011c4446756e64726169736572437265617465641801246167656e745f6469649c01284964656e74697479496404e84964656e74697479206f66207468652065787465726e616c206167656e742077686f2063726561746564207468652066756e647261697365722e01386f66666572696e675f6173736574b0011c4173736574496404bc4173736574206265696e67206f66666572656420666f722073616c6520696e207468652066756e647261697365722e013472616973696e675f6173736574b0011c4173736574496404c84173736574206265696e67206163636570746564206173207061796d656e7420696e207468652066756e647261697365722e013466756e647261697365725f69643904013046756e6472616973657249640494556e69717565206964656e74696669657220666f72207468652066756e647261697365722e013c66756e647261697365725f6e616d653d04013846756e647261697365724e616d65049848756d616e2d7265616461626c65206e616d65206f66207468652066756e647261697365722e012866756e647261697365724104015446756e647261697365723c543a3a4d6f6d656e743e0488436f6d706c6574652066756e6472616973657220636f6e66696775726174696f6e2e000c8841206e65772066756e6472616973657220686173206265656e20637265617465642e0059015b6167656e745f6469642c206f66666572696e675f61737365742c2072616973696e675f61737365742c2066756e647261697365725f69642c2066756e647261697365725f6e616d652c2066756e647261697365725d20496e766573746564180130696e766573746f725f6469649c01284964656e74697479496404644964656e74697479206f662074686520696e766573746f722e01386f66666572696e675f6173736574b0011c4173736574496404584173736574206265696e67207075726368617365642e013466756e647261697365725f69643904013046756e647261697365724964048046756e6472616973657220746861742077617320696e76657374656420696e2e013466756e64696e675f61737365745104013046756e64696e67417373657404b454797065206f662066756e64696e67207573656420286f6e2d636861696e206f72206f66662d636861696e292e013c6f66666572696e675f616d6f756e7418011c42616c616e6365048c416d6f756e74206f66206f66666572696e67206173736574207075726368617365642e013072616973655f616d6f756e7418011c42616c616e63650478416d6f756e74206f662072616973696e67206173736574207370656e742e010cd0416e20696e766573746f72207375636365737366756c6c7920696e76657374656420696e207468652066756e647261697365722e006d015b696e766573746f725f6469642c206f66666572696e675f61737365742c2066756e647261697365725f69642c2066756e64696e675f61737365742c206f66666572696e675f616d6f756e742c2072616973655f616d6f756e745d4046756e6472616973657246726f7a656e0c01246167656e745f6469649c01284964656e74697479496404e04964656e74697479206f66207468652065787465726e616c206167656e742077686f2066726f7a65207468652066756e647261697365722e01386f66666572696e675f6173736574b0011c4173736574496404944173736574206173736f6369617465642077697468207468652066756e647261697365722e013466756e647261697365725f69643904013046756e647261697365724964046c46756e647261697365722074686174207761732066726f7a656e2e020ce4412066756e6472616973657220686173206265656e2066726f7a656e2c2070726576656e74696e67206e657720696e766573746d656e74732e00a85b6167656e745f6469642c206f66666572696e675f61737365742c2066756e647261697365725f69645d4846756e64726169736572556e66726f7a656e0c01246167656e745f6469649c01284964656e74697479496404e84964656e74697479206f66207468652065787465726e616c206167656e742077686f20756e66726f7a65207468652066756e647261697365722e01386f66666572696e675f6173736574b0011c4173736574496404944173736574206173736f6369617465642077697468207468652066756e647261697365722e013466756e647261697365725f69643904013046756e647261697365724964047446756e6472616973657220746861742077617320756e66726f7a656e2e030ce4412066756e6472616973657220686173206265656e20756e66726f7a656e2c20616c6c6f77696e67206e657720696e766573746d656e74732e00a85b6167656e745f6469642c206f66666572696e675f61737365742c2066756e647261697365725f69645d6046756e6472616973657257696e646f774d6f6469666965641c01246167656e745f646964850201204576656e7444696404dc4964656e74697479206f66207468652065787465726e616c206167656e742077686f206d6f646966696564207468652077696e646f772e01386f66666572696e675f6173736574b0011c4173736574496404944173736574206173736f6369617465642077697468207468652066756e647261697365722e013466756e647261697365725f69643904013046756e647261697365724964049446756e647261697365722077686f73652077696e646f7720776173206d6f6469666965642e01246f6c645f7374617274300124543a3a4d6f6d656e74045050726576696f75732073746172742074696d652e011c6f6c645f656e640d0101444f7074696f6e3c543a3a4d6f6d656e743e046c50726576696f757320656e642074696d652028696620616e79292e01246e65775f7374617274300124543a3a4d6f6d656e74043c4e65772073746172742074696d652e011c6e65775f656e640d0101444f7074696f6e3c543a3a4d6f6d656e743e04584e657720656e642074696d652028696620616e79292e040cb4412066756e6472616973657227732074696d652077696e646f7720686173206265656e206d6f6469666965642e0049015b6167656e745f6469642c206f66666572696e675f61737365742c2066756e647261697365725f69642c206f6c645f73746172742c206f6c645f656e642c206e65775f73746172742c206e65775f656e645d4046756e64726169736572436c6f7365640c01246167656e745f6469649c01284964656e74697479496404e44964656e74697479206f66207468652065787465726e616c206167656e742077686f20636c6f736564207468652066756e647261697365722e01386f66666572696e675f6173736574b0011c4173736574496404944173736574206173736f6369617465642077697468207468652066756e647261697365722e013466756e647261697365725f69643904013046756e647261697365724964046c46756e6472616973657220746861742077617320636c6f7365642e050ca4412066756e6472616973657220686173206265656e207065726d616e656e746c7920636c6f7365642e00a85b6167656e745f6469642c206f66666572696e675f61737365742c2066756e647261697365725f69645d8046756e647261697365724f6666636861696e46756e64696e67456e61626c65641001246167656e745f6469649c01284964656e74697479496404f44964656e74697479206f66207468652065787465726e616c206167656e742077686f20656e61626c6564206f66662d636861696e2066756e64696e672e01386f66666572696e675f6173736574b0011c4173736574496404944173736574206173736f6369617465642077697468207468652066756e647261697365722e013466756e647261697365725f69643904013046756e64726169736572496404cc46756e6472616973657220666f72207768696368206f66662d636861696e2066756e64696e672077617320656e61626c65642e01187469636b6572290101185469636b657204945469636b65722073796d626f6c206f6620746865206f66662d636861696e2061737365742e060cd04f66662d636861696e2066756e64696e6720686173206265656e20656e61626c656420666f7220612066756e647261697365722e00c85b6167656e745f6469642c206f66666572696e675f61737365742c2066756e647261697365725f69642c207469636b65725d047c54686520604576656e746020656e756d206f6620746869732070616c6c657439040c4c706f6c796d6573685f7072696d6974697665730c73746f3046756e6472616973657249640000040030010c75363400003d04082870616c6c65745f73746f3846756e647261697365724e616d650000040038011c5665633c75383e00004104082870616c6c65745f73746f2846756e6472616973657204184d6f6d656e740130002c011c63726561746f729c01284964656e7469747949640001486f66666572696e675f706f7274666f6c696ff0012c506f7274666f6c696f49640001386f66666572696e675f6173736574b0011c4173736574496400014472616973696e675f706f7274666f6c696ff0012c506f7274666f6c696f496400013472616973696e675f6173736574b0011c4173736574496400011474696572734504014c5665633c46756e64726169736572546965723e00012076656e75655f6964c903011c56656e7565496400011473746172743001184d6f6d656e7400010c656e640d0101384f7074696f6e3c4d6f6d656e743e0001187374617475734d04014046756e647261697365725374617475730001486d696e696d756d5f696e766573746d656e7418011c42616c616e6365000045040000024904004904082870616c6c65745f73746f3846756e647261697365725469657200000c0114746f74616c18011c42616c616e6365000114707269636518011c42616c616e636500012472656d61696e696e6718011c42616c616e636500004d04082870616c6c65745f73746f4046756e64726169736572537461747573000110104c6976650000001846726f7a656e00010018436c6f7365640002002c436c6f7365644561726c79000300005104082870616c6c65745f73746f3046756e64696e6741737365740001081c4f6e436861696e0400b0011c41737365744964000000204f6666436861696e0400290101185469636b65720001000055040c3c70616c6c65745f74726561737572791870616c6c6574144576656e7404045400010c50547265617375727944697362757273656d656e7410009c01284964656e74697479496400009c01284964656e7469747949640000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e00000c8844697362757273656d656e7420746f206120746172676574204964656e746974792e000101287472656173757279206964656e746974792c20746172676574206964656e746974792c20746172676574207072696d617279206b65792c20616d6f756e742968547265617375727944697362757273656d656e744661696c656410009c01284964656e74697479496400009c01284964656e7469747949640000000130543a3a4163636f756e744964000018013042616c616e63654f663c543e00010ca444697362757273656d656e7420746f206120746172676574204964656e74697479206661696c65642e000101287472656173757279206964656e746974792c20746172676574206964656e746974792c20746172676574207072696d617279206b65792c20616d6f756e74295454726561737572795265696d62757273656d656e7408009c01284964656e746974794964000018013042616c616e63654f663c543e00020c5c5472656173757279207265696d62757273656d656e742e006428736f75726365206964656e746974792c20616d6f756e7429047c54686520604576656e746020656e756d206f6620746869732070616c6c657459040c3870616c6c65745f7574696c6974791870616c6c6574144576656e7404045400011c404261746368496e746572727570746564080114696e64657810010c7533320001146572726f7268013444697370617463684572726f7200000855014261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061734877656c6c20617320746865206572726f722e384261746368436f6d706c65746564000104c84261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e604261746368436f6d706c65746564576974684572726f7273000204b44261746368206f66206469737061746368657320636f6d706c657465642062757420686173206572726f72732e344974656d436f6d706c657465640003041d01412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206e6f206572726f722e284974656d4661696c65640401146572726f7268013444697370617463684572726f720004041101412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206572726f722e30446973706174636865644173040118726573756c74510101384469737061746368526573756c7400050458412063616c6c2077617320646973706174636865642e2452656c6179656454780c012863616c6c65725f6469649c01284964656e746974794964000118746172676574000130543a3a4163636f756e744964000118726573756c74510101384469737061746368526573756c740006085052656c61796564207472616e73616374696f6e2e40504f4c594d4553483a206576656e742e047c54686520604576656e746020656e756d206f6620746869732070616c6c65745d040c2c70616c6c65745f626173651870616c6c6574144576656e740001043c556e65787065637465644572726f720400610401544f7074696f6e3c44697370617463684572726f723e000008e4416e20756e6578706563746564206572726f722068617070656e656420746861742073686f756c6420626520696e766573746967617465642e60544f444f3a20556e757365642c2072656d6f76652069742e047c54686520604576656e746020656e756d206f6620746869732070616c6c6574610404184f7074696f6e04045401680108104e6f6e6500000010536f6d65040068000001000065040c5870616c6c65745f65787465726e616c5f6167656e74731870616c6c6574144576656e740404540001143047726f7570437265617465641000850201204576656e744469640000b0011c41737365744964000041010110414749640000c0015045787472696e7369635065726d697373696f6e7300000c6c416e204167656e742047726f75702077617320637265617465642e00d42843616c6c6572204449442c204147277320417373657449642c20414727732049442c2041472773207065726d697373696f6e73295c47726f75705065726d697373696f6e73557064617465641000850201204576656e744469640000b0011c41737365744964000041010110414749640000c0015045787472696e7369635065726d697373696f6e7300010ca4416e204167656e742047726f75702773207065726d697373696f6e732077617320757064617465642e00e42843616c6c6572204449442c204147277320417373657449642c20414727732049442c2041472773206e6577207065726d697373696f6e7329284167656e7441646465640c00850201204576656e744469640000b0011c4173736574496400003d0101284167656e7447726f757000020c4c416e206167656e74207761732061646465642e00c82843616c6c65722f4167656e74204449442c204167656e74277320417373657449642c204167656e7427732067726f757029304167656e7452656d6f7665640c00850201204576656e744469640000b0011c4173736574496400009c01284964656e74697479496400030c54416e206167656e74207761732072656d6f7665642e00a82843616c6c6572204449442c204167656e74277320417373657449642c204167656e74277320444944293047726f75704368616e6765641000850201204576656e744469640000b0011c4173736574496400009c01284964656e74697479496400003d0101284167656e7447726f757000040c74416e206167656e7427732067726f757020776173206368616e6765642e0019012843616c6c6572204449442c204167656e74277320417373657449642c204167656e742773204449442c20546865206e65772067726f7570206f6620746865206167656e7429047c54686520604576656e746020656e756d206f6620746869732070616c6c657469040c3870616c6c65745f72656c617965721870616c6c6574144576656e740404540001104c417574686f72697a6564506179696e674b65791400850201204576656e744469640000000130543a3a4163636f756e7449640000000130543a3a4163636f756e744964000018011c42616c616e6365000030010c75363400000ccc417574686f72697a6174696f6e20676976656e20666f722060706179696e675f6b65796020746f2060757365725f6b6579602e0001012843616c6c6572204449442c2055736572204b65792c20506179696e67204b65792c20496e697469616c20504f4c5958206c696d69742c204175746820494429444163636570746564506179696e674b65790c00850201204576656e744469640000000130543a3a4163636f756e7449640000000130543a3a4163636f756e74496400010c50416363657074656420706179696e67206b65792e00882843616c6c6572204449442c2055736572204b65792c20506179696e67204b6579294052656d6f766564506179696e674b65790c00850201204576656e744469640000000130543a3a4163636f756e7449640000000130543a3a4163636f756e74496400020c4c52656d6f76656420706179696e67206b65792e00882843616c6c6572204449442c2055736572204b65792c20506179696e67204b6579294455706461746564506f6c79784c696d69741400850201204576656e744469640000000130543a3a4163636f756e7449640000000130543a3a4163636f756e744964000018011c42616c616e6365000018011c42616c616e636500030c505570646174656420706f6c7978206c696d69742e0011012843616c6c6572204449442c2055736572204b65792c20506179696e67204b65792c20504f4c5958206c696d69742c206f6c642072656d61696e696e6720504f4c595829047c54686520604576656e746020656e756d206f6620746869732070616c6c65746d040c4070616c6c65745f636f6e7472616374731870616c6c6574144576656e7404045400012830496e7374616e7469617465640801206465706c6f796572000130543a3a4163636f756e744964000120636f6e7472616374000130543a3a4163636f756e744964000004d8436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e285465726d696e61746564080120636f6e7472616374000130543a3a4163636f756e744964048454686520636f6e7472616374207468617420776173207465726d696e617465642e012c62656e6566696369617279000130543a3a4163636f756e74496404e4546865206163636f756e7420746861742072656365697665642074686520636f6e7472616374732072656d61696e696e672062616c616e6365011868436f6e747261637420686173206265656e2072656d6f7665642e001823204e6f7465003d01546865206f6e6c792077617920666f72206120636f6e747261637420746f2062652072656d6f76656420616e6420656d697474696e672074686973206576656e742069732062792063616c6c696e6744607365616c5f7465726d696e617465602e28436f646553746f7265640c0124636f64655f6861736834011c543a3a486173680001306465706f7369745f68656c6418013042616c616e63654f663c543e00012075706c6f61646572000130543a3a4163636f756e744964000204b4436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e3c436f6e7472616374456d6974746564080120636f6e7472616374000130543a3a4163636f756e744964049054686520636f6e7472616374207468617420656d697474656420746865206576656e742e01106461746138011c5665633c75383e0835014461746120737570706c6965642062792074686520636f6e74726163742e204d657461646174612067656e65726174656420647572696e6720636f6e747261637420636f6d70696c6174696f6e5c6973206e656564656420746f206465636f64652069742e03049c4120637573746f6d206576656e7420656d69747465642062792074686520636f6e74726163742e2c436f646552656d6f7665640c0124636f64655f6861736834011c543a3a486173680001406465706f7369745f72656c656173656418013042616c616e63654f663c543e00011c72656d6f766572000130543a3a4163636f756e744964000404ac4120636f6465207769746820746865207370656369666965642068617368207761732072656d6f7665642e4c436f6e7472616374436f6465557064617465640c0120636f6e7472616374000130543a3a4163636f756e744964048c54686520636f6e7472616374207468617420686173206265656e20757064617465642e01346e65775f636f64655f6861736834011c543a3a4861736804b04e657720636f646520686173682074686174207761732073657420666f722074686520636f6e74726163742e01346f6c645f636f64655f6861736834011c543a3a48617368048c50726576696f757320636f64652068617368206f662074686520636f6e74726163742e0504784120636f6e7472616374277320636f64652077617320757064617465642e1843616c6c656408011863616c6c6572710401244f726967696e3c543e04745468652063616c6c6572206f66207468652060636f6e7472616374602e0120636f6e7472616374000130543a3a4163636f756e744964047454686520636f6e74726163742074686174207761732063616c6c65642e061c11014120636f6e7472616374207761732063616c6c656420656974686572206279206120706c61696e206163636f756e74206f7220616e6f7468657220636f6e74726163742e001823204e6f7465003101506c65617365206b65657020696e206d696e642074686174206c696b6520616c6c206576656e74732074686973206973206f6e6c7920656d697474656420666f72207375636365737366756c290163616c6c732e20546869732069732062656361757365206f6e206661696c75726520616c6c2073746f72616765206368616e67657320696e636c7564696e67206576656e74732061726530726f6c6c6564206261636b2e3844656c656761746543616c6c6564080120636f6e7472616374000130543a3a4163636f756e74496408210154686520636f6e7472616374207468617420706572666f726d6564207468652064656c65676174652063616c6c20616e642068656e636520696e2077686f736520636f6e74657874707468652060636f64655f68617368602069732065786563757465642e0124636f64655f6861736834012c436f6465486173683c543e049c54686520636f646520686173682074686174207761732064656c65676174652063616c6c65642e071c9c4120636f6e74726163742064656c65676174652063616c6c6564206120636f646520686173682e001823204e6f7465003101506c65617365206b65657020696e206d696e642074686174206c696b6520616c6c206576656e74732074686973206973206f6e6c7920656d697474656420666f72207375636365737366756c290163616c6c732e20546869732069732062656361757365206f6e206661696c75726520616c6c2073746f72616765206368616e67657320696e636c7564696e67206576656e74732061726530726f6c6c6564206261636b2e8053746f726167654465706f7369745472616e73666572726564416e6448656c640c011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000804f4536f6d652066756e64732068617665206265656e207472616e7366657272656420616e642068656c642061732073746f72616765206465706f7369742e9053746f726167654465706f7369745472616e73666572726564416e6452656c65617365640c011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000904f8536f6d652073746f72616765206465706f7369742066756e64732068617665206265656e207472616e7366657272656420616e642072656c65617365642e047c54686520604576656e746020656e756d206f6620746869732070616c6c65747104084070616c6c65745f636f6e747261637473184f726967696e040454017504010810526f6f74000000185369676e65640400000130543a3a4163636f756e7449640001000075040c60706f6c796d6573685f72756e74696d655f646576656c6f701c72756e74696d651c52756e74696d650000000079040c48706f6c796d6573685f636f6e7472616374731870616c6c6574144576656e740404540001083841706948617368557064617465640c007d04010c417069000081040130436861696e56657273696f6e000034012c436f6465486173683c543e000008f0456d6974746564207768656e206120636f6e74726163742073746172747320737570706f7274696e672061206e65772041504920757067726164652e2101436f6e7461696e7320746865205b60417069605d2c205b60436861696e56657273696f6e605d2c20616e642074686520627974657320666f722074686520636f646520686173682e34534352756e74696d6543616c6c0800000130543a3a4163636f756e74496400008504012c45787472696e7369634964000108bc456d6974746564207768656e206120636f6e74726163742063616c6c7320696e746f207468652072756e74696d652e2901436f6e7461696e7320746865206163636f756e74206964207365742062792074686520636f6e7472616374206f776e657220616e6420746865205b6045787472696e7369634964605d2e047c54686520604576656e746020656e756d206f6620746869732070616c6c65747d040848706f6c796d6573685f636f6e7472616374730c41706900000801106465736348011c5b75383b20345d0001146d616a6f7210010c753332000081040848706f6c796d6573685f636f6e74726163747330436861696e56657273696f6e0000080130737065635f76657273696f6e10010c75333200012874785f76657273696f6e10010c753332000085040c48706f6c796d6573685f636f6e7472616374733c636861696e5f657874656e73696f6e2c45787472696e736963496400000800080108753800000801087538000089040c3c70616c6c65745f707265696d6167651870616c6c6574144576656e7404045400010c144e6f7465640401106861736834011c543a3a48617368000004684120707265696d61676520686173206265656e206e6f7465642e245265717565737465640401106861736834011c543a3a48617368000104784120707265696d61676520686173206265656e207265717565737465642e1c436c65617265640401106861736834011c543a3a486173680002046c4120707265696d616765206861732062656e20636c65617265642e047c54686520604576656e746020656e756d206f6620746869732070616c6c65748d040c2870616c6c65745f6e66741870616c6c6574144576656e74040454000108504e6674436f6c6c656374696f6e437265617465640c009c01284964656e7469747949640000b0011c4173736574496400009104013c4e4654436f6c6c656374696f6e4964000004b4456d6974746564207768656e2061206e6577206e667420636f6c6c656374696f6e20697320637265617465642e4c4e4654506f7274666f6c696f5570646174656414009c01284964656e7469747949640000a50301104e46547300006d02014c4f7074696f6e3c506f7274666f6c696f49643e00006d02014c4f7074696f6e3c506f7274666f6c696f49643e000071020154506f7274666f6c696f557064617465526561736f6e00010cdc456d6974746564207768656e204e4654732077657265206973737565642c2072656465656d6564206f72207472616e736665727265642e0502436f6e7461696e7320746865205b604964656e746974794964605d206f66207468652072656365697665722f6973737565722f72656465656d65722c20746865205b604e465473605d2c20746865205b60506f7274666f6c696f4964605d206f662074686520736f757263652c20746865205b60506f7274666f6c696f4964605dd46f66207468652064657374696e6174696f6e20616e6420746865205b60506f7274666f6c696f557064617465526561736f6e605d2e047c54686520604576656e746020656e756d206f6620746869732070616c6c657491040c4c706f6c796d6573685f7072696d6974697665730c6e66743c4e4654436f6c6c656374696f6e49640000040030010c753634000095040c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c6574144576656e7404045400011838536f6c7574696f6e53746f7265640c011c636f6d707574659904013c456c656374696f6e436f6d707574650001186f726967696e350101504f7074696f6e3c543a3a4163636f756e7449643e000130707265765f656a6563746564200110626f6f6c00001cb44120736f6c7574696f6e207761732073746f72656420776974682074686520676976656e20636f6d707574652e00510154686520606f726967696e6020696e6469636174657320746865206f726967696e206f662074686520736f6c7574696f6e2e20496620606f726967696e602069732060536f6d65284163636f756e74496429602c59017468652073746f72656420736f6c7574696f6e20776173207375626d697474656420696e20746865207369676e65642070686173652062792061206d696e657220776974682074686520604163636f756e744964602e25014f74686572776973652c2074686520736f6c7574696f6e207761732073746f7265642065697468657220647572696e672074686520756e7369676e6564207068617365206f722062794d0160543a3a466f7263654f726967696e602e205468652060626f6f6c6020697320607472756560207768656e20612070726576696f757320736f6c7574696f6e2077617320656a656374656420746f206d616b6548726f6f6d20666f722074686973206f6e652e44456c656374696f6e46696e616c697a656408011c636f6d707574659904013c456c656374696f6e436f6d7075746500011473636f72659d040134456c656374696f6e53636f7265000104190154686520656c656374696f6e20686173206265656e2066696e616c697a65642c20776974682074686520676976656e20636f6d7075746174696f6e20616e642073636f72652e38456c656374696f6e4661696c656400020c4c416e20656c656374696f6e206661696c65642e0001014e6f74206d7563682063616e20626520736169642061626f757420776869636820636f6d7075746573206661696c656420696e207468652070726f636573732e20526577617264656408011c6163636f756e740001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e74496400011476616c756518013042616c616e63654f663c543e0003042501416e206163636f756e7420686173206265656e20726577617264656420666f72207468656972207369676e6564207375626d697373696f6e206265696e672066696e616c697a65642e1c536c617368656408011c6163636f756e740001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e74496400011476616c756518013042616c616e63654f663c543e0004042101416e206163636f756e7420686173206265656e20736c617368656420666f72207375626d697474696e6720616e20696e76616c6964207369676e6564207375626d697373696f6e2e4450686173655472616e736974696f6e65640c011066726f6da104016050686173653c426c6f636b4e756d626572466f723c543e3e000108746fa104016050686173653c426c6f636b4e756d626572466f723c543e3e000114726f756e6410010c753332000504b85468657265207761732061207068617365207472616e736974696f6e20696e206120676976656e20726f756e642e047c54686520604576656e746020656e756d206f6620746869732070616c6c65749904089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173653c456c656374696f6e436f6d707574650001141c4f6e436861696e000000185369676e656400010020556e7369676e65640002002046616c6c6261636b00030024456d657267656e6379000400009d04084473705f6e706f735f656c656374696f6e7334456c656374696f6e53636f726500000c01346d696e696d616c5f7374616b6518013c457874656e64656442616c616e636500012473756d5f7374616b6518013c457874656e64656442616c616e636500014473756d5f7374616b655f7371756172656418013c457874656e64656442616c616e63650000a104089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651450686173650408426e011001100c4f6666000000185369676e656400010020556e7369676e65640400a504012828626f6f6c2c20426e2900020024456d657267656e637900030000a50400000408201000a90408306672616d655f73797374656d14506861736500010c384170706c7945787472696e736963040010010c7533320000003046696e616c697a6174696f6e00010038496e697469616c697a6174696f6e00020000ad040000023400b104000002bd0300b50408306672616d655f73797374656d584c61737452756e74696d6555706772616465496e666f0000080130737065635f76657273696f6eb904014c636f6465633a3a436f6d706163743c7533323e000124737065635f6e616d65bd040144436f773c277374617469632c207374723e0000b9040000061000bd04040c436f7704045401cc000400cc000000c10408306672616d655f73797374656d60436f646555706772616465417574686f72697a6174696f6e0404540000080124636f64655f6861736834011c543a3a48617368000134636865636b5f76657273696f6e200110626f6f6c0000c5040c306672616d655f73797374656d1870616c6c65741043616c6c04045400012c1872656d61726b04011872656d61726b38011c5665633c75383e00000c684d616b6520736f6d65206f6e2d636861696e2072656d61726b2e008843616e20626520657865637574656420627920657665727920606f726967696e602e387365745f686561705f7061676573040114706167657330010c753634000104f853657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040110636f646538011c5665633c75383e0002046453657420746865206e65772072756e74696d6520636f64652e5c7365745f636f64655f776974686f75745f636865636b73040110636f646538011c5665633c75383e000310190153657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e0051014e6f746520746861742072756e74696d652075706772616465732077696c6c206e6f742072756e20696620746869732069732063616c6c656420776974682061206e6f742d696e6372656173696e6720737065632076657273696f6e212c7365745f73746f726167650401146974656d73c90401345665633c4b657956616c75653e0004046853657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f726167650401106b657973d10401205665633c4b65793e000504744b696c6c20736f6d65206974656d732066726f6d2073746f726167652e2c6b696c6c5f70726566697808011870726566697838010c4b657900011c7375626b65797310010c75333200061011014b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e0039012a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e6465723d0174686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e4472656d61726b5f776974685f6576656e7404011872656d61726b38011c5665633c75383e000704a44d616b6520736f6d65206f6e2d636861696e2072656d61726b20616e6420656d6974206576656e742e44617574686f72697a655f75706772616465040124636f64655f6861736834011c543a3a486173680009106101417574686f72697a6520616e207570677261646520746f206120676976656e2060636f64655f686173686020666f72207468652072756e74696d652e205468652072756e74696d652063616e20626520737570706c696564186c617465722e007c546869732063616c6c20726571756972657320526f6f74206f726967696e2e80617574686f72697a655f757067726164655f776974686f75745f636865636b73040124636f64655f6861736834011c543a3a48617368000a206101417574686f72697a6520616e207570677261646520746f206120676976656e2060636f64655f686173686020666f72207468652072756e74696d652e205468652072756e74696d652063616e20626520737570706c696564186c617465722e005d015741524e494e473a205468697320617574686f72697a657320616e207570677261646520746861742077696c6c2074616b6520706c61636520776974686f757420616e792073616665747920636865636b732c20666f7259016578616d706c652074686174207468652073706563206e616d652072656d61696e73207468652073616d6520616e642074686174207468652076657273696f6e206e756d62657220696e637265617365732e204e6f74f07265636f6d6d656e64656420666f72206e6f726d616c207573652e205573652060617574686f72697a655f757067726164656020696e73746561642e007c546869732063616c6c20726571756972657320526f6f74206f726967696e2e606170706c795f617574686f72697a65645f75706772616465040110636f646538011c5665633c75383e000b24550150726f766964652074686520707265696d616765202872756e74696d652062696e617279292060636f64656020666f7220616e2075706772616465207468617420686173206265656e20617574686f72697a65642e00490149662074686520617574686f72697a6174696f6e20726571756972656420612076657273696f6e20636865636b2c20746869732063616c6c2077696c6c20656e73757265207468652073706563206e616d65e872656d61696e7320756e6368616e67656420616e6420746861742074686520737065632076657273696f6e2068617320696e637265617365642e005901446570656e64696e67206f6e207468652072756e74696d65277320604f6e536574436f64656020636f6e66696775726174696f6e2c20746869732066756e6374696f6e206d6179206469726563746c79206170706c791101746865206e65772060636f64656020696e207468652073616d6520626c6f636b206f7220617474656d707420746f207363686564756c652074686520757067726164652e0060416c6c206f726967696e732061726520616c6c6f7765642e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ec904000002cd0400cd0400000408383800d1040000023800d5040c306672616d655f73797374656d186c696d69747330426c6f636b5765696768747300000c0128626173655f626c6f636b2801185765696768740001246d61785f626c6f636b2801185765696768740001247065725f636c617373d90401845065724469737061746368436c6173733c57656967687473506572436c6173733e0000d9040c346672616d655f737570706f7274206469737061746368405065724469737061746368436c61737304045401dd04000c01186e6f726d616cdd0401045400012c6f7065726174696f6e616cdd040104540001246d616e6461746f7279dd040104540000dd040c306672616d655f73797374656d186c696d6974733c57656967687473506572436c6173730000100138626173655f65787472696e7369632801185765696768740001346d61785f65787472696e736963e10401384f7074696f6e3c5765696768743e0001246d61785f746f74616ce10401384f7074696f6e3c5765696768743e0001207265736572766564e10401384f7074696f6e3c5765696768743e0000e10404184f7074696f6e04045401280108104e6f6e6500000010536f6d650400280000010000e5040c306672616d655f73797374656d186c696d6974732c426c6f636b4c656e677468000004010c6d6178e90401545065724469737061746368436c6173733c7533323e0000e9040c346672616d655f737570706f7274206469737061746368405065724469737061746368436c6173730404540110000c01186e6f726d616c1001045400012c6f7065726174696f6e616c100104540001246d616e6461746f7279100104540000ed04082873705f776569676874733c52756e74696d65446257656967687400000801107265616430010c753634000114777269746530010c7536340000f104082873705f76657273696f6e3852756e74696d6556657273696f6e0000200124737065635f6e616d65bd040144436f773c277374617469632c207374723e000124696d706c5f6e616d65bd040144436f773c277374617469632c207374723e000144617574686f72696e675f76657273696f6e10010c753332000130737065635f76657273696f6e10010c753332000130696d706c5f76657273696f6e10010c75333200011061706973f504011c4170697356656300014c7472616e73616374696f6e5f76657273696f6e10010c75333200013873797374656d5f76657273696f6e08010875380000f504040c436f7704045401f904000400f904000000f904000002fd0400fd040000040801051000010500000308000000080005050c306672616d655f73797374656d1870616c6c6574144572726f720404540001243c496e76616c6964537065634e616d650000081101546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e685370656356657273696f6e4e65656473546f496e63726561736500010841015468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e744661696c6564546f4578747261637452756e74696d6556657273696f6e00020cec4661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e0009014569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e4c4e6f6e44656661756c74436f6d706f73697465000304fc537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e3c4e6f6e5a65726f526566436f756e74000404350154686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e3043616c6c46696c7465726564000504d0546865206f726967696e2066696c7465722070726576656e74207468652063616c6c20746f20626520646973706174636865642e6c4d756c7469426c6f636b4d6967726174696f6e734f6e676f696e67000604550141206d756c74692d626c6f636b206d6967726174696f6e206973206f6e676f696e6720616e642070726576656e7473207468652063757272656e7420636f64652066726f6d206265696e67207265706c616365642e444e6f7468696e67417574686f72697a6564000704584e6f207570677261646520617574686f72697a65642e30556e617574686f72697a656400080494546865207375626d697474656420636f6465206973206e6f7420617574686f72697a65642e046c4572726f7220666f72207468652053797374656d2070616c6c657409050c4c626f756e6465645f636f6c6c656374696f6e73407765616b5f626f756e6465645f766563385765616b426f756e646564566563080454010d05045300000400150501185665633c543e00000d05000004081105300011050c4473705f636f6e73656e7375735f626162650c617070185075626c69630000040004013c737232353531393a3a5075626c6963000015050000020d05001905084873705f636f6e73656e7375735f736c6f747310536c6f740000040030010c75363400001d050c4473705f636f6e73656e7375735f626162651c64696765737473504e657874436f6e66696744657363726970746f720001040856310801046321050128287536342c2075363429000134616c6c6f7765645f736c6f747325050130416c6c6f776564536c6f7473000100002105000004083030002505084473705f636f6e73656e7375735f6261626530416c6c6f776564536c6f747300010c305072696d617279536c6f7473000000745072696d617279416e645365636f6e64617279506c61696e536c6f74730001006c5072696d617279416e645365636f6e64617279565246536c6f74730002000029050c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401040453000004002d0501185665633c543e00002d050000020400310504184f7074696f6e0404540135050108104e6f6e6500000010536f6d6504003505000001000035050c4473705f636f6e73656e7375735f626162651c646967657374732450726544696765737400010c1c5072696d6172790400390501405072696d617279507265446967657374000100385365636f6e64617279506c61696e04004105015c5365636f6e64617279506c61696e507265446967657374000200305365636f6e646172795652460400450501545365636f6e646172795652465072654469676573740003000039050c4473705f636f6e73656e7375735f626162651c64696765737473405072696d61727950726544696765737400000c013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f7419050110536c6f740001347672665f7369676e61747572653d0501305672665369676e617475726500003d05101c73705f636f72651c737232353531390c767266305672665369676e617475726500000801287072655f6f75747075740401305672665072654f757470757400011470726f6f661502012056726650726f6f66000041050c4473705f636f6e73656e7375735f626162651c646967657374735c5365636f6e64617279506c61696e507265446967657374000008013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f7419050110536c6f74000045050c4473705f636f6e73656e7375735f626162651c64696765737473545365636f6e6461727956524650726544696765737400000c013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f7419050110536c6f740001347672665f7369676e61747572653d0501305672665369676e617475726500004905084473705f636f6e73656e7375735f62616265584261626545706f6368436f6e66696775726174696f6e00000801046321050128287536342c2075363429000134616c6c6f7765645f736c6f747325050130416c6c6f776564536c6f747300004d050c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e646564566563080454015105045300000400550501185665633c543e0000510500000408301000550500000251050059050c2c70616c6c65745f626162651870616c6c65741043616c6c04045400010c4c7265706f72745f65717569766f636174696f6e08014865717569766f636174696f6e5f70726f6f665d050190426f783c45717569766f636174696f6e50726f6f663c486561646572466f723c543e3e3e00013c6b65795f6f776e65725f70726f6f6665050140543a3a4b65794f776e657250726f6f6600001009015265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667905017468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f660d01616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c306265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e656408014865717569766f636174696f6e5f70726f6f665d050190426f783c45717569766f636174696f6e50726f6f663c486561646572466f723c543e3e3e00013c6b65795f6f776e65725f70726f6f6665050140543a3a4b65794f776e657250726f6f6600012009015265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667905017468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f660d01616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c306265207265706f727465642e0d01546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c791501626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c2061732073756368150169662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e247265706f727465722e48706c616e5f636f6e6669675f6368616e6765040118636f6e6669671d0501504e657874436f6e66696744657363726970746f720002105d01506c616e20616e2065706f636820636f6e666967206368616e67652e205468652065706f636820636f6e666967206368616e6765206973207265636f7264656420616e642077696c6c20626520656e6163746564206f6e5101746865206e6578742063616c6c20746f2060656e6163745f65706f63685f6368616e6765602e2054686520636f6e6669672077696c6c20626520616374697661746564206f6e652065706f63682061667465722e59014d756c7469706c652063616c6c7320746f2074686973206d6574686f642077696c6c207265706c61636520616e79206578697374696e6720706c616e6e656420636f6e666967206368616e6765207468617420686164546e6f74206265656e20656e6163746564207965742e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e5d05084873705f636f6e73656e7375735f736c6f74734445717569766f636174696f6e50726f6f660818486561646572016105084964011105001001206f6666656e646572110501084964000110736c6f7419050110536c6f7400013066697273745f686561646572610501184865616465720001347365636f6e645f6865616465726105011848656164657200006105102873705f72756e74696d651c67656e65726963186865616465721848656164657208184e756d62657201101048617368000014012c706172656e745f68617368340130486173683a3a4f75747075740001186e756d626572b90401184e756d62657200012873746174655f726f6f74340130486173683a3a4f757470757400013c65787472696e736963735f726f6f74340130486173683a3a4f75747075740001186469676573743c011844696765737400006505082873705f73657373696f6e3c4d656d6265727368697050726f6f6600000c011c73657373696f6e10013053657373696f6e496e646578000128747269655f6e6f646573d10401305665633c5665633c75383e3e00013c76616c696461746f725f636f756e7410013856616c696461746f72436f756e74000069050c2c70616c6c65745f626162651870616c6c6574144572726f7204045400011060496e76616c696445717569766f636174696f6e50726f6f660000043101416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c69644b65794f776e65727368697050726f6f66000104310141206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f727400020415014120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e50496e76616c6964436f6e66696775726174696f6e0003048c5375626d697474656420636f6e66696775726174696f6e20697320696e76616c69642e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e6d050c4070616c6c65745f74696d657374616d701870616c6c65741043616c6c0404540001040c73657404010c6e6f772c0124543a3a4d6f6d656e7400004c54536574207468652063757272656e742074696d652e005501546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed470686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e0041015468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e7420737065636966696564206279685b60436f6e6669673a3a4d696e696d756d506572696f64605d2e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f4e6f6e655f2e0051015468697320646973706174636820636c617373206973205f4d616e6461746f72795f20746f20656e73757265206974206765747320657865637574656420696e2074686520626c6f636b2e204265206177617265510174686174206368616e67696e672074686520636f6d706c6578697479206f6620746869732063616c6c20636f756c6420726573756c742065786861757374696e6720746865207265736f757263657320696e206184626c6f636b20746f206578656375746520616e79206f746865722063616c6c732e0034232320436f6d706c657869747931012d20604f2831296020284e6f7465207468617420696d706c656d656e746174696f6e73206f6620604f6e54696d657374616d7053657460206d75737420616c736f20626520604f283129602955012d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f283129602062656361757365206f6620604469645570646174653a3a74616b656020696e402020606f6e5f66696e616c697a656029d42d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f736574602e204d75737420626520604f283129602e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e71050000040c0018200075050c3870616c6c65745f696e64696365731870616c6c65741043616c6c04045400011814636c61696d040114696e64657810013c543a3a4163636f756e74496e6465780000309841737369676e20616e2070726576696f75736c7920756e61737369676e656420696e6465782e00dc5061796d656e743a20604465706f736974602069732072657365727665642066726f6d207468652073656e646572206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00f02d2060696e646578603a2074686520696e64657820746f20626520636c61696d65642e2054686973206d757374206e6f7420626520696e207573652e0090456d6974732060496e64657841737369676e656460206966207375636365737366756c2e0034232320436f6d706c6578697479242d20604f283129602e207472616e7366657208010c6e6577790501504163636f756e7449644c6f6f6b75704f663c543e000114696e64657810013c543a3a4163636f756e74496e6465780001305d0141737369676e20616e20696e64657820616c7265616479206f776e6564206279207468652073656e64657220746f20616e6f74686572206163636f756e742e205468652062616c616e6365207265736572766174696f6eb86973206566666563746976656c79207472616e7366657272656420746f20746865206e6577206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0025012d2060696e646578603a2074686520696e64657820746f2062652072652d61737369676e65642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e5d012d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e0090456d6974732060496e64657841737369676e656460206966207375636365737366756c2e0034232320436f6d706c6578697479242d20604f283129602e1066726565040114696e64657810013c543a3a4163636f756e74496e646578000230944672656520757020616e20696e646578206f776e6564206279207468652073656e6465722e005d015061796d656e743a20416e792070726576696f7573206465706f73697420706c6163656420666f722074686520696e64657820697320756e726573657276656420696e207468652073656e646572206163636f756e742e005501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d757374206f776e2074686520696e6465782e000d012d2060696e646578603a2074686520696e64657820746f2062652066726565642e2054686973206d757374206265206f776e6564206279207468652073656e6465722e0084456d6974732060496e646578467265656460206966207375636365737366756c2e0034232320436f6d706c6578697479242d20604f283129602e38666f7263655f7472616e736665720c010c6e6577790501504163636f756e7449644c6f6f6b75704f663c543e000114696e64657810013c543a3a4163636f756e74496e646578000118667265657a65200110626f6f6c0003345501466f72636520616e20696e64657820746f20616e206163636f756e742e205468697320646f65736e277420726571756972652061206465706f7369742e2049662074686520696e64657820697320616c7265616479e868656c642c207468656e20616e79206465706f736974206973207265696d62757273656420746f206974732063757272656e74206f776e65722e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00a42d2060696e646578603a2074686520696e64657820746f206265202872652d2961737369676e65642e5d012d20606e6577603a20746865206e6577206f776e6572206f662074686520696e6465782e20546869732066756e6374696f6e2069732061206e6f2d6f7020696620697420697320657175616c20746f2073656e6465722e41012d2060667265657a65603a2069662073657420746f206074727565602c2077696c6c20667265657a652074686520696e64657820736f2069742063616e6e6f74206265207472616e736665727265642e0090456d6974732060496e64657841737369676e656460206966207375636365737366756c2e0034232320436f6d706c6578697479242d20604f283129602e18667265657a65040114696e64657810013c543a3a4163636f756e74496e6465780004304101467265657a6520616e20696e64657820736f2069742077696c6c20616c7761797320706f696e7420746f207468652073656e646572206163636f756e742e205468697320636f6e73756d657320746865206465706f7369742e005901546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206861766520616c6e6f6e2d66726f7a656e206163636f756e742060696e646578602e00ac2d2060696e646578603a2074686520696e64657820746f2062652066726f7a656e20696e20706c6163652e0088456d6974732060496e64657846726f7a656e60206966207375636365737366756c2e0034232320436f6d706c6578697479242d20604f283129602e30706f6b655f6465706f736974040114696e64657810013c543a3a4163636f756e74496e6465780005289c506f6b6520746865206465706f73697420726573657276656420666f7220616e20696e6465782e005901546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e6420746865207369676e696e67206163636f756e74206d757374206861766520616c6e6f6e2d66726f7a656e206163636f756e742060696e646578602e005901546865207472616e73616374696f6e20666565732069732077616976656420696620746865206465706f736974206973206368616e67656420616674657220706f6b696e672f7265636f6e73696465726174696f6e2e00fc2d2060696e646578603a2074686520696e6465782077686f7365206465706f73697420697320746f20626520706f6b65642f7265636f6e736964657265642e008c456d69747320604465706f736974506f6b656460206966207375636365737366756c2e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e79050c2873705f72756e74696d65306d756c746961646472657373304d756c74694164647265737308244163636f756e7449640100304163636f756e74496e6465780110011408496404000001244163636f756e74496400000014496e6465780400b90401304163636f756e74496e6465780001000c526177040038011c5665633c75383e0002002441646472657373333204000401205b75383b2033325d000300244164647265737332300400f90101205b75383b2032305d000400007d050c3870616c6c65745f696e64696365731870616c6c6574144572726f720404540001142c4e6f7441737369676e65640000048c54686520696e64657820776173206e6f7420616c72656164792061737369676e65642e204e6f744f776e6572000104a454686520696e6465782069732061737369676e656420746f20616e6f74686572206163636f756e742e14496e5573650002047054686520696e64657820776173206e6f7420617661696c61626c652e2c4e6f745472616e73666572000304c854686520736f7572636520616e642064657374696e6174696f6e206163636f756e747320617265206964656e746963616c2e245065726d616e656e74000404d054686520696e646578206973207065726d616e656e7420616e64206d6179206e6f742062652066726565642f6368616e6765642e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e81050c4c626f756e6465645f636f6c6c656374696f6e73407765616b5f626f756e6465645f766563385765616b426f756e6465645665630804540185050453000004008d0501185665633c543e000085050c3c70616c6c65745f62616c616e6365731474797065732c42616c616e63654c6f636b041c42616c616e63650118000c01086964010501384c6f636b4964656e746966696572000118616d6f756e7418011c42616c616e636500011c726561736f6e738905011c526561736f6e73000089050c3c70616c6c65745f62616c616e6365731474797065731c526561736f6e7300010c0c466565000000104d6973630001000c416c6c000200008d0500000285050091050c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e646564566563080454019505045300000400990501185665633c543e000095050c3c70616c6c65745f62616c616e6365731474797065732c52657365727665446174610844526573657276654964656e7469666965720101051c42616c616e6365011800080108696401050144526573657276654964656e746966696572000118616d6f756e7418011c42616c616e6365000099050000029505009d050c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401a105045300000400b50501185665633c543e0000a10514346672616d655f737570706f72741874726169747318746f6b656e73106d697363204964416d6f756e740808496401a5051c42616c616e63650118000801086964a50501084964000118616d6f756e7418011c42616c616e63650000a5050c60706f6c796d6573685f72756e74696d655f646576656c6f701c72756e74696d654452756e74696d65486f6c64526561736f6e00010c1c5374616b696e670400a905016870616c6c65745f7374616b696e673a3a486f6c64526561736f6e00110024436f6e7472616374730400ad05017070616c6c65745f636f6e7472616374733a3a486f6c64526561736f6e002e0020507265696d6167650400b105016c70616c6c65745f707265696d6167653a3a486f6c64526561736f6e00300000a905103870616c6c65745f7374616b696e671870616c6c65741870616c6c657428486f6c64526561736f6e0001041c5374616b696e6700000000ad050c4070616c6c65745f636f6e7472616374731870616c6c657428486f6c64526561736f6e00010860436f646555706c6f61644465706f736974526573657276650000005453746f726167654465706f7369745265736572766500010000b1050c3c70616c6c65745f707265696d6167651870616c6c657428486f6c64526561736f6e00010420507265696d61676500000000b505000002a10500b9050c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401bd05045300000400c10501185665633c543e0000bd0514346672616d655f737570706f72741874726169747318746f6b656e73106d697363204964416d6f756e74080849640101051c42616c616e63650118000801086964010501084964000118616d6f756e7418011c42616c616e63650000c105000002bd0500c5050c3c70616c6c65745f62616c616e6365731870616c6c65741043616c6c080454000449000128507472616e736665725f616c6c6f775f646561746808011064657374790501504163636f756e7449644c6f6f6b75704f663c543e00011476616c7565c9010128543a3a42616c616e636500001cd45472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e003501607472616e736665725f616c6c6f775f6465617468602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e11014966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b06f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e001501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e38666f7263655f7472616e736665720c0118736f75726365790501504163636f756e7449644c6f6f6b75704f663c543e00011064657374790501504163636f756e7449644c6f6f6b75704f663c543e00011476616c7565c9010128543a3a42616c616e6365000208610145786163746c7920617320607472616e736665725f616c6c6f775f6465617468602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74446d6179206265207370656369666965642e4c7472616e736665725f6b6565705f616c69766508011064657374790501504163636f756e7449644c6f6f6b75704f663c543e00011476616c7565c9010128543a3a42616c616e6365000318590153616d6520617320746865205b607472616e736665725f616c6c6f775f6465617468605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74606b696c6c20746865206f726967696e206163636f756e742e00e8393925206f66207468652074696d6520796f752077616e74205b607472616e736665725f616c6c6f775f6465617468605d20696e73746561642e00f05b607472616e736665725f616c6c6f775f6465617468605d3a207374727563742e50616c6c65742e68746d6c236d6574686f642e7472616e73666572307472616e736665725f616c6c08011064657374790501504163636f756e7449644c6f6f6b75704f663c543e0001286b6565705f616c697665200110626f6f6c00043c05015472616e736665722074686520656e74697265207472616e7366657261626c652062616c616e63652066726f6d207468652063616c6c6572206163636f756e742e0059014e4f54453a20546869732066756e6374696f6e206f6e6c7920617474656d70747320746f207472616e73666572205f7472616e7366657261626c655f2062616c616e6365732e2054686973206d65616e7320746861746101616e79206c6f636b65642c2072657365727665642c206f72206578697374656e7469616c206465706f7369747320287768656e20606b6565705f616c6976656020697320607472756560292c2077696c6c206e6f742062655d017472616e7366657272656420627920746869732066756e6374696f6e2e20546f20656e73757265207468617420746869732066756e6374696f6e20726573756c747320696e2061206b696c6c6564206163636f756e742c4501796f75206d69676874206e65656420746f207072657061726520746865206163636f756e742062792072656d6f76696e6720616e79207265666572656e636520636f756e746572732c2073746f72616765406465706f736974732c206574632e2e2e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205369676e65642e00a02d206064657374603a2054686520726563697069656e74206f6620746865207472616e736665722e59012d20606b6565705f616c697665603a204120626f6f6c65616e20746f2064657465726d696e652069662074686520607472616e736665725f616c6c60206f7065726174696f6e2073686f756c642073656e6420616c6c4d0120206f66207468652066756e647320746865206163636f756e74206861732c2063617573696e67207468652073656e646572206163636f756e7420746f206265206b696c6c6564202866616c7365292c206f72590120207472616e736665722065766572797468696e6720657863657074206174206c6561737420746865206578697374656e7469616c206465706f7369742c2077686963682077696c6c2067756172616e74656520746f9c20206b656570207468652073656e646572206163636f756e7420616c697665202874727565292e3c666f7263655f756e7265736572766508010c77686f790501504163636f756e7449644c6f6f6b75704f663c543e000118616d6f756e74180128543a3a42616c616e636500050cb0556e7265736572766520736f6d652062616c616e63652066726f6d2061207573657220627920666f7263652e006c43616e206f6e6c792062652063616c6c656420627920524f4f542e40757067726164655f6163636f756e747304010c77686f050101445665633c543a3a4163636f756e7449643e0006207055706772616465206120737065636966696564206163636f756e742e00742d20606f726967696e603a204d75737420626520605369676e6564602e902d206077686f603a20546865206163636f756e7420746f2062652075706772616465642e005501546869732077696c6c20776169766520746865207472616e73616374696f6e20666565206966206174206c6561737420616c6c2062757420313025206f6620746865206163636f756e7473206e656564656420746f410162652075706772616465642e20285765206c657420736f6d65206e6f74206861766520746f206265207570677261646564206a75737420696e206f7264657220746f20616c6c6f7720666f722074686558706f73736962696c697479206f6620636875726e292e44666f7263655f7365745f62616c616e636508010c77686f790501504163636f756e7449644c6f6f6b75704f663c543e0001206e65775f66726565c9010128543a3a42616c616e636500080cac5365742074686520726567756c61722062616c616e6365206f66206120676976656e206163636f756e742e00b0546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e6c666f7263655f61646a7573745f746f74616c5f69737375616e6365080124646972656374696f6ec905014c41646a7573746d656e74446972656374696f6e00011464656c7461c9010128543a3a42616c616e6365000914b841646a7573742074686520746f74616c2069737375616e636520696e20612073617475726174696e67207761792e00fc43616e206f6e6c792062652063616c6c656420627920726f6f7420616e6420616c77617973206e65656473206120706f736974697665206064656c7461602e002423204578616d706c65106275726e08011476616c7565c9010128543a3a42616c616e63650001286b6565705f616c697665200110626f6f6c000a1cfc4275726e2074686520737065636966696564206c697175696420667265652062616c616e63652066726f6d20746865206f726967696e206163636f756e742e002501496620746865206f726967696e2773206163636f756e7420656e64732075702062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c7409016f6620746865206275726e20616e6420606b6565705f616c697665602069732066616c73652c20746865206163636f756e742077696c6c206265207265617065642e005101556e6c696b652073656e64696e672066756e647320746f2061205f6275726e5f20616464726573732c207768696368206d6572656c79206d616b6573207468652066756e647320696e61636365737369626c652c21017468697320606275726e60206f7065726174696f6e2077696c6c2072656475636520746f74616c2069737375616e63652062792074686520616d6f756e74205f6275726e65645f2e487472616e736665725f776974685f6d656d6f0c011064657374790501504163636f756e7449644c6f6f6b75704f663c543e00011476616c7565c9010128543a3a42616c616e63650001106d656d6f8c013c4f7074696f6e3c543a3a4d656d6f3e002858d45472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e000501607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e11014966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b06f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e001501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e0034232320436f6d706c657869747961012d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f7220696e70757420636f6e66696794202074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e31012d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c6578382020636f6d7075746174696f6e2e004852656c617465642066756e6374696f6e733a004d0120202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e290120202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365cc2020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e5d0120202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765722060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e636564602e5d0120202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616c20636865636bdc202020207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ec9050c3c70616c6c65745f62616c616e6365731474797065734c41646a7573746d656e74446972656374696f6e00010820496e63726561736500000020446563726561736500010000cd050c3c70616c6c65745f62616c616e6365731870616c6c6574144572726f7208045400044900013c3856657374696e6742616c616e63650000049c56657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75652e544c69717569646974795265737472696374696f6e73000104c84163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c2e4c496e73756666696369656e7442616c616e63650002047842616c616e636520746f6f206c6f7720746f2073656e642076616c75652e484578697374656e7469616c4465706f736974000304ec56616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f7369742e34457870656e646162696c697479000404905472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e742e5c4578697374696e6756657374696e675363686564756c65000504cc412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742e2c446561644163636f756e740006048c42656e6566696369617279206163636f756e74206d757374207072652d65786973742e3c546f6f4d616e795265736572766573000704b84e756d626572206f66206e616d65642072657365727665732065786365656420604d61785265736572766573602e30546f6f4d616e79486f6c6473000804f84e756d626572206f6620686f6c647320657863656564206056617269616e74436f756e744f663c543a3a52756e74696d65486f6c64526561736f6e3e602e38546f6f4d616e79467265657a6573000904984e756d626572206f6620667265657a65732065786365656420604d6178467265657a6573602e4c49737375616e63654465616374697661746564000a0401015468652069737375616e63652063616e6e6f74206265206d6f6469666965642073696e636520697420697320616c72656164792064656163746976617465642e2444656c74615a65726f000b04645468652064656c74612063616e6e6f74206265207a65726f2e584c6f636b4964656e7469666965724e6f74466f756e64000c04644c6f636b204964656e746966696572206e6f7420466f756e64204f766572666c6f77000d044042616c616e6365204f766572666c6f77404d61784c6f636b734578636565646564000e04484d6178204c6f636b73204578636565646564048054686520604572726f726020656e756d206f6620746869732070616c6c65742ed1050c3473705f61726974686d657469632c66697865645f706f696e742446697865645531323800000400180110753132380000d505086870616c6c65745f7472616e73616374696f6e5f7061796d656e742052656c6561736573000108245631416e6369656e7400000008563200010000d9050c6870616c6c65745f7472616e73616374696f6e5f7061796d656e741870616c6c65741043616c6c040454000104407365745f64697361626c655f6665657304011476616c7565200110626f6f6c000000040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732edd050c4c706f6c796d6573685f7072696d697469766573206964656e74697479244469645265636f726404244163636f756e74496401000004012c7072696d6172795f6b6579350101444f7074696f6e3c4163636f756e7449643e0000e10500000408e505e90500e5050c3c70616c6c65745f6964656e746974791474797065732c436c61696d3173744b657900000801187461726765749c01284964656e746974794964000128636c61696d5f74797065dd020124436c61696d547970650000e9050c3c70616c6c65745f6964656e746974791474797065732c436c61696d326e644b657900000801186973737565729c01284964656e74697479496400011473636f7065250101344f7074696f6e3c53636f70653e0000ed050c4c706f6c796d6573685f7072696d697469766573347365636f6e646172795f6b6579244b65795265636f726404244163636f756e7449640100010c285072696d6172794b657904009c01284964656e746974794964000000305365636f6e646172794b657904009c01284964656e746974794964000100444d756c74695369675369676e65724b657904000001244163636f756e74496400020000f105000004089c0000f50500000408f9053000f9050c4c706f6c796d6573685f7072696d697469766573347365636f6e646172795f6b6579245369676e61746f727904244163636f756e74496401000108204964656e7469747904009c01284964656e7469747949640000001c4163636f756e7404000001244163636f756e74496400010000fd050c4c706f6c796d6573685f7072696d69746976657334617574686f72697a6174696f6e34417574686f72697a6174696f6e08244163636f756e7449640100184d6f6d656e74013000140148617574686f72697a6174696f6e5f6461746139010170417574686f72697a6174696f6e446174613c4163636f756e7449643e000134617574686f72697a65645f62799c01284964656e7469747949640001186578706972790d0101384f7074696f6e3c4d6f6d656e743e00011c617574685f696430010c753634000114636f756e7410010c75333200000106000004089c30000506083c70616c6c65745f6964656e746974791c56657273696f6e00000400080108753800000906000004089c9c000d060c3c70616c6c65745f6964656e746974791870616c6c65741043616c6c040454000160406364645f72656769737465725f6469640801387461726765745f6163636f756e74000130543a3a4163636f756e7449640001387365636f6e646172795f6b657973a0017c5665633c5365636f6e646172794b65793c543a3a4163636f756e7449643e3e000020b8526567697374657220607461726765745f6163636f756e746020776974682061206e6577204964656e746974792e002423204661696c75726545012d20606f726967696e602068617320746f206265206120616374697665204344442070726f76696465722e20496e616374697665204344442070726f7669646572732063616e6e6f7420616464206e65771c636c61696d732e5d012d20607461726765745f6163636f756e746020287072696d617279206b6579206f6620746865206e6577204964656e74697479292063616e206265206c696e6b656420746f206a757374206f6e6520616e64206f6e6c79346f6e65206964656e746974792ef42d2045787465726e616c207365636f6e64617279206b6579732063616e206265206c696e6b656420746f206a757374206f6e65206964656e746974792e54696e76616c69646174655f6364645f636c61696d730c010c6364649c01284964656e74697479496400013064697361626c655f66726f6d300124543a3a4d6f6d656e740001186578706972790d0101444f7074696f6e3c543a3a4d6f6d656e743e0001102101496e76616c69646174657320616e7920636c61696d2067656e6572617465642062792060636464602066726f6d206064697361626c655f66726f6d602074696d657374616d70732e009c596f752063616e20616c736f20646566696e6520616e2065787069726174696f6e2074696d652c6d0177686963682077696c6c20696e76616c696461746520616c6c20636c61696d732067656e657261746564206279207468617420606364646020616e642072656d6f766520697420617320434444206d656d6265722067726f75702e486163636570745f7072696d6172795f6b6579080140726f746174696f6e5f617574685f696430010c7536340001506f7074696f6e616c5f6364645f617574685f69640d01012c4f7074696f6e3c7536343e000234650143616c6c2074686973207769746820746865206e6577207072696d617279206b65792e20427920696e766f6b696e672074686973206d6574686f642c2063616c6c6572206163636570747320617574686f72697a6174696f6e6501746f206265636f6d6520746865206e6577207072696d617279206b6579206f66207468652069737375696e67206964656e746974792e20496620612043444420736572766963652070726f766964657220617070726f766564250174686973206368616e676520286f722074686973206973206e6f74207265717569726564292c207072696d617279206b6579206f66207468652044494420697320757064617465642e005d015468652063616c6c657220286e6577207072696d617279206b657929206d757374206265206569746865722061207365636f6e64617279206b6579206f66207468652069737375696e67206964656e746974792c206f7264756e6c696e6b656420746f20616e79206964656e746974792e005d01446966666572732066726f6d20726f746174655f7072696d6172795f6b65795f746f5f7365636f6e6461727920696e20746861742069742077696c6c20756e6c696e6b20746865206f6c64207072696d617279206b6579a4696e7374656164206f66206c656176696e672069742061732061207365636f6e64617279206b65792e002c2320417267756d656e74731d012a20606f776e65725f617574685f69646020417574686f72697a6174696f6e2066726f6d20746865206f776e65722077686f20696e6974696174656420746865206368616e6765e42a20606364645f617574685f69646020417574686f72697a6174696f6e2066726f6d20612043444420736572766963652070726f7669646572986368616e67655f6364645f726571756972656d656e745f666f725f6d6b5f726f746174696f6e040134617574685f7265717569726564200110626f6f6c00031435015365742069662043444420617574686f72697a6174696f6e20697320726571756972656420666f72207570646174696e67207072696d617279206b6579206f6620616e206964656e746974792e7843616c6c61626c652076696120726f6f742028676f7665726e616e636529002c2320417267756d656e7473cc2a2060617574685f7265717569726564602043444420417574686f72697a6174696f6e207265717569726564206f72206e6f74506a6f696e5f6964656e746974795f61735f6b657904011c617574685f696430010c753634000404904a6f696e20616e206964656e746974792061732061207365636f6e64617279206b65792e546c656176655f6964656e746974795f61735f6b65790005048c4c6561766520746865207365636f6e64617279206b65792773206964656e746974792e246164645f636c61696d0c01187461726765749c01284964656e746974794964000114636c61696d11010114436c61696d0001186578706972790d0101444f7074696f6e3c543a3a4d6f6d656e743e00060cc4416464732061206e657720636c61696d207265636f7264206f7220656469747320616e206578697374696e67206f6e652e00a84f6e6c792063616c6c6564206279206469645f6973737565722773207365636f6e64617279206b65792e307265766f6b655f636c61696d0801187461726765749c01284964656e746974794964000114636c61696d11010114436c61696d000704944d61726b73207468652073706563696669656420636c61696d206173207265766f6b65642e54667265657a655f7365636f6e646172795f6b657973000810c449742064697361626c657320616c6c207365636f6e64617279206b657973206174206064696460206964656e746974792e002023204572726f7273005c756e667265657a655f7365636f6e646172795f6b657973000904dc52652d656e61626c657320616c6c207365636f6e64617279206b657973206f66207468652063616c6c65722773206964656e746974792e446164645f617574686f72697a6174696f6e0c0118746172676574f905015c5369676e61746f72793c543a3a4163636f756e7449643e000110646174613901017c417574686f72697a6174696f6e446174613c543a3a4163636f756e7449643e0001186578706972790d0101444f7074696f6e3c543a3a4d6f6d656e743e000a04584164647320616e20617574686f72697a6174696f6e2e5072656d6f76655f617574686f72697a6174696f6e0c0118746172676574f905015c5369676e61746f72793c543a3a4163636f756e7449643e00011c617574685f696430010c753634000140617574685f6973737565725f70617973200110626f6f6c000b086452656d6f76657320616e20617574686f72697a6174696f6e2e7d01605f617574685f6973737565725f70617973602064657465726d696e657320776865746865722074686520697373756572206f662074686520617574686f7269736174696f6e207061797320746865207472616e73616374696f6e206665654067635f6164645f6364645f636c61696d0401187461726765749c01284964656e746974794964000c044501417373756d696e6720746869732069732065786563757465642062792074686520474320766f74696e67206d616a6f726974792c20616464732061206e65772063646420636c61696d207265636f72642e4c67635f7265766f6b655f6364645f636c61696d0401187461726765749c01284964656e746974794964000d046901417373756d696e6720746869732069732065786563757465642062792074686520474320766f74696e67206d616a6f726974792c2072656d6f76657320616e206578697374696e672063646420636c61696d207265636f72642e547265766f6b655f636c61696d5f62795f696e6465780c01187461726765749c01284964656e746974794964000128636c61696d5f74797065dd020124436c61696d5479706500011473636f7065250101344f7074696f6e3c53636f70653e000e10f5015265766f6b6573206120737065636966696320636c61696d207573696e6720697473205b436c61696d20556e6971756520496e6465785d282f70616c6c65745f6964656e746974792f696e6465782e68746d6c23636c61696d2d756e697175652d696e6465782920636f6d706f7365642062792060746172676574602c6860636c61696d5f74797065602c20616e64206073636f7065602e000501506c65617365206e6f7465207468617420606f726967696e60206d7573742062652074686520697373756572206f66207468652074617267657420636c61696d2e7c726f746174655f7072696d6172795f6b65795f746f5f7365636f6e6461727908011c617574685f696430010c7536340001506f7074696f6e616c5f6364645f617574685f69640d01012c4f7074696f6e3c7536343e000f38650143616c6c2074686973207769746820746865206e6577207072696d617279206b65792e20427920696e766f6b696e672074686973206d6574686f642c2063616c6c6572206163636570747320617574686f72697a6174696f6e6501746f206265636f6d6520746865206e6577207072696d617279206b6579206f66207468652069737375696e67206964656e746974792e20496620612043444420736572766963652070726f766964657220617070726f766564290174686973206368616e67652c20286f722074686973206973206e6f74207265717569726564292c207072696d617279206b6579206f66207468652044494420697320757064617465642e005d015468652063616c6c657220286e6577207072696d617279206b657929206d757374206265206569746865722061207365636f6e64617279206b6579206f66207468652069737375696e67206964656e746974792c206f7264756e6c696e6b656420746f20616e79206964656e746974792e006101446966666572732066726f6d206163636570745f7072696d6172795f6b657920696e20746861742069742077696c6c206c6561766520746865206f6c64207072696d617279206b65792061732061207365636f6e6461727985016b6579207769746820746865207065726d697373696f6e732073706563696669656420696e2074686520636f72726573706f6e64696e6720526f746174655072696d6172794b6579546f5365636f6e6461727920617574686f72697a6174696f6ea4696e7374656164206f6620756e6c696e6b696e6720746865206f6c64207072696d617279206b65792e002c2320417267756d656e74731d012a20606f776e65725f617574685f69646020417574686f72697a6174696f6e2066726f6d20746865206f776e65722077686f20696e6974696174656420746865206368616e6765e42a20606364645f617574685f69646020417574686f72697a6174696f6e2066726f6d20612043444420736572766963652070726f7669646572946164645f7365636f6e646172795f6b6579735f776974685f617574686f72697a6174696f6e08013c6164646974696f6e616c5f6b6579731106019c5665633c5365636f6e646172794b657957697468417574683c543a3a4163636f756e7449643e3e000128657870697265735f6174300124543a3a4d6f6d656e74001034b041646473207365636f6e64617279206b65797320746f20746172676574206964656e7469747920606964602e0039014b65797320617265206469726563746c7920616464656420746f206964656e7469747920626563617573652065616368206f66207468656d2068617320616e20617574686f72697a6174696f6e2e00302320417267756d656e74733a0901202020202d20606f726967696e60207768696368206d75737420626520746865207072696d617279206b6579206f6620746865206964656e7469747920606964602ed4202020202d206069646020746f207768696368206e6577207365636f6e64617279206b6579732077696c6c2062652061646465642ed8202020202d20606164646974696f6e616c5f6b6579736020776869636820696e636c75646573207365636f6e64617279206b6579732c090120202020202020636f75706c6564207769746820617574686f72697a6174696f6e20646174612c20746f2061646420746f20746172676574206964656e746974792e002023204572726f7273ac202020202d2043616e206f6e6c792063616c6c6564206279207072696d617279206b6579206f776e65722ed0202020202d204b6579732073686f756c642062652061626c6520746f206c696e6b656420746f20616e79206964656e746974792e747365745f7365636f6e646172795f6b65795f7065726d697373696f6e7308010c6b6579000130543a3a4163636f756e7449640001147065726d73a8012c5065726d697373696f6e7300110cc853657473207065726d697373696f6e7320666f7220616e20737065636966696320607461726765745f6b657960206b65792e0035014f6e6c7920746865207072696d617279206b6579206f6620616e206964656e746974792069732061626c6520746f20736574207365636f6e64617279206b6579207065726d697373696f6e732e5472656d6f76655f7365636f6e646172795f6b6579730401386b6579735f746f5f72656d6f7665050101445665633c543a3a4163636f756e7449643e001214d452656d6f76657320737065636966696564207365636f6e64617279206b657973206f662061204449442069662070726573656e742e002023204572726f727300cc5468652065787472696e7369632063616e206f6e6c792063616c6c6564206279207072696d617279206b6579206f776e65722e6872656769737465725f637573746f6d5f636c61696d5f74797065040108747938011c5665633c75383e0013186c526567697374657220637573746f6d20636c61696d20747970652e002023204572726f727349012a2060437573746f6d436c61696d54797065416c7265616479457869737473602054686520747970652074686174206973206265696e67207265676973746572656420616c7265616479206578697374732ed42a2060436f756e7465724f766572666c6f776020437573746f6d436c61696d54797065496420686173206f766572666c6f7765642ec82a2060546f6f4c6f6e6760205468652074797065206265696e67207265676973746572656420697320746f6f206c616e672e646364645f72656769737465725f6469645f776974685f6364640c01387461726765745f6163636f756e74000130543a3a4163636f756e7449640001387365636f6e646172795f6b657973a0017c5665633c5365636f6e646172794b65793c543a3a4163636f756e7449643e3e0001186578706972790d0101444f7074696f6e3c543a3a4d6f6d656e743e0014205901526567697374657220607461726765745f6163636f756e746020776974682061206e6577204964656e7469747920616e6420697373756520612043444420636c61696d2077697468206120626c616e6b204364644964002423204661696c75726545012d20606f726967696e602068617320746f206265206120616374697665204344442070726f76696465722e20496e616374697665204344442070726f7669646572732063616e6e6f7420616464206e65771c636c61696d732e5d012d20607461726765745f6163636f756e746020287072696d617279206b6579206f6620746865206e6577204964656e74697479292063616e206265206c696e6b656420746f206a757374206f6e6520616e64206f6e6c79346f6e65206964656e746974792ef42d2045787465726e616c207365636f6e64617279206b6579732063616e206265206c696e6b656420746f206a757374206f6e65206964656e746974792e546372656174655f6368696c645f6964656e746974790401347365636f6e646172795f6b6579000130543a3a4163636f756e74496400153019014372656174652061206368696c64206964656e7469747920616e64206d616b652074686520607365636f6e646172795f6b6579602069742773207072696d617279206b65792e00c44f6e6c7920746865207072696d617279206b65792063616e20637265617465206368696c64206964656e7469746965732e002c2320417267756d656e747365012d20607365636f6e646172795f6b65796020746865207365636f6e64617279206b657920746861742077696c6c206265636f6d6520746865207072696d617279206b6579206f6620746865206e6577206964656e746974792e002023204572726f727305012d20604b65794e6f74416c6c6f77656460206f6e6c7920746865207072696d617279206b65792063616e206372656174652061206e6577206964656e746974792e4d012d20604e6f74415369676e6572602074686520607365636f6e646172795f6b657960206973206e6f742061207365636f6e64617279206b6579206f66207468652063616c6c65722773206964656e746974792e6d012d20604163636f756e744b657949734265696e6755736564602074686520607365636f6e646172795f6b6579602063616e277420626520756e6c696e6b65642066726f6d20697427732063757272656e74206964656e746974792ea1012d206049734368696c644964656e7469747960207468652063616c6c65722773206964656e7469747920697320616c72656164792061206368696c64206964656e7469747920616e642063616e277420637265617465206368696c64206964656e7469746965732e5c6372656174655f6368696c645f6964656e7469746965730801286368696c645f6b6579731d0601b85665633c4372656174654368696c644964656e7469747957697468417574683c543a3a4163636f756e7449643e3e000128657870697265735f6174300124543a3a4d6f6d656e7400163c684372656174652061206368696c64206964656e7469746965732e002501546865206e6577207072696d617279206b657920666f722065616368206368696c64206964656e746974792077696c6c206e65656420746f207369676e20286f66662d636861696e2944616e20617574686f72697a6174696f6e2e00c44f6e6c7920746865207072696d617279206b65792063616e20637265617465206368696c64206964656e7469746965732e002c2320417267756d656e747349012d20606368696c645f6b6579736020746865206b65797320746861742077696c6c206265636f6d65207072696d617279206b657973206f66207468656972206f776e206368696c64206964656e746974792e002023204572726f727305012d20604b65794e6f74416c6c6f77656460206f6e6c7920746865207072696d617279206b65792063616e206372656174652061206e6577206964656e746974792e0d012d2060416c72656164794c696e6b656460206f6e65206f6620746865206b65797320697320616c7265616479206c696e6b656420746f20616e206964656e746974792ef02d20604475706c69636174654b657960206f6e65206f6620746865206b65797320697320696e636c75646564206d756c7469706c652074696d65732ea1012d206049734368696c644964656e7469747960207468652063616c6c65722773206964656e7469747920697320616c72656164792061206368696c64206964656e7469747920616e642063616e277420637265617465206368696c64206964656e7469746965732e54756e6c696e6b5f6368696c645f6964656e746974790401246368696c645f6469649c01284964656e74697479496400172cc8556e6c696e6b2061206368696c64206964656e746974792066726f6d206974277320706172656e74206964656e746974792e0045014f6e6c7920746865207072696d617279206b6579206f662074686520706172656e74206f72206368696c64206964656e7469746965732063616e20756e6c696e6b20746865206964656e7469746965732e002c2320417267756d656e747311012d20606368696c645f6469646020746865206368696c64206964656e7469747920746f20756e6c696e6b2066726f6d2069747320706172656e74206964656e746974792e002023204572726f7273a1012d20604b65794e6f74416c6c6f77656460206f6e6c7920746865207072696d617279206b6579206f66206569746865722074686520706172656e74206f72206368696c64206964656e746974792063616e20756e6c696e6b20746865206964656e7469746965732e35012d20604e6f506172656e744964656e746974796020746865206964656e7469747920606368696c645f6469646020646f65736e27742068617665206120706172656e74206964656e746974792e59012d20604e6f74506172656e744f724368696c644964656e7469747960207468652063616c6c65722773206964656e746974792069736e27742074686520706172656e74206f72206368696c64206964656e746974792e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e110600000215060015061064706f6c796d6573685f636f6d6d6f6e5f7574696c697469657318747261697473206964656e74697479505365636f6e646172794b6579576974684175746804244163636f756e7449640100000801347365636f6e646172795f6b6579a4015c5365636f6e646172794b65793c4163636f756e7449643e000138617574685f7369676e6174757265190601104835313200001906083c7072696d69746976655f7479706573104835313200000400150201205b75383b2036345d00001d0600000221060021061064706f6c796d6573685f636f6d6d6f6e5f7574696c697469657318747261697473206964656e746974796c4372656174654368696c644964656e74697479576974684175746804244163636f756e74496401000008010c6b65790001244163636f756e744964000138617574685f7369676e61747572651906011048353132000025060c3c70616c6c65745f6964656e746974791870616c6c6574144572726f7204045400019834416c72656164794c696e6b6564000004dc4f6e65207365636f6e64617279206f72207072696d617279206b65792063616e206f6e6c792062656c6f6e6720746f206f6e65204449443c4d697373696e674964656e746974790001047843616c6c6572206973206d697373696e6720616e206964656e746974792e30556e617574686f72697a6564000204bc5369676e61746f7279206973206e6f742070726520617574686f72697a656420627920746865206964656e7469747944496e76616c69644163636f756e744b6579000304a84163636f756e742049642063616e6e6f74206265206578747261637465642066726f6d207369676e65725c556e417574686f72697a656443646450726f76696465720004049c4f6e6c792043444420736572766963652070726f7669646572732061726520616c6c6f7765642e74496e76616c6964417574686f72697a6174696f6e46726f6d4f776e6572000504a0416e20696e76616c696420617574686f72697a6174696f6e2066726f6d20746865206f776e65722e8c496e76616c6964417574686f72697a6174696f6e46726f6d43646450726f7669646572000604bc416e20696e76616c696420617574686f72697a6174696f6e2066726f6d20746865204344442070726f76696465722e644e6f7443646450726f76696465724174746573746174696f6e000704b84174746573746174696f6e20776173206e6f7420627920612043444420736572766963652070726f76696465722e70417574686f72697a6174696f6e734e6f74466f7253616d6544696473000804a0417574686f72697a6174696f6e7320617265206e6f7420666f72207468652073616d65204449442e4c4469644d757374416c726561647945786973740009046c54686520444944206d75737420616c72656164792065786973742e50417574686f72697a6174696f6e45787069726564000a049c546865206f6666636861696e20617574686f72697a6174696f6e2068617320657870697265642e385461726765744861734e6f436464000b0480546865207461726765742044494420686173206e6f2076616c6964204344442e6c417574686f72697a6174696f6e4861734265656e5265766f6b6564000c04a8417574686f72697a6174696f6e20686173206265656e206578706c696369746c79207265766f6b65642e74496e76616c6964417574686f72697a6174696f6e5369676e6174757265000d048c416e20696e76616c696420617574686f72697a6174696f6e207369676e61747572652e344b65794e6f74416c6c6f776564000e04d454686973206b6579206973206e6f7420616c6c6f77656420746f2065786563757465206120676976656e206f7065726174696f6e2e344e6f745072696d6172794b6579000f0461014f6e6c7920746865207072696d617279206b657920697320616c6c6f77656420746f207265766f6b6520616e204964656e74697479205369676e61746f7279206f66662d636861696e20617574686f72697a6174696f6e2e3c446964446f65734e6f7445786973740010045c5468652044494420646f6573206e6f742065786973742e40446964416c72656164794578697374730011045c5468652044494420616c7265616479206578697374732e785365636f6e646172794b657973436f6e7461696e5072696d6172794b6579001204ac546865207365636f6e64617279206b65797320636f6e7461696e20746865207072696d617279206b65792e444661696c6564546f436861726765466565001304a0436f756c646e2774206368617267652066656520666f7220746865207472616e73616374696f6e2e284e6f74415369676e6572001404d85369676e6572206973206e6f742061207365636f6e64617279206b6579206f66207468652070726f7669646564206964656e746974796c43616e6e6f744465636f64655369676e65724163636f756e744964001504150143616e6e6f7420636f6e7665727420612060543a3a4163636f756e7449646020746f2060416e795369676e61747572653a3a5369676e65723a3a4163636f756e744964602e544163636f756e744b657949734265696e6755736564001604d0546865206163636f756e74206b6579206973206265696e6720757365642c2069742063616e277420626520756e6c696e6b65642e48437573746f6d53636f7065546f6f4c6f6e670017086c4120637573746f6d2073636f706520697320746f6f206c6f6e672e9c49742063616e206174206d6f737420626520603332602063686172616374657273206c6f6e672e70437573746f6d436c61696d54797065416c7265616479457869737473001804f454686520637573746f6d20636c61696d207479706520747279696e6720746f206265207265676973746572656420616c7265616479206578697374732e6c437573746f6d436c61696d54797065446f65734e6f7445786973740019049454686520637573746f6d20636c61696d207479706520646f6573206e6f742065786973742e44436c61696d446f65734e6f744578697374001a0454436c61696d20646f6573206e6f742065786973742e3c49734368696c644964656e74697479001b0451014964656e7469747920697320616c72656164792061206368696c64206f6620616e206f74686572206964656e746974792c2063616e277420637265617465206772616e642d6368696c64206964656e746974792e404e6f506172656e744964656e74697479001c04b0546865204964656e7469747920646f65736e27742068617665206120706172656e74206964656e746974792e604e6f74506172656e744f724368696c644964656e74697479001d04bc5468652063616c6c6572206973206e6f742074686520706172656e74206f72206368696c64206964656e746974792e304475706c69636174654b6579001e04a45468652073616d65206b65792077617320696e636c75646564206d756c7469706c652074696d65732e744578636570744e6f74416c6c6f776564466f7245787472696e73696373001f04e043616e6e6f742075736520457863657074207768656e2073706563696679696e672065787472696e736963207065726d697373696f6e732e6845786365656465644e756d6265724f66476976656e4175746873002004d04d6178696d756d206e756d626572206f6620676976656e20617574686f72697a6174696f6e73207761732065786365656465642e50426164417574686f72697a6174696f6e547970650021046d015468652065787472696e736963206578706563746564206120646966666572656e742060417574686f72697a6174696f6e5479706560207468616e2077686174207468652060646174612e617574685f747970652829602069732e50496e76616c6964417574686f72697a6174696f6e002208110141757468206964656e74696669656420627920616e2060617574685f69646020666f72206120676976656e20607461726765746020646f6573206e6f742065786973742e1901546865206074617267657460206d696768742062652077726f6e67206f72207468652060617574685f69646020776173206e65766572206372656174656420617420616c6c2e6c556e617574686f72697a656443616c6c657246726f7a656e4469640023045446726f7a656e207365636f6e64617279206b65792e7c556e617574686f72697a656443616c6c65724469644d697373696e674364640024047c54686520444944206973206d697373696e6720612043444420636c61696d2e90556e617574686f72697a656443616c6c65724d697373696e675065726d697373696f6e73002504ec546865206b657920646f6573206e6f742068617665207065726d697373696f6e7320746f2065786563757465207468652065787472696e7369632e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e29060000022d06002d06104c706f6c796d6573685f7072696d697469766573187472616974731467726f757038496e6163746976654d656d62657204184d6f6d656e740130000c010869649c01284964656e74697479496400013864656163746976617465645f61743001184d6f6d656e740001186578706972790d0101384f7074696f6e3c4d6f6d656e743e000031060c3070616c6c65745f67726f75701870616c6c65741043616c6c08045400044900011c607365745f6163746976655f6d656d626572735f6c696d69740401146c696d697410012c4d656d626572436f756e7400001035014368616e676520746869732067726f75702773206c696d697420666f7220686f77206d616e7920636f6e63757272656e7420616374697665206d656d626572732074686579206d61792062652e002c2320417267756d656e74730d012a20606c696d697460202d20746865206e756d626572206f6620616374697665206d656d62657273207468657265206d617920626520636f6e63757272656e746c792e3864697361626c655f6d656d6265720c010c77686f9c01284964656e7469747949640001186578706972790d0101444f7074696f6e3c543a3a4d6f6d656e743e00010861740d0101444f7074696f6e3c543a3a4d6f6d656e743e0001409444697361626c65732061206d656d626572206174207370656369666963206d6f6d656e742e004101506c65617365206e6f74652074686174206966206d656d62657220697320616c7265616479207265766f6b6564202861202276616c6964206d656d62657222292c20697473207265766f636174696f6e6c74696d652d7374616d702077696c6c20626520757064617465642e004d01416e792064697361626c6564206d656d6265722073686f756c64204e4f5420616c6c6f7720746f20616374206c696b6520616e20616374697665206d656d626572206f66207468652067726f75702e20466f725d01696e7374616e63652c20612064697361626c656420434444206d656d6265722073686f756c64204e4f542062652061626c6520746f2067656e657261746520612043444420636c61696d2e20486f776576657220616e79190167656e65726174656420636c61696d20697373756564206265666f7265206061746020776f756c6420626520636f6e7369646572656420617320612076616c6964206f6e652e005101496620796f752077616e7420746f20696e76616c696461746520616e792067656e65726174656420636c61696d2c20796f752073686f756c6420757365206053656c663a3a72656d6f76655f6d656d626572602e002c2320417267756d656e74737c2a2060617460202d205265766f636174696f6e2074696d652d7374616d702e942a206077686f60202d20546172676574206d656d626572206f66207468652067726f75702e55012a206065787069727960202d2054696d652d7374616d70207768656e206077686f602069732072656d6f7665642066726f6d204344442e20417320736f6f6e20617320697420697320657870697265642c20746865510167656e65726174656420636c61696d732077696c6c2062652022696e76616c696422206173206077686f60206973206e6f7420636f6e736964657265642061206d656d626572206f66207468652067726f75702e286164645f6d656d62657204010c77686f9c01284964656e7469747949640002143901416464732061206d656d626572206077686f6020746f207468652067726f75702e204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e002c2320417267756d656e7473d02a20606f726967696e60202d204f726967696e20726570726573656e74696e6720604164644f726967696e60206f7220726f6f74b82a206077686f60202d204964656e74697479496420746f20626520616464656420746f207468652067726f75702e3472656d6f76655f6d656d62657204010c77686f9c01284964656e746974794964000328510152656d6f7665732061206d656d626572206077686f602066726f6d20746865207365742e204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e004101416e7920636c61696d2070726576696f75736c792067656e6572617465642062792074686973206d656d626572206973206e6f742076616c696420617320612067726f757020636c61696d2e20466f725901696e7374616e63652c206966206120434444206d656d6265722067726f75702067656e657261746564206120636c61696d20666f72206120746172676574206964656e7469747920616e64207468656e206974206973610172656d6f7665642c207468617420636c61696d2077696c6c20626520696e76616c69642e2020496e206361736520796f752077616e7420746f206b656570207468652076616c6964697479206f662067656e657261746564dc636c61696d732c20796f75206861766520746f20757365206053656c663a3a64697361626c655f6d656d626572602066756e6374696f6e002c2320417267756d656e7473dc2a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052656d6f76654f726967696e60206f7220726f6f74c82a206077686f60202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702e2c737761705f6d656d62657208011872656d6f76659c01284964656e74697479496400010c6164649c01284964656e746974794964000420dc5377617073206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f74686572206d656d6265722060616464602e00b44d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e002c2320417267756d656e7473d42a20606f726967696e60202d204f726967696e20726570726573656e74696e672060537761704f726967696e60206f7220726f6f74d42a206072656d6f766560202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702ed82a206061646460202d204964656e74697479496420746f20626520616464656420696e20706c616365206f66206072656d6f7665602e3472657365745f6d656d6265727304011c6d656d626572734901013c5665633c4964656e7469747949643e00051829014368616e67657320746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702eb84d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e002c2320417267756d656e7473d82a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052657365744f726967696e60206f7220726f6f748c2a20606d656d6265727360202d204e657720736574206f66206964656e7469746965734c61626469636174655f6d656d626572736869700006284d01416c6c6f7773207468652063616c6c696e67206d656d62657220746f202a756e696c61746572616c6c7920717569742a20776974686f75742074686973206265696e67207375626a65637420746f206120474314766f74652e002c2320417267756d656e7473cc2a20606f726967696e60202d204d656d626572206f6620636f6d6d69747465652077686f2077616e747320746f20717569742e001c23204572726f7200802a204f6e6c79207072696d617279206b65792063616e2061626469636174652ea42a204c617374206d656d626572206f6620612067726f75702063616e6e6f742061626469636174652e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e35060c3070616c6c65745f67726f75701870616c6c6574144572726f72080454000449000118544f6e6c795072696d6172794b6579416c6c6f776564000004b04f6e6c79207072696d617279206b6579206f6620746865206964656e7469747920697320616c6c6f7765642e3c4475706c69636174654d656d6265720001047c47726f7570206d656d6265722077617320616464656420616c72656164792e304e6f537563684d656d626572000204a443616e27742072656d6f76652061206d656d626572207468617420646f65736e27742065786973742e504c6173744d656d62657243616e6e6f7451756974000304a84c617374206d656d626572206f662074686520636f6d6d69747465652063616e206e6f7420717569742e684163746976654d656d626572734c696d697445786365656465640004045d01546865206c696d697420666f7220746865206e756d626572206f6620636f6e63757272656e7420616374697665206d656d6265727320666f7220746869732067726f757020686173206265656e2065786365656465642e684163746976654d656d626572734c696d69744f766572666c6f770005041501416374697665206d656d626572206c696d6974207761732067726561746572207468616e206d6178696d756d20636f6d6d6974746565206d656d62657273206c696d69742e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e39060c60706f6c796d6573685f72756e74696d655f646576656c6f701c72756e74696d652c52756e74696d6543616c6c0001b01853797374656d0400c50401ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53797374656d2c2052756e74696d653e00000010426162650400590501a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c426162652c2052756e74696d653e0001002454696d657374616d7004006d0501b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c54696d657374616d702c2052756e74696d653e0002001c496e64696365730400750501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c496e64696365732c2052756e74696d653e0003002042616c616e6365730400c50501b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c42616c616e6365732c2052756e74696d653e000500485472616e73616374696f6e5061796d656e740400d90501dd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5472616e73616374696f6e5061796d656e742c2052756e74696d653e000600204964656e7469747904000d0601b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4964656e746974792c2052756e74696d653e0007004c4364645365727669636550726f7669646572730400310601e10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4364645365727669636550726f7669646572732c2052756e74696d653e00080044506f6c796d657368436f6d6d697474656504003d0601d90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c506f6c796d657368436f6d6d69747465652c2052756e74696d653e0009004c436f6d6d69747465654d656d626572736869700400410601e10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f6d6d69747465654d656d626572736869702c2052756e74696d653e000a0048546563686e6963616c436f6d6d69747465650400450601dd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c436f6d6d69747465652c2052756e74696d653e000b0070546563686e6963616c436f6d6d69747465654d656d626572736869700400490601050273656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c546563686e6963616c436f6d6d69747465654d656d626572736869702c2052756e74696d653e000c004055706772616465436f6d6d697474656504004d0601d50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c55706772616465436f6d6d69747465652c2052756e74696d653e000d006855706772616465436f6d6d69747465654d656d626572736869700400510601fd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c55706772616465436f6d6d69747465654d656d626572736869702c2052756e74696d653e000e00204d756c74695369670400550601b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4d756c74695369672c2052756e74696d653e000f002856616c696461746f727304005d0601bd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c56616c696461746f72732c2052756e74696d653e0010001c5374616b696e670400610601b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5374616b696e672c2052756e74696d653e0011001c53657373696f6e0400950601b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53657373696f6e2c2052756e74696d653e0013001c4772616e6470610400a10601b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4772616e6470612c2052756e74696d653e00150020496d4f6e6c696e650400c90601b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c496d4f6e6c696e652c2052756e74696d653e001700105375646f0400d50601a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5375646f2c2052756e74696d653e0019001441737365740400d90601a90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c41737365742c2052756e74696d653e001a004c4361706974616c446973747269627574696f6e0400e50601e10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4361706974616c446973747269627574696f6e2c2052756e74696d653e001b0028436865636b706f696e740400ed0601bd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436865636b706f696e742c2052756e74696d653e001c0044436f6d706c69616e63654d616e616765720400f10601d90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f6d706c69616e63654d616e616765722c2052756e74696d653e001d003c436f72706f72617465416374696f6e0400f50601d10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f72706f72617465416374696f6e2c2052756e74696d653e001e003c436f72706f7261746542616c6c6f7404000d0701d10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f72706f7261746542616c6c6f742c2052756e74696d653e001f0010506970730400110701a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c506970732c2052756e74696d653e00210024506f7274666f6c696f0400210701b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c506f7274666f6c696f2c2052756e74696d653e0022002c50726f746f636f6c46656504002d0701c10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50726f746f636f6c4665652c2052756e74696d653e002300245363686564756c65720400350701b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5363686564756c65722c2052756e74696d653e00240028536574746c656d656e7404003d0701bd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c536574746c656d656e742c2052756e74696d653e00250028537461746973746963730400690701bd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c537461746973746963732c2052756e74696d653e0026000c53746f0400790701a10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53746f2c2052756e74696d653e00270020547265617375727904008d0701b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c54726561737572792c2052756e74696d653e0028001c5574696c6974790400990701b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5574696c6974792c2052756e74696d653e00290010426173650400b90701a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c426173652c2052756e74696d653e002a003845787465726e616c4167656e74730400bd0701cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c45787465726e616c4167656e74732c2052756e74696d653e002b001c52656c617965720400c10701b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c52656c617965722c2052756e74696d653e002c0024436f6e7472616374730400c50701b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f6e7472616374732c2052756e74696d653e002e0044506f6c796d657368436f6e7472616374730400d10701d90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c506f6c796d657368436f6e7472616374732c2052756e74696d653e002f0020507265696d6167650400e50701b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c507265696d6167652c2052756e74696d653e0030000c4e66740400e90701a10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4e66742c2052756e74696d653e00310068456c656374696f6e50726f76696465724d756c746950686173650400090801fd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c456c656374696f6e50726f76696465724d756c746950686173652c2052756e74696d653e003200003d060c4070616c6c65745f636f6d6d69747465651870616c6c65741043616c6c080454000449000114487365745f766f74655f7468726573686f6c640801046e10010c7533320001046410010c753332000018f84368616e67652074686520766f7465207468726573686f6c64207468652064657465726d696e6573207468652077696e6e696e672070726f706f73616c2e5501466f7220652e672e2c20666f7220612073696d706c65206d616a6f72697479207573652028312c20322920776869636820726570726573656e74732074686520696e2d6571756174696f6e20223e3d20312f32222e002c2320417267756d656e7473f82a20606e60202d204e756d657261746f72206f6620746865206672616374696f6e20726570726573656e74696e6720766f7465207468726573686f6c642e01012a20606460202d2044656e6f6d696e61746f72206f6620746865206672616374696f6e20726570726573656e74696e6720766f7465207468726573686f6c642e5c7365745f72656c656173655f636f6f7264696e61746f7204010869649c01284964656e74697479496400011c804368616e676573207468652072656c6561736520636f6f7264696e61746f722e002c2320417267756d656e7473c02a2060696460202d2054686520444944206f6620746865206e65772072656c6561736520636f6f7264696e61746f722e002023204572726f727325012a20604e6f74414d656d626572602c20496620746865206e657720636f6f7264696e61746f722060696460206973206e6f742070617274206f662074686520636f6d6d69747465652e447365745f657870697265735f6166746572040118657870697279590101744d61796265426c6f636b3c426c6f636b4e756d626572466f723c543e3e000210c04368616e676573207468652074696d6520616674657220776869636820612070726f706f73616c20657870697265732e002c2320417267756d656e7473842a206065787069727960202d20546865206e6577206578706972792074696d652e3c766f74655f6f725f70726f706f736508011c617070726f7665200110626f6f6c00011063616c6c3906017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e000344150150726f706f73657320746f2074686520636f6d6d69747465652074686174206063616c6c602073686f756c6420626520657865637574656420696e20697473206e616d652e5d01416c7465726e61746976656c792c206966207468652068617368206f66206063616c6c602068617320616c7265616479206265656e207265636f726465642c20692e652e2c20616c72656164792070726f706f7365642c1d017468656e20746869732063616c6c20636f756e7473206173206120766f74652c20692e652e2c2061732069662060766f74655f62795f6861736860207761732063616c6c65642e00202320576569676874002d0154686520776569676874206f66207468697320646973706174636861626c652069732074686174206f66206063616c6c602061732077656c6c2061732074686520636f6d706c657869747978666f72207265636f7264696e672074686520766f746520697473656c662e002c2320417267756d656e7473a02a2060617070726f766560202d206973207468697320616e20617070726f76696e6720766f74653f610120204966207468652070726f706f73616c20646f65736e27742065786973742c2070617373696e67206066616c7365602077696c6c20726573756c7420696e206572726f7220604669727374566f746552656a656374602eb42a206063616c6c60202d207468652063616c6c20746f2070726f706f736520666f7220657865637574696f6e2e002023204572726f72732d012a20604669727374566f746552656a656374602c206966206063616c6c60206861736e2774206265656e2070726f706f73656420616e642060617070726f7665203d3d2066616c7365602e09012a20604e6f74414d656d626572602c2069662074686520606f726967696e60206973206e6f742061206d656d626572206f66207468697320636f6d6d69747465652e10766f74650c012070726f706f73616c34011c543a3a48617368000114696e64657810013450726f706f73616c496e64657800011c617070726f7665200110626f6f6c000428a4566f7465732060617070726f766560696e676c7920286f72206e6f742c206966206066616c73656029d46f6e20616e206578697374696e67206070726f706f73616c6020676976656e2062792069747320686173682c2060696e646578602e002c2320417267756d656e7473d42a206070726f706f73616c60202d20412068617368206f66207468652070726f706f73616c20746f20626520766f746564206f6e2e7c2a2060696e64657860202d205468652070726f706f73616c20696e6465782e2d012a2060617070726f766560202d20496620607472756560207468616e207468697320697320612060666f726020766f74652c20616e642060616761696e737460206f74686572776973652e002023204572726f727309012a20604e6f74414d656d626572602c2069662074686520606f726967696e60206973206e6f742061206d656d626572206f66207468697320636f6d6d69747465652e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e41060c3070616c6c65745f67726f75701870616c6c65741043616c6c08045400044900011c607365745f6163746976655f6d656d626572735f6c696d69740401146c696d697410012c4d656d626572436f756e7400001035014368616e676520746869732067726f75702773206c696d697420666f7220686f77206d616e7920636f6e63757272656e7420616374697665206d656d626572732074686579206d61792062652e002c2320417267756d656e74730d012a20606c696d697460202d20746865206e756d626572206f6620616374697665206d656d62657273207468657265206d617920626520636f6e63757272656e746c792e3864697361626c655f6d656d6265720c010c77686f9c01284964656e7469747949640001186578706972790d0101444f7074696f6e3c543a3a4d6f6d656e743e00010861740d0101444f7074696f6e3c543a3a4d6f6d656e743e0001409444697361626c65732061206d656d626572206174207370656369666963206d6f6d656e742e004101506c65617365206e6f74652074686174206966206d656d62657220697320616c7265616479207265766f6b6564202861202276616c6964206d656d62657222292c20697473207265766f636174696f6e6c74696d652d7374616d702077696c6c20626520757064617465642e004d01416e792064697361626c6564206d656d6265722073686f756c64204e4f5420616c6c6f7720746f20616374206c696b6520616e20616374697665206d656d626572206f66207468652067726f75702e20466f725d01696e7374616e63652c20612064697361626c656420434444206d656d6265722073686f756c64204e4f542062652061626c6520746f2067656e657261746520612043444420636c61696d2e20486f776576657220616e79190167656e65726174656420636c61696d20697373756564206265666f7265206061746020776f756c6420626520636f6e7369646572656420617320612076616c6964206f6e652e005101496620796f752077616e7420746f20696e76616c696461746520616e792067656e65726174656420636c61696d2c20796f752073686f756c6420757365206053656c663a3a72656d6f76655f6d656d626572602e002c2320417267756d656e74737c2a2060617460202d205265766f636174696f6e2074696d652d7374616d702e942a206077686f60202d20546172676574206d656d626572206f66207468652067726f75702e55012a206065787069727960202d2054696d652d7374616d70207768656e206077686f602069732072656d6f7665642066726f6d204344442e20417320736f6f6e20617320697420697320657870697265642c20746865510167656e65726174656420636c61696d732077696c6c2062652022696e76616c696422206173206077686f60206973206e6f7420636f6e736964657265642061206d656d626572206f66207468652067726f75702e286164645f6d656d62657204010c77686f9c01284964656e7469747949640002143901416464732061206d656d626572206077686f6020746f207468652067726f75702e204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e002c2320417267756d656e7473d02a20606f726967696e60202d204f726967696e20726570726573656e74696e6720604164644f726967696e60206f7220726f6f74b82a206077686f60202d204964656e74697479496420746f20626520616464656420746f207468652067726f75702e3472656d6f76655f6d656d62657204010c77686f9c01284964656e746974794964000328510152656d6f7665732061206d656d626572206077686f602066726f6d20746865207365742e204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e004101416e7920636c61696d2070726576696f75736c792067656e6572617465642062792074686973206d656d626572206973206e6f742076616c696420617320612067726f757020636c61696d2e20466f725901696e7374616e63652c206966206120434444206d656d6265722067726f75702067656e657261746564206120636c61696d20666f72206120746172676574206964656e7469747920616e64207468656e206974206973610172656d6f7665642c207468617420636c61696d2077696c6c20626520696e76616c69642e2020496e206361736520796f752077616e7420746f206b656570207468652076616c6964697479206f662067656e657261746564dc636c61696d732c20796f75206861766520746f20757365206053656c663a3a64697361626c655f6d656d626572602066756e6374696f6e002c2320417267756d656e7473dc2a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052656d6f76654f726967696e60206f7220726f6f74c82a206077686f60202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702e2c737761705f6d656d62657208011872656d6f76659c01284964656e74697479496400010c6164649c01284964656e746974794964000420dc5377617073206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f74686572206d656d6265722060616464602e00b44d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e002c2320417267756d656e7473d42a20606f726967696e60202d204f726967696e20726570726573656e74696e672060537761704f726967696e60206f7220726f6f74d42a206072656d6f766560202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702ed82a206061646460202d204964656e74697479496420746f20626520616464656420696e20706c616365206f66206072656d6f7665602e3472657365745f6d656d6265727304011c6d656d626572734901013c5665633c4964656e7469747949643e00051829014368616e67657320746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702eb84d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e002c2320417267756d656e7473d82a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052657365744f726967696e60206f7220726f6f748c2a20606d656d6265727360202d204e657720736574206f66206964656e7469746965734c61626469636174655f6d656d626572736869700006284d01416c6c6f7773207468652063616c6c696e67206d656d62657220746f202a756e696c61746572616c6c7920717569742a20776974686f75742074686973206265696e67207375626a65637420746f206120474314766f74652e002c2320417267756d656e7473cc2a20606f726967696e60202d204d656d626572206f6620636f6d6d69747465652077686f2077616e747320746f20717569742e001c23204572726f7200802a204f6e6c79207072696d617279206b65792063616e2061626469636174652ea42a204c617374206d656d626572206f6620612067726f75702063616e6e6f742061626469636174652e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e45060c4070616c6c65745f636f6d6d69747465651870616c6c65741043616c6c080454000449000114487365745f766f74655f7468726573686f6c640801046e10010c7533320001046410010c753332000018f84368616e67652074686520766f7465207468726573686f6c64207468652064657465726d696e6573207468652077696e6e696e672070726f706f73616c2e5501466f7220652e672e2c20666f7220612073696d706c65206d616a6f72697479207573652028312c20322920776869636820726570726573656e74732074686520696e2d6571756174696f6e20223e3d20312f32222e002c2320417267756d656e7473f82a20606e60202d204e756d657261746f72206f6620746865206672616374696f6e20726570726573656e74696e6720766f7465207468726573686f6c642e01012a20606460202d2044656e6f6d696e61746f72206f6620746865206672616374696f6e20726570726573656e74696e6720766f7465207468726573686f6c642e5c7365745f72656c656173655f636f6f7264696e61746f7204010869649c01284964656e74697479496400011c804368616e676573207468652072656c6561736520636f6f7264696e61746f722e002c2320417267756d656e7473c02a2060696460202d2054686520444944206f6620746865206e65772072656c6561736520636f6f7264696e61746f722e002023204572726f727325012a20604e6f74414d656d626572602c20496620746865206e657720636f6f7264696e61746f722060696460206973206e6f742070617274206f662074686520636f6d6d69747465652e447365745f657870697265735f6166746572040118657870697279590101744d61796265426c6f636b3c426c6f636b4e756d626572466f723c543e3e000210c04368616e676573207468652074696d6520616674657220776869636820612070726f706f73616c20657870697265732e002c2320417267756d656e7473842a206065787069727960202d20546865206e6577206578706972792074696d652e3c766f74655f6f725f70726f706f736508011c617070726f7665200110626f6f6c00011063616c6c3906017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e000344150150726f706f73657320746f2074686520636f6d6d69747465652074686174206063616c6c602073686f756c6420626520657865637574656420696e20697473206e616d652e5d01416c7465726e61746976656c792c206966207468652068617368206f66206063616c6c602068617320616c7265616479206265656e207265636f726465642c20692e652e2c20616c72656164792070726f706f7365642c1d017468656e20746869732063616c6c20636f756e7473206173206120766f74652c20692e652e2c2061732069662060766f74655f62795f6861736860207761732063616c6c65642e00202320576569676874002d0154686520776569676874206f66207468697320646973706174636861626c652069732074686174206f66206063616c6c602061732077656c6c2061732074686520636f6d706c657869747978666f72207265636f7264696e672074686520766f746520697473656c662e002c2320417267756d656e7473a02a2060617070726f766560202d206973207468697320616e20617070726f76696e6720766f74653f610120204966207468652070726f706f73616c20646f65736e27742065786973742c2070617373696e67206066616c7365602077696c6c20726573756c7420696e206572726f7220604669727374566f746552656a656374602eb42a206063616c6c60202d207468652063616c6c20746f2070726f706f736520666f7220657865637574696f6e2e002023204572726f72732d012a20604669727374566f746552656a656374602c206966206063616c6c60206861736e2774206265656e2070726f706f73656420616e642060617070726f7665203d3d2066616c7365602e09012a20604e6f74414d656d626572602c2069662074686520606f726967696e60206973206e6f742061206d656d626572206f66207468697320636f6d6d69747465652e10766f74650c012070726f706f73616c34011c543a3a48617368000114696e64657810013450726f706f73616c496e64657800011c617070726f7665200110626f6f6c000428a4566f7465732060617070726f766560696e676c7920286f72206e6f742c206966206066616c73656029d46f6e20616e206578697374696e67206070726f706f73616c6020676976656e2062792069747320686173682c2060696e646578602e002c2320417267756d656e7473d42a206070726f706f73616c60202d20412068617368206f66207468652070726f706f73616c20746f20626520766f746564206f6e2e7c2a2060696e64657860202d205468652070726f706f73616c20696e6465782e2d012a2060617070726f766560202d20496620607472756560207468616e207468697320697320612060666f726020766f74652c20616e642060616761696e737460206f74686572776973652e002023204572726f727309012a20604e6f74414d656d626572602c2069662074686520606f726967696e60206973206e6f742061206d656d626572206f66207468697320636f6d6d69747465652e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e49060c3070616c6c65745f67726f75701870616c6c65741043616c6c08045400044900011c607365745f6163746976655f6d656d626572735f6c696d69740401146c696d697410012c4d656d626572436f756e7400001035014368616e676520746869732067726f75702773206c696d697420666f7220686f77206d616e7920636f6e63757272656e7420616374697665206d656d626572732074686579206d61792062652e002c2320417267756d656e74730d012a20606c696d697460202d20746865206e756d626572206f6620616374697665206d656d62657273207468657265206d617920626520636f6e63757272656e746c792e3864697361626c655f6d656d6265720c010c77686f9c01284964656e7469747949640001186578706972790d0101444f7074696f6e3c543a3a4d6f6d656e743e00010861740d0101444f7074696f6e3c543a3a4d6f6d656e743e0001409444697361626c65732061206d656d626572206174207370656369666963206d6f6d656e742e004101506c65617365206e6f74652074686174206966206d656d62657220697320616c7265616479207265766f6b6564202861202276616c6964206d656d62657222292c20697473207265766f636174696f6e6c74696d652d7374616d702077696c6c20626520757064617465642e004d01416e792064697361626c6564206d656d6265722073686f756c64204e4f5420616c6c6f7720746f20616374206c696b6520616e20616374697665206d656d626572206f66207468652067726f75702e20466f725d01696e7374616e63652c20612064697361626c656420434444206d656d6265722073686f756c64204e4f542062652061626c6520746f2067656e657261746520612043444420636c61696d2e20486f776576657220616e79190167656e65726174656420636c61696d20697373756564206265666f7265206061746020776f756c6420626520636f6e7369646572656420617320612076616c6964206f6e652e005101496620796f752077616e7420746f20696e76616c696461746520616e792067656e65726174656420636c61696d2c20796f752073686f756c6420757365206053656c663a3a72656d6f76655f6d656d626572602e002c2320417267756d656e74737c2a2060617460202d205265766f636174696f6e2074696d652d7374616d702e942a206077686f60202d20546172676574206d656d626572206f66207468652067726f75702e55012a206065787069727960202d2054696d652d7374616d70207768656e206077686f602069732072656d6f7665642066726f6d204344442e20417320736f6f6e20617320697420697320657870697265642c20746865510167656e65726174656420636c61696d732077696c6c2062652022696e76616c696422206173206077686f60206973206e6f7420636f6e736964657265642061206d656d626572206f66207468652067726f75702e286164645f6d656d62657204010c77686f9c01284964656e7469747949640002143901416464732061206d656d626572206077686f6020746f207468652067726f75702e204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e002c2320417267756d656e7473d02a20606f726967696e60202d204f726967696e20726570726573656e74696e6720604164644f726967696e60206f7220726f6f74b82a206077686f60202d204964656e74697479496420746f20626520616464656420746f207468652067726f75702e3472656d6f76655f6d656d62657204010c77686f9c01284964656e746974794964000328510152656d6f7665732061206d656d626572206077686f602066726f6d20746865207365742e204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e004101416e7920636c61696d2070726576696f75736c792067656e6572617465642062792074686973206d656d626572206973206e6f742076616c696420617320612067726f757020636c61696d2e20466f725901696e7374616e63652c206966206120434444206d656d6265722067726f75702067656e657261746564206120636c61696d20666f72206120746172676574206964656e7469747920616e64207468656e206974206973610172656d6f7665642c207468617420636c61696d2077696c6c20626520696e76616c69642e2020496e206361736520796f752077616e7420746f206b656570207468652076616c6964697479206f662067656e657261746564dc636c61696d732c20796f75206861766520746f20757365206053656c663a3a64697361626c655f6d656d626572602066756e6374696f6e002c2320417267756d656e7473dc2a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052656d6f76654f726967696e60206f7220726f6f74c82a206077686f60202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702e2c737761705f6d656d62657208011872656d6f76659c01284964656e74697479496400010c6164649c01284964656e746974794964000420dc5377617073206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f74686572206d656d6265722060616464602e00b44d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e002c2320417267756d656e7473d42a20606f726967696e60202d204f726967696e20726570726573656e74696e672060537761704f726967696e60206f7220726f6f74d42a206072656d6f766560202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702ed82a206061646460202d204964656e74697479496420746f20626520616464656420696e20706c616365206f66206072656d6f7665602e3472657365745f6d656d6265727304011c6d656d626572734901013c5665633c4964656e7469747949643e00051829014368616e67657320746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702eb84d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e002c2320417267756d656e7473d82a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052657365744f726967696e60206f7220726f6f748c2a20606d656d6265727360202d204e657720736574206f66206964656e7469746965734c61626469636174655f6d656d626572736869700006284d01416c6c6f7773207468652063616c6c696e67206d656d62657220746f202a756e696c61746572616c6c7920717569742a20776974686f75742074686973206265696e67207375626a65637420746f206120474314766f74652e002c2320417267756d656e7473cc2a20606f726967696e60202d204d656d626572206f6620636f6d6d69747465652077686f2077616e747320746f20717569742e001c23204572726f7200802a204f6e6c79207072696d617279206b65792063616e2061626469636174652ea42a204c617374206d656d626572206f6620612067726f75702063616e6e6f742061626469636174652e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e4d060c4070616c6c65745f636f6d6d69747465651870616c6c65741043616c6c080454000449000114487365745f766f74655f7468726573686f6c640801046e10010c7533320001046410010c753332000018f84368616e67652074686520766f7465207468726573686f6c64207468652064657465726d696e6573207468652077696e6e696e672070726f706f73616c2e5501466f7220652e672e2c20666f7220612073696d706c65206d616a6f72697479207573652028312c20322920776869636820726570726573656e74732074686520696e2d6571756174696f6e20223e3d20312f32222e002c2320417267756d656e7473f82a20606e60202d204e756d657261746f72206f6620746865206672616374696f6e20726570726573656e74696e6720766f7465207468726573686f6c642e01012a20606460202d2044656e6f6d696e61746f72206f6620746865206672616374696f6e20726570726573656e74696e6720766f7465207468726573686f6c642e5c7365745f72656c656173655f636f6f7264696e61746f7204010869649c01284964656e74697479496400011c804368616e676573207468652072656c6561736520636f6f7264696e61746f722e002c2320417267756d656e7473c02a2060696460202d2054686520444944206f6620746865206e65772072656c6561736520636f6f7264696e61746f722e002023204572726f727325012a20604e6f74414d656d626572602c20496620746865206e657720636f6f7264696e61746f722060696460206973206e6f742070617274206f662074686520636f6d6d69747465652e447365745f657870697265735f6166746572040118657870697279590101744d61796265426c6f636b3c426c6f636b4e756d626572466f723c543e3e000210c04368616e676573207468652074696d6520616674657220776869636820612070726f706f73616c20657870697265732e002c2320417267756d656e7473842a206065787069727960202d20546865206e6577206578706972792074696d652e3c766f74655f6f725f70726f706f736508011c617070726f7665200110626f6f6c00011063616c6c3906017c426f783c3c5420617320436f6e6669673c493e3e3a3a50726f706f73616c3e000344150150726f706f73657320746f2074686520636f6d6d69747465652074686174206063616c6c602073686f756c6420626520657865637574656420696e20697473206e616d652e5d01416c7465726e61746976656c792c206966207468652068617368206f66206063616c6c602068617320616c7265616479206265656e207265636f726465642c20692e652e2c20616c72656164792070726f706f7365642c1d017468656e20746869732063616c6c20636f756e7473206173206120766f74652c20692e652e2c2061732069662060766f74655f62795f6861736860207761732063616c6c65642e00202320576569676874002d0154686520776569676874206f66207468697320646973706174636861626c652069732074686174206f66206063616c6c602061732077656c6c2061732074686520636f6d706c657869747978666f72207265636f7264696e672074686520766f746520697473656c662e002c2320417267756d656e7473a02a2060617070726f766560202d206973207468697320616e20617070726f76696e6720766f74653f610120204966207468652070726f706f73616c20646f65736e27742065786973742c2070617373696e67206066616c7365602077696c6c20726573756c7420696e206572726f7220604669727374566f746552656a656374602eb42a206063616c6c60202d207468652063616c6c20746f2070726f706f736520666f7220657865637574696f6e2e002023204572726f72732d012a20604669727374566f746552656a656374602c206966206063616c6c60206861736e2774206265656e2070726f706f73656420616e642060617070726f7665203d3d2066616c7365602e09012a20604e6f74414d656d626572602c2069662074686520606f726967696e60206973206e6f742061206d656d626572206f66207468697320636f6d6d69747465652e10766f74650c012070726f706f73616c34011c543a3a48617368000114696e64657810013450726f706f73616c496e64657800011c617070726f7665200110626f6f6c000428a4566f7465732060617070726f766560696e676c7920286f72206e6f742c206966206066616c73656029d46f6e20616e206578697374696e67206070726f706f73616c6020676976656e2062792069747320686173682c2060696e646578602e002c2320417267756d656e7473d42a206070726f706f73616c60202d20412068617368206f66207468652070726f706f73616c20746f20626520766f746564206f6e2e7c2a2060696e64657860202d205468652070726f706f73616c20696e6465782e2d012a2060617070726f766560202d20496620607472756560207468616e207468697320697320612060666f726020766f74652c20616e642060616761696e737460206f74686572776973652e002023204572726f727309012a20604e6f74414d656d626572602c2069662074686520606f726967696e60206973206e6f742061206d656d626572206f66207468697320636f6d6d69747465652e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e51060c3070616c6c65745f67726f75701870616c6c65741043616c6c08045400044900011c607365745f6163746976655f6d656d626572735f6c696d69740401146c696d697410012c4d656d626572436f756e7400001035014368616e676520746869732067726f75702773206c696d697420666f7220686f77206d616e7920636f6e63757272656e7420616374697665206d656d626572732074686579206d61792062652e002c2320417267756d656e74730d012a20606c696d697460202d20746865206e756d626572206f6620616374697665206d656d62657273207468657265206d617920626520636f6e63757272656e746c792e3864697361626c655f6d656d6265720c010c77686f9c01284964656e7469747949640001186578706972790d0101444f7074696f6e3c543a3a4d6f6d656e743e00010861740d0101444f7074696f6e3c543a3a4d6f6d656e743e0001409444697361626c65732061206d656d626572206174207370656369666963206d6f6d656e742e004101506c65617365206e6f74652074686174206966206d656d62657220697320616c7265616479207265766f6b6564202861202276616c6964206d656d62657222292c20697473207265766f636174696f6e6c74696d652d7374616d702077696c6c20626520757064617465642e004d01416e792064697361626c6564206d656d6265722073686f756c64204e4f5420616c6c6f7720746f20616374206c696b6520616e20616374697665206d656d626572206f66207468652067726f75702e20466f725d01696e7374616e63652c20612064697361626c656420434444206d656d6265722073686f756c64204e4f542062652061626c6520746f2067656e657261746520612043444420636c61696d2e20486f776576657220616e79190167656e65726174656420636c61696d20697373756564206265666f7265206061746020776f756c6420626520636f6e7369646572656420617320612076616c6964206f6e652e005101496620796f752077616e7420746f20696e76616c696461746520616e792067656e65726174656420636c61696d2c20796f752073686f756c6420757365206053656c663a3a72656d6f76655f6d656d626572602e002c2320417267756d656e74737c2a2060617460202d205265766f636174696f6e2074696d652d7374616d702e942a206077686f60202d20546172676574206d656d626572206f66207468652067726f75702e55012a206065787069727960202d2054696d652d7374616d70207768656e206077686f602069732072656d6f7665642066726f6d204344442e20417320736f6f6e20617320697420697320657870697265642c20746865510167656e65726174656420636c61696d732077696c6c2062652022696e76616c696422206173206077686f60206973206e6f7420636f6e736964657265642061206d656d626572206f66207468652067726f75702e286164645f6d656d62657204010c77686f9c01284964656e7469747949640002143901416464732061206d656d626572206077686f6020746f207468652067726f75702e204d6179206f6e6c792062652063616c6c65642066726f6d20604164644f726967696e60206f7220726f6f742e002c2320417267756d656e7473d02a20606f726967696e60202d204f726967696e20726570726573656e74696e6720604164644f726967696e60206f7220726f6f74b82a206077686f60202d204964656e74697479496420746f20626520616464656420746f207468652067726f75702e3472656d6f76655f6d656d62657204010c77686f9c01284964656e746974794964000328510152656d6f7665732061206d656d626572206077686f602066726f6d20746865207365742e204d6179206f6e6c792062652063616c6c65642066726f6d206052656d6f76654f726967696e60206f7220726f6f742e004101416e7920636c61696d2070726576696f75736c792067656e6572617465642062792074686973206d656d626572206973206e6f742076616c696420617320612067726f757020636c61696d2e20466f725901696e7374616e63652c206966206120434444206d656d6265722067726f75702067656e657261746564206120636c61696d20666f72206120746172676574206964656e7469747920616e64207468656e206974206973610172656d6f7665642c207468617420636c61696d2077696c6c20626520696e76616c69642e2020496e206361736520796f752077616e7420746f206b656570207468652076616c6964697479206f662067656e657261746564dc636c61696d732c20796f75206861766520746f20757365206053656c663a3a64697361626c655f6d656d626572602066756e6374696f6e002c2320417267756d656e7473dc2a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052656d6f76654f726967696e60206f7220726f6f74c82a206077686f60202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702e2c737761705f6d656d62657208011872656d6f76659c01284964656e74697479496400010c6164649c01284964656e746974794964000420dc5377617073206f7574206f6e65206d656d626572206072656d6f76656020666f7220616e6f74686572206d656d6265722060616464602e00b44d6179206f6e6c792062652063616c6c65642066726f6d2060537761704f726967696e60206f7220726f6f742e002c2320417267756d656e7473d42a20606f726967696e60202d204f726967696e20726570726573656e74696e672060537761704f726967696e60206f7220726f6f74d42a206072656d6f766560202d204964656e74697479496420746f2062652072656d6f7665642066726f6d207468652067726f75702ed82a206061646460202d204964656e74697479496420746f20626520616464656420696e20706c616365206f66206072656d6f7665602e3472657365745f6d656d6265727304011c6d656d626572734901013c5665633c4964656e7469747949643e00051829014368616e67657320746865206d656d6265727368697020746f2061206e6577207365742c20646973726567617264696e6720746865206578697374696e67206d656d626572736869702eb84d6179206f6e6c792062652063616c6c65642066726f6d206052657365744f726967696e60206f7220726f6f742e002c2320417267756d656e7473d82a20606f726967696e60202d204f726967696e20726570726573656e74696e67206052657365744f726967696e60206f7220726f6f748c2a20606d656d6265727360202d204e657720736574206f66206964656e7469746965734c61626469636174655f6d656d626572736869700006284d01416c6c6f7773207468652063616c6c696e67206d656d62657220746f202a756e696c61746572616c6c7920717569742a20776974686f75742074686973206265696e67207375626a65637420746f206120474314766f74652e002c2320417267756d656e7473cc2a20606f726967696e60202d204d656d626572206f6620636f6d6d69747465652077686f2077616e747320746f20717569742e001c23204572726f7200802a204f6e6c79207072696d617279206b65792063616e2061626469636174652ea42a204c617374206d656d626572206f6620612067726f75702063616e6e6f742061626469636174652e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e55060c3c70616c6c65745f6d756c74697369671870616c6c65741043616c6c0404540001483c6372656174655f6d756c74697369670c011c7369676e6572737501019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e000134736967735f726571756972656430010c75363400012c7065726d697373696f6e735906014c4f7074696f6e3c5065726d697373696f6e733e00001848437265617465732061206d756c7469736967002c2320417267756d656e7473a5012a20607369676e65727360202d205369676e657273206f6620746865206d756c7469736967202854686579206e65656420746f2061636365707420617574686f72697a6174696f6e206265666f72652074686579206172652061637475616c6c79206164646564292e19012a2060736967735f726571756972656460202d204e756d626572206f66207369677320726571756972656420746f2070726f636573732061206d756c74692d7369672074782e91012a20607065726d697373696f6e7360202d206f7074696f6e616c20637573746f6d207065726d697373696f6e732e20204f6e6c7920746865207072696d617279206b65792063616e2070726f7669646520637573746f6d207065726d697373696f6e732e3c6372656174655f70726f706f73616c0c01206d756c7469736967000130543a3a4163636f756e74496400012070726f706f73616c39060170426f783c3c5420617320436f6e6669673e3a3a50726f706f73616c3e0001186578706972790d0101444f7074696f6e3c543a3a4d6f6d656e743e0001206c437265617465732061206d756c74697369672070726f706f73616c002c2320417267756d656e7473802a20606d756c746973696760202d204d756c746953696720616464726573732e9c2a206070726f706f73616c60202d2050726f706f73616c20746f20626520766f746564206f6e2eac2a206065787069727960202d204f7074696f6e616c2070726f706f73616c206578706972792074696d652e003101496620746869732069732031206f7574206f6620606d60206d756c74697369672c207468652070726f706f73616c2077696c6c20626520696d6d6564696174656c792065786563757465642e1c617070726f76650c01206d756c7469736967000130543a3a4163636f756e74496400012c70726f706f73616c5f696430010c7536340001286d61785f776569676874e10401384f7074696f6e3c5765696768743e0002203101417070726f7665732061206d756c74697369672070726f706f73616c207573696e67207468652063616c6c65722773207365636f6e64617279206b65792028604163636f756e74496460292e002c2320417267756d656e7473802a20606d756c746973696760202d204d756c746953696720616464726573732ea42a206070726f706f73616c5f696460202d2050726f706f73616c20696420746f20617070726f76652ef02a20606d61785f77656967687460202d20546865206d6178696d756d2077656967687420746f2065786563757465207468652070726f706f73616c2e00010149662071756f72756d20697320726561636865642c207468652070726f706f73616c2077696c6c20626520696d6d6564696174656c792065786563757465642e1872656a6563740801206d756c7469736967000130543a3a4163636f756e74496400012c70726f706f73616c5f696430010c7536340003182d0152656a656374732061206d756c74697369672070726f706f73616c207573696e67207468652063616c6c65722773207365636f6e64617279206b65792028604163636f756e74496460292e002c2320417267756d656e7473802a20606d756c746973696760202d204d756c746953696720616464726573732ea02a206070726f706f73616c5f696460202d2050726f706f73616c20696420746f2072656a6563742e010149662071756f72756d20697320726561636865642c207468652070726f706f73616c2077696c6c20626520696d6d6564696174656c792065786563757465642e586163636570745f6d756c74697369675f7369676e657204011c617574685f696430010c7536340004102901416363657074732061206d756c7469736967207369676e657220617574686f72697a6174696f6e20676976656e20746f207369676e65722773206b657920284163636f756e744964292e002c2320417267756d656e7473ac2a2060617574685f696460202d2041757468206964206f662074686520617574686f72697a6174696f6e2e506164645f6d756c74697369675f7369676e65727304011c7369676e6572737501019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e000510290141646473207369676e65727320746f20746865206d756c74697369672e202054686973206d7573742062652063616c6c656420627920746865206d756c746973696720697473656c662e002c2320417267756d656e7473742a20607369676e65727360202d205369676e65727320746f206164642e5c72656d6f76655f6d756c74697369675f7369676e65727304011c7369676e6572737501019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e0006103d0152656d6f766573207369676e6572732066726f6d20746865206d756c74697369672e202054686973206d7573742062652063616c6c656420627920746865206d756c746973696720697473656c662e002c2320417267756d656e7473802a20607369676e65727360202d205369676e65727320746f2072656d6f76652e786164645f6d756c74697369675f7369676e6572735f7669615f61646d696e0801206d756c7469736967000130543a3a4163636f756e74496400011c7369676e6572737501019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e00071c4101416464732061207369676e657220746f20746865206d756c74697369672e202054686973206d7573742062652063616c6c6564206279207468652061646d696e206964656e74697479206f6620746865246d756c74697369672e002c2320417267756d656e74739c2a20606d756c746973696760202d2041646472657373206f6620746865206d756c746920736967742a20607369676e65727360202d205369676e65727320746f206164642e008472656d6f76655f6d756c74697369675f7369676e6572735f7669615f61646d696e0801206d756c7469736967000130543a3a4163636f756e74496400011c7369676e6572737501019c426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61785369676e6572733e00081c8c52656d6f7665732061207369676e65722066726f6d20746865206d756c74697369672ee854686973206d7573742062652063616c6c6564206279207468652061646d696e206964656e74697479206f6620746865206d756c74697369672e002c2320417267756d656e74739c2a20606d756c746973696760202d2041646472657373206f6620746865206d756c74697369672e802a20607369676e65727360202d205369676e65727320746f2072656d6f76652e00506368616e67655f736967735f7265717569726564040134736967735f726571756972656430010c75363400091451014368616e67657320746865206e756d626572206f66207369676e6174757265732072657175697265642062792061206d756c74697369672e202054686973206d7573742062652063616c6c656420627920746865406d756c746973696720697473656c662e002c2320417267756d656e7473d82a2060736967735f726571756972656460202d204e6577206e756d626572206f66207265717569726564207369676e6174757265732e786368616e67655f736967735f72657175697265645f7669615f61646d696e0801206d756c7469736967000130543a3a4163636f756e74496400014c7369676e6174757265735f726571756972656430010c753634000a14ad014368616e67657320746865206e756d626572206f66207369676e6174757265732072657175697265642062792061206d756c74697369672e202054686973206d7573742062652063616c6c6564206279207468652061646d696e206f6620746865206d756c74697369672e002c2320417267756d656e747359012a20606d756c746973696760202d20546865206163636f756e74206964656e74696669657220285b604163636f756e744964605d2920666f7220746865206d756c7469207369676e6174757265206163636f756e742ef02a20607369676e6174757265735f726571756972656460202d20546865206e756d626572206f66207265717569726564207369676e6174757265732e246164645f61646d696e04012461646d696e5f6469649c01284964656e746974794964000b044d0141646420616e2061646d696e206964656e7469747920746f20746865206d756c74697369672e202054686973206d7573742062652063616c6c656420627920746865206d756c746973696720697473656c662e5872656d6f76655f61646d696e5f7669615f61646d696e0401206d756c7469736967000130543a3a4163636f756e744964000c04890152656d6f766573207468652061646d696e206964656e746974792066726f6d2074686520606d756c7469736967602e202054686973206d7573742062652063616c6c6564206279207468652061646d696e206f6620746865206d756c74697369672e3072656d6f76655f7061796572000d04750152656d6f7665732074686520706179696e67206964656e746974792066726f6d2074686520606d756c7469736967602e202054686973206d7573742062652063616c6c656420627920746865206d756c746973696720697473656c662e5872656d6f76655f70617965725f7669615f70617965720401206d756c7469736967000130543a3a4163636f756e744964000e04b50152656d6f7665732074686520706179696e67206964656e746974792066726f6d2074686520606d756c7469736967602e202054686973206d7573742062652063616c6c65642062792074686520706179696e67206964656e74697479206f6620746865206d756c74697369672e54617070726f76655f6a6f696e5f6964656e746974790801206d756c7469736967000130543a3a4163636f756e74496400011c617574685f696430010c753634000f1cac417070726f7665732061206d756c7469736967206a6f696e206964656e746974792070726f706f73616c2e002c2320417267756d656e7473802a20606d756c746973696760202d204d756c746953696720616464726573732ee42a2060617574685f696460202d20546865206a6f696e206964656e7469747920617574686f72697a6174696f6e20746f20617070726f76652e00390149662071756f72756d20697320726561636865642c20746865206a6f696e206964656e746974792070726f706f73616c2077696c6c20626520696d6d6564696174656c792065786563757465642e346a6f696e5f6964656e7469747904011c617574685f696430010c7536340010048d014163636570742061204a6f696e4964656e7469747920617574686f72697a6174696f6e20666f722074686973206d756c74697369672e202054686973206d7573742062652063616c6c656420627920746865206d756c746973696720697473656c662e3072656d6f76655f61646d696e001104710152656d6f766573207468652061646d696e206964656e746974792066726f6d2074686520606d756c7469736967602e202054686973206d7573742062652063616c6c656420627920746865206d756c746973696720697473656c662e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e590604184f7074696f6e04045401a80108104e6f6e6500000010536f6d650400a800000100005d060c4470616c6c65745f76616c696461746f72731870616c6c65741043616c6c04045400011c686164645f7065726d697373696f6e65645f76616c696461746f720801206964656e746974799c01284964656e746974794964000138696e74656e6465645f636f756e748d01012c4f7074696f6e3c7533323e00000cd8416464732061207065726d697373696f6e6564206964656e7469747920616e6420736574732069747320707265666572656e6365732e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e7472656d6f76655f7065726d697373696f6e65645f76616c696461746f720401206964656e746974799c01284964656e74697479496400011ca90152656d6f766520616e206964656e746974792066726f6d2074686520706f6f6c206f66202877616e6e616265292076616c696461746f72206964656e7469746965732e204566666563747320617265206b6e6f776e20696e20746865206e6578742073657373696f6e2e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2320417267756d656e7473f02a206f726967696e205265717569726564206f726967696e20666f722072656d6f76696e67206120706f74656e7469616c2076616c696461746f722e882a206964656e746974792056616c696461746f722773204964656e7469747949642e607061796f75745f7374616b6572735f62795f73797374656d08013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400010c657261100120457261496e6465780002006c6368616e67655f736c617368696e675f616c6c6f7765645f666f7204013c736c617368696e675f7377697463687d010138536c617368696e675377697463680003046d0153776974636820736c617368696e6720737461747573206f6e20746865206261736973206f6620676976656e2060736c617368696e675f737769746368602e2043616e206f6e6c792062652063616c6c656420627920726f6f742eb07570646174655f7065726d697373696f6e65645f76616c696461746f725f696e74656e6465645f636f756e740801206964656e746974799c01284964656e7469747949640001486e65775f696e74656e6465645f636f756e7410010c7533320004042501536574732074686520696e74656e64656420636f756e7420746f20606e65775f696e74656e6465645f636f756e746020666f722074686520676976656e20606964656e74697479602e546368696c6c5f66726f6d5f676f7665726e616e63650801206964656e746974799c01284964656e74697479496400012873746173685f6b657973050101445665633c543a3a4163636f756e7449643e000504a101476f7665726e616e636520636f756e63696c20666f72636566756c6c79206368696c6c7320612076616c696461746f722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e487365745f636f6d6d697373696f6e5f63617004011c6e65775f6361708101011c50657262696c6c00061421014368616e67657320636f6d6d697373696f6e2072617465207768696368206170706c69657320746f20616c6c2076616c696461746f72732e204f6e6c7920476f7665726e616e6365a8636f6d6d697474656520697320616c6c6f77656420746f206368616e676520746869732076616c75652e002c2320417267756d656e74738c2a20606e65775f6361706020746865206e657720636f6d6d697373696f6e206361702e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e6106103870616c6c65745f7374616b696e671870616c6c65741870616c6c65741043616c6c04045400018010626f6e6408011476616c7565c901013042616c616e63654f663c543e00011470617965658901017c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e000040610154616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c80626520746865206163636f756e74207468617420636f6e74726f6c732069742e002d016076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e002101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e003c456d6974732060426f6e646564602e34232320436f6d706c6578697479d02d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e1c2d204f2831292e642d20546872656520657874726120444220656e74726965732e004d014e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e65645901756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20286f7220657175616c20746f20302920616e6420676574732072656d6f76656420617320647573742e28626f6e645f65787472610401386d61785f6164646974696f6e616cc901013042616c616e63654f663c543e000138610141646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757030666f72207374616b696e672e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e004d01557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e5501556e6c696b65205b60626f6e64605d2853656c663a3a626f6e6429206f72205b60756e626f6e64605d2853656c663a3a756e626f6e642920746869732066756e6374696f6e20646f6573206e6f7420696d706f7365bc616e79206c696d69746174696f6e206f6e2074686520616d6f756e7420746861742063616e2062652061646465642e003c456d6974732060426f6e646564602e0034232320436f6d706c6578697479e42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e1c2d204f2831292e18756e626f6e6404011476616c7565c901013042616c616e63654f663c543e00024c51015363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64fc706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e21015b6061737365743a3a6578697374656e7469616c5f6465706f736974605d2c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0045014f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665bc7468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e0031014e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d6178556e6c6f636b696e674368756e6b736029410163616e20636f2d657869737473206174207468652073616d652074696d652e20496620746865726520617265206e6f20756e6c6f636b696e67206368756e6b7320736c6f747320617661696c61626c6545015b6043616c6c3a3a77697468647261775f756e626f6e646564605d2069732063616c6c656420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00390149662061207573657220656e636f756e74657273207468652060496e73756666696369656e74426f6e6460206572726f72207768656e2063616c6c696e6720746869732065787472696e7369632c1901746865792073686f756c642063616c6c20606368696c6c6020666972737420696e206f7264657220746f206672656520757020746865697220626f6e6465642066756e64732e0044456d6974732060556e626f6e646564602e009453656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e4477697468647261775f756e626f6e6465640401486e756d5f736c617368696e675f7370616e7310010c75333200035c290152656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e0055015468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722469742077616e74732e001501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722e0048456d697473206057697468647261776e602e006853656520616c736f205b6043616c6c3a3a756e626f6e64605d2e0034232320506172616d65746572730051012d20606e756d5f736c617368696e675f7370616e736020696e6469636174657320746865206e756d626572206f66206d6574616461746120736c617368696e67207370616e7320746f20636c656172207768656e5501746869732063616c6c20726573756c747320696e206120636f6d706c6574652072656d6f76616c206f6620616c6c2074686520646174612072656c6174656420746f20746865207374617368206163636f756e742e3d01496e207468697320636173652c2074686520606e756d5f736c617368696e675f7370616e7360206d757374206265206c6172676572206f7220657175616c20746f20746865206e756d626572206f665d01736c617368696e67207370616e73206173736f636961746564207769746820746865207374617368206163636f756e7420696e20746865205b60536c617368696e675370616e73605d2073746f7261676520747970652c25016f7468657277697365207468652063616c6c2077696c6c206661696c2e205468652063616c6c20776569676874206973206469726563746c792070726f706f7274696f6e616c20746f54606e756d5f736c617368696e675f7370616e73602e0034232320436f6d706c6578697479d84f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2072656d6f766509014e4f54453a2057656967687420616e6e6f746174696f6e20697320746865206b696c6c207363656e6172696f2c20776520726566756e64206f74686572776973652e2076616c696461746504011470726566739101013856616c696461746f725072656673000414e44465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e206e6f6d696e61746504011c74617267657473650601645665633c4163636f756e7449644c6f6f6b75704f663c543e3e0005280d014465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0034232320436f6d706c65786974792d012d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f662060746172676574736020284e29050177686963682069732063617070656420617420436f6d7061637441737369676e6d656e74733a3a4c494d49542028543a3a4d61784e6f6d696e6174696f6e73292ed42d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e146368696c6c000628c44465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0034232320436f6d706c6578697479e42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e502d20436f6e7461696e73206f6e6520726561642ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e247365745f706179656504011470617965658901017c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e000730b42852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e005101456666656374732077696c6c2062652066656c7420696e7374616e746c792028617320736f6f6e20617320746869732066756e6374696f6e20697320636f6d706c65746564207375636365737366756c6c79292e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0034232320436f6d706c6578697479182d204f283129e42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e942d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e242d2d2d2d2d2d2d2d2d387365745f636f6e74726f6c6c657200083845012852652d29736574732074686520636f6e74726f6c6c6572206f66206120737461736820746f2074686520737461736820697473656c662e20546869732066756e6374696f6e2070726576696f75736c794d01616363657074656420612060636f6e74726f6c6c65726020617267756d656e7420746f207365742074686520636f6e74726f6c6c657220746f20616e206163636f756e74206f74686572207468616e207468655901737461736820697473656c662e20546869732066756e6374696f6e616c69747920686173206e6f77206265656e2072656d6f7665642c206e6f77206f6e6c792073657474696e672074686520636f6e74726f6c6c65728c746f207468652073746173682c206966206974206973206e6f7420616c72656164792e005101456666656374732077696c6c2062652066656c7420696e7374616e746c792028617320736f6f6e20617320746869732066756e6374696f6e20697320636f6d706c65746564207375636365737366756c6c79292e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e0034232320436f6d706c6578697479104f283129e42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e942d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e4c7365745f76616c696461746f725f636f756e7404010c6e6577b904010c75333200091890536574732074686520696465616c206e756d626572206f662076616c696461746f72732e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0034232320436f6d706c6578697479104f28312960696e6372656173655f76616c696461746f725f636f756e740401286164646974696f6e616cb904010c753332000a1ce8496e6372656d656e74732074686520696465616c206e756d626572206f662076616c696461746f727320757020746f206d6178696d756d206f668c60456c656374696f6e50726f7669646572426173653a3a4d617857696e6e657273602e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0034232320436f6d706c65786974799853616d65206173205b6053656c663a3a7365745f76616c696461746f725f636f756e74605d2e547363616c655f76616c696461746f725f636f756e74040118666163746f726906011c50657263656e74000b1c11015363616c652075702074686520696465616c206e756d626572206f662076616c696461746f7273206279206120666163746f7220757020746f206d6178696d756d206f668c60456c656374696f6e50726f7669646572426173653a3a4d617857696e6e657273602e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0034232320436f6d706c65786974799853616d65206173205b6053656c663a3a7365745f76616c696461746f725f636f756e74605d2e34666f7263655f6e6f5f65726173000c34ac466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e3901546875732074686520656c656374696f6e2070726f63657373206d6179206265206f6e676f696e67207768656e20746869732069732063616c6c65642e20496e2074686973206361736520746865dc656c656374696f6e2077696c6c20636f6e74696e756520756e74696c20746865206e65787420657261206973207472696767657265642e0034232320436f6d706c65786974793c2d204e6f20617267756d656e74732e382d205765696768743a204f28312934666f7263655f6e65775f657261000d384901466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c2062659c726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e4901496620746869732069732063616c6c6564206a757374206265666f72652061206e657720657261206973207472696767657265642c2074686520656c656374696f6e2070726f63657373206d6179206e6f748c6861766520656e6f75676820626c6f636b7320746f20676574206120726573756c742e0034232320436f6d706c65786974793c2d204e6f20617267756d656e74732e382d205765696768743a204f283129447365745f696e76756c6e657261626c6573040134696e76756c6e657261626c6573050101445665633c543a3a4163636f756e7449643e000e0cc8536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e34666f7263655f756e7374616b650801147374617368000130543a3a4163636f756e7449640001486e756d5f736c617368696e675f7370616e7310010c753332000f200901466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e0034232320506172616d65746572730045012d20606e756d5f736c617368696e675f7370616e73603a20526566657220746f20636f6d6d656e7473206f6e205b6043616c6c3a3a77697468647261775f756e626f6e646564605d20666f72206d6f72652064657461696c732e50666f7263655f6e65775f6572615f616c776179730010240101466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e4901496620746869732069732063616c6c6564206a757374206265666f72652061206e657720657261206973207472696767657265642c2074686520656c656374696f6e2070726f63657373206d6179206e6f748c6861766520656e6f75676820626c6f636b7320746f20676574206120726573756c742e5463616e63656c5f64656665727265645f736c61736808010c657261100120457261496e646578000134736c6173685f696e64696365736d0601205665633c7533323e0011149443616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e009843616e2062652063616c6c6564206279207468652060543a3a41646d696e4f726967696e602e000101506172616d65746572733a2065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e387061796f75745f7374616b65727308013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400010c657261100120457261496e6465780012341901506179206f7574206e6578742070616765206f6620746865207374616b65727320626568696e6420612076616c696461746f7220666f722074686520676976656e206572612e00e82d206076616c696461746f725f73746173686020697320746865207374617368206163636f756e74206f66207468652076616c696461746f722e31012d206065726160206d617920626520616e7920657261206265747765656e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e005501546865206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e20416e79206163636f756e742063616e2063616c6c20746869732066756e6374696f6e2c206576656e206966746974206973206e6f74206f6e65206f6620746865207374616b6572732e00490154686520726577617264207061796f757420636f756c6420626520706167656420696e20636173652074686572652061726520746f6f206d616e79206e6f6d696e61746f7273206261636b696e67207468655d016076616c696461746f725f7374617368602e20546869732063616c6c2077696c6c207061796f757420756e7061696420706167657320696e20616e20617363656e64696e67206f726465722e20546f20636c61696d2061b4737065636966696320706167652c2075736520607061796f75745f7374616b6572735f62795f70616765602e6000f0496620616c6c2070616765732061726520636c61696d65642c2069742072657475726e7320616e206572726f722060496e76616c696450616765602e187265626f6e6404011476616c7565c901013042616c616e63654f663c543e00131cdc5265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e00d4546865206469737061746368206f726967696e206d757374206265207369676e65642062792074686520636f6e74726f6c6c65722e0034232320436f6d706c6578697479d02d2054696d6520636f6d706c65786974793a204f284c292c207768657265204c20697320756e6c6f636b696e67206368756e6b73882d20426f756e64656420627920604d6178556e6c6f636b696e674368756e6b73602e28726561705f73746173680801147374617368000130543a3a4163636f756e7449640001486e756d5f736c617368696e675f7370616e7310010c7533320014485d0152656d6f766520616c6c2064617461207374727563747572657320636f6e6365726e696e672061207374616b65722f7374617368206f6e636520697420697320617420612073746174652077686572652069742063616e0501626520636f6e736964657265642060647573746020696e20746865207374616b696e672073797374656d2e2054686520726571756972656d656e7473206172653a000501312e207468652060746f74616c5f62616c616e636560206f66207468652073746173682069732062656c6f77206578697374656e7469616c206465706f7369742e1101322e206f722c2074686520606c65646765722e746f74616c60206f66207468652073746173682069732062656c6f77206578697374656e7469616c206465706f7369742e6101332e206f722c206578697374656e7469616c206465706f736974206973207a65726f20616e64206569746865722060746f74616c5f62616c616e636560206f7220606c65646765722e746f74616c60206973207a65726f2e00550154686520666f726d65722063616e2068617070656e20696e206361736573206c696b65206120736c6173683b20746865206c6174746572207768656e20612066756c6c7920756e626f6e646564206163636f756e7409016973207374696c6c20726563656976696e67207374616b696e67207265776172647320696e206052657761726444657374696e6174696f6e3a3a5374616b6564602e00310149742063616e2062652063616c6c656420627920616e796f6e652c206173206c6f6e672061732060737461736860206d65657473207468652061626f766520726571756972656d656e74732e00dc526566756e647320746865207472616e73616374696f6e20666565732075706f6e207375636365737366756c20657865637574696f6e2e0034232320506172616d65746572730045012d20606e756d5f736c617368696e675f7370616e73603a20526566657220746f20636f6d6d656e7473206f6e205b6043616c6c3a3a77697468647261775f756e626f6e646564605d20666f72206d6f72652064657461696c732e106b69636b04010c77686f650601645665633c4163636f756e7449644c6f6f6b75704f663c543e3e00152ce052656d6f76652074686520676976656e206e6f6d696e6174696f6e732066726f6d207468652063616c6c696e672076616c696461746f722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e004d012d206077686f603a2041206c697374206f66206e6f6d696e61746f72207374617368206163636f756e74732077686f20617265206e6f6d696e6174696e6720746869732076616c696461746f72207768696368c0202073686f756c64206e6f206c6f6e676572206265206e6f6d696e6174696e6720746869732076616c696461746f722e0055014e6f74653a204d616b696e6720746869732063616c6c206f6e6c79206d616b65732073656e736520696620796f7520666972737420736574207468652076616c696461746f7220707265666572656e63657320746f78626c6f636b20616e792066757274686572206e6f6d696e6174696f6e732e4c7365745f7374616b696e675f636f6e666967731c01486d696e5f6e6f6d696e61746f725f626f6e6471060158436f6e6669674f703c42616c616e63654f663c543e3e0001486d696e5f76616c696461746f725f626f6e6471060158436f6e6669674f703c42616c616e63654f663c543e3e00014c6d61785f6e6f6d696e61746f725f636f756e7475060134436f6e6669674f703c7533323e00014c6d61785f76616c696461746f725f636f756e7475060134436f6e6669674f703c7533323e00013c6368696c6c5f7468726573686f6c6479060144436f6e6669674f703c50657263656e743e0001386d696e5f636f6d6d697373696f6e7d060144436f6e6669674f703c50657262696c6c3e0001486d61785f7374616b65645f7265776172647379060144436f6e6669674f703c50657263656e743e001644ac5570646174652074686520766172696f7573207374616b696e6720636f6e66696775726174696f6e73202e0025012a20606d696e5f6e6f6d696e61746f725f626f6e64603a20546865206d696e696d756d2061637469766520626f6e64206e656564656420746f2062652061206e6f6d696e61746f722e25012a20606d696e5f76616c696461746f725f626f6e64603a20546865206d696e696d756d2061637469766520626f6e64206e656564656420746f20626520612076616c696461746f722e55012a20606d61785f6e6f6d696e61746f725f636f756e74603a20546865206d6178206e756d626572206f662075736572732077686f2063616e2062652061206e6f6d696e61746f72206174206f6e63652e205768656e98202073657420746f20604e6f6e65602c206e6f206c696d697420697320656e666f726365642e55012a20606d61785f76616c696461746f725f636f756e74603a20546865206d6178206e756d626572206f662075736572732077686f2063616e20626520612076616c696461746f72206174206f6e63652e205768656e98202073657420746f20604e6f6e65602c206e6f206c696d697420697320656e666f726365642e59012a20606368696c6c5f7468726573686f6c64603a2054686520726174696f206f6620606d61785f6e6f6d696e61746f725f636f756e7460206f7220606d61785f76616c696461746f725f636f756e74602077686963681901202073686f756c642062652066696c6c656420696e206f7264657220666f722074686520606368696c6c5f6f7468657260207472616e73616374696f6e20746f20776f726b2e61012a20606d696e5f636f6d6d697373696f6e603a20546865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e207468617420656163682076616c696461746f7273206d757374206d61696e7461696e2e550120205468697320697320636865636b6564206f6e6c792075706f6e2063616c6c696e67206076616c6964617465602e204578697374696e672076616c696461746f727320617265206e6f742061666665637465642e00c452756e74696d654f726967696e206d75737420626520526f6f7420746f2063616c6c20746869732066756e6374696f6e2e0035014e4f54453a204578697374696e67206e6f6d696e61746f727320616e642076616c696461746f72732077696c6c206e6f742062652061666665637465642062792074686973207570646174652e1101746f206b69636b2070656f706c6520756e64657220746865206e6577206c696d6974732c20606368696c6c5f6f74686572602073686f756c642062652063616c6c65642e2c6368696c6c5f6f746865720401147374617368000130543a3a4163636f756e74496400176841014465636c61726520612060636f6e74726f6c6c65726020746f2073746f702070617274696369706174696e672061732065697468657220612076616c696461746f72206f72206e6f6d696e61746f722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e004101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2c206275742063616e2062652063616c6c656420627920616e796f6e652e0059014966207468652063616c6c6572206973207468652073616d652061732074686520636f6e74726f6c6c6572206265696e672074617267657465642c207468656e206e6f206675727468657220636865636b7320617265d8656e666f726365642c20616e6420746869732066756e6374696f6e2062656861766573206a757374206c696b6520606368696c6c602e005d014966207468652063616c6c657220697320646966666572656e74207468616e2074686520636f6e74726f6c6c6572206265696e672074617267657465642c2074686520666f6c6c6f77696e6720636f6e646974696f6e73306d757374206265206d65743a001d012a2060636f6e74726f6c6c657260206d7573742062656c6f6e6720746f2061206e6f6d696e61746f722077686f20686173206265636f6d65206e6f6e2d6465636f6461626c652c000c4f723a003d012a204120604368696c6c5468726573686f6c6460206d7573742062652073657420616e6420636865636b656420776869636820646566696e657320686f7720636c6f736520746f20746865206d6178550120206e6f6d696e61746f7273206f722076616c696461746f7273207765206d757374207265616368206265666f72652075736572732063616e207374617274206368696c6c696e67206f6e652d616e6f746865722e59012a204120604d61784e6f6d696e61746f72436f756e746020616e6420604d617856616c696461746f72436f756e7460206d75737420626520736574207768696368206973207573656420746f2064657465726d696e65902020686f7720636c6f73652077652061726520746f20746865207468726573686f6c642e5d012a204120604d696e4e6f6d696e61746f72426f6e646020616e6420604d696e56616c696461746f72426f6e6460206d7573742062652073657420616e6420636865636b65642c2077686963682064657465726d696e65735101202069662074686973206973206120706572736f6e20746861742073686f756c64206265206368696c6c6564206265636175736520746865792068617665206e6f74206d657420746865207468726573686f6c64402020626f6e642072657175697265642e005501546869732063616e2062652068656c7066756c20696620626f6e6420726571756972656d656e74732061726520757064617465642c20616e64207765206e65656420746f2072656d6f7665206f6c642075736572739877686f20646f206e6f74207361746973667920746865736520726571756972656d656e74732e68666f7263655f6170706c795f6d696e5f636f6d6d697373696f6e04013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400180c4501466f72636520612076616c696461746f7220746f2068617665206174206c6561737420746865206d696e696d756d20636f6d6d697373696f6e2e20546869732077696c6c206e6f74206166666563742061610176616c696461746f722077686f20616c726561647920686173206120636f6d6d697373696f6e2067726561746572207468616e206f7220657175616c20746f20746865206d696e696d756d2e20416e79206163636f756e743863616e2063616c6c20746869732e487365745f6d696e5f636f6d6d697373696f6e04010c6e65778101011c50657262696c6c00191025015365747320746865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e207468617420656163682076616c696461746f7273206d757374206d61696e7461696e2e005901546869732063616c6c20686173206c6f7765722070726976696c65676520726571756972656d656e7473207468616e20607365745f7374616b696e675f636f6e6669676020616e642063616e2062652063616c6c6564cc6279207468652060543a3a41646d696e4f726967696e602e20526f6f742063616e20616c776179732063616c6c20746869732e587061796f75745f7374616b6572735f62795f706167650c013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400010c657261100120457261496e6465780001107061676510011050616765001a443101506179206f757420612070616765206f6620746865207374616b65727320626568696e6420612076616c696461746f7220666f722074686520676976656e2065726120616e6420706167652e00e82d206076616c696461746f725f73746173686020697320746865207374617368206163636f756e74206f66207468652076616c696461746f722e31012d206065726160206d617920626520616e7920657261206265747765656e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e31012d2060706167656020697320746865207061676520696e646578206f66206e6f6d696e61746f727320746f20706179206f757420776974682076616c7565206265747765656e203020616e64b02020606e756d5f6e6f6d696e61746f7273202f20543a3a4d61784578706f737572655061676553697a65602e005501546865206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e20416e79206163636f756e742063616e2063616c6c20746869732066756e6374696f6e2c206576656e206966746974206973206e6f74206f6e65206f6620746865207374616b6572732e003d01496620612076616c696461746f7220686173206d6f7265207468616e205b60436f6e6669673a3a4d61784578706f737572655061676553697a65605d206e6f6d696e61746f7273206261636b696e6729017468656d2c207468656e20746865206c697374206f66206e6f6d696e61746f72732069732070616765642c207769746820656163682070616765206265696e672063617070656420617455015b60436f6e6669673a3a4d61784578706f737572655061676553697a65602e5d20496620612076616c696461746f7220686173206d6f7265207468616e206f6e652070616765206f66206e6f6d696e61746f72732c49017468652063616c6c206e6565647320746f206265206d61646520666f72206561636820706167652073657061726174656c7920696e206f7264657220666f7220616c6c20746865206e6f6d696e61746f727355016261636b696e6720612076616c696461746f7220746f207265636569766520746865207265776172642e20546865206e6f6d696e61746f727320617265206e6f7420736f72746564206163726f73732070616765736101616e6420736f2069742073686f756c64206e6f7420626520617373756d6564207468652068696768657374207374616b657220776f756c64206265206f6e2074686520746f706d6f7374207061676520616e642076696365490176657273612e204966207265776172647320617265206e6f7420636c61696d656420696e205b60436f6e6669673a3a486973746f72794465707468605d20657261732c207468657920617265206c6f73742e307570646174655f7061796565040128636f6e74726f6c6c6572000130543a3a4163636f756e744964001b18e04d6967726174657320616e206163636f756e742773206052657761726444657374696e6174696f6e3a3a436f6e74726f6c6c65726020746fa46052657761726444657374696e6174696f6e3a3a4163636f756e7428636f6e74726f6c6c657229602e005101456666656374732077696c6c2062652066656c7420696e7374616e746c792028617320736f6f6e20617320746869732066756e6374696f6e20697320636f6d706c65746564207375636365737366756c6c79292e003101546869732077696c6c20776169766520746865207472616e73616374696f6e20666565206966207468652060706179656560206973207375636365737366756c6c79206d696772617465642e686465707265636174655f636f6e74726f6c6c65725f626174636804012c636f6e74726f6c6c657273810601f4426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d6178436f6e74726f6c6c657273496e4465707265636174696f6e42617463683e001c1c5d01557064617465732061206261746368206f6620636f6e74726f6c6c6572206163636f756e747320746f20746865697220636f72726573706f6e64696e67207374617368206163636f756e7420696620746865792061726561016e6f74207468652073616d652e2049676e6f72657320616e7920636f6e74726f6c6c6572206163636f756e7473207468617420646f206e6f742065786973742c20616e6420646f6573206e6f74206f706572617465206966b874686520737461736820616e6420636f6e74726f6c6c65722061726520616c7265616479207468652073616d652e005101456666656374732077696c6c2062652066656c7420696e7374616e746c792028617320736f6f6e20617320746869732066756e6374696f6e20697320636f6d706c65746564207375636365737366756c6c79292e00b4546865206469737061746368206f726967696e206d7573742062652060543a3a41646d696e4f726967696e602e38726573746f72655f6c65646765721001147374617368000130543a3a4163636f756e7449640001406d617962655f636f6e74726f6c6c6572350101504f7074696f6e3c543a3a4163636f756e7449643e00012c6d617962655f746f74616c210401504f7074696f6e3c42616c616e63654f663c543e3e00013c6d617962655f756e6c6f636b696e6785060115014f7074696f6e3c426f756e6465645665633c556e6c6f636b4368756e6b3c42616c616e63654f663c543e3e2c20543a3a0a4d6178556e6c6f636b696e674368756e6b733e3e001d2c0501526573746f72657320746865207374617465206f662061206c656467657220776869636820697320696e20616e20696e636f6e73697374656e742073746174652e00dc54686520726571756972656d656e747320746f20726573746f72652061206c6564676572206172652074686520666f6c6c6f77696e673a642a2054686520737461736820697320626f6e6465643b206f720d012a20546865207374617368206973206e6f7420626f6e64656420627574206974206861732061207374616b696e67206c6f636b206c65667420626568696e643b206f7225012a204966207468652073746173682068617320616e206173736f636961746564206c656467657220616e642069747320737461746520697320696e636f6e73697374656e743b206f721d012a20496620746865206c6564676572206973206e6f7420636f72727570746564202a6275742a20697473207374616b696e67206c6f636b206973206f7574206f662073796e632e00610154686520606d617962655f2a6020696e70757420706172616d65746572732077696c6c206f76657277726974652074686520636f72726573706f6e64696e67206461746120616e64206d65746164617461206f662074686559016c6564676572206173736f6369617465642077697468207468652073746173682e2049662074686520696e70757420706172616d657465727320617265206e6f74207365742c20746865206c65646765722077696c6c9062652072657365742076616c7565732066726f6d206f6e2d636861696e2073746174652e406d6967726174655f63757272656e63790401147374617368000130543a3a4163636f756e744964001e1cbc52656d6f76657320746865206c6567616379205374616b696e67206c6f636b7320696620746865792065786973742e005101546869732072656d6f76657320746865206c6567616379206c6f636b206f6e20746865207374616b652077697468205b60436f6e6669673a3a4f6c6443757272656e6379605d20616e64206372656174657320615501686f6c64206f6e206974206966206e65656465642e20496620616c6c207374616b652063616e6e6f742062652068656c642c207468652062657374206566666f7274206973206d61646520746f20686f6c6420617329016d75636820617320706f737369626c652e205468652072656d61696e696e67207374616b6520697320666f726365642077697468647261776e2066726f6d20746865206c65646765722e00c4546865206665652069732077616976656420696620746865206d6967726174696f6e206973207375636365737366756c2e306d616e75616c5f736c6173680c013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400010c657261100120457261496e646578000138736c6173685f6672616374696f6e8101011c50657262696c6c0021541901546869732066756e6374696f6e20616c6c6f777320676f7665726e616e636520746f206d616e75616c6c7920736c61736820612076616c696461746f7220616e6420697320615c2a2a66616c6c6261636b206d656368616e69736d2a2a2e00b4546865206469737061746368206f726967696e206d7573742062652060543a3a41646d696e4f726967696e602e0034232320506172616d657465727309012d206076616c696461746f725f737461736860202d20546865207374617368206163636f756e74206f66207468652076616c696461746f7220746f20736c6173682efc2d206065726160202d205468652065726120696e207768696368207468652076616c696461746f722077617320696e2074686520616374697665207365742e49012d2060736c6173685f6672616374696f6e60202d205468652070657263656e74616765206f6620746865207374616b6520746f20736c6173682c2065787072657373656420617320612050657262696c6c2e002c2323204265686176696f72003d0154686520736c6173682077696c6c206265206170706c696564207573696e6720746865207374616e6461726420736c617368696e67206d656368616e6963732c2072657370656374696e672074686580636f6e666967757265642060536c61736844656665724475726174696f6e602e002c54686973206d65616e733a51012d204966207468652076616c696461746f722077617320616c726561647920736c61736865642062792061206869676865722070657263656e7461676520666f72207468652073616d65206572612c20746869739c2020736c6173682077696c6c2068617665206e6f206164646974696f6e616c206566666563742e51012d204966207468652076616c696461746f72207761732070726576696f75736c7920736c61736865642062792061206c6f7765722070657263656e746167652c206f6e6c792074686520646966666572656e636548202077696c6c206265206170706c6965642e3d012d2054686520736c6173682077696c6c2062652064656665727265642062792060536c61736844656665724475726174696f6e602065726173206265666f7265206265696e6720656e61637465642e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e650600000279050069060c3473705f61726974686d65746963287065725f7468696e67731c50657263656e7400000400080108753800006d0600000210007106103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f700404540118010c104e6f6f700000000c5365740400180104540001001852656d6f7665000200007506103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f700404540110010c104e6f6f700000000c5365740400100104540001001852656d6f7665000200007906103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f70040454016906010c104e6f6f700000000c536574040069060104540001001852656d6f7665000200007d06103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f70040454018101010c104e6f6f700000000c536574040081010104540001001852656d6f76650002000081060c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e6465645665630804540100045300000400050101185665633c543e0000850604184f7074696f6e0404540189060108104e6f6e6500000010536f6d6504008906000001000089060c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e646564566563080454018d06045300000400910601185665633c543e00008d06083870616c6c65745f7374616b696e672c556e6c6f636b4368756e6b041c42616c616e636501180008011476616c7565c901011c42616c616e636500010c657261b9040120457261496e646578000091060000028d060095060c3870616c6c65745f73657373696f6e1870616c6c65741043616c6c040454000108207365745f6b6579730801106b6579739906011c543a3a4b65797300011470726f6f6638011c5665633c75383e000024e453657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e1d01416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d0546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e0034232320436f6d706c657869747959012d20604f283129602e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f69647328296020776869636820697320202066697865642e2870757267655f6b657973000130c852656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722e00c05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e005501546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265205369676e656420616e6420746865206163636f756e74206d757374206265206569746865722062655d01636f6e7665727469626c6520746f20612076616c696461746f72204944207573696e672074686520636861696e2773207479706963616c2061646472657373696e672073797374656d20287468697320757375616c6c7951016d65616e73206265696e67206120636f6e74726f6c6c6572206163636f756e7429206f72206469726563746c7920636f6e7665727469626c6520696e746f20612076616c696461746f722049442028776869636894757375616c6c79206d65616e73206265696e672061207374617368206163636f756e74292e0034232320436f6d706c65786974793d012d20604f2831296020696e206e756d626572206f66206b65792074797065732e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f6698202060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e99060c60706f6c796d6573685f72756e74696d655f646576656c6f701c72756e74696d652c53657373696f6e4b657973000010011c6772616e647061b10101d03c4772616e647061206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c696300011062616265110501c43c42616265206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c6963000124696d5f6f6e6c696e65b90101d43c496d4f6e6c696e65206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c696300014c617574686f726974795f646973636f766572799d0601fc3c417574686f72697479446973636f76657279206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c696300009d060c5873705f617574686f726974795f646973636f766572790c617070185075626c69630000040004013c737232353531393a3a5075626c69630000a1060c3870616c6c65745f6772616e6470611870616c6c65741043616c6c04045400010c4c7265706f72745f65717569766f636174696f6e08014865717569766f636174696f6e5f70726f6f66a50601c8426f783c45717569766f636174696f6e50726f6f663c543a3a486173682c20426c6f636b4e756d626572466f723c543e3e3e00013c6b65795f6f776e65725f70726f6f6665050140543a3a4b65794f776e657250726f6f6600001009015265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f465717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66f8616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63654477696c6c206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e656408014865717569766f636174696f6e5f70726f6f66a50601c8426f783c45717569766f636174696f6e50726f6f663c543a3a486173682c20426c6f636b4e756d626572466f723c543e3e3e00013c6b65795f6f776e65725f70726f6f6665050140543a3a4b65794f776e657250726f6f6600012409015265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f465717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66f8616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63654477696c6c206265207265706f727465642e000d01546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c791501626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c2061732073756368150169662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e247265706f727465722e306e6f74655f7374616c6c656408011464656c6179100144426c6f636b4e756d626572466f723c543e00016c626573745f66696e616c697a65645f626c6f636b5f6e756d626572100144426c6f636b4e756d626572466f723c543e0002303d014e6f74652074686174207468652063757272656e7420617574686f7269747920736574206f6620746865204752414e4450412066696e616c6974792067616467657420686173207374616c6c65642e006101546869732077696c6c2074726967676572206120666f7263656420617574686f7269747920736574206368616e67652061742074686520626567696e6e696e67206f6620746865206e6578742073657373696f6e2c20746f6101626520656e6163746564206064656c61796020626c6f636b7320616674657220746861742e20546865206064656c6179602073686f756c64206265206869676820656e6f75676820746f20736166656c7920617373756d654901746861742074686520626c6f636b207369676e616c6c696e672074686520666f72636564206368616e67652077696c6c206e6f742062652072652d6f7267656420652e672e203130303020626c6f636b732e5d0154686520626c6f636b2070726f64756374696f6e207261746520287768696368206d617920626520736c6f77656420646f776e2062656361757365206f662066696e616c697479206c616767696e67292073686f756c64510162652074616b656e20696e746f206163636f756e74207768656e2063686f6f73696e6720746865206064656c6179602e20546865204752414e44504120766f74657273206261736564206f6e20746865206e65775501617574686f726974792077696c6c20737461727420766f74696e67206f6e20746f70206f662060626573745f66696e616c697a65645f626c6f636b5f6e756d6265726020666f72206e65772066696e616c697a65644d01626c6f636b732e2060626573745f66696e616c697a65645f626c6f636b5f6e756d626572602073686f756c64206265207468652068696768657374206f6620746865206c61746573742066696e616c697a6564c4626c6f636b206f6620616c6c2076616c696461746f7273206f6620746865206e657720617574686f72697479207365742e00584f6e6c792063616c6c61626c6520627920726f6f742e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ea506085073705f636f6e73656e7375735f6772616e6470614445717569766f636174696f6e50726f6f660804480134044e0110000801187365745f6964300114536574496400013065717569766f636174696f6ea906014845717569766f636174696f6e3c482c204e3e0000a906085073705f636f6e73656e7375735f6772616e6470613045717569766f636174696f6e0804480134044e011001081c507265766f74650400ad0601890166696e616c6974795f6772616e6470613a3a45717569766f636174696f6e3c417574686f7269747949642c2066696e616c6974795f6772616e6470613a3a507265766f74653c0a482c204e3e2c20417574686f726974795369676e61747572652c3e00000024507265636f6d6d69740400bd0601910166696e616c6974795f6772616e6470613a3a45717569766f636174696f6e3c417574686f7269747949642c2066696e616c6974795f6772616e6470613a3a507265636f6d6d69740a3c482c204e3e2c20417574686f726974795369676e61747572652c3e00010000ad06084066696e616c6974795f6772616e6470613045717569766f636174696f6e0c08496401b101045601b106045301b50600100130726f756e645f6e756d62657230010c7536340001206964656e74697479b101010849640001146669727374b906011828562c2053290001187365636f6e64b906011828562c2053290000b106084066696e616c6974795f6772616e6470611c507265766f74650804480134044e01100008012c7461726765745f68617368340104480001347461726765745f6e756d6265721001044e0000b5060c5073705f636f6e73656e7375735f6772616e6470610c617070245369676e61747572650000040015020148656432353531393a3a5369676e61747572650000b90600000408b106b50600bd06084066696e616c6974795f6772616e6470613045717569766f636174696f6e0c08496401b101045601c106045301b50600100130726f756e645f6e756d62657230010c7536340001206964656e74697479b101010849640001146669727374c506011828562c2053290001187365636f6e64c506011828562c2053290000c106084066696e616c6974795f6772616e64706124507265636f6d6d69740804480134044e01100008012c7461726765745f68617368340104480001347461726765745f6e756d6265721001044e0000c50600000408c106b50600c9060c4070616c6c65745f696d5f6f6e6c696e651870616c6c65741043616c6c04045400010424686561727462656174080124686561727462656174cd0601704865617274626561743c426c6f636b4e756d626572466f723c543e3e0001247369676e6174757265d10601bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e617475726500000c38232320436f6d706c65786974793afc2d20604f284b2960207768657265204b206973206c656e677468206f6620604b6579736020286865617274626561742e76616c696461746f72735f6c656e298820202d20604f284b29603a206465636f64696e67206f66206c656e67746820604b60040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ecd06084070616c6c65745f696d5f6f6e6c696e6524486561727462656174042c426c6f636b4e756d626572011000100130626c6f636b5f6e756d62657210012c426c6f636b4e756d62657200013473657373696f6e5f696e64657810013053657373696f6e496e64657800013c617574686f726974795f696e64657810012441757468496e64657800013876616c696461746f72735f6c656e10010c7533320000d106104070616c6c65745f696d5f6f6e6c696e651c737232353531392c6170705f73723235353139245369676e61747572650000040015020148737232353531393a3a5369676e61747572650000d5060c2c70616c6c65745f7375646f1870616c6c65741043616c6c040454000110107375646f04011063616c6c3906017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000018350141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0034232320436f6d706c65786974791c2d204f2831292e547375646f5f756e636865636b65645f77656967687408011063616c6c3906017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000118776569676874280118576569676874000120350141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e2d01546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b05375646f207573657220746f20737065636966792074686520776569676874206f66207468652063616c6c2e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0034232320436f6d706c65786974791c2d204f2831292e1c7365745f6b657904010c6e6577790501504163636f756e7449644c6f6f6b75704f663c543e00021c5d0141757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f106b65792e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0034232320436f6d706c65786974791c2d204f2831292e1c7375646f5f617308010c77686f790501504163636f756e7449644c6f6f6b75704f663c543e00011063616c6c3906017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00031c4d0141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d406120676976656e206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0034232320436f6d706c65786974791c2d204f2831292e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ed9060c3070616c6c65745f61737365741870616c6c65741043616c6c0404540001885872656769737465725f756e697175655f7469636b65720401187469636b6572290101185469636b65720000402101526567697374657273206120756e69717565207469636b6572206f7220657874656e6473207468652076616c6964697479206f6620616e206578697374696e67207469636b65722e004d01546869732066756e6374696f6e20616c6c6f7773207468652063616c6c657220746f2072656769737465722061206e6577207469636b6572206f7220657874656e642074686520726567697374726174696f6e41016f6620616e206578697374696e67207469636b65722e20546865207469636b65722076616c696469747920646f6573206e6f7420636172727920666f7277617264207768656e2072656e6577696e672e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792e902a20607469636b657260202d20546865207469636b657220746f2072656769737465722e002023204576656e747301012a20605469636b65725265676973746572656460202d205768656e2061207469636b6572206973207375636365737366756c6c7920726567697374657265642e002023204572726f727309012a20605469636b6572416c72656164795265676973746572656460202d20496620746865207469636b657220697320616c726561647920726567697374657265642e31012a20605469636b6572546f6f4c6f6e6760202d20496620746865207469636b6572206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682e1d012a2060496e76616c69645469636b657243686172616374657260202d20496620746865207469636b657220636f6e7461696e7320696e76616c696420636861726163746572732e586163636570745f7469636b65725f7472616e7366657204011c617574685f696430010c75363400013c68416363657074732061207469636b6572207472616e736665722e002d01436f6e73756d65732074686520617574686f72697a6174696f6e2060617574685f6964602028736565206070616c6c65745f6964656e746974793a3a636f6e73756d655f6175746860292e25014e423a20546f2072656a65637420746865207472616e736665722c2063616c6c2072656d6f766520617574682066756e6374696f6e20696e206964656e74697479206d6f64756c652e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792e01012a2060617574685f696460202d20417574686f72697a6174696f6e204944206f66207469636b6572207472616e7366657220617574686f72697a6174696f6e2e002023204576656e747309012a20605469636b65725472616e7366657272656460202d205768656e2061207469636b6572206973207375636365737366756c6c79207472616e736665727265642e002023204572726f727325012a20605469636b6572526567697374726174696f6e4e6f74466f756e6460202d20496620746865207469636b657220726567697374726174696f6e206973206e6f7420666f756e642e45012a20605469636b65724973416c72656164794c696e6b6564546f416e417373657460202d20496620746865207469636b657220697320616c7265616479206c696e6b656420746f20616e2061737365742e7c6163636570745f61737365745f6f776e6572736869705f7472616e7366657204011c617574685f696430010c75363400023c904163636570747320616e206173736574206f776e657273686970207472616e736665722e002d01436f6e73756d65732074686520617574686f72697a6174696f6e2060617574685f6964602028736565206070616c6c65745f6964656e746974793a3a636f6e73756d655f6175746860292e25014e423a20546f2072656a65637420746865207472616e736665722c2063616c6c2072656d6f766520617574682066756e6374696f6e20696e206964656e74697479206d6f64756c652e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792e35012a2060617574685f696460202d20417574686f72697a6174696f6e204944206f6620746865206173736574206f776e657273686970207472616e7366657220617574686f72697a6174696f6e2e002023204576656e74734d012a206041737365744f776e6572736869705472616e7366657272656460202d205768656e2061206173736574206f776e657273686970206973207375636365737366756c6c79207472616e736665727265642e002023204572726f727325012a20605469636b6572526567697374726174696f6e4e6f74466f756e6460202d20496620746865207469636b657220726567697374726174696f6e206973206e6f7420666f756e642e45012a20605469636b65724973416c72656164794c696e6b6564546f416e417373657460202d20496620746865207469636b657220697320616c7265616479206c696e6b656420746f20616e2061737365742e306372656174655f617373657414012861737365745f6e616d65e901012441737365744e616d65000124646976697369626c65200110626f6f6c00012861737365745f74797065dd01012441737365745479706500014461737365745f6964656e74696669657273ed0101505665633c41737365744964656e7469666965723e00014866756e64696e675f726f756e645f6e616d65fd0101604f7074696f6e3c46756e64696e67526f756e644e616d653e00034c50437265617465732061206e65772061737365742e003d0154686520746f74616c20737570706c792077696c6c20696e697469616c6c79206265207a65726f2e20546f206d696e7420746f6b656e732c20757365205b6050616c6c65743a3a6973737565605d2e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792ed02a206061737365745f6e616d6560202d20546865205b6041737365744e616d65605d206f6620746865206e65772061737365742e71012a2060646976697369626c6560202d2053657473205b60417373657444657461696c733a3a646976697369626c65605d2c20776865726520607472756560206d65616e732074686520617373657420697320646976697369626c652ed02a206061737365745f7479706560202d20546865205b60417373657454797065605d206f6620746865206e65772061737365742ee02a206061737365745f6964656e7469666965727360202d204120766563746f72206f66205b6041737365744964656e746966696572605d2e39012a206066756e64696e675f726f756e645f6e616d6560202d20546865206e616d65206f66207468652066756e64696e6720726f756e6420285b6046756e64696e67526f756e644e616d65605d292e002023204576656e7473f02a206041737365744372656174656460202d205768656e2061206e6577206173736574206973207375636365737366756c6c7920637265617465642e002023204572726f72737d012a20604d61784c656e6774684f6641737365744e616d65457863656564656460202d20496620746865206173736574206e616d65206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682e19012a2060496e76616c6964437573746f6d417373657454797065496460202d2049662074686520637573746f6d206173736574207479706520494420697320696e76616c69642e25012a2060496e76616c696441737365744964656e74696669657260202d20496620616e79206f6620746865206173736574206964656e746966696572732061726520696e76616c69642e18667265657a6504012061737365745f6964b0011c417373657449640004448c467265657a6573207472616e7366657273206f66206120676976656e2061737365742e008101546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f20667265657a65207472616e7366657273206f66206120676976656e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792e8c2a206061737365745f696460202d2054686520617373657420746f20667265657a652e003423205065726d697373696f6e731c2a204173736574002023204576656e7473dc2a2060417373657446726f7a656e60202d205768656e20616e206173736574206973207375636365737366756c6c792066726f7a656e2e002023204572726f7273b82a20604e6f53756368417373657460202d2049662074686520617373657420646f6573206e6f742065786973742ecc2a2060416c726561647946726f7a656e60202d2049662074686520617373657420697320616c72656164792066726f7a656e2e20756e667265657a6504012061737365745f6964b0011c4173736574496400054494556e667265657a6573207472616e7366657273206f66206120676976656e2061737365742e008901546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f20756e667265657a65207472616e7366657273206f66206120676976656e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792e942a206061737365745f696460202d2054686520617373657420746f20756e667265657a652e003423205065726d697373696f6e731c2a204173736574002023204576656e7473ec2a20604173736574556e66726f7a656e60202d205768656e20616e206173736574206973207375636365737366756c6c7920756e66726f7a656e2e002023204572726f7273b82a20604e6f53756368417373657460202d2049662074686520617373657420646f6573206e6f742065786973742eac2a20604e6f7446726f7a656e60202d20496620746865206173736574206973206e6f742066726f7a656e2e3072656e616d655f617373657408012061737365745f6964b0011c4173736574496400012861737365745f6e616d65e901012441737365744e616d65000648c45570646174657320746865205b6041737365744e616d65605d206173736f63696174656420746f20616e2061737365742e006901546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f2075706461746520746865206e616d65206f6620616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792edc2a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f207468652061737365742e31012a206061737365745f6e616d6560202d20546865206e6577205b6041737365744e616d65605d20746861742077696c6c206265206173736f63696174656420746f207468652061737365742e003423205065726d697373696f6e731c2a204173736574002023204576656e7473e42a2060417373657452656e616d656460202d205768656e20616e206173736574206973207375636365737366756c6c792072656e616d65642e002023204572726f72737d012a20604d61784c656e6774684f6641737365744e616d65457863656564656460202d20496620746865206173736574206e616d65206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682eb82a20604e6f53756368417373657460202d2049662074686520617373657420646f6573206e6f742065786973742e1469737375650c012061737365745f6964b0011c41737365744964000118616d6f756e7418011c42616c616e6365000138706f7274666f6c696f5f6b696e64f40134506f7274666f6c696f4b696e64000754590149737375652028692e65206d696e7429206e657720746f6b656e7320746f207468652063616c6c65722c207768696368206d75737420626520616e20617574686f72697a65642065787465726e616c206167656e742e008101546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f206d696e74206e657720746f6b656e7320666f72206120676976656e2061737365742e002c2320417267756d656e747325012a20606f726967696e603a2041207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f6620607469636b6572602ed82a206061737365745f6964603a20746865205b6041737365744964605d206173736f63696174656420746f207468652061737365742ed42a2060616d6f756e74603a2054686520616d6f756e74206f6620746f6b656e7320746861742077696c6c206265206973737565642e7d012a2060706f7274666f6c696f5f6b696e64603a20546865205b60506f7274666f6c696f4b696e64605d206f662074686520706f7274666f6c696f20746861742077696c6c207265636569766520746865206d696e74656420746f6b656e732e003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f002023204576656e747325012a2060417373657442616c616e63655570646174656460202d205768656e207468652061737365742062616c616e6365206973207375636365737366756c6c7920757064617465642e002023204572726f727319012a2060556e65787065637465644e6f6e46756e6769626c65546f6b656e60202d204966207468652061737365742069732061206e6f6e2d66756e6769626c6520746f6b656e2e6d012a2060496e76616c69644772616e756c617269747960202d2049662074686520616d6f756e7420746f20697373756520646f6573206e6f74206d65657420746865206772616e756c617269747920726571756972656d656e74732e41012a2060546f74616c537570706c794f766572666c6f7760202d2049662074686520746f74616c20737570706c79206578636565647320746865206d6178696d756d20616c6c6f776564206c696d69742e1872656465656d0c012061737365745f6964b0011c4173736574496400011476616c756518011c42616c616e6365000138706f7274666f6c696f5f6b696e64f40134506f7274666f6c696f4b696e64000854e10152656465656d732028692e65206275726e7329206578697374696e6720746f6b656e73206279207265647563696e67207468652062616c616e6365206f66207468652063616c6c6572277320706f7274666f6c696f20616e642074686520746f74616c20737570706c79206f66207468652061737365742e007d01546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f2072656465656d20746f6b656e732066726f6d206120676976656e2061737365742e002c2320417267756d656e747339012a20606f726967696e603a2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed82a206061737365745f6964603a20746865205b6041737365744964605d206173736f63696174656420746f207468652061737365742e982a206076616c7565603a20616d6f756e74206f6620746f6b656e7320746f2072656465656d2e35012a2060706f7274666f6c696f5f6b696e64603a20746865205b60506f7274666f6c696f4b696e64605d20746861742077696c6c2068617665206974732062616c616e636520726564756365642e003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f002023204576656e747325012a2060417373657442616c616e63655570646174656460202d205768656e207468652061737365742062616c616e6365206973207375636365737366756c6c7920757064617465642e002023204572726f727319012a2060556e65787065637465644e6f6e46756e6769626c65546f6b656e60202d204966207468652061737365742069732061206e6f6e2d66756e6769626c6520746f6b656e2e6d012a2060496e76616c69644772616e756c617269747960202d204966207468652076616c756520746f2072656465656d20646f6573206e6f74206d65657420746865206772616e756c617269747920726571756972656d656e74732e41012a2060546f74616c537570706c794f766572666c6f7760202d2049662074686520746f74616c20737570706c79206578636565647320746865206d6178696d756d20616c6c6f776564206c696d69742e386d616b655f646976697369626c6504012061737365745f6964b0011c417373657449640009487d01496620746865206173736574206173736f63696174656420746f206061737365745f69646020697320696e646976697369626c652c2073657473205b60417373657444657461696c733a3a646976697369626c65605d20746f20747275652e008901546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f206d616b6520616e20696e646976697369626c6520617373657420646976697369626c652e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792edc2a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f207468652061737365742e003423205065726d697373696f6e731c2a204173736574002023204576656e747351012a206044697669736962696c6974794368616e67656460202d205768656e207468652064697669736962696c697479206f6620616e206173736574206973207375636365737366756c6c79206368616e6765642e002023204572726f7273b82a20604e6f53756368417373657460202d2049662074686520617373657420646f6573206e6f742065786973742e19012a2060556e65787065637465644e6f6e46756e6769626c65546f6b656e60202d204966207468652061737365742069732061206e6f6e2d66756e6769626c6520746f6b656e2ef82a20604173736574416c7265616479446976697369626c6560202d2049662074686520617373657420697320616c726561647920646976697369626c652e346164645f646f63756d656e7473080110646f6373dd0601345665633c446f63756d656e743e00012061737365745f6964b0011c41737365744964000a448041646420646f63756d656e747320666f72206120676976656e2061737365742e006101546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f2061646420646f63756d656e747320746f20616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792edc2a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f207468652061737365742ec42a2060646f637360202d20446f63756d656e747320746f20626520617474616368656420746f207468652061737365742e003423205065726d697373696f6e731c2a204173736574002023204576656e747319012a2060446f63756d656e74416464656460202d205768656e206120646f63756d656e74206973207375636365737366756c6c7920616464656420746f20616e2061737365742e002023204572726f7273ec2a2060436f756e7465724f766572666c6f7760202d2049662074686520646f63756d656e7420494420636f756e746572206f766572666c6f77732e4072656d6f76655f646f63756d656e747308011c646f63735f69641503013c5665633c446f63756d656e7449643e00012061737365745f6964b0011c41737365744964000b388c52656d6f766520646f63756d656e747320666f72206120676976656e2061737365742e007501546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f2072656d6f766520646f63756d656e74732066726f6d20616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792edc2a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f207468652061737365742e45012a2060646f63735f696460202d204120766563746f72206f6620616c6c205b60446f63756d656e744964605d20746861742077696c6c2062652072656d6f7665642066726f6d207468652061737365742e003423205065726d697373696f6e731c2a204173736574002023204576656e747331012a2060446f63756d656e7452656d6f76656460202d205768656e206120646f63756d656e74206973207375636365737366756c6c792072656d6f7665642066726f6d20616e2061737365742e447365745f66756e64696e675f726f756e6408012061737365745f6964b0011c4173736574496400014866756e64696e675f726f756e645f6e616d650102014046756e64696e67526f756e644e616d65000c44ac5365747320746865206e616d65206f66207468652063757272656e742066756e64696e6720726f756e642e00d501546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f2073657420746865206e616d65206f66207468652063757272656e742066756e64696e6720726f756e6420666f7220616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792edc2a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f207468652061737365742e3d012a206066756e64696e675f726f756e645f6e616d6560202d20546865205b6046756e64696e67526f756e644e616d65605d206f66207468652063757272656e742066756e64696e6720726f756e642e003423205065726d697373696f6e731c2a204173736574002023204576656e747319012a206046756e64696e67526f756e6453657460202d205768656e207468652066756e64696e6720726f756e64206e616d65206973207375636365737366756c6c79207365742e002023204572726f7273b1012a206046756e64696e67526f756e644e616d654d61784c656e677468457863656564656460202d204966207468652066756e64696e6720726f756e64206e616d65206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682e487570646174655f6964656e7469666965727308012061737365745f6964b0011c4173736574496400014461737365745f6964656e74696669657273ed0101505665633c41737365744964656e7469666965723e000d44d85570646174657320746865206173736574206964656e74696669657273206173736f63696174656420746f207468652061737365742e00a101546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f2075706461746520746865206173736574206964656e7469666965727320666f7220616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792edc2a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f207468652061737365742e75012a206061737365745f6964656e7469666965727360202d204120766563746f72206f66205b6041737365744964656e746966696572605d20746861742077696c6c206265206173736f63696174656420746f207468652061737365742e003423205065726d697373696f6e731c2a204173736574002023204576656e747335012a20604964656e746966696572735570646174656460202d205768656e20746865206173736574206964656e7469666965727320617265207375636365737366756c6c7920757064617465642e002023204572726f727325012a2060496e76616c696441737365744964656e74696669657260202d20496620616e79206f6620746865206173736574206964656e746966696572732061726520696e76616c69642e4c636f6e74726f6c6c65725f7472616e736665720c012061737365745f6964b0011c4173736574496400011476616c756518011c42616c616e636500013866726f6d5f706f7274666f6c696ff0012c506f7274666f6c696f4964000e545101466f726365732061207472616e73666572206f6620746f6b656e732066726f6d206066726f6d5f706f7274666f6c696f6020746f207468652063616c6c657227732064656661756c7420706f7274666f6c696f2e00dd01546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f20666f7263652061207472616e73666572206f6620746f6b656e732066726f6d206f6e6520706f7274666f6c696f20746f20616e6f746865722e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792edc2a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f207468652061737365742efc2a206076616c756560202d20546865205b6042616c616e6365605d206f6620746f6b656e7320746861742077696c6c206265207472616e736665727265642e31012a206066726f6d5f706f7274666f6c696f60202d20546865205b60506f7274666f6c696f4964605d20746861742077696c6c2068617665206974732062616c616e636520726564756365642e003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f002023204576656e747309012a2060436f6e74726f6c6c65725472616e7366657260202d205768656e20746f6b656e7320617265207375636365737366756c6c79207472616e736665727265642e002023204572726f727319012a2060556e65787065637465644e6f6e46756e6769626c65546f6b656e60202d204966207468652061737365742069732061206e6f6e2d66756e6769626c6520746f6b656e2e79012a2060496e76616c69644772616e756c617269747960202d2049662074686520616d6f756e7420746f207472616e7366657220646f6573206e6f74206d65657420746865206772616e756c617269747920726571756972656d656e74732e41012a2060546f74616c537570706c794f766572666c6f7760202d2049662074686520746f74616c20737570706c79206578636565647320746865206d6178696d756d20616c6c6f776564206c696d69742e6872656769737465725f637573746f6d5f61737365745f74797065040108747938011c5665633c75383e000f3078526567697374657273206120637573746f6d20617373657420747970652e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792ef82a2060747960202d20436f6e7461696e732074686520737472696e6720726570726573656e746174696f6e206f662074686520617373657420747970652e002023204576656e747361012a2060437573746f6d4173736574547970655265676973746572656460202d205768656e2061206e657720637573746f6d2061737365742074797065206973207375636365737366756c6c7920726567697374657265642e61012a2060437573746f6d417373657454797065416c72656164795265676973746572656460202d205768656e2074686520637573746f6d206173736574207479706520697320616c726561647920726567697374657265642e002023204572726f727345012a2060546f6f4c6f6e6760202d2049662074686520637573746f6d2061737365742074797065206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682e746372656174655f61737365745f776974685f637573746f6d5f7479706514012861737365745f6e616d65e901012441737365744e616d65000124646976697369626c65200110626f6f6c000144637573746f6d5f61737365745f7479706538011c5665633c75383e00014461737365745f6964656e74696669657273ed0101505665633c41737365744964656e7469666965723e00014866756e64696e675f726f756e645f6e616d65fd0101604f7074696f6e3c46756e64696e67526f756e644e616d653e001058c4437265617465732061206e657720617373657420776974682061206e657720637573746f6d20617373657420747970652e003d0154686520746f74616c20737570706c792077696c6c20696e697469616c6c79206265207a65726f2e20546f206d696e7420746f6b656e732c20757365205b6050616c6c65743a3a6973737565605d2e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792ed02a206061737365745f6e616d6560202d20546865205b6041737365744e616d65605d206f6620746865206e65772061737365742e71012a2060646976697369626c6560202d2053657473205b60417373657444657461696c733a3a646976697369626c65605d2c20776865726520607472756560206d65616e732074686520617373657420697320646976697369626c652eec2a2060637573746f6d5f61737365745f7479706560202d2054686520637573746f6d2061737365742074797065206f66207468652061737365742ee02a206061737365745f6964656e7469666965727360202d204120766563746f72206f66205b6041737365744964656e746966696572605d2e39012a206066756e64696e675f726f756e645f6e616d6560202d20546865206e616d65206f66207468652066756e64696e6720726f756e6420285b6046756e64696e67526f756e644e616d65605d292e002023204576656e7473f02a206041737365744372656174656460202d205768656e2061206e6577206173736574206973207375636365737366756c6c7920637265617465642e61012a2060437573746f6d4173736574547970655265676973746572656460202d205768656e2061206e657720637573746f6d2061737365742074797065206973207375636365737366756c6c7920726567697374657265642e61012a2060437573746f6d417373657454797065416c72656164795265676973746572656460202d205768656e2074686520637573746f6d206173736574207479706520697320616c726561647920726567697374657265642e002023204572726f72737d012a20604d61784c656e6774684f6641737365744e616d65457863656564656460202d20496620746865206173736574206e616d65206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682e19012a2060496e76616c6964437573746f6d417373657454797065496460202d2049662074686520637573746f6d206173736574207479706520494420697320696e76616c69642e25012a2060496e76616c696441737365744964656e74696669657260202d20496620616e79206f6620746865206173736574206964656e746966696572732061726520696e76616c69642e45012a2060546f6f4c6f6e6760202d2049662074686520637573746f6d2061737365742074797065206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682e487365745f61737365745f6d6574616461746110012061737365745f6964b0011c4173736574496400010c6b65796902014041737365744d657461646174614b657900011476616c75653502014841737365744d6574616461746156616c756500011864657461696c390201ac4f7074696f6e3c41737365744d6574616461746156616c756544657461696c3c543a3a4d6f6d656e743e3e00115464536574206173736574206d657461646174612076616c75652e006101546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f20736574206d6574616461746120666f7220616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792edc2a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f207468652061737365742eec2a20606b657960202d20546865205b6041737365744d657461646174614b6579605d206173736f63696174656420746f207468652061737365742e05012a206076616c756560202d20546865205b6041737365744d6574616461746156616c7565605d206f662074686520676976656e206d65746164617461206b65792e29012a206064657461696c7360202d204f7074696f6e616c205b6041737365744d6574616461746156616c756544657461696c605d20286578706972652c206c6f636b20737461747573292e003423205065726d697373696f6e731c2a204173736574002023204576656e747339012a206053657441737365744d6574616461746156616c756560202d205768656e20746865206173736574206d657461646174612076616c7565206973207375636365737366756c6c79207365742e002023204572726f7273fc2a206041737365744d657461646174614b657949734d697373696e6760202d20496620746865206d65746164617461206b6579206973206d697373696e672e05012a206041737365744d6574616461746156616c756549734c6f636b656460202d20496620746865206d657461646174612076616c7565206973206c6f636b65642ea9012a206041737365744d6574616461746156616c75654d61784c656e677468457863656564656460202d20496620746865206d657461646174612076616c7565206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682e687365745f61737365745f6d657461646174615f64657461696c730c012061737365745f6964b0011c4173736574496400010c6b65796902014041737365744d657461646174614b657900011864657461696c3d02018c41737365744d6574616461746156616c756544657461696c3c543a3a4d6f6d656e743e001250dc536574206173736574206d657461646174612076616c75652064657461696c7320286578706972652c206c6f636b20737461747573292e008101546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f20736574206d657461646174612064657461696c7320666f7220616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792edc2a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f207468652061737365742eec2a20606b657960202d20546865205b6041737365744d657461646174614b6579605d206173736f63696174656420746f207468652061737365742ea9012a206064657461696c7360202d20546865205b6041737365744d6574616461746156616c756544657461696c605d20286578706972652c206c6f636b207374617475732920746861742077696c6c206265206173736f63696174656420746f207468652061737365742e003423205065726d697373696f6e731c2a204173736574002023204576656e747379012a206053657441737365744d6574616461746156616c756544657461696c7360202d205768656e20746865206173736574206d657461646174612076616c75652064657461696c7320617265207375636365737366756c6c79207365742e002023204572726f7273fc2a206041737365744d657461646174614b657949734d697373696e6760202d20496620746865206d65746164617461206b6579206973206d697373696e672e05012a206041737365744d6574616461746156616c756549734c6f636b656460202d20496620746865206d657461646174612076616c7565206973206c6f636b65642efc2a206041737365744d6574616461746156616c75654973456d70747960202d20496620746865206d657461646174612076616c756520697320656d7074792e9472656769737465725f616e645f7365745f6c6f63616c5f61737365745f6d6574616461746114012061737365745f6964b0011c417373657449640001106e616d654502014441737365744d657461646174614e616d65000110737065634d02014441737365744d657461646174615370656300011476616c75653502014841737365744d6574616461746156616c756500011864657461696c390201ac4f7074696f6e3c41737365744d6574616461746156616c756544657461696c3c543a3a4d6f6d656e743e3e00135c9c52656769737465727320616e6420736574206c6f63616c206173736574206d657461646174612e00ad01546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f20726567697374657220616e6420736574206c6f63616c206d6574616461746120666f7220616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792edc2a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f207468652061737365742e942a20606e616d6560202d20546865205b6041737365744d657461646174614e616d65605d2e15012a20607370656360202d20546865206173736574206d657461646174612073706563696669636174696f6e7320285b6041737365744d6574616461746153706563605d292e05012a206076616c756560202d20546865205b6041737365744d6574616461746156616c7565605d206f662074686520676976656e206d65746164617461206b65792e29012a206064657461696c7360202d204f7074696f6e616c205b6041737365744d6574616461746156616c756544657461696c605d20286578706972652c206c6f636b20737461747573292e003423205065726d697373696f6e731c2a204173736574002023204576656e74738d012a2060526567697374657241737365744d657461646174614c6f63616c5479706560202d205768656e20746865206c6f63616c206173736574206d657461646174612074797065206973207375636365737366756c6c7920726567697374657265642e39012a206053657441737365744d6574616461746156616c756560202d205768656e20746865206173736574206d657461646174612076616c7565206973207375636365737366756c6c79207365742e002023204572726f727349012a206041737365744d657461646174614c6f63616c4b6579416c726561647945786973747360202d20496620746865206c6f63616c206d65746164617461206b657920616c7265616479206578697374732e05012a206041737365744d6574616461746156616c756549734c6f636b656460202d20496620746865206d657461646174612076616c7565206973206c6f636b65642ea9012a206041737365744d6574616461746156616c75654d61784c656e677468457863656564656460202d20496620746865206d657461646174612076616c7565206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682e8872656769737465725f61737365745f6d657461646174615f6c6f63616c5f747970650c012061737365745f6964b0011c417373657449640001106e616d654502014441737365744d657461646174614e616d65000110737065634d02014441737365744d657461646174615370656300145090526567697374657273206173736574206d65746164617461206c6f63616c20747970652e00a901546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f2072656769737465722061206c6f63616c206d65746164617461207479706520666f7220616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792edc2a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f207468652061737365742e942a20606e616d6560202d20546865205b6041737365744d657461646174614e616d65605d2e15012a20607370656360202d20546865206173736574206d657461646174612073706563696669636174696f6e7320285b6041737365744d6574616461746153706563605d292e003423205065726d697373696f6e731c2a204173736574002023204576656e74738d012a2060526567697374657241737365744d657461646174614c6f63616c5479706560202d205768656e20746865206c6f63616c206173736574206d657461646174612074797065206973207375636365737366756c6c7920726567697374657265642e002023204572726f727349012a206041737365744d657461646174614c6f63616c4b6579416c726561647945786973747360202d20496620746865206c6f63616c206d65746164617461206b657920616c7265616479206578697374732ea1012a206041737365744d657461646174614e616d654d61784c656e677468457863656564656460202d20496620746865206d65746164617461206e616d65206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682ed9012a206041737365744d65746164617461547970654465664d61784c656e677468457863656564656460202d20496620746865206d65746164617461207479706520646566696e6974696f6e206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682e8c72656769737465725f61737365745f6d657461646174615f676c6f62616c5f747970650801106e616d654502014441737365744d657461646174614e616d65000110737065634d02014441737365744d657461646174615370656300154094526567697374657273206173736574206d6574616461746120676c6f62616c20747970652e002101546869732066756e6374696f6e20616c6c6f77732074686520726f6f74206f726967696e20746f207265676973746572206120676c6f62616c206d6574616461746120747970652e002c2320417267756d656e7473742a20606f726967696e60202d2054686520726f6f74206f726967696e2e942a20606e616d6560202d20546865205b6041737365744d657461646174614e616d65605d2e15012a20607370656360202d20546865206173736574206d657461646174612073706563696669636174696f6e7320285b6041737365744d6574616461746153706563605d292e002023204576656e747395012a2060526567697374657241737365744d65746164617461476c6f62616c5479706560202d205768656e2074686520676c6f62616c206173736574206d657461646174612074797065206973207375636365737366756c6c7920726567697374657265642e002023204572726f727351012a206041737365744d65746164617461476c6f62616c4b6579416c726561647945786973747360202d2049662074686520676c6f62616c206d65746164617461206b657920616c7265616479206578697374732ea1012a206041737365744d657461646174614e616d654d61784c656e677468457863656564656460202d20496620746865206d65746164617461206e616d65206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682ed9012a206041737365744d65746164617461547970654465664d61784c656e677468457863656564656460202d20496620746865206d65746164617461207479706520646566696e6974696f6e206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682e447570646174655f61737365745f7479706508012061737365745f6964b0011c4173736574496400012861737365745f74797065dd01012441737365745479706500164c7455706461746573207468652074797065206f6620616e2061737365742e006901546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f20757064617465207468652074797065206f6620616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792edc2a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f207468652061737365742ed02a206061737365745f7479706560202d20546865206e6577205b60417373657454797065605d206f66207468652061737365742e003423205065726d697373696f6e731c2a204173736574002023204576656e74730d012a20604173736574547970654368616e67656460202d205768656e207468652061737365742074797065206973207375636365737366756c6c79206368616e6765642e002023204572726f7273b82a20604e6f53756368417373657460202d2049662074686520617373657420646f6573206e6f742065786973742e19012a2060496e76616c6964437573746f6d417373657454797065496460202d2049662074686520637573746f6d206173736574207479706520494420697320696e76616c69642e95012a2060496e636f6d70617469626c6541737365745479706555706461746560202d20496620746865206e6577206173736574207479706520697320696e636f6d70617469626c65207769746820746865206578697374696e6720617373657420747970652e6472656d6f76655f6c6f63616c5f6d657461646174615f6b657908012061737365745f6964b0011c417373657449640001246c6f63616c5f6b65794902015441737365744d657461646174614c6f63616c4b657900174ce052656d6f76657320746865206173736574206d65746164617461206b657920616e642076616c7565206f662061206c6f63616c206b65792e00d501546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f2072656d6f76652061206c6f63616c206d65746164617461206b657920616e64206974732076616c756520666f7220616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792e11012a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f20746865206c6f63616c206d65746164617461206b65792e0d012a20606c6f63616c5f6b657960202d20546865205b6041737365744d657461646174614c6f63616c4b6579605d20746861742077696c6c2062652072656d6f7665642e003423205065726d697373696f6e731c2a204173736574002023204576656e747349012a20604c6f63616c4d657461646174614b657944656c6574656460202d205768656e20746865206c6f63616c206d65746164617461206b6579206973207375636365737366756c6c792064656c657465642e002023204572726f727315012a206041737365744d657461646174614b657949734d697373696e6760202d20496620746865206c6f63616c206d65746164617461206b6579206973206d697373696e672e05012a206041737365744d6574616461746156616c756549734c6f636b656460202d20496620746865206d657461646174612076616c7565206973206c6f636b65642e79012a206041737365744d657461646174614b657942656c6f6e6773546f4e4654436f6c6c656374696f6e60202d20496620746865206d65746164617461206b65792062656c6f6e677320746f20616e204e465420636f6c6c656374696f6e2e5472656d6f76655f6d657461646174615f76616c756508012061737365745f6964b0011c417373657449640001306d657461646174615f6b65796902014041737365744d657461646174614b6579001848cc52656d6f76657320746865206173736574206d657461646174612076616c7565206f662061206d65746164617461206b65792e008d01546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f2072656d6f76652061206d657461646174612076616c756520666f7220616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792ef82a206061737365745f696460202d20546865205b6041737365744964605d206173736f63696174656420746f20746865206d65746164617461206b65792e35012a20606d657461646174615f6b657960202d20546865205b6041737365744d657461646174614b6579605d20746861742077696c6c2068617665206974732076616c75652064656c657465642e003423205065726d697373696f6e731c2a204173736574002023204576656e74732d012a20604d6574616461746156616c756544656c6574656460202d205768656e20746865206d657461646174612076616c7565206973207375636365737366756c6c792064656c657465642e002023204572726f7273fc2a206041737365744d657461646174614b657949734d697373696e6760202d20496620746865206d65746164617461206b6579206973206d697373696e672e05012a206041737365744d6574616461746156616c756549734c6f636b656460202d20496620746865206d657461646174612076616c7565206973206c6f636b65642e606578656d70745f61737365745f61666669726d6174696f6e04012061737365745f6964b0011c41737365744964001928f45072652d617070726f7665732074686520726563656976656d656e74206f662074686520617373657420666f7220616c6c206964656e7469746965732e008d01546869732066756e6374696f6e20616c6c6f77732074686520726f6f74206f726967696e20746f207072652d617070726f76652074686520726563656976656d656e74206f6620616e20617373657420666f7220616c6c206964656e7469746965732e002c2320417267756d656e7473742a20606f726967696e60202d2054686520726f6f74206f726967696e2e11012a206061737365745f696460202d20546865205b6041737365744964605d20746861742077696c6c206265206578656d70742066726f6d2061666669726d6174696f6e2e002023204576656e747365012a2060417373657441666669726d6174696f6e4578656d7074696f6e60202d205768656e20746865206173736574206973207375636365737366756c6c79206578656d707465642066726f6d2061666669726d6174696f6e2e8872656d6f76655f61737365745f61666669726d6174696f6e5f6578656d7074696f6e04012061737365745f6964b0011c41737365744964001a28e452656d6f76657320746865207072652d617070726f76616c206f662074686520617373657420666f7220616c6c206964656e7469746965732e007d01546869732066756e6374696f6e20616c6c6f77732074686520726f6f74206f726967696e20746f2072656d6f766520746865207072652d617070726f76616c206f6620616e20617373657420666f7220616c6c206964656e7469746965732e002c2320417267756d656e7473742a20606f726967696e60202d2054686520726f6f74206f726967696e2e11012a206061737365745f696460202d20546865205b6041737365744964605d20746861742077696c6c206861766520697473206578656d7074696f6e2072656d6f7665642e002023204576656e747395012a206052656d6f7665417373657441666669726d6174696f6e4578656d7074696f6e60202d205768656e2074686520617373657427732061666669726d6174696f6e206578656d7074696f6e206973207375636365737366756c6c792072656d6f7665642e447072655f617070726f76655f617373657404012061737365745f6964b0011c41737365744964001b2ca45072652d617070726f7665732074686520726563656976656d656e74206f6620616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792e11012a206061737365745f696460202d20546865205b6041737365744964605d20746861742077696c6c206265206578656d70742066726f6d2061666669726d6174696f6e2e003423205065726d697373696f6e731c2a204173736574002023204576656e74734d012a2060507265417070726f766564417373657460202d205768656e20746865206173736574206973207375636365737366756c6c79207072652d617070726f76656420666f7220726563656976656d656e742e6472656d6f76655f61737365745f7072655f617070726f76616c04012061737365745f6964b0011c41737365744964001c2c9452656d6f76657320746865207072652d617070726f76616c206f6620616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792e11012a206061737365745f696460202d20546865205b6041737365744964605d20746861742077696c6c206861766520697473206578656d7074696f6e2072656d6f7665642e003423205065726d697373696f6e731c2a204173736574002023204576656e74734d012a206052656d6f7665507265417070726f766564417373657460202d205768656e207468652061737365742773207072652d617070726f76616c206973207375636365737366756c6c792072656d6f7665642e5c6164645f6d616e6461746f72795f6d65646961746f727308012061737365745f6964b0011c417373657449640001246d65646961746f7273e10601c4426f756e64656442547265655365743c4964656e7469747949642c20543a3a4d617841737365744d65646961746f72733e001d44b9015365747320616c6c206964656e74697469657320696e2074686520606d65646961746f72736020736574206173206d616e6461746f7279206d65646961746f727320666f7220616e7920696e737472756374696f6e207472616e7366657272696e67206061737365745f6964602e008d01546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f20616464206d616e6461746f7279206d65646961746f727320666f7220616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792e31012a206061737365745f696460202d20546865205b6041737365744964605d206f662074686520617373657420746861742077696c6c207265717569726520746865206d65646961746f72732e71012a20606d65646961746f727360202d204120736574206f66205b604964656e746974794964605d206f6620616c6c20746865206d616e6461746f7279206d65646961746f727320666f722074686520676976656e207469636b65722e003423205065726d697373696f6e731c2a204173736574002023204576656e747339012a206041737365744d65646961746f7273416464656460202d205768656e20746865206d616e6461746f7279206d65646961746f727320617265207375636365737366756c6c792061646465642e002023204572726f7273b1012a20604e756d6265724f6641737365744d65646961746f7273457863656564656460202d20496620746865206e756d626572206f66206d616e6461746f7279206d65646961746f7273206578636565647320746865206d6178696d756d20616c6c6f776564206c696d69742e6872656d6f76655f6d616e6461746f72795f6d65646961746f727308012061737365745f6964b0011c417373657449640001246d65646961746f7273e10601c4426f756e64656442547265655365743c4964656e7469747949642c20543a3a4d617841737365744d65646961746f72733e001e38a50152656d6f76657320616c6c206964656e74697469657320696e2074686520606d65646961746f727360207365742066726f6d20746865206d616e6461746f7279206d65646961746f7273206c69737420666f722074686520676976656e206061737365745f6964602e009901546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f2072656d6f7665206d616e6461746f7279206d65646961746f727320666f7220616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792e35012a206061737365745f696460202d20546865205b6041737365744964605d206f662074686520617373657420746861742077696c6c2068617665206d65646961746f72732072656d6f7665642ed1012a20606d65646961746f727360202d204120736574206f66205b604964656e746974794964605d206f6620616c6c20746865206d65646961746f727320746861742077696c6c2062652072656d6f7665642066726f6d20746865206d616e6461746f7279206d65646961746f7273206c6973742e003423205065726d697373696f6e731c2a204173736574002023204576656e747349012a206041737365744d65646961746f727352656d6f76656460202d205768656e20746865206d616e6461746f7279206d65646961746f727320617265207375636365737366756c6c792072656d6f7665642e5c6c696e6b5f7469636b65725f746f5f61737365745f69640801187469636b6572290101185469636b657200012061737365745f6964b0011c41737365744964001f54e445737461626c6973686573206120636f6e6e656374696f6e206265747765656e2061207469636b657220616e6420616e20417373657449642e006101546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f206c696e6b2061207469636b657220746f20616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792e21012a20607469636b657260202d20546865205b605469636b6572605d20746861742077696c6c206265206c696e6b656420746f2074686520676976656e206061737365745f6964602e09012a206061737365745f696460202d20546865205b6041737365744964605d20746861742077696c6c20626520636f6e6e656374656420746f20607469636b6572602e003423205065726d697373696f6e731c2a204173736574002023204576656e747339012a20605469636b65724c696e6b6564546f417373657460202d205768656e20746865207469636b6572206973207375636365737366756c6c79206c696e6b656420746f207468652061737365742e002023204572726f727341012a20605469636b65724e6f7452656769737465726564546f43616c6c657260202d20496620746865207469636b6572206973206e6f74207265676973746572656420746f207468652063616c6c65722e1d012a20605469636b6572526567697374726174696f6e4578706972656460202d20496620746865207469636b657220726567697374726174696f6e2068617320657870697265642e25012a20605469636b6572526567697374726174696f6e4e6f74466f756e6460202d20496620746865207469636b657220726567697374726174696f6e206973206e6f7420666f756e642e45012a20605469636b65724973416c72656164794c696e6b6564546f416e417373657460202d20496620746865207469636b657220697320616c7265616479206c696e6b656420746f20616e2061737365742e3d012a206041737365744973416c72656164794c696e6b6564546f415469636b657260202d2049662074686520617373657420697320616c7265616479206c696e6b656420746f2061207469636b65722e6c756e6c696e6b5f7469636b65725f66726f6d5f61737365745f69640801187469636b6572290101185469636b657200012061737365745f6964b0011c4173736574496400204cbc52656d6f76657320746865206c696e6b206265747765656e2061207469636b657220616e6420616e2061737365742e007101546869732066756e6374696f6e20616c6c6f77732074686520617373657420697373756572206f7220616e2065787465726e616c206167656e7420746f20756e6c696e6b2061207469636b65722066726f6d20616e2061737365742e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792e31012a20607469636b657260202d20546865205b605469636b6572605d20746861742077696c6c20626520756e6c696e6b65642066726f6d2074686520676976656e206061737365745f6964602e0d012a206061737365745f696460202d20546865205b6041737365744964605d20746861742077696c6c20626520756e6c696e6b65642066726f6d20607469636b6572602e003423205065726d697373696f6e731c2a204173736574002023204576656e747359012a20605469636b6572556e6c696e6b656446726f6d417373657460202d205768656e20746865207469636b6572206973207375636365737366756c6c7920756e6c696e6b65642066726f6d207468652061737365742e002023204572726f727341012a20605469636b65724e6f7452656769737465726564546f43616c6c657260202d20496620746865207469636b6572206973206e6f74207265676973746572656420746f207468652063616c6c65722e25012a20605469636b6572526567697374726174696f6e4e6f74466f756e6460202d20496620746865207469636b657220726567697374726174696f6e206973206e6f7420666f756e642e2d012a20605469636b657249734e6f744c696e6b6564546f546865417373657460202d20496620746865207469636b6572206973206e6f74206c696e6b656420746f207468652061737365742e6c7570646174655f676c6f62616c5f6d657461646174615f7370656308014c61737365745f6d657461646174615f6e616d654502014441737365744d657461646174614e616d6500014c61737365745f6d657461646174615f737065634d02014441737365744d6574616461746153706563002138a8557064617465732074686520676c6f62616c206d657461646174612073706563696669636174696f6e2e002c2320417267756d656e747379012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2077686963682063616e20626520746865207072696d617279206f72207365636f6e64617279206b6579206f6620616e206964656e746974792e61012a206061737365745f6d657461646174615f6e616d6560202d20546865205b6041737365744d657461646174614e616d65605d206173736f63696174656420776974682074686520676c6f62616c206d657461646174612ea5012a206061737365745f6d657461646174615f7370656360202d20546865206e6577205b6041737365744d6574616461746153706563605d20746861742077696c6c206265206173736f63696174656420776974682074686520676c6f62616c206d657461646174612e002023204576656e74737d012a2060476c6f62616c4d65746164617461537065635570646174656460202d205768656e2074686520676c6f62616c206d657461646174612073706563696669636174696f6e206973207375636365737366756c6c7920757064617465642e002023204572726f7273c02a20604261644f726967696e60202d20496620746865206f726967696e206973206e6f7420617574686f72697a65642e6d012a2060546f6f4c6f6e6760202d20496620746865206d657461646174612075726c206f72206465736372697074696f6e206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682ed9012a206041737365744d65746164617461547970654465664d61784c656e677468457863656564656460202d20496620746865206d65746164617461207479706520646566696e6974696f6e206c656e677468206578636565647320746865206d6178696d756d20616c6c6f776564206c656e6774682e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732edd06000002090200e1060c4c626f756e6465645f636f6c6c656374696f6e7344626f756e6465645f62747265655f7365743c426f756e6465644254726565536574080454019c0453000004007d02012c42547265655365743c543e0000e506106070616c6c65745f636f72706f726174655f616374696f6e7330646973747269627574696f6e1870616c6c65741043616c6c04045400011428646973747269627574651c011463615f69648902011043414964000124706f7274666f6c696fe906015c4f7074696f6e3c506f7274666f6c696f4e756d6265723e00012063757272656e6379b0011c417373657449640001247065725f736861726518011c42616c616e6365000118616d6f756e7418011c42616c616e63650001287061796d656e745f61743001184d6f6d656e74000128657870697265735f61740d0101384f7074696f6e3c4d6f6d656e743e0000ac2501537461727420616e64206174746163682061206361706974616c20646973747269627574696f6e2c20746f20746865204341206964656e746966696564206279206063615f6964602c6501776974682060616d6f756e74602066756e647320696e206063757272656e6379602077697468647261776e2066726f6d2060706f7274666f6c696f602062656c6f6e67696e6720746f20606f726967696e602773204449442e00290154686520646973747269627574696f6e2077696c6c20636f6d6d656e636520617420607061796d656e745f61746020616e64206578706972652061742060657870697265735f6174602cc869662070726f76696465642c206f7220696620604e6f6e65602c207468656e2074686572652773206e6f206578706972792e0025015468652066756e64732077696c6c206265206c6f636b656420696e2060706f7274666f6c696f602066726f6d207768656e206064697374726962757465602069732063616c6c65642e35015768656e2074686572652773206e6f206578706972792c20736f6d652066756e6473206d6179206265206c6f636b656420696e646566696e6974656c7920696e2060706f7274666f6c696f602c150164756520746f20636c61696d616e7473206e6f74207769746864726177696e67206f72206e6f2062656e6566697473206265696e672070757368656420746f207468656d2e2901466f7220696e646976697369626c652063757272656e636965732c20756e6c6f636b656420616d6f756e74732c206f66206c657373207468616e206f6e652077686f6c6520756e69742ca877696c6c206e6f74206265207472616e7366657261626c652066726f6d2060706f7274666f6c696f602e4d01486f77657665722c20696620776520696d6167696e6520746861742075736572732060416c6963656020616e642060426f626020626f74682061726520656e7469746c656420746f20312e3520756e6974732c5101616e64206f6e6c7920726563656976652060316020756e69747320656163682c207468656e2060302e35202b20302e35203d20316020756e69747320617265206c65667420696e2060706f7274666f6c696f602c6c7768696368206973206e6f77207472616e736665727261626c652e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602e01012d206063615f696460206964656e7469666965732074686520434120746f2073746172742061206361706974616c20646973747269627574696f6e20666f722e59012d2060706f7274666f6c696f60207370656369666965732074686520706f7274666f6c696f206e756d626572206f6620746865206167656e7420746f20646973747269627574652060616d6f756e74602066726f6d2ef42d206063757272656e63796020746f20776974686472617720616e6420646973747269627574652066726f6d207468652060706f7274666f6c696f602ef82d20607065725f73686172656020616d6f756e74206f66206063757272656e63796020746f20776974686472617720616e6420646973747269627574652e25012020205370656369666965642061732061207065722d6d696c6c696f6e2c20692e652e206031202f2031305e36607468206f66206f6e65206063757272656e63796020746f6b656e2ef02d2060616d6f756e7460206f66206063757272656e63796020746f20776974686472617720616e642064697374726962757465206174206d6f73742e19012d20607061796d656e745f61746020737065636966696573207768656e2062656e6566697473206d617920666972737420626520707573686564206f7220636c61696d65642e29012d2060657870697265735f617460207370656369666965732c2069662070726f76696465642c207768656e2072656d61696e696e672062656e65666974732061726520666f726665697490202020616e64206d6179206265207265636c61696d656420627920606f726967696e602e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602efc2d20604578706972794265666f72655061796d656e74602069662060657870697265735f61742e756e777261702829203c3d207061796d656e745f6174602ee42d20604e6f53756368434160206966206063615f69646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412ea82d20604e6f5265636f7264446174656020696620434120686173206e6f207265636f726420646174652ee82d20605265636f72644461746541667465725374617274602069662043412773207265636f72642064617465203e207061796d656e745f61742e31012d2060556e617574686f72697a6564437573746f6469616e60206966207468652063616c6c6572206973206e6f742074686520637573746f6469616e206f662060706f7274666f6c696f602e55012d2060496e73756666696369656e74506f7274666f6c696f42616c616e6365602069662060706f7274666f6c696f6020686173206c657373207468616e2060616d6f756e7460206f66206063757272656e6379602e01012d2060496e73756666696369656e7442616c616e636560206966207468652070726f746f636f6c2066656520636f756c646e277420626520636861726765642e45012d206043414e6f7442656e656669746020696620746865204341206973206e6f74206f66206b696e64205072656469637461626c6542656e656669742f556e7072656469637461626c6542656e65666974d42d2060446973747269627574696f6e416d6f756e7449735a65726f60206966207468652060616d6f756e7460206973207a65726f2ee82d2060446973747269627574696f6e506572536861726549735a65726f602069662074686520607065725f736861726560206973207a65726f2e003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f14636c61696d04011463615f6964890201104341496400015c0101436c61696d20612062656e65666974206f6620746865206361706974616c20646973747269627574696f6e20617474616368656420746f206063615f6964602e00a8546178657320617265207769746868656c6420617320737065636966696564206279207468652043412e5901506f73742d746178206561726e696e677320617265207468656e207472616e7366657272656420746f207468652064656661756c7420706f7274666f6c696f206f662074686520606f726967696e602773204449442e001101416c6c2062656e65666974732061726520726f756e646564206279207472756e636174696f6e2c20646f776e20746f20666972737420696e74656765722062656c6f772e39014d6f72656f7665722c206265666f726520706f73742d746178206561726e696e67732c20696e20696e646976697369626c652063757272656e6369657320617265207472616e736665727265642c98746865792061726520726f756e64656420646f776e20746f20612077686f6c6520756e69742e0030232320417267756d656e747345012d20606f726967696e60207768696368206d757374206265206120686f6c646572206f662074686520617373657420616e6420656c696769626c6520666f722074686520646973747269627574696f6e2e01012d206063615f696460206964656e7469666965732074686520434120746f2073746172742061206361706974616c20646973747269627574696f6e20666f722e002023204572726f727325012d2060486f6c646572416c7265616479506169646020696620606f726967696e602773204449442068617320616c7265616479207265636569766564206974732062656e656669742e19012d20604e6f53756368446973747269627574696f6e602069662074686572652773206e6f206361706974616c20646973747269627574696f6e20666f72206063615f6964602ec42d206043616e6e6f74436c61696d4265666f726553746172746020696620606e6f77203c207061796d656e745f6174602ee42d206043616e6e6f74436c61696d41667465724578706972796020696620606e6f77203e206578706972795f61742e756e777261702829602ee42d20604e6f53756368434160206966206063615f69646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412ef42d20604e6f74546172676574656442794341602069662074686520434120646f6573206e6f742074617267657420606f726967696e602773204449442e35012d206042616c616e6365416d6f756e7450726f647563744f766572666c6f7765646020696620606261203d2062616c616e6365202a20616d6f756e746020776f756c64206f766572666c6f772e35012d206042616c616e6365416d6f756e7450726f64756374537570706c794469766973696f6e4661696c65646020696620606261202a20737570706c796020776f756c64206f766572666c6f772e21012d204f74686572206572726f72732063616e206f636375722069662074686520636f6d706c69616e6365206d616e616765722072656a6563747320746865207472616e736665722e30707573685f62656e6566697408011463615f69648902011043414964000118686f6c6465729c01284964656e746974794964000260f8507573682062656e65666974206f6620616e206f6e676f696e6720646973747269627574696f6e20746f2074686520676976656e2060686f6c646572602e00a8546178657320617265207769746868656c6420617320737065636966696564206279207468652043412e5901506f73742d746178206561726e696e677320617265207468656e207472616e7366657272656420746f207468652064656661756c7420706f7274666f6c696f206f662074686520606f726967696e602773204449442e001101416c6c2062656e65666974732061726520726f756e646564206279207472756e636174696f6e2c20646f776e20746f20666972737420696e74656765722062656c6f772e39014d6f72656f7665722c206265666f726520706f73742d746178206561726e696e67732c20696e20696e646976697369626c652063757272656e6369657320617265207472616e736665727265642c98746865792061726520726f756e64656420646f776e20746f20612077686f6c6520756e69742e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602e39012d206063615f696460206964656e7469666965732074686520434120776974682061206361706974616c20646973747269627574696f6e7320746f20707573682062656e656669747320666f722e7c2d2060686f6c6465726020746f20707573682062656e656669747320746f2e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e19012d20604e6f53756368446973747269627574696f6e602069662074686572652773206e6f206361706974616c20646973747269627574696f6e20666f72206063615f6964602ec42d206043616e6e6f74436c61696d4265666f726553746172746020696620606e6f77203c207061796d656e745f6174602ee42d206043616e6e6f74436c61696d41667465724578706972796020696620606e6f77203e206578706972795f61742e756e777261702829602ee42d20604e6f53756368434160206966206063615f69646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412edc2d20604e6f74546172676574656442794341602069662074686520434120646f6573206e6f74207461726765742060686f6c646572602e35012d206042616c616e6365416d6f756e7450726f647563744f766572666c6f7765646020696620606261203d2062616c616e6365202a20616d6f756e746020776f756c64206f766572666c6f772e35012d206042616c616e6365416d6f756e7450726f64756374537570706c794469766973696f6e4661696c65646020696620606261202a20737570706c796020776f756c64206f766572666c6f772e21012d204f74686572206572726f72732063616e206f636375722069662074686520636f6d706c69616e6365206d616e616765722072656a6563747320746865207472616e736665722e1c7265636c61696d04011463615f6964890201104341496400032c90417373756d696e67206120646973747269627574696f6e2068617320657870697265642ce4756e6c6f636b207468652072656d61696e696e6720616d6f756e7420696e20746865206469737472696275746f7220706f7274666f6c696f2e0030232320417267756d656e747345012d20606f726967696e60207768696368206d757374206265207468652063726561746f72206f6620746865206361706974616c20646973747269627574696f6e207469656420746f206063615f6964602e1d012d206063615f696460206964656e7469666965732074686520434120776974682061206361706974616c20646973747269627574696f6e20746f207265636c61696d20666f722e002023204572726f727319012d20604e6f53756368446973747269627574696f6e602069662074686572652773206e6f206361706974616c20646973747269627574696f6e20666f72206063615f6964602e2d012d2060416c72656164795265636c61696d65646020696620746869732066756e6374696f6e2068617320616c7265616479206265656e2063616c6c6564207375636365737366756c6c792e842d20604e6f74457870697265646020696620606e6f77203c20657870697279602e4c72656d6f76655f646973747269627574696f6e04011463615f6964890201104341496400042cbc52656d6f766573206120646973747269627574696f6e2074686174206861736e27742073746172746564207965742cdc756e6c6f636b696e67207468652066756c6c20616d6f756e7420696e20746865206469737472696275746f7220706f7274666f6c696f2e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602e49012d206063615f696460206964656e7469666965732074686520434120776974682061206e6f742d7965742d73746172746564206361706974616c20646973747269627574696f6e20746f2072656d6f76652e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e19012d20604e6f53756368446973747269627574696f6e602069662074686572652773206e6f206361706974616c20646973747269627574696f6e20666f72206063615f6964602ebc2d2060446973747269627574696f6e537461727465646020696620607061796d656e745f6174203c3d206e6f77602e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ee90604184f7074696f6e04045401f80108104e6f6e6500000010536f6d650400f80000010000ed06103070616c6c65745f617373657428636865636b706f696e741870616c6c65741043616c6c040454000110446372656174655f636865636b706f696e7404012061737365745f6964b0011c41737365744964000024c04372656174657320612073696e676c6520636865636b706f696e74206174207468652063757272656e742074696d652e002c2320417267756d656e747335012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ea82d206061737365745f69646020746f206372656174652074686520636865636b706f696e7420666f722e002023204572726f72735d012d2060556e617574686f72697a65644167656e74602069662074686520444944206f6620606f726967696e602069736e27742061207065726d697373696f6e6564206167656e7420666f72206061737365745f6964602e0d012d2060436f756e7465724f766572666c6f77602069662074686520746f74616c20636865636b706f696e7420636f756e74657220776f756c64206f766572666c6f772e707365745f7363686564756c65735f6d61785f636f6d706c65786974790401386d61785f636f6d706c657869747930010c75363400012461015365747320746865206d617820636f6d706c6578697479206f662061207363686564756c652073657420666f7220616e206172626974726172792061737365745f696420746f20606d61785f636f6d706c6578697479602eb8546865206e6577206d6178696d756d206973206e6f7420656e666f7263656420726574726f6163746976656c792cb4616e64206f6e6c79206170706c696573206f6e6365206e6577207363686564756c657320617265206d6164652e00a84d7573742062652063616c6c6564206173206120504950202872657175697265732022726f6f7422292e002c2320417267756d656e7473782d20606f726967696e602069732074686520726f6f74206f726967696e2e05012d20606d61785f636f6d706c65786974796020616c6c6f77656420666f7220616e206172626974726172792061737365742773207363686564756c65207365742e3c6372656174655f7363686564756c6508012061737365745f6964b0011c417373657449640001207363686564756c65a502014c5363686564756c65436865636b706f696e7473000244a4437265617465732061207363686564756c652067656e65726174696e6720636865636b706f696e7473d4696e20746865206675747572652061742065697468657220612066697865642074696d65206f7220617420696e74657276616c732e000901546865207363686564756c6520737461727473206f7574207769746820607374726f6e675f7265665f636f756e74287363686564756c655f696429203c2d2030602e002c2320417267756d656e747329012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f20616374206173206f776e6572206f66206061737365745f6964602ea02d206061737365745f69646020746f2063726561746520746865207363686564756c6520666f722eb02d20607363686564756c656020746861742077696c6c2067656e657261746520636865636b706f696e74732e002023204572726f72735d012d2060556e617574686f72697a65644167656e74602069662074686520444944206f6620606f726967696e602069736e27742061207065726d697373696f6e6564206167656e7420666f72206061737365745f6964602e21012d2060496e73756666696369656e744163636f756e7442616c616e636560206966207468652070726f746f636f6c2066656520636f756c64206e6f7420626520636861726765642e4d012d2060436f756e7465724f766572666c6f776020696620746865207363686564756c65204944206f7220746f74616c20636865636b706f696e7420636f756e7465727320776f756c64206f766572666c6f772e003423205065726d697373696f6e731c2a2041737365743c72656d6f76655f7363686564756c6508012061737365745f6964b0011c417373657449640001086964a10201285363686564756c654964000338fc52656d6f7665732074686520636865636b706f696e74207363686564756c65206f6620616e206173736574206964656e74696669656420627920606964602e002c2320417267756d656e747329012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f20616374206173206f776e6572206f66206061737365745f6964602ea42d206061737365745f69646020746f2072656d6f766520746865207363686564756c652066726f6d2e09012d2060696460206f6620746865207363686564756c652c207768656e2069742077617320637265617465642062792060637265617465645f7363686564756c65602e002023204572726f72735d012d2060556e617574686f72697a65644167656e74602069662074686520444944206f6620606f726967696e602069736e27742061207065726d697373696f6e6564206167656e7420666f72206061737365745f6964602e49012d20604e6f436865636b706f696e745363686564756c6560206966206069646020646f6573206e6f74206964656e746966792061207363686564756c6520666f722074686973206061737365745f6964602ef42d20605363686564756c654e6f7452656d6f7661626c656020696620606964602065786973747320627574206973206e6f742072656d6f7661626c652e003423205065726d697373696f6e731c2a204173736574040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ef1060c6470616c6c65745f636f6d706c69616e63655f6d616e616765721870616c6c65741043616c6c040454000124686164645f636f6d706c69616e63655f726571756972656d656e740c012061737365745f6964b0011c4173736574496400014473656e6465725f636f6e646974696f6e73b90201385665633c436f6e646974696f6e3e00014c72656365697665725f636f6e646974696f6e73b90201385665633c436f6e646974696f6e3e00002cf841646473206120636f6d706c69616e636520726571756972656d656e7420746f20616e20617373657420676976656e206279206061737365745f6964602e6901496620746865726520617265206475706c696361746520436c61696d547970657320666f72206120706172746963756c61722074727573746564206973737565722c206475706c696361746573206172652072656d6f7665642e002c2320417267756d656e747329012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f6620746865206173736574802a2061737365745f6964202d2053796d626f6c206f6620746865206173736574c42a2073656e6465725f636f6e646974696f6e73202d2053656e646572207472616e7366657220636f6e646974696f6e732ed42a2072656365697665725f636f6e646974696f6e73202d205265636569766572207472616e7366657220636f6e646974696f6e732e003423205065726d697373696f6e731c2a2041737365747472656d6f76655f636f6d706c69616e63655f726571756972656d656e7408012061737365745f6964b0011c41737365744964000108696410010c753332000124f052656d6f766573206120636f6d706c69616e636520726571756972656d656e742066726f6d20616e206173736574277320636f6d706c69616e63652e002c2320417267756d656e747329012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f6620746865206173736574802a2061737365745f6964202d2053796d626f6c206f6620746865206173736574f02a206964202d20436f6d706c69616e636520726571756972656d656e74206964207768696368206973206e65656420746f2062652072656d6f766564003423205065726d697373696f6e731c2a204173736574607265706c6163655f61737365745f636f6d706c69616e636508012061737365745f6964b0011c4173736574496400014061737365745f636f6d706c69616e6365e10201685665633c436f6d706c69616e6365526571756972656d656e743e00023cd45265706c6163657320616e206173736574277320636f6d706c69616e636520776974682061206e657720636f6d706c69616e63652e00fc436f6d706c69616e636520726571756972656d656e74732077696c6c20626520736f727465642028617363656e64696e6720627920696429206265666f72658c7265706c6163696e67207468652063757272656e7420726571756972656d656e74732e002c2320417267756d656e7473882a206061737365745f696460202d207468652061737365742061737365745f69642cbc2a206061737365745f636f6d706c69616e6365202d20746865206e657720617373657420636f6d706c69616e63652e002023204572726f7273f82a2060556e617574686f72697a65646020696620606f726967696e60206973206e6f7420746865206f776e6572206f66207468652061737365745f69642eb1012a20604475706c69636174654173736574436f6d706c69616e636560206966206061737365745f636f6d706c69616e63656020636f6e7461696e73206d756c7469706c6520656e74726965732077697468207468652073616d652060726571756972656d656e745f6964602e003423205065726d697373696f6e731c2a2041737365745872657365745f61737365745f636f6d706c69616e636504012061737365745f6964b0011c417373657449640003207452656d6f76657320616e206173736574277320636f6d706c69616e6365002c2320417267756d656e747329012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f6620746865206173736574802a2061737365745f6964202d2053796d626f6c206f6620746865206173736574003423205065726d697373696f6e731c2a2041737365745870617573655f61737365745f636f6d706c69616e636504012061737365745f6964b0011c4173736574496400042019015061757365732074686520766572696669636174696f6e206f6620636f6e646974696f6e7320666f72206061737365745f69646020647572696e67207472616e73666572732e002c2320417267756d656e747329012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f6620746865206173736574802a2061737365745f6964202d2053796d626f6c206f6620746865206173736574003423205065726d697373696f6e731c2a2041737365745c726573756d655f61737365745f636f6d706c69616e636504012061737365745f6964b0011c417373657449640005201d01526573756d65732074686520766572696669636174696f6e206f6620636f6e646974696f6e7320666f72206061737365745f69646020647572696e67207472616e73666572732e002c2320417267756d656e747329012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f6620746865206173736574802a2061737365745f6964202d2053796d626f6c206f6620746865206173736574003423205065726d697373696f6e731c2a204173736574806164645f64656661756c745f747275737465645f636c61696d5f69737375657208012061737365745f6964b0011c41737365744964000118697373756572d102013454727573746564497373756572000624f44164647320616e6f746865722064656661756c74207472757374656420636c61696d2069737375657220617420746865206173736574206c6576656c2e002c2320417267756d656e74732d012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f66207468652061737365742e842a2061737365745f6964202d2053796d626f6c206f66207468652061737365742ec82a20697373756572202d204964656e746974794964206f6620746865207472757374656420636c61696d206973737565722e003423205065726d697373696f6e731c2a2041737365748c72656d6f76655f64656661756c745f747275737465645f636c61696d5f69737375657208012061737365745f6964b0011c417373657449640001186973737565729c01284964656e746974794964000724710152656d6f7665732074686520676976656e2060697373756572602066726f6d2074686520736574206f662064656661756c74207472757374656420636c61696d206973737565727320617420746865206173736574206c6576656c2e002c2320417267756d656e74732d012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f66207468652061737365742e842a2061737365745f6964202d2053796d626f6c206f66207468652061737365742ec82a20697373756572202d204964656e746974794964206f6620746865207472757374656420636c61696d206973737565722e003423205065726d697373696f6e731c2a204173736574746368616e67655f636f6d706c69616e63655f726571756972656d656e7408012061737365745f6964b0011c4173736574496400011c6e65775f726571b5020154436f6d706c69616e6365526571756972656d656e74000824ec4d6f6469667920616e206578697374696e6720636f6d706c69616e636520726571756972656d656e74206f66206120676976656e2061737365742e002c2320417267756d656e74732d012a206f726967696e202d205369676e6572206f662074686520646973706174636861626c652e2049742073686f756c6420626520746865206f776e6572206f66207468652061737365742e842a2061737365745f6964202d2053796d626f6c206f66207468652061737365742e8c2a206e65775f726571202d20436f6d706c69616e636520726571756972656d656e742e003423205065726d697373696f6e731c2a204173736574040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ef5060c6070616c6c65745f636f72706f726174655f616374696f6e731870616c6c65741043616c6c040454000128587365745f6d61785f64657461696c735f6c656e6774680401186c656e67746810010c753332000008d053657420746865206d617820606c656e67746860206f66206064657461696c736020696e207465726d73206f662062797465732e744d6179206f6e6c792062652063616c6c6564207669612061205049502e4c7365745f64656661756c745f7461726765747308012061737365745f6964b0011c4173736574496400011c74617267657473e90201405461726765744964656e746974696573000134cc536574207468652064656661756c7420434120605461726765744964656e7469746965736020746f206074617267657473602e0030232320417267756d656e74734d012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206061737365745f69646020776974682072656c6576616e74207065726d697373696f6e732eec2d206061737365745f69646020666f72207768696368207468652064656661756c74206964656e74697469657320617265206368616e67696e672ecc2d20607461726765747360207468652064656661756c7420746172676574206964656e74697469657320666f7220612043412e00242323204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e31012d2060546f6f4d616e79546172676574496473602069662060746172676574732e6964656e7469746965732e6c656e2829203e20543a3a4d61785461726765744964733a3a6765742829602e003423205065726d697373696f6e731c2a2041737365746c7365745f64656661756c745f77697468686f6c64696e675f74617808012061737365745f6964b0011c4173736574496400010c7461789502010c5461780002304501536574207468652064656661756c742077697468686f6c64696e672074617820666f7220616c6c204449447320616e64204341732072656c6576616e7420746f2074686973206061737365745f6964602e0030232320417267756d656e74734d012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206061737365745f69646020776974682072656c6576616e74207065726d697373696f6e732ed02d206061737365745f6964602074686174207468652077697468686f6c64696e67207461782077696c6c206170706c7920746f2e05012d20607461786020746861742073686f756c64206265207769746868656c64207768656e20646973747269627574696e67206469766964656e64732c206574632e00242323204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e003423205065726d697373696f6e731c2a2041737365745c7365745f6469645f77697468686f6c64696e675f7461780c012061737365745f6964b0011c4173736574496400012474617865645f6469649c01284964656e74697479496400010c746178f102012c4f7074696f6e3c5461783e000340fc536574207468652077697468686f6c64696e6720746178206f66206061737365745f69646020666f72206074617865645f6469646020746f2060746178602e890149662060536f6d652874617829602c2074686973206f7665727269646573207468652064656661756c742077697468686f6c64696e6720746178206f66206061737365745f69646020746f20607461786020666f72206074617865645f646964602efc4f74686572776973652c20696620604e6f6e65602c207468652064656661756c742077697468686f6c64696e67207461782077696c6c20626520757365642e0030232320417267756d656e74734d012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206061737365745f69646020776974682072656c6576616e74207065726d697373696f6e732ed02d206061737365745f6964602074686174207468652077697468686f6c64696e67207461782077696c6c206170706c7920746f2ee42d206074617865645f6469646020746861742077696c6c2068617665206974732077697468686f6c64696e672074617820757064617465642e05012d20607461786020746861742073686f756c64206265207769746868656c64207768656e20646973747269627574696e67206469766964656e64732c206574632e00242323204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e81012d2060546f6f4d616e794469645461786573602069662060536f6d6528746178296020616e6420616464696e6720746865206f7665727269646520776f756c6420676f206f76657220746865206c696d697420604d617844696457687473602e003423205065726d697373696f6e731c2a20417373657464696e6974696174655f636f72706f726174655f616374696f6e20012061737365745f6964b0011c417373657449640001106b696e64f902011843414b696e640001246465636c5f646174653001184d6f6d656e7400012c7265636f72645f64617465f90601584f7074696f6e3c5265636f726444617465537065633e00011c64657461696c7311030124434144657461696c7300011c74617267657473010701604f7074696f6e3c5461726765744964656e7469746965733e00015c64656661756c745f77697468686f6c64696e675f746178f102012c4f7074696f6e3c5461783e00013c77697468686f6c64696e675f746178050701784f7074696f6e3c5665633c284964656e7469747949642c20546178293e3e0004785101496e69746961746573206120434120666f72206061737365745f696460206f6620606b696e64602077697468206064657461696c736020616e64206f746865722070726f766964656420617267756d656e74732e0030232320417267756d656e74734d012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206061737365745f69646020776974682072656c6576616e74207065726d697373696f6e732e942d206061737365745f696460207468617420746865204341206973206d61646520666f722e7c2d20606b696e6460206f66204341206265696e6720696e697469617465642e982d20606465636c5f6461746560206f66204341206272696e6720696e697469616c697a65642ef02d20607265636f72645f64617465602c20696620616e792c20746f2063616c63756c6174652074686520696d70616374206f6620746869732043412e610120202049662070726f76696465642c207468697320726573756c747320696e2061207363686564756c65642062616c616e636520736e617073686f74202822636865636b706f696e7422292061742074686520646174652e4d012d206064657461696c7360206f662074686520434120696e20667265652d7465787420666f726d2c20757020746f2061206365727461696e206e756d626572206f6620627974657320696e206c656e6774682ef42d206074617267657473602c20696620616e792c20776869636820746869732043412069732072656c6576616e742f697272656c6576616e7420746f2e49012020204f76657272696465732c2069662070726f76696465642c207468652064656661756c7420617420746865206173736574206c6576656c2028607365745f64656661756c745f7461726765747360292e5d012d206064656661756c745f77697468686f6c64696e675f746178602c20696620616e792c206973207468652064656661756c742077697468686f6c64696e672074617820746f2075736520666f7220746869732043412e69012020204f76657272696465732c2069662070726f76696465642c207468652064656661756c7420617420746865206173736574206c6576656c2028607365745f64656661756c745f77697468686f6c64696e675f74617860292e21012d206077697468686f6c64696e675f746178602c20696620616e792c2070726f7669646573207065722d4449442077697468686f6c64696e6720746178206f76657272696465732e59012020204f76657272696465732c2069662070726f76696465642c207468652064656661756c7420617420746865206173736574206c6576656c2028607365745f6469645f77697468686f6c64696e675f74617860292e002023204572726f72731d012d206044657461696c73546f6f4c6f6e6760206966206064657461696c732e6c656e28296020676f6573206265796f6e6420606d61785f64657461696c735f6c656e677468602e2d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e71012d2060436f756e7465724f766572666c6f776020696e2074686520756e6c696b656c79206576656e74207468617420736f206d616e79204341732077657265206372656174656420666f722074686973206061737365745f6964602cf820207468617420696e7465676572206f766572666c6f7720776f756c642068617665206f63637572656420696620696e737465616420616c6c6f7765642e75012d2060546f6f4d616e79446964546178657360206966206077697468686f6c64696e675f7461782e756e7772617028292e6c656e28296020776f756c6420676f206f76657220746865206c696d697420604d617844696457687473602e01012d20604475706c69636174654469645461786020696620612044494420697320696e636c75646564206d6f7265207468616e206f6e636520696e20607774602e55012d2060546f6f4d616e79546172676574496473602069662060746172676574732e756e7772617028292e6964656e7469746965732e6c656e2829203e20543a3a4d61785461726765744964733a3a6765742829602e01012d20604465636c44617465496e4675747572656020696620746865206465636c61726174696f6e2064617465206973206e6f7420696e2074686520706173742e51012d205768656e20607265636f72645f646174652e69735f736f6d652829602c206f74686572206572726f72732064756520746f20636865636b706f696e74207363686564756c696e67206d6179206f636375722e003423205065726d697373696f6e731c2a2041737365742c6c696e6b5f63615f646f6308010869648902011043414964000110646f63731503013c5665633c446f63756d656e7449643e000548ac4c696e6b2074686520676976656e204341206069646020746f2074686520676976656e2060646f6373602ef4416e792070726576696f7573206c696e6b7320666f7220746865204341206172652072656d6f76656420696e206661766f72206f662060646f6373602e00550154686520776f726b666c6f77206865726520697320746f206164642074686520646f63756d656e747320616e6420696e6974696174696e672074686520434120696e20616e79206f7264657220646573697265642ec44f6e636520626f74682065786973742c20746865792063616e206e6f77206265206c696e6b656420746f6765746865722e0030232320417267756d656e747359012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206069642e61737365745f69646020776974682072656c6576616e74207065726d697373696f6e732ea82d2060696460206f662074686520434120746f206173736f636961746520776974682060646f6373602eb02d2060646f63736020746f206173736f6369617465207769746820746865204341207769746820606964602e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602ed82d20604e6f53756368434160206966206069646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412e19012d20604e6f53756368446f636020696620616e79206f662060646f63736020646f6573206e6f74206964656e7469667920616e206578697374696e6720646f63756d656e742e003423205065726d697373696f6e731c2a2041737365742472656d6f76655f636104011463615f696489020110434149640006489452656d6f76657320746865204341206964656e746966696564206279206063615f6964602e00c44173736f63696174656420646174612c207375636820617320646f63756d656e74206c696e6b732c2062616c6c6f74732cac616e64206361706974616c20646973747269627574696f6e732061726520616c736f2072656d6f7665642e00d4416e79207363686564756c65206173736f636961746564207769746820746865207265636f726420646174652077696c6c20736565b0607374726f6e675f7265665f636f756e74287363686564756c655f696429602064656372656d656e7465642e0030232320417267756d656e747365012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206063615f69642e61737365745f69646020776974682072656c6576616e74207065726d697373696f6e732e782d206063615f696460206f662074686520434120746f2072656d6f76652e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602ed82d20604e6f53756368434160206966206069646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412e003423205065726d697373696f6e731c2a204173736574486368616e67655f7265636f72645f6461746508011463615f6964890201104341496400012c7265636f72645f64617465f90601584f7074696f6e3c5265636f726444617465537065633e00073ce04368616e67657320746865207265636f72642064617465206f6620746865204341206964656e746966696564206279206063615f6964602e0030232320417267756d656e747365012d20606f726967696e60207768696368206d75737420626520616e2065787465726e616c206167656e74206f66206063615f69642e61737365745f69646020776974682072656c6576616e74207065726d697373696f6e732e742d206063615f696460206f662074686520434120746f20616c7465722eec2d20607265636f72645f64617465602c20696620616e792c20746f2063616c63756c6174652074686520696d70616374206f66207468652043412e610120202049662070726f76696465642c207468697320726573756c747320696e2061207363686564756c65642062616c616e636520736e617073686f74202822636865636b706f696e7422292061742074686520646174652e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602ed82d20604e6f53756368434160206966206069646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412e51012d205768656e20607265636f72645f646174652e69735f736f6d652829602c206f74686572206572726f72732064756520746f20636865636b706f696e74207363686564756c696e67206d6179206f636375722e003423205065726d697373696f6e731c2a204173736574a0696e6974696174655f636f72706f726174655f616374696f6e5f616e645f646973747269627574651c011c63615f617267730907016c496e697469617465436f72706f72617465416374696f6e41726773000124706f7274666f6c696fe906015c4f7074696f6e3c506f7274666f6c696f4e756d6265723e00012063757272656e6379b0011c417373657449640001247065725f736861726518011c42616c616e6365000118616d6f756e7418011c42616c616e63650001287061796d656e745f61743001184d6f6d656e74000128657870697265735f61740d0101384f7074696f6e3c4d6f6d656e743e0008041d015574696c6974792065787472696e73696320746f2062617463682060696e6974696174655f636f72706f726174655f616374696f6e6020616e642060646973747269627574656090696e6974696174655f636f72706f726174655f616374696f6e5f616e645f62616c6c6f7410011c63615f617267730907016c496e697469617465436f72706f72617465416374696f6e4172677300014462616c6c6f745f74696d655f72616e67651d03013c42616c6c6f7454696d6552616e676500012c62616c6c6f745f6d6574612103012842616c6c6f744d65746100010c726376200110626f6f6c000900040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ef90604184f7074696f6e04045401fd060108104e6f6e6500000010536f6d650400fd060000010000fd06086070616c6c65745f636f72706f726174655f616374696f6e73385265636f7264446174655370656300010c245363686564756c656404003001184d6f6d656e74000000404578697374696e675363686564756c650400a10201285363686564756c654964000100204578697374696e6704009d020130436865636b706f696e74496400020000010704184f7074696f6e04045401e9020108104e6f6e6500000010536f6d650400e9020000010000050704184f7074696f6e0404540109030108104e6f6e6500000010536f6d650400090300000100000907086070616c6c65745f636f72706f726174655f616374696f6e736c496e697469617465436f72706f72617465416374696f6e41726773000020012061737365745f6964b0011c417373657449640001106b696e64f902011843414b696e640001246465636c5f646174653001184d6f6d656e7400012c7265636f72645f64617465f90601584f7074696f6e3c5265636f726444617465537065633e00011c64657461696c7311030124434144657461696c7300011c74617267657473010701604f7074696f6e3c5461726765744964656e7469746965733e00015c64656661756c745f77697468686f6c64696e675f746178f102012c4f7074696f6e3c5461783e00013c77697468686f6c64696e675f746178050701784f7074696f6e3c5665633c284964656e7469747949642c20546178293e3e00000d07106070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f741870616c6c65741043616c6c040454000118346174746163685f62616c6c6f7410011463615f6964890201104341496400011472616e67651d03013c42616c6c6f7454696d6552616e67650001106d6574612103012842616c6c6f744d65746100010c726376200110626f6f6c000068e8417474616368206120636f72706f726174652062616c6c6f7420746f20746865204341206964656e746966696564206279206063615f6964602e00ac5468652062616c6c6f742077696c6c2061646d697420766f7465732077697468696e206072616e6765602eb05468652062616c6c6f742773206d657461646174612069732070726f766964656420627920606d657461602c0501776869636820696e636c75646573207468652062616c6c6f74207469746c652c20746865206d6f74696f6e732c2074686569722063686f696365732c206574632e7853656520746865206042616c6c6f744d6574616020666f72206d6f72652e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602ed02d206063615f696460206964656e7469666965732074686520434120746f20617474616368207468652062616c6c6f7420746f2ec02d206072616e67656020737065636966696573207768656e20766f74696e672073746172747320616e6420656e64732eec2d20606d6574616020737065636966696573207468652062616c6c6f742773206d657461646174612061732061666f72656d656e74696f6e65642ee42d2060726376602073706563696669657320776865746865722052435620697320656e61626c656420666f7220746869732062616c6c6f742e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602ee42d20604e6f53756368434160206966206063615f69646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412ef02d206043414e6f744e6f746963656020696620746865204341206973206e6f74206f662074686520604973737565724e6f7469636560206b696e642ebc2d206053746172744166746572456e6460206966206072616e67652e7374617274203e2072616e67652e656e64602e29012d20604e6f774166746572456e646020696620606e6f77203e2072616e67652e656e646020776865726520606e6f7760206973207468652063757272656e742074696d657374616d702ea82d20604e6f5265636f7264446174656020696620434120686173206e6f207265636f726420646174652e59012d20605265636f7264446174654166746572537461727460206966206064617465203e2072616e67652e73746172746020776865726520606461746560206973207468652043412773207265636f726420646174652eb82d2060416c726561647945786973747360206966207468657265277320612062616c6c6f7420616c72656164792e31012d20604e756d6265724f6643686f696365734f766572666c6f77602069662074686520746f74616c2063686f69636520696e20606d65746160206f766572666c6f777320607573697a65602e09012d2060546f6f4c6f6e676020696620616e79206f662074686520656d62656464656420737472696e677320696e20606d657461602061726520746f6f206c6f6e672e01012d2060496e73756666696369656e7442616c616e636560206966207468652070726f746f636f6c2066656520636f756c646e277420626520636861726765642e10766f746508011463615f69648902011043414964000114766f7465734103013c5665633c42616c6c6f74566f74653e0001441101436173742060766f7465736020696e207468652062616c6c6f7420617474616368656420746f20746865204341206964656e746966696564206279206063615f6964602e0030232320417267756d656e747309012d20606f726967696e60207768696368206d7573742062652061207065726d697373696f6e6564207369676e6572207461726765746564206279207468652043412eb82d206063615f696460206964656e746966696573207468652061747461636865642062616c6c6f7427732043412e21012d2060766f7465736020737065636966696573207468652062616c616e63657320746f2061737369676e20746f20656163682063686f69636520696e207468652062616c6c6f742e55012020205468652066756c6c20766f74696e6720706f776572206f6620606f726967696e60277320444944206d6179206265207573656420666f722065616368206d6f74696f6e20696e207468652062616c6c6f742e002023204572726f7273dc2d20604e6f5375636842616c6c6f7460206966206063615f69646020646f6573206e6f74206964656e7469667920612062616c6c6f742efc2d2060566f74696e674e6f7453746172746564602069662074686520766f74696e6720706572696f64206861736e277420636f6d6d656e636564207965742ed82d2060566f74696e67416c7265616479456e646564602069662074686520766f74696e6720706572696f642068617320656e6465642e5d012d206057726f6e67566f7465436f756e746020696620746865206e756d626572206f662063686f6963657320696e207468652062616c6c6f7420646f6573206e6f74206d617463682060766f7465732e6c656e2829602ee42d20604e6f53756368434160206966206063615f69646020646f6573206e6f74206964656e7469667920616e206578697374696e672043412ef42d20604e6f74546172676574656442794341602069662074686520434120646f6573206e6f742074617267657420606f726967696e602773204449442e21012d2060496e73756666696369656e74566f746573602069662074686520766f74696e6720706f776572207573656420666f7220616e79206d6f74696f6e20696e2060766f74657360a42020206578636565647320606f726967696e60277320444944277320766f74696e6720706f7765722e286368616e67655f656e6408011463615f6964890201104341496400010c656e643001184d6f6d656e740002300501416d656e642074686520656e642064617465206f66207468652062616c6c6f74206f6620746865204341206964656e746966696564206279206063615f6964602e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602eb82d206063615f696460206964656e746966696573207468652061747461636865642062616c6c6f7427732043412ec42d2060656e64602073706563696669657320746865206e657720656e642064617465206f66207468652062616c6c6f742e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602edc2d20604e6f5375636842616c6c6f7460206966206063615f69646020646f6573206e6f74206964656e7469667920612062616c6c6f742e31012d2060566f74696e67416c7265616479537461727465646020696620607374617274203e3d206e6f77602c20776865726520606e6f7760206973207468652063757272656e742074696d652e8c2d206053746172744166746572456e646020696620607374617274203e20656e64602e2c6368616e67655f6d65746108011463615f696489020110434149640001106d6574612103012842616c6c6f744d6574610003346101416d656e6420746865206d6574616461746120287469746c652c206d6f74696f6e732c206574632e29206f66207468652062616c6c6f74206f6620746865204341206964656e746966696564206279206063615f6964602e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602eb82d206063615f696460206964656e746966696573207468652061747461636865642062616c6c6f7427732043412e902d20606d657461602073706563696669657320746865206e6577206d657461646174612e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602edc2d20604e6f5375636842616c6c6f7460206966206063615f69646020646f6573206e6f74206964656e7469667920612062616c6c6f742e31012d2060566f74696e67416c7265616479537461727465646020696620607374617274203e3d206e6f77602c20776865726520606e6f7760206973207468652063757272656e742074696d652e31012d20604e756d6265724f6643686f696365734f766572666c6f77602069662074686520746f74616c2063686f69636520696e20606d65746160206f766572666c6f777320607573697a65602e09012d2060546f6f4c6f6e676020696620616e79206f662074686520656d62656464656420737472696e677320696e20606d657461602061726520746f6f206c6f6e672e286368616e67655f72637608011463615f6964890201104341496400010c726376200110626f6f6c00042c0501416d656e642052435620737570706f727420666f72207468652062616c6c6f74206f6620746865204341206964656e746966696564206279206063615f6964602e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602eb82d206063615f696460206964656e746966696573207468652061747461636865642062616c6c6f7427732043412ecc2d206072637660207370656369666965732069662052435620697320746f20626520737570706f72746564206f72206e6f742e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602edc2d20604e6f5375636842616c6c6f7460206966206063615f69646020646f6573206e6f74206964656e7469667920612062616c6c6f742e31012d2060566f74696e67416c7265616479537461727465646020696620607374617274203e3d206e6f77602c20776865726520606e6f7760206973207468652063757272656e742074696d652e3472656d6f76655f62616c6c6f7404011463615f69648902011043414964000528c852656d6f7665207468652062616c6c6f74206f6620746865204341206964656e746966696564206279206063615f6964602e0030232320417267756d656e74734d012d20606f726967696e602069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206063615f69642e61737365745f6964602eb82d206063615f696460206964656e746966696573207468652061747461636865642062616c6c6f7427732043412e002023204572726f72732d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602edc2d20604e6f5375636842616c6c6f7460206966206063615f69646020646f6573206e6f74206964656e7469667920612062616c6c6f742e31012d2060566f74696e67416c7265616479537461727465646020696620607374617274203e3d206e6f77602c20776865726520606e6f7760206973207468652063757272656e742074696d652e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e11070c2c70616c6c65745f706970731870616c6c65741043616c6c040454000144647365745f7072756e655f686973746f726963616c5f706970730401147072756e65200110626f6f6c00002c89015365747320746865207072756e696e672073657474696e6720666f7220686973746f726963616c20504950732e20546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792074686520726f6f74206f726967696e2e002c2320417267756d656e7473f02a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d7573742062652074686520726f6f742eb5012a20607072756e6560202d204120626f6f6c65616e20666c616720696e6469636174696e67207768657468657220636f6d706c6574656420504950732073686f756c64206265207072756e6564202860747275656029206f722072657461696e656420286066616c736560292e002023204576656e7473a9012a2060486973746f726963616c506970735072756e656460202d20456d6974746564207768656e20746865207072756e696e672073657474696e67206973206368616e6765642c20636f6e7461696e696e6720746865206f6c6420616e64206e65772076616c7565732e002023204572726f7273ec2a20604261644f726967696e60202d204966207468652063616c6c206973206e6f74206d6164652062792074686520726f6f74206f726967696e2e607365745f6d696e5f70726f706f73616c5f6465706f73697404011c6465706f73697418011c42616c616e636500012cf9014368616e67657320746865206d696e696d756d2070726f706f73616c206465706f73697420616d6f756e7420726571756972656420746f20737461727420612070726f706f73616c2e20546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792074686520726f6f74206f726967696e2e002c2320417267756d656e7473f02a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d7573742062652074686520726f6f742e0d012a20606465706f73697460202d20546865206e6577206d696e696d756d206465706f73697420726571756972656420746f20737461727420612070726f706f73616c2e002023204576656e7473f1012a20604d696e696d756d50726f706f73616c4465706f7369744368616e67656460202d20456d6974746564207768656e20746865206d696e696d756d2070726f706f73616c206465706f736974206973206368616e6765642c20636f6e7461696e696e6720746865206f6c6420616e64206e65772076616c7565732e002023204572726f7273ec2a20604261644f726967696e60202d204966207468652063616c6c206973206e6f74206d6164652062792074686520726f6f74206f726967696e2e707365745f64656661756c745f656e6163746d656e745f706572696f640401206475726174696f6e100144426c6f636b4e756d626572466f723c543e00022c69014368616e676573207468652064656661756c7420656e6163746d656e7420706572696f642e20546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792074686520726f6f74206f726967696e2e002c2320417267756d656e7473f02a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d7573742062652074686520726f6f742eb82a2060706572696f6460202d20546865206e65772064656661756c7420656e6163746d656e7420706572696f642e002023204576656e7473f1012a206044656661756c74456e6163746d656e74506572696f644368616e67656460202d20456d6974746564207768656e207468652064656661756c7420656e6163746d656e7420706572696f64206973206368616e6765642c20636f6e7461696e696e6720746865206f6c6420616e64206e65772076616c7565732e002023204572726f7273ec2a20604261644f726967696e60202d204966207468652063616c6c206973206e6f74206d6164652062792074686520726f6f74206f726967696e2e587365745f70656e64696e675f7069705f657870697279040118657870697279590101744d61796265426c6f636b3c426c6f636b4e756d626572466f723c543e3e00032cad01536574732074686520657870697279206475726174696f6e2028696e20626c6f636b732920666f722070656e64696e6720504950732e20546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792074686520726f6f74206f726967696e2e002c2320417267756d656e7473f02a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d7573742062652074686520726f6f742e51012a206065787069727960202d20546865206e657720657870697279206475726174696f6e20666f722070656e64696e6720504950732e20496620604e6f6e65602c2050495073206e65766572206578706972652e002023204576656e7473e5012a206050656e64696e675069704578706972794368616e67656460202d20456d6974746564207768656e207468652070656e64696e672050495020657870697279206475726174696f6e206973206368616e6765642c20636f6e7461696e696e6720746865206f6c6420616e64206e65772076616c7565732e002023204572726f7273ec2a20604261644f726967696e60202d204966207468652063616c6c206973206e6f74206d6164652062792074686520726f6f74206f726967696e2e587365745f6d61785f7069705f736b69705f636f756e7404010c6d6178080130536b6970706564436f756e7400042cad015365747320746865206d6178696d756d206e756d626572206f662074696d65732061205049502063616e20626520736b69707065642e20546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792074686520726f6f74206f726967696e2e002c2320417267756d656e7473f02a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d7573742062652074686520726f6f742eb82a20606d617860202d20546865206e6577206d6178696d756d20736b697020636f756e7420666f7220504950732e002023204576656e7473cd012a20604d6178506970536b6970436f756e744368616e67656460202d20456d6974746564207768656e20746865206d6178696d756d2050495020736b697020636f756e74206973206368616e6765642c20636f6e7461696e696e6720746865206f6c6420616e64206e65772076616c7565732e002023204572726f7273ec2a20604261644f726967696e60202d204966207468652063616c6c206973206e6f74206d6164652062792074686520726f6f74206f726967696e2e507365745f6163746976655f7069705f6c696d69740401146c696d697410010c75333200052c85015365747320746865206c696d6974206f6e20746865206e756d626572206f662061637469766520504950732e20546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792074686520726f6f74206f726967696e2e002c2320417267756d656e7473f02a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d7573742062652074686520726f6f742edc2a20606c696d697460202d20546865206e6577206c696d6974206f6e20746865206e756d626572206f662061637469766520504950732e002023204576656e7473b1012a20604163746976655069704c696d69744368616e67656460202d20456d6974746564207768656e207468652061637469766520504950206c696d6974206973206368616e6765642c20636f6e7461696e696e6720746865206f6c6420616e64206e65772076616c7565732e002023204572726f7273ec2a20604261644f726967696e60202d204966207468652063616c6c206973206e6f74206d6164652062792074686520726f6f74206f726967696e2e1c70726f706f736510012070726f706f73616c39060140426f783c543a3a50726f706f73616c3e00011c6465706f73697418011c42616c616e636500010c75726c5102012c4f7074696f6e3c55726c3e00012c6465736372697074696f6e610301584f7074696f6e3c5069704465736372697074696f6e3e00063c290150726f706f7365732061206e657720504950206279207375626d697474696e67206120646973706174636861626c65207768696368206368616e67657320746865206e6574776f726b2e002c2320417267756d656e7473902a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2e942a206070726f706f73616c60202d2054686520646973706174636861626c652063616c6c2ec82a20606465706f73697460202d20546865206465706f73697420616d6f756e7420666f72207468652070726f706f73616c2ed82a206075726c60202d2041206c696e6b20746f2061207765627369746520666f722070726f706f73616c2064697363757373696f6e2ed82a20606465736372697074696f6e60202d20412073686f7274206465736372697074696f6e206f66207468652070726f706f73616c2e002023204576656e7473502a206050726f706f73616c43726561746564602e002023204572726f72733d012a2060496e636f72726563744465706f73697460202d20496620746865206465706f73697420616d6f756e74206973206c657373207468616e20746865207265717569726564206d696e696d756d2e25012a2060546f6f4d616e794163746976655069707360202d20496620746865206e756d626572206f66206163746976652050495073206578636565647320746865206d6178696d756d2e10766f74650c010869645d03011450697049640001286179655f6f725f6e6179200110626f6f6c00011c6465706f73697418011c42616c616e636500075ce04361737473206120766f74652065697468657220696e206661766f72206f7220616761696e7374206120504950207769746820606964602e49015468652022636f6e76696374696f6e22206f7220737472656e677468206f662074686520766f746520697320676976656e20627920606465706f736974602c2077686963682069732072657365727665642e008c4e6f746520746861742060766f746560206973202a6e6f742a2061646469746976652ef8546861742069732c2060766f74652869642c20747275652c203530296020666f6c6c6f7765642062792060766f74652869642c20747275652c2034302960490177696c6c2066697273742072657365727665206035306020616e64207468656e20726566756e6420603530202d203130602c20656e64696e672075702077697468206034306020696e206465706f7369742e2501546f206164642061746f70206f66206578697374696e6720766f7465732c20796f75276c6c206e65656420606578697374696e675f6465706f736974202b206164646974696f6e602e002c2320417267756d656e7473902a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2e902a2060696460202d205468652070726f706f73616c20494420746f20766f7465206f6e2e59012a20606179655f6f725f6e617960202d204120626f6f6c65616e20726570726573656e74696e67206120766f746520696e206661766f72202860747275656029206f7220616761696e737420286066616c736560292e75012a20606465706f73697460202d205468652022636f6e76696374696f6e22206f7220737472656e677468206f662074686520766f74652c20726570726573656e7465642062792074686520616d6f756e74206f66206465706f7369742e002023204576656e7473d42a2060566f74656460202d20456d6974746564207768656e206120766f7465206973207375636365737366756c6c7920636173742e002023204572726f727301012a20604e6f5375636850726f706f73616c60202d20496620746865206069646020646f6573206e6f74207265666572656e636520612076616c6964205049502efc2a20604e6f7446726f6d436f6d6d756e69747960202d204966207468652070726f706f73616c20776173206d616465206279206120636f6d6d69747465652e09012a2060496e636f727265637450726f706f73616c537461746560202d2049662074686520504950206973206e6f7420696e20612070656e64696e672073746174652e39012a2060496e73756666696369656e744465706f73697460202d2049662074686520606f726967696e602063616e6e6f74207265736572766520746865207265717569726564206465706f7369742e3d012a2060496e636f72726563744465706f73697460202d20496620746865206465706f73697420616d6f756e74206973206c657373207468616e20746865207265717569726564206d696e696d756d2e68617070726f76655f636f6d6d69747465655f70726f706f73616c04010869645d0301145069704964000840d4417070726f766573207468652070656e64696e6720636f6d6d69747465652050495020676976656e2062792074686520606964602e004101546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279206120476f7665726e616e636520436f6d6d6974746565202847432920766f74696e67206d616a6f726974792e002c2320417267756d656e747321012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d757374206265206120474320766f74696e67206d616a6f726974792ecc2a2060696460202d205468652070726f706f73616c204944206f66207468652050495020746f20626520617070726f7665642e002023204572726f727301012a20604261644f726967696e60202d204966207468652063616c6c206973206e6f74206d616465206279206120474320766f74696e67206d616a6f726974792e0d012a20604e6f5375636850726f706f73616c60202d204966207468652050495020776974682074686520676976656e206069646020646f6573206e6f742065786973742e1d012a2060496e636f727265637450726f706f73616c537461746560202d204966207468652070726f706f73616c206973206e6f7420696e20612070656e64696e672073746174652e05012a20604e6f744279436f6d6d697474656560202d204966207468652070726f706f73616c20776173206e6f74206d616465206279206120636f6d6d69747465652e001c23204e6f7465730501546869732066756e6374696f6e207363686564756c6573207468652050495020666f7220657865637574696f6e20696620616c6c20636865636b7320706173732e3c72656a6563745f70726f706f73616c04010869645d0301145069704964000948510152656a65637473207468652050495020676976656e2062792074686520606964602e20426f6e6465642066756e64732077696c6c20626520726566756e6465642c20617373756d696e67206974206861736e27746c6265656e2063616e63656c6c6564206f722065786563757465642e004101546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279206120476f7665726e616e636520436f6d6d6974746565202847432920766f74696e67206d616a6f726974792e002c2320417267756d656e747321012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d757374206265206120474320766f74696e67206d616a6f726974792ecc2a2060696460202d205468652070726f706f73616c204944206f66207468652050495020746f2062652072656a65637465642e002023204572726f727301012a20604261644f726967696e60202d204966207468652063616c6c206973206e6f74206d616465206279206120474320766f74696e67206d616a6f726974792e0d012a20604e6f5375636850726f706f73616c60202d204966207468652050495020776974682074686520676976656e206069646020646f6573206e6f742065786973742e1d012a2060496e636f727265637450726f706f73616c537461746560202d204966207468652070726f706f73616c207761732063616e63656c6c6564206f722065786563757465642e001c23204e6f7465734101546869732066756e6374696f6e2077696c6c20756e7363686564756c65207468652050495020696620697420776173207363686564756c656420666f7220657865637574696f6e20616e642077696c6c4901756e736e617073686f742074686520504950206966206974207761732070617274206f66206120736e617073686f742e2049742077696c6c20616c736f2068616e646c65207468652072656a656374696f6eb06f66207468652070726f706f73616c20616e6420726566756e6420616e7920626f6e6465642066756e64732e387072756e655f70726f706f73616c04010869645d0301145069704964000a3cf45072756e6573207468652050495020676976656e2062792074686520606964602e2054686520504950206d757374206e6f74206265206163746976652e002102546869732066756e6374696f6e20697320696e74656e64656420666f722073746f72616765206761726261676520636f6c6c656374696f6e20707572706f73657320616e642063616e206f6e6c792062652063616c6c6564206279206120476f7665726e616e636520436f6d6d6974746565202847432920766f74696e67206d616a6f726974792e002c2320417267756d656e747321012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d757374206265206120474320766f74696e67206d616a6f726974792ec42a2060696460202d205468652070726f706f73616c204944206f66207468652050495020746f206265207072756e65642e002023204572726f727301012a20604261644f726967696e60202d204966207468652063616c6c206973206e6f74206d616465206279206120474320766f74696e67206d616a6f726974792e0d012a20604e6f5375636850726f706f73616c60202d204966207468652050495020776974682074686520676976656e206069646020646f6573206e6f742065786973742edc2a2060496e636f727265637450726f706f73616c537461746560202d204966207468652070726f706f73616c206973206163746976652e001c23204e6f7465735501546869732066756e6374696f6e2077696c6c2072656d6f766520746865205049502066726f6d2073746f7261676520616e6420726566756e6420616e792072656d61696e696e6720626f6e6465642066756e64732e5072657363686564756c655f657865637574696f6e08010869645d0301145069704964000114756e74696c8d0101644f7074696f6e3c426c6f636b4e756d626572466f723c543e3e000b34e0557064617465732074686520657865637574696f6e207363686564756c65206f66207468652050495020676976656e20627920606964602ef0546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207468652072656c6561736520636f6f7264696e61746f722e002c2320417267756d656e74732d012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d757374206265207468652072656c6561736520636f6f7264696e61746f722ed82a2060696460202d205468652070726f706f73616c204944206f66207468652050495020746f2062652072657363686564756c65642e4d012a2060756e74696c60202d20416e206f7074696f6e616c2066757475726520626c6f636b206e756d6265722077686572652074686520656e6163746d656e7420706572696f642077696c6c2066696e6973682e0501202020496620604e6f6e65602c2074686520656e6163746d656e7420706572696f642077696c6c2066696e69736820696e20746865206e65787420626c6f636b2e002023204572726f72736d012a206052657363686564756c654e6f74427952656c65617365436f6f7264696e61746f7260202d204966207468652063616c6c206973206e6f74206d616465206279207468652072656c6561736520636f6f7264696e61746f722e25012a2060496e636f727265637450726f706f73616c537461746560202d204966207468652070726f706f73616c206973206e6f7420696e2061207363686564756c65642073746174652e7d012a2060496e76616c6964467574757265426c6f636b4e756d62657260202d204966207468652070726f766964656420626c6f636b206e756d626572206973206e6f7420612076616c69642066757475726520626c6f636b206e756d6265722e38636c6561725f736e617073686f74000c30e8436c656172732074686520736e617073686f7420616e6420656d69747320746865206576656e742060536e617073686f74436c6561726564602e001d01546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279206120476f7665726e616e636520436f6d6d69747465652028474329206d656d6265722e002c2320417267756d656e7473fc2a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d7573742062652061204743206d656d6265722e002023204576656e7473cd012a2060536e617073686f74436c656172656460202d20456d6974746564207768656e2074686520736e617073686f74206973207375636365737366756c6c7920636c65617265642c20636f6e7461696e696e6720746865204944206f662074686520636c656172656420736e617073686f742e002023204572726f727305012a20604e6f7441436f6d6d69747465654d656d62657260202d204966207468652063616c6c206973206e6f74206d6164652062792061204743206d656d6265722e20736e617073686f74000d34110154616b65732061206e657720736e617073686f74206f66207468652063757272656e74206c697374206f662061637469766520616e642070656e64696e6720504950732e2901546865205049507320617265207468656e20736f7274656420696e746f2061207072696f72697479207175657565206261736564206f6e2065616368205049502773207765696768742e001d01546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279206120476f7665726e616e636520436f6d6d69747465652028474329206d656d6265722e002c2320417267756d656e7473fc2a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d7573742062652061204743206d656d6265722e002023204576656e7473ed012a2060536e617073686f7454616b656e60202d20456d6974746564207768656e206120736e617073686f74206973207375636365737366756c6c792074616b656e2c20636f6e7461696e696e6720746865204944206f662074686520736e617073686f7420616e6420746865207175657565206f6620504950732e002023204572726f727305012a20604e6f7441436f6d6d69747465654d656d62657260202d204966207468652063616c6c206973206e6f74206d6164652062792061204743206d656d6265722e58656e6163745f736e617073686f745f726573756c747304011c726573756c7473150701705665633c2850697049642c20536e617073686f74526573756c74293e000e68d8456e616374732074686520726573756c747320666f7220746865205049507320696e2074686520736e617073686f742071756575652e00290154686520736e617073686f742077696c6c20626520617661696c61626c6520666f72206675727468657220656e6163746d656e747320756e74696c20697420697320636c65617265642e00d1015468652060726573756c74736020706172616d657465722069732061206c697374206f6620602869642c20726573756c742960207475706c65732077686572652060726573756c7460206973206170706c69656420746f207468652050495020776974682074686520676976656e20606964602e49014e6f746520746861742074686520736e617073686f74207072696f7269747920717565756520697320656e636f646564207769746820746865202a6c6f77657374207072696f726974792066697273742a2e7d01466f72206578616d706c652c2060726573756c7473203d205b2869642c20417070726f7665295d602077696c6c20617070726f76652060536e617073686f7451756575655b536e617073686f7451756575652e6c656e2829202d20315d602e002c2320417267756d656e747321012a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d757374206265206120474320766f74696e67206d616a6f726974792e0d022a2060726573756c747360202d204120766563746f72206f66207475706c65732077686572652065616368207475706c6520636f6e7461696e7320612050495020494420616e6420612060536e617073686f74526573756c746020286569746865722060417070726f7665602c206052656a656374602c206f722060536b697060292e002023204576656e747345022a2060536e617073686f74526573756c7473456e616374656460202d20456d6974746564207768656e2074686520736e617073686f7420726573756c747320617265207375636365737366756c6c7920656e61637465642c20636f6e7461696e696e6720746865204944206f662074686520736e617073686f7420616e642074686520616374696f6e732074616b656e2e002023204572726f727301012a20604261644f726967696e60202d204966207468652063616c6c206973206e6f74206d616465206279206120474320766f74696e67206d616a6f726974792e2d012a206043616e6e6f74536b697050697060202d204966206120676976656e205049502068617320616c7265616479206265656e20736b697070656420746f6f206d616e792074696d65732ea5012a2060536e617073686f74526573756c74546f6f4c6172676560202d20496620746865206c656e677468206f662060726573756c7473602069732067726561746572207468616e20746865206c656e677468206f662074686520736e617073686f742071756575652ea1012a2060536e617073686f7449644d69736d6174636860202d2049662074686572652069732061206d69736d61746368206265747765656e20746865205049502049447320696e2060726573756c74736020616e642074686520736e617073686f742071756575652e001c23204e6f7465734c546869732066756e6374696f6e2077696c6c3acc2d205570646174652074686520736b697020636f756e747320666f72205049507320746861742061726520736b69707065642e21012d2052656a6563742050495073207468617420617265206d61726b656420666f722072656a656374696f6e20616e6420726566756e6420616e7920626f6e6465642066756e64732e31012d20417070726f76652050495073207468617420617265206d61726b656420666f7220617070726f76616c20616e64207363686564756c65207468656d20666f7220657865637574696f6e2e54657865637574655f7363686564756c65645f70697004010869645d0301145069704964000f34e445786563757465732061207363686564756c6564205049502028506f6c796d65736820496d70726f76656d656e742050726f706f73616c292e002c2320417267756d656e7473f02a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d7573742062652074686520726f6f742ee42a2060696460202d2054686520756e69717565206964656e746966696572206f66207468652050495020746f2062652065786563757465642e002023204572726f7273ec2a20604261644f726967696e60202d204966207468652063616c6c206973206e6f74206d6164652062792074686520726f6f74206f726967696e2e001c23204e6f7465734c546869732066756e6374696f6e2077696c6c3aac2d2052656d6f766520746865205049502066726f6d20746865207363686564756c696e672071756575652ebc2d2045786563757465207468652070726f706f73616c206173736f636961746564207769746820746865205049502e506578706972655f7363686564756c65645f70697008010c6469649c01284964656e74697479496400010869645d030114506970496400103ce0457870697265732061207363686564756c6564205049502028506f6c796d65736820496d70726f76656d656e742050726f706f73616c292e002c2320417267756d656e7473f02a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c207768696368206d7573742062652074686520726f6f742e09012a206064696460202d20546865206964656e74697479204944206f662074686520656e7469747920696e6974696174696e67207468652065787069726174696f6e2ee02a2060696460202d2054686520756e69717565206964656e746966696572206f66207468652050495020746f20626520657870697265642e002023204572726f7273ec2a20604261644f726967696e60202d204966207468652063616c6c206973206e6f74206d6164652062792074686520726f6f74206f726967696e2e001c23204e6f7465734c546869732066756e6374696f6e2077696c6c3aa42d20436865636b206966207468652050495020697320696e20612070656e64696e672073746174652ec82d20556e736e617073686f742074686520504950206966206974207761732070617274206f66206120736e617073686f742ec82d205072756e652074686520504950206461746120696620697420697320696e20616e20657870697265642073746174652e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e15070000021907001907000004085d031d07001d070c2c70616c6c65745f7069707314747970657338536e617073686f74526573756c7400010c1c417070726f76650000001852656a65637400010010536b69700002000021070c4070616c6c65745f706f7274666f6c696f1870616c6c65741043616c6c04045400012c406372656174655f706f7274666f6c696f0401106e616d6595030134506f7274666f6c696f4e616d65000004a843726561746573206120706f7274666f6c696f20776974682074686520676976656e20606e616d65602e4064656c6574655f706f7274666f6c696f04010c6e756df8013c506f7274666f6c696f4e756d626572000120350144656c657465732061207573657220706f7274666f6c696f2e204120706f7274666f6c696f2063616e2062652064656c65746564206f6e6c7920696620697420686173206e6f2066756e64732e002023204572726f72731d012a2060506f7274666f6c696f446f65734e6f7445786973746020696620606e756d6020646f65736e2774207265666572656e636520612076616c696420706f7274666f6c696f2ef02a2060506f7274666f6c696f4e6f74456d707479602069662074686520706f7274666f6c696f207374696c6c20686f6c647320616e79206173736574003423205065726d697373696f6e732c2a20506f7274666f6c696f4072656e616d655f706f7274666f6c696f08010c6e756df8013c506f7274666f6c696f4e756d62657200011c746f5f6e616d6595030134506f7274666f6c696f4e616d6500021c8052656e616d65732061206e6f6e2d64656661756c7420706f7274666f6c696f2e002023204572726f72731d012a2060506f7274666f6c696f446f65734e6f7445786973746020696620606e756d6020646f65736e2774207265666572656e636520612076616c696420706f7274666f6c696f2e003423205065726d697373696f6e732c2a20506f7274666f6c696f58717569745f706f7274666f6c696f5f637573746f647904010c706964f0012c506f7274666f6c696f4964000320bc5768656e2063616c6c65642062792074686520637573746f6469616e206f662060706f7274666f6c696f5f6964602c4901616c6c6f77732072657475726e696e672074686520637573746f6479206f662074686520706f7274666f6c696f20746f2074686520706f7274666f6c696f206f776e657220756e696c61746572616c6c792e002023204572726f72735d012a2060556e617574686f72697a6564437573746f6469616e60206966207468652063616c6c6572206973206e6f74207468652063757272656e7420637573746f6469616e206f662060706f7274666f6c696f5f6964602e003423205065726d697373696f6e732c2a20506f7274666f6c696f606163636570745f706f7274666f6c696f5f637573746f647904011c617574685f696430010c753634000400506d6f76655f706f7274666f6c696f5f66756e64730c011066726f6df0012c506f7274666f6c696f4964000108746ff0012c506f7274666f6c696f496400011466756e6473250701245665633c46756e643e000548a1014d6f7665732066756e6769676c6520616e206e6f6e2d66756e6769626c6520746f6b656e732066726f6d206f6e6520706f7274666f6c696f206f6620616e206964656e7469747920746f20616e6f7468657220706f7274666f6c696f206f66207468652073616d65e06964656e746974792e204d7573742062652063616c6c65642062792074686520637573746f6469616e206f66207468652073656e6465722e110146756e64732066726f6d2064656c6574656420706f7274666f6c696f732063616e20616c736f206265207265636f7665726564207669612074686973206d6574686f642e00e0412073686f7274206d656d6f2063616e20626520616464656420746f20746f206561636820746f6b656e20616d6f756e74206d6f7665642e002023204572726f727369012a2060506f7274666f6c696f446f65734e6f74457869737460206966206f6e65206f7220626f7468206f662074686520706f7274666f6c696f73207265666572656e636520616e20696e76616c696420706f7274666f6c696f2e51012a206064657374696e6174696f6e5f69735f73616d655f706f7274666f6c696f6020696620626f74682073656e64657220616e6420726563656976657220706f7274666f6c696f20617265207468652073616d6591012a2060446966666572656e744964656e74697479506f7274666f6c696f7360206966207468652073656e64657220616e6420726563656976657220706f7274666f6c696f732062656c6f6e6720746f20646966666572656e74206964656e74697469657349012a2060556e617574686f72697a6564437573746f6469616e60206966207468652063616c6c6572206973206e6f742074686520637573746f6469616e206f66207468652066726f6d20706f7274666f6c696f41012a2060496e73756666696369656e74506f7274666f6c696f42616c616e636560206966207468652073656e64657220646f6573206e6f74206861766520656e6f75676820667265652062616c616e636549012a20604e6f4475706c6963617465417373657473416c6c6f77656460207468652073616d652061737365742063616e277420626520726570656174656420696e20746865206974656d7320766563746f722e55012a2060496e76616c69645472616e736665724e46544e6f744f776e656460206966207468652063616c6c657220697320747279696e6720746f206d6f766520616e204e465420686520646f65736e2774206f776e2e31012a2060496e76616c69645472616e736665724e465449734c6f636b656460206966207468652063616c6c657220697320747279696e6720746f206d6f76652061206c6f636b6564204e46542e003423205065726d697373696f6e732c2a20506f7274666f6c696f547072655f617070726f76655f706f7274666f6c696f08012061737365745f6964b0011c41737365744964000130706f7274666f6c696f5f6964f0012c506f7274666f6c696f4964000624e05072652d617070726f7665732074686520726563656976656d656e74206f6620616e20617373657420746f206120706f7274666f6c696f2e002c2320417267756d656e7473b42a20606f726967696e60202d20746865207365636f6e64617279206b6579206f66207468652073656e6465722e11012a206061737365745f696460202d20746865205b6041737365744964605d20746861742077696c6c206265206578656d70742066726f6d2061666669726d6174696f6e2e5d012a2060706f7274666f6c696f5f696460202d20746865205b60506f7274666f6c696f4964605d20746861742063616e2072656365697665206061737365745f69646020776974686f75742061666669726d6174696f6e2e003423205065726d697373696f6e732c2a20506f7274666f6c696f7472656d6f76655f706f7274666f6c696f5f7072655f617070726f76616c08012061737365745f6964b0011c41737365744964000130706f7274666f6c696f5f6964f0012c506f7274666f6c696f4964000724d052656d6f766573207468652070726520617070726f76616c206f6620616e20617373657420746f206120706f7274666f6c696f2e002c2320417267756d656e7473b42a20606f726967696e60202d20746865207365636f6e64617279206b6579206f66207468652073656e6465722e11012a206061737365745f696460202d20746865205b6041737365744964605d20746861742077696c6c206265206578656d70742066726f6d2061666669726d6174696f6e2e5d012a2060706f7274666f6c696f5f696460202d20746865205b60506f7274666f6c696f4964605d20746861742063616e2072656365697665206061737365745f69646020776974686f75742061666669726d6174696f6e2e003423205065726d697373696f6e732c2a20506f7274666f6c696f8c616c6c6f775f6964656e746974795f746f5f6372656174655f706f7274666f6c696f73040140747275737465645f6964656e746974799c01284964656e746974794964000814b1014164647320616e206964656e7469747920746861742077696c6c20626520616c6c6f77656420746f2063726561746520616e642074616b6520637573746f6479206f66206120706f7274666f6c696f20756e646572207468652063616c6c65722773206964656e746974792e002c2320417267756d656e747389012a2060747275737465645f6964656e7469747960202d20746865205b604964656e746974794964605d20746861742077696c6c20626520616c6c6f77656420746f2063616c6c20606372656174655f637573746f64795f706f7274666f6c696f602e008c7265766f6b655f6372656174655f706f7274666f6c696f735f7065726d697373696f6e0401206964656e746974799c01284964656e746974794964000914a10152656d6f766573207065726d697373696f6e206f6620616e206964656e7469747920746f2063726561746520616e642074616b6520637573746f6479206f66206120706f7274666f6c696f20756e646572207468652063616c6c65722773206964656e746974792e002c2320417267756d656e7473b1012a20606964656e7469747960202d20746865205b604964656e746974794964605d20746861742077696c6c206861766520746865207065726d697373696f6e7320746f2063616c6c20606372656174655f637573746f64795f706f7274666f6c696f60207265766f6b65642e00606372656174655f637573746f64795f706f7274666f6c696f080148706f7274666f6c696f5f6f776e65725f69649c01284964656e746974794964000138706f7274666f6c696f5f6e616d6595030134506f7274666f6c696f4e616d65000a18bd0143726561746573206120706f7274666f6c696f20756e646572207468652060706f7274666f6c696f5f6f776e65725f696460206964656e7469747920616e64207472616e73666572732069747320637573746f647920746f207468652063616c6c65722773206964656e746974792e002c2320417267756d656e747331012a2060706f7274666f6c696f5f6f776e65725f696460202d20746865205b604964656e746974794964605d20746861742077696c6c206f776e20746865206e657720706f7274666f6c696f2e01012a2060706f7274666f6c696f5f6e616d6560202d20746865205b60506f7274666f6c696f4e616d65605d206f6620746865206e657720706f7274666f6c696f2e00040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e250700000229070029070c4c706f6c796d6573685f7072696d69746976657324706f7274666f6c696f1046756e64000008012c6465736372697074696f6ea103013c46756e644465736372697074696f6e0001106d656d6f8c01304f7074696f6e3c4d656d6f3e00002d070c4c70616c6c65745f70726f746f636f6c5f6665651870616c6c65741043616c6c040454000108486368616e67655f636f656666696369656e7404012c636f656666696369656e74b5030120506f73526174696f000010c04368616e676573207468652066656520636f656666696369656e7420666f722074686520726f6f74206f726967696e2e002023204572726f7273882a20604261644f726967696e60202d204f6e6c7920726f6f7420616c6c6f7765642e3c6368616e67655f626173655f6665650801086f703107012850726f746f636f6c4f70000120626173655f66656518011c42616c616e6365000110ac4368616e67657320746865206120626173652066656520666f722074686520726f6f74206f726967696e2e002023204572726f7273882a20604261644f726967696e60202d204f6e6c7920726f6f7420616c6c6f7765642e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e31070c64706f6c796d6573685f636f6d6d6f6e5f7574696c69746965733070726f746f636f6c5f6665652850726f746f636f6c4f700001404c417373657452656769737465725469636b65720000002841737365744973737565000100444173736574416464446f63756d656e7473000200404173736574437265617465417373657400030060436865636b706f696e744372656174655363686564756c65000400a4436f6d706c69616e63654d616e61676572416464436f6d706c69616e6365526571756972656d656e74000500584964656e746974794364645265676973746572446964000600404964656e74697479416464436c61696d000700a44964656e746974794164645365636f6e646172794b65797357697468417574686f72697a6174696f6e0008002c5069707350726f706f736500090040436f6e747261637473507574436f6465000a006c436f72706f7261746542616c6c6f7441747461636842616c6c6f74000b00744361706974616c446973747269627574696f6e44697374726962757465000c004c4e4654437265617465436f6c6c656374696f6e000d001c4e46544d696e74000e006c4964656e746974794372656174654368696c644964656e74697479000f000035070c4070616c6c65745f7363686564756c65721870616c6c65741043616c6c040454000128207363686564756c651001107768656e100144426c6f636b4e756d626572466f723c543e0001386d617962655f706572696f646963390701ac4f7074696f6e3c7363686564756c653a3a506572696f643c426c6f636b4e756d626572466f723c543e3e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6c3906017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e00000470416e6f6e796d6f75736c79207363686564756c652061207461736b2e1863616e63656c0801107768656e100144426c6f636b4e756d626572466f723c543e000114696e64657810010c7533320001049443616e63656c20616e20616e6f6e796d6f75736c79207363686564756c6564207461736b2e387363686564756c655f6e616d656414010869640401205461736b4e616d650001107768656e100144426c6f636b4e756d626572466f723c543e0001386d617962655f706572696f646963390701ac4f7074696f6e3c7363686564756c653a3a506572696f643c426c6f636b4e756d626572466f723c543e3e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6c3906017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000204585363686564756c652061206e616d6564207461736b2e3063616e63656c5f6e616d656404010869640401205461736b4e616d650003047843616e63656c2061206e616d6564207363686564756c6564207461736b2e387363686564756c655f61667465721001146166746572100144426c6f636b4e756d626572466f723c543e0001386d617962655f706572696f646963390701ac4f7074696f6e3c7363686564756c653a3a506572696f643c426c6f636b4e756d626572466f723c543e3e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6c3906017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000404a8416e6f6e796d6f75736c79207363686564756c652061207461736b20616674657220612064656c61792e507363686564756c655f6e616d65645f616674657214010869640401205461736b4e616d650001146166746572100144426c6f636b4e756d626572466f723c543e0001386d617962655f706572696f646963390701ac4f7074696f6e3c7363686564756c653a3a506572696f643c426c6f636b4e756d626572466f723c543e3e3e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6c3906017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000504905363686564756c652061206e616d6564207461736b20616674657220612064656c61792e247365745f72657472790c01107461736bbd0301785461736b416464726573733c426c6f636b4e756d626572466f723c543e3e00011c726574726965730801087538000118706572696f64100144426c6f636b4e756d626572466f723c543e0006305901536574206120726574727920636f6e66696775726174696f6e20666f722061207461736b20736f20746861742c20696e206361736520697473207363686564756c65642072756e206661696c732c2069742077696c6c5501626520726574726965642061667465722060706572696f646020626c6f636b732c20666f72206120746f74616c20616d6f756e74206f66206072657472696573602072657472696573206f7220756e74696c2069742473756363656564732e0055015461736b73207768696368206e65656420746f206265207363686564756c656420666f72206120726574727920617265207374696c6c207375626a65637420746f20776569676874206d65746572696e6720616e6451016167656e64612073706163652c2073616d65206173206120726567756c6172207461736b2e204966206120706572696f646963207461736b206661696c732c2069742077696c6c206265207363686564756c6564906e6f726d616c6c79207768696c6520746865207461736b206973207265747279696e672e0051015461736b73207363686564756c6564206173206120726573756c74206f66206120726574727920666f72206120706572696f646963207461736b2061726520756e6e616d65642c206e6f6e2d706572696f6469633d01636c6f6e6573206f6620746865206f726967696e616c207461736b2e20546865697220726574727920636f6e66696775726174696f6e2077696c6c20626520646572697665642066726f6d207468654d016f726967696e616c207461736b277320636f6e66696775726174696f6e2c206275742077696c6c20686176652061206c6f7765722076616c756520666f72206072656d61696e696e6760207468616e20746865646f726967696e616c2060746f74616c5f72657472696573602e3c7365745f72657472795f6e616d65640c010869640401205461736b4e616d6500011c726574726965730801087538000118706572696f64100144426c6f636b4e756d626572466f723c543e0007305d01536574206120726574727920636f6e66696775726174696f6e20666f722061206e616d6564207461736b20736f20746861742c20696e206361736520697473207363686564756c65642072756e206661696c732c2069745d0177696c6c20626520726574726965642061667465722060706572696f646020626c6f636b732c20666f72206120746f74616c20616d6f756e74206f66206072657472696573602072657472696573206f7220756e74696c3069742073756363656564732e0055015461736b73207768696368206e65656420746f206265207363686564756c656420666f72206120726574727920617265207374696c6c207375626a65637420746f20776569676874206d65746572696e6720616e6451016167656e64612073706163652c2073616d65206173206120726567756c6172207461736b2e204966206120706572696f646963207461736b206661696c732c2069742077696c6c206265207363686564756c6564906e6f726d616c6c79207768696c6520746865207461736b206973207265747279696e672e0051015461736b73207363686564756c6564206173206120726573756c74206f66206120726574727920666f72206120706572696f646963207461736b2061726520756e6e616d65642c206e6f6e2d706572696f6469633d01636c6f6e6573206f6620746865206f726967696e616c207461736b2e20546865697220726574727920636f6e66696775726174696f6e2077696c6c20626520646572697665642066726f6d207468654d016f726967696e616c207461736b277320636f6e66696775726174696f6e2c206275742077696c6c20686176652061206c6f7765722076616c756520666f72206072656d61696e696e6760207468616e20746865646f726967696e616c2060746f74616c5f72657472696573602e3063616e63656c5f72657472790401107461736bbd0301785461736b416464726573733c426c6f636b4e756d626572466f723c543e3e000804a852656d6f7665732074686520726574727920636f6e66696775726174696f6e206f662061207461736b2e4863616e63656c5f72657472795f6e616d656404010869640401205461736b4e616d65000904bc43616e63656c2074686520726574727920636f6e66696775726174696f6e206f662061206e616d6564207461736b2e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e390704184f7074696f6e04045401bd030108104e6f6e6500000010536f6d650400bd0300000100003d070c4470616c6c65745f736574746c656d656e741870616c6c65741043616c6c040454000164306372656174655f76656e75650c011c64657461696c73cd03013056656e756544657461696c7300011c7369676e657273050101445665633c543a3a4163636f756e7449643e00010c747970d103012456656e756554797065000014585265676973746572732061206e65772076656e75652e00a42a206064657461696c7360202d2045787472612064657461696c732061626f757420612076656e75653d012a20607369676e65727360202d204172726179206f66207369676e65727320746861742061726520616c6c6f77656420746f207369676e20726563656970747320666f7220746869732076656e7565942a206074797060202d2054797065206f662076656e7565206265696e672063726561746564507570646174655f76656e75655f64657461696c730801086964c903011c56656e7565496400011c64657461696c73cd03013056656e756544657461696c730001105c4564697420612076656e756527732064657461696c732e00b42a20606964602073706563696669657320746865204944206f66207468652076656e756520746f20656469742ec02a206064657461696c7360207370656369666965732074686520757064617465642076656e75652064657461696c732e447570646174655f76656e75655f747970650801086964c903011c56656e7565496400010c747970d103012456656e756554797065000210504564697420612076656e7565277320747970652e00b42a20606964602073706563696669657320746865204944206f66207468652076656e756520746f20656469742eb42a206074797065602073706563696669657320746865206e65772074797065206f66207468652076656e75652e5061666669726d5f776974685f72656365697074730c0108696479020134496e737472756374696f6e496400013c726563656970745f64657461696c73410701dc5665633c5265636569707444657461696c733c543a3a4163636f756e7449642c20543a3a4f6666436861696e5369676e61747572653e3e000128706f7274666f6c696f73510701d8426f756e64656442547265655365743c506f7274666f6c696f49642c20543a3a4d61784e756d6265724f66506f7274666f6c696f733e000324f441666669726d7320616e20696e737472756374696f6e207573696e6720726563656970747320666f72206f6666636861696e207472616e73666572732e002c2320417267756d656e747305012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672061666669726d65642eb1012a2060726563656970745f64657461696c7360202d206120766563746f72206f66205b605265636569707444657461696c73605d2c20776869636820636f6e7461696e207468652064657461696c732061626f757420746865206f6666636861696e207472616e736665722e95012a2060706f7274666f6c696f7360202d206120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e2e003423205065726d697373696f6e732c2a20506f7274666f6c696f4c7365745f76656e75655f66696c746572696e6708012061737365745f6964b0011c4173736574496400011c656e61626c6564200110626f6f6c000420c0456e61626c6573206f722064697361626c65642076656e75652066696c746572696e6720666f72206120746f6b656e2e002c2320417267756d656e7473c02a206061737365745f696460202d2041737365744964206f662074686520746f6b656e20696e207175657374696f6e2e19012a2060656e61626c656460202d20426f6f6c65616e20746861742064656369646573206966207468652066696c746572696e672073686f756c6420626520656e61626c65642e003423205065726d697373696f6e731c2a20417373657430616c6c6f775f76656e75657308012061737365745f6964b0011c4173736574496400011876656e756573e10301305665633c56656e756549643e00051c0d01416c6c6f7773206164646974696f6e616c2076656e75657320746f2063726561746520696e737472756374696f6e7320696e766f6c76696e6720616e2061737365742e00c02a206061737365745f696460202d2041737365744964206f662074686520746f6b656e20696e207175657374696f6e2e7d012a206076656e75657360202d204172726179206f662076656e75657320746861742061726520616c6c6f77656420746f2063726561746520696e737472756374696f6e7320666f722074686520746f6b656e20696e207175657374696f6e2e003423205065726d697373696f6e731c2a2041737365743c646973616c6c6f775f76656e75657308012061737365745f6964b0011c4173736574496400011876656e756573e10301305665633c56656e756549643e00061c69015265766f6b6573207065726d697373696f6e20676976656e20746f2076656e75657320666f72206372656174696e6720696e737472756374696f6e7320696e766f6c76696e67206120706172746963756c61722061737365742e00c02a206061737365745f696460202d2041737365744964206f662074686520746f6b656e20696e207175657374696f6e2ea5012a206076656e75657360202d204172726179206f662076656e756573207468617420617265206e6f206c6f6e67657220616c6c6f77656420746f2063726561746520696e737472756374696f6e7320666f722074686520746f6b656e20696e207175657374696f6e2e003423205065726d697373696f6e731c2a204173736574507570646174655f76656e75655f7369676e6572730c01086964c903011c56656e7565496400011c7369676e657273050101445665633c543a3a4163636f756e7449643e00012c6164645f7369676e657273200110626f6f6c0007105c4564697420612076656e75652773207369676e6572732eb42a20606964602073706563696669657320746865204944206f66207468652076656e756520746f20656469742ec02a20607369676e657273602073706563696669657320746865207369676e65727320746f206164642f72656d6f76652e91012a20606164645f7369676e657273602073706563696669657320746865207570646174652074797065206164642f72656d6f7665206f662076656e756520776865726520616464206973207472756520616e642072656d6f76652069732066616c73652e68657865637574655f6d616e75616c5f696e737472756374696f6e180108696479020134496e737472756374696f6e4964000124706f7274666f6c696f6d02014c4f7074696f6e3c506f7274666f6c696f49643e00014866756e6769626c655f7472616e736665727310010c7533320001386e6674735f7472616e736665727310010c7533320001486f6666636861696e5f7472616e736665727310010c7533320001307765696768745f6c696d6974e10401384f7074696f6e3c5765696768743e000834844d616e75616c6c7920657865637574657320616e20696e737472756374696f6e2e002c2320417267756d656e747301012a20606964603a20546865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e20746f2062652065786563757465642e95012a2060706f7274666f6c696f603a20204f6e65206f66207468652063616c6c65722773205b60506f7274666f6c696f4964605d20776869636820697320616c736f206120636f756e74657220706174727920696e2074686520696e737472756374696f6e2e61014966204e6f6e652c207468652063616c6c6572206d757374206265207468652076656e75652063726561746f72206f72206120636f756e74657220706172747920696e2061205b604c65673a3a4f6666436861696e605d2e1d012a206066756e6769626c655f7472616e7366657273603a20546865206e756d626572206f662066756e6769626c65206c65677320696e2074686520696e737472756374696f6e2e31012a20606e6674735f7472616e7366657273603a20546865206e756d626572206f66206e667473206265696e67207472616e7366657272656420696e2074686520696e737472756374696f6e2e1d012a20606f6666636861696e5f7472616e7366657273603a20546865206e756d626572206f66206f6666636861696e206c65677320696e2074686520696e737472756374696f6e2e8d012a20607765696768745f6c696d6974603a20416e206f7074696f6e616c206d6178696d756d205b60576569676874605d2076616c756520746f206265206368617267656420666f7220657865637574696e672074686520696e737472756374696f6e2e710149662074686520607765696768745f6c696d697460206973206c657373207468616e2074686520726571756972656420616d6f756e742c2074686520696e737472756374696f6e2077696c6c206661696c20657865637574696f6e2e004d024e6f74653a2063616c6c696e672074686520727063206d6574686f6420606765745f657865637574655f696e737472756374696f6e5f696e666f602072657475726e7320616e20696e7374616e6365206f66205b6045786563757465496e737472756374696f6e496e666f605d2c20776869636820636f6e7461696e732074686520636f756e7420706172616d65746572732e3c6164645f696e737472756374696f6e18012076656e75655f6964e503013c4f7074696f6e3c56656e756549643e00013c736574746c656d656e745f74797065e9030184536574746c656d656e74547970653c426c6f636b4e756d626572466f723c543e3e00012874726164655f646174650d0101444f7074696f6e3c543a3a4d6f6d656e743e00012876616c75655f646174650d0101444f7074696f6e3c543a3a4d6f6d656e743e0001106c656773ed0301205665633c4c65673e000140696e737472756374696f6e5f6d656d6f8c01304f7074696f6e3c4d656d6f3e0009245c416464732061206e657720696e737472756374696f6e2e002c2320417267756d656e747341012a206076656e75655f6964603a20546865206f7074696f6e616c205b6056656e75654964605d206f66207468652076656e7565207468697320696e737472756374696f6e2062656c6f6e677320746f2e79012a2060736574746c656d656e745f74797065603a20546865205b60536574746c656d656e7454797065605d2073706563696679696e67207768656e2074686520696e737472756374696f6e2073686f756c6420626520736574746c65642e4d012a206074726164655f64617465603a204f7074696f6e616c20646174652066726f6d2077686963682070656f706c652063616e20696e7465726163742077697468207468697320696e737472756374696f6e2e6d012a206076616c75655f64617465603a204f7074696f6e616c20646174652061667465722077686963682074686520696e737472756374696f6e2073686f756c6420626520736574746c656420286e6f7420656e666f72636564292efc2a20606c656773603a204120766563746f72206f6620616c6c205b604c6567605d20696e636c7564656420696e207468697320696e737472756374696f6e2ee82a20606d656d6f603a20416e206f7074696f6e616c205b604d656d6f605d206669656c6420666f72207468697320696e737472756374696f6e2e686164645f616e645f61666669726d5f696e737472756374696f6e1c012076656e75655f6964e503013c4f7074696f6e3c56656e756549643e00013c736574746c656d656e745f74797065e9030184536574746c656d656e74547970653c426c6f636b4e756d626572466f723c543e3e00012874726164655f646174650d0101444f7074696f6e3c543a3a4d6f6d656e743e00012876616c75655f646174650d0101444f7074696f6e3c543a3a4d6f6d656e743e0001106c656773ed0301205665633c4c65673e000128706f7274666f6c696f73510701d8426f756e64656442547265655365743c506f7274666f6c696f49642c20543a3a4d61784e756d6265724f66506f7274666f6c696f733e000140696e737472756374696f6e5f6d656d6f8c01304f7074696f6e3c4d656d6f3e000a348c4164647320616e642061666669726d732061206e657720696e737472756374696f6e2e002c2320417267756d656e74731d012a206076656e75655f6964603a20546865205b6056656e75654964605d206f66207468652076656e7565207468697320696e737472756374696f6e2062656c6f6e677320746f2e79012a2060736574746c656d656e745f74797065603a20546865205b60536574746c656d656e7454797065605d2073706563696679696e67207768656e2074686520696e737472756374696f6e2073686f756c6420626520736574746c65642e4d012a206074726164655f64617465603a204f7074696f6e616c20646174652066726f6d2077686963682070656f706c652063616e20696e7465726163742077697468207468697320696e737472756374696f6e2e6d012a206076616c75655f64617465603a204f7074696f6e616c20646174652061667465722077686963682074686520696e737472756374696f6e2073686f756c6420626520736574746c656420286e6f7420656e666f72636564292efc2a20606c656773603a204120766563746f72206f6620616c6c205b604c6567605d20696e636c7564656420696e207468697320696e737472756374696f6e2e91012a2060706f7274666f6c696f73603a204120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e2ee82a20606d656d6f603a20416e206f7074696f6e616c205b604d656d6f605d206669656c6420666f72207468697320696e737472756374696f6e2e003423205065726d697373696f6e732c2a20506f7274666f6c696f4861666669726d5f696e737472756374696f6e080108696479020134496e737472756374696f6e4964000128706f7274666f6c696f73510701d8426f756e64656442547265655365743c506f7274666f6c696f49642c20543a3a4d61784e756d6265724f66506f7274666f6c696f733e000b20bc50726f766964652061666669726d6174696f6e20746f20616e206578697374696e6720696e737472756374696f6e2e002c2320417267756d656e747305012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672061666669726d65642e95012a2060706f7274666f6c696f7360202d206120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e2e003423205065726d697373696f6e732c2a20506f7274666f6c696f5077697468647261775f61666669726d6174696f6e080108696479020134496e737472756374696f6e4964000128706f7274666f6c696f73510701d8426f756e64656442547265655365743c506f7274666f6c696f49642c20543a3a4d61784e756d6265724f66506f7274666f6c696f733e000c20c0576974686472617720616e2061666669726d6174696f6e20666f72206120676976656e20696e737472756374696f6e2e002c2320417267756d656e74734d012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e2067657474696e6720616e2061666669726d6174696f6e2077697468647261776e2ec1012a2060706f7274666f6c696f7360202d206120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e207769746864726177616c2e003423205065726d697373696f6e732c2a20506f7274666f6c696f4872656a6563745f696e737472756374696f6e080108696479020134496e737472756374696f6e4964000124706f7274666f6c696ff0012c506f7274666f6c696f4964000d208052656a6563747320616e206578697374696e6720696e737472756374696f6e2e002c2320417267756d656e747305012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672072656a65637465642e61012a2060706f7274666f6c696f60202d20746865205b60506f7274666f6c696f4964605d20746861742062656c6f6e677320746f2074686520696e737472756374696f6e20616e642069732072656a656374696e672069742e003423205065726d697373696f6e732c2a20506f7274666f6c696f74657865637574655f7363686564756c65645f696e737472756374696f6e080108696479020134496e737472756374696f6e49640001307765696768745f6c696d6974280118576569676874000e048101526f6f742063616c6c61626c652065787472696e7369632c207573656420617320616e20696e7465726e616c2063616c6c20746f20657865637574652061207363686564756c656420736574746c656d656e7420696e737472756374696f6e2e7c61666669726d5f776974685f72656365697074735f776974685f636f756e74100108696479020134496e737472756374696f6e496400013c726563656970745f64657461696c73410701dc5665633c5265636569707444657461696c733c543a3a4163636f756e7449642c20543a3a4f6666436861696e5369676e61747572653e3e000128706f7274666f6c696f73510701d8426f756e64656442547265655365743c506f7274666f6c696f49642c20543a3a4d61784e756d6265724f66506f7274666f6c696f733e0001406e756d6265725f6f665f617373657473550701604f7074696f6e3c41666669726d6174696f6e436f756e743e000f30f441666669726d7320616e20696e737472756374696f6e207573696e6720726563656970747320666f72206f6666636861696e207472616e73666572732e002c2320417267756d656e747305012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672061666669726d65642eb1012a2060726563656970745f64657461696c7360202d206120766563746f72206f66205b605265636569707444657461696c73605d2c20776869636820636f6e7461696e207468652064657461696c732061626f757420746865206f6666636861696e207472616e736665722e95012a2060706f7274666f6c696f7360202d206120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e2e19022a20606e756d6265725f6f665f61737365747360202d20616e206f7074696f6e616c205b6041666669726d6174696f6e436f756e74605d20746861742077696c6c206265207573656420666f72206120707265636973652066656520657374696d6174696f6e206265666f726520657865637574696e67207468652065787472696e7369632e0085014e6f74653a2063616c6c696e672074686520727063206d6574686f6420606765745f61666669726d6174696f6e5f636f756e74602072657475726e7320616e20696e7374616e6365206f66205b6041666669726d6174696f6e436f756e74605d2e003423205065726d697373696f6e732c2a20506f7274666f6c696f7461666669726d5f696e737472756374696f6e5f776974685f636f756e740c0108696479020134496e737472756374696f6e4964000128706f7274666f6c696f73510701d8426f756e64656442547265655365743c506f7274666f6c696f49642c20543a3a4d61784e756d6265724f66506f7274666f6c696f733e0001406e756d6265725f6f665f617373657473550701604f7074696f6e3c41666669726d6174696f6e436f756e743e00102cbc50726f766964652061666669726d6174696f6e20746f20616e206578697374696e6720696e737472756374696f6e2e002c2320417267756d656e747305012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672061666669726d65642e95012a2060706f7274666f6c696f7360202d206120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e2e19022a20606e756d6265725f6f665f61737365747360202d20616e206f7074696f6e616c205b6041666669726d6174696f6e436f756e74605d20746861742077696c6c206265207573656420666f72206120707265636973652066656520657374696d6174696f6e206265666f726520657865637574696e67207468652065787472696e7369632e0085014e6f74653a2063616c6c696e672074686520727063206d6574686f6420606765745f61666669726d6174696f6e5f636f756e74602072657475726e7320616e20696e7374616e6365206f66205b6041666669726d6174696f6e436f756e74605d2e003423205065726d697373696f6e732c2a20506f7274666f6c696f7472656a6563745f696e737472756374696f6e5f776974685f636f756e740c0108696479020134496e737472756374696f6e4964000124706f7274666f6c696ff0012c506f7274666f6c696f49640001406e756d6265725f6f665f617373657473610701484f7074696f6e3c4173736574436f756e743e00112c8052656a6563747320616e206578697374696e6720696e737472756374696f6e2e002c2320417267756d656e747305012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672072656a65637465642e61012a2060706f7274666f6c696f60202d20746865205b60506f7274666f6c696f4964605d20746861742062656c6f6e677320746f2074686520696e737472756374696f6e20616e642069732072656a656374696e672069742e01022a20606e756d6265725f6f665f61737365747360202d20616e206f7074696f6e616c205b604173736574436f756e74605d20746861742077696c6c206265207573656420666f72206120707265636973652066656520657374696d6174696f6e206265666f726520657865637574696e67207468652065787472696e7369632e0035024e6f74653a2063616c6c696e672074686520727063206d6574686f6420606765745f657865637574655f696e737472756374696f6e5f696e666f602072657475726e7320616e20696e7374616e6365206f66205b6045786563757465496e737472756374696f6e496e666f605d2c20776869636820636f6e7461696e2074686520617373657420636f756e742e003423205065726d697373696f6e732c2a20506f7274666f6c696f7c77697468647261775f61666669726d6174696f6e5f776974685f636f756e740c0108696479020134496e737472756374696f6e4964000128706f7274666f6c696f73510701d8426f756e64656442547265655365743c506f7274666f6c696f49642c20543a3a4d61784e756d6265724f66506f7274666f6c696f733e0001406e756d6265725f6f665f617373657473550701604f7074696f6e3c41666669726d6174696f6e436f756e743e00122cc0576974686472617720616e2061666669726d6174696f6e20666f72206120676976656e20696e737472756374696f6e2e002c2320417267756d656e74734d012a2060696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e2067657474696e6720616e2061666669726d6174696f6e2077697468647261776e2ec1012a2060706f7274666f6c696f7360202d206120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e207769746864726177616c2e19022a20606e756d6265725f6f665f61737365747360202d20616e206f7074696f6e616c205b6041666669726d6174696f6e436f756e74605d20746861742077696c6c206265207573656420666f72206120707265636973652066656520657374696d6174696f6e206265666f726520657865637574696e67207468652065787472696e7369632e0085014e6f74653a2063616c6c696e672074686520727063206d6574686f6420606765745f61666669726d6174696f6e5f636f756e74602072657475726e7320616e20696e7374616e6365206f66205b6041666669726d6174696f6e436f756e74605d2e003423205065726d697373696f6e732c2a20506f7274666f6c696f786164645f696e737472756374696f6e5f776974685f6d65646961746f72731c012076656e75655f6964e503013c4f7074696f6e3c56656e756549643e00013c736574746c656d656e745f74797065e9030184536574746c656d656e74547970653c426c6f636b4e756d626572466f723c543e3e00012874726164655f646174650d0101444f7074696f6e3c543a3a4d6f6d656e743e00012876616c75655f646174650d0101444f7074696f6e3c543a3a4d6f6d656e743e0001106c656773ed0301205665633c4c65673e000140696e737472756374696f6e5f6d656d6f8c01304f7074696f6e3c4d656d6f3e0001246d65646961746f7273650701dc426f756e64656442547265655365743c4964656e7469747949642c20543a3a4d6178496e737472756374696f6e4d65646961746f72733e00132898416464732061206e657720696e737472756374696f6e2077697468206d65646961746f72732e002c2320417267756d656e74731d012a206076656e75655f6964603a20546865205b6056656e75654964605d206f66207468652076656e7565207468697320696e737472756374696f6e2062656c6f6e677320746f2e79012a2060736574746c656d656e745f74797065603a20546865205b60536574746c656d656e7454797065605d2073706563696679696e67207768656e2074686520696e737472756374696f6e2073686f756c6420626520736574746c65642e4d012a206074726164655f64617465603a204f7074696f6e616c20646174652066726f6d2077686963682070656f706c652063616e20696e7465726163742077697468207468697320696e737472756374696f6e2e6d012a206076616c75655f64617465603a204f7074696f6e616c20646174652061667465722077686963682074686520696e737472756374696f6e2073686f756c6420626520736574746c656420286e6f7420656e666f72636564292efc2a20606c656773603a204120766563746f72206f6620616c6c205b604c6567605d20696e636c7564656420696e207468697320696e737472756374696f6e2e19012a2060696e737472756374696f6e5f6d656d6f603a20416e206f7074696f6e616c205b604d656d6f605d206669656c6420666f72207468697320696e737472756374696f6e2e69012a20606d65646961746f7273603a204120736574206f66205b604964656e746974794964605d206f6620616c6c20746865206d616e6461746f7279206d65646961746f727320666f722074686520696e737472756374696f6e2e746164645f616e645f61666669726d5f776974685f6d65646961746f727320012076656e75655f6964e503013c4f7074696f6e3c56656e756549643e00013c736574746c656d656e745f74797065e9030184536574746c656d656e74547970653c426c6f636b4e756d626572466f723c543e3e00012874726164655f646174650d0101444f7074696f6e3c543a3a4d6f6d656e743e00012876616c75655f646174650d0101444f7074696f6e3c543a3a4d6f6d656e743e0001106c656773ed0301205665633c4c65673e000128706f7274666f6c696f73510701d8426f756e64656442547265655365743c506f7274666f6c696f49642c20543a3a4d61784e756d6265724f66506f7274666f6c696f733e000140696e737472756374696f6e5f6d656d6f8c01304f7074696f6e3c4d656d6f3e0001246d65646961746f7273650701dc426f756e64656442547265655365743c4964656e7469747949642c20543a3a4d6178496e737472756374696f6e4d65646961746f72733e001438c84164647320616e642061666669726d732061206e657720696e737472756374696f6e2077697468206d65646961746f72732e002c2320417267756d656e74731d012a206076656e75655f6964603a20546865205b6056656e75654964605d206f66207468652076656e7565207468697320696e737472756374696f6e2062656c6f6e677320746f2e79012a2060736574746c656d656e745f74797065603a20546865205b60536574746c656d656e7454797065605d2073706563696679696e67207768656e2074686520696e737472756374696f6e2073686f756c6420626520736574746c65642e4d012a206074726164655f64617465603a204f7074696f6e616c20646174652066726f6d2077686963682070656f706c652063616e20696e7465726163742077697468207468697320696e737472756374696f6e2e6d012a206076616c75655f64617465603a204f7074696f6e616c20646174652061667465722077686963682074686520696e737472756374696f6e2073686f756c6420626520736574746c656420286e6f7420656e666f72636564292efc2a20606c656773603a204120766563746f72206f6620616c6c205b604c6567605d20696e636c7564656420696e207468697320696e737472756374696f6e2e91012a2060706f7274666f6c696f73603a204120766563746f72206f66205b60506f7274666f6c696f4964605d20756e646572207468652063616c6c6572277320636f6e74726f6c20616e6420696e74656e64656420666f722061666669726d6174696f6e2e19012a2060696e737472756374696f6e5f6d656d6f603a20416e206f7074696f6e616c205b604d656d6f605d206669656c6420666f72207468697320696e737472756374696f6e2e69012a20606d65646961746f7273603a204120736574206f66205b604964656e746974794964605d206f6620616c6c20746865206d616e6461746f7279206d65646961746f727320666f722074686520696e737472756374696f6e2e003423205065726d697373696f6e732c2a20506f7274666f6c696f7861666669726d5f696e737472756374696f6e5f61735f6d65646961746f72080138696e737472756374696f6e5f696479020134496e737472756374696f6e49640001186578706972790d0101444f7074696f6e3c543a3a4d6f6d656e743e0015188d0141666669726d732074686520696e737472756374696f6e2061732061206d65646961746f72202d2073686f756c64206f6e6c792062652063616c6c6564206279206d65646961746f72732c206f74686572776973652069742077696c6c206661696c2e002c2320417267756d656e7473b02a20606f726967696e603a20546865207365636f6e64617279206b6579206f66207468652073656e6465722e41012a2060696e737472756374696f6e5f6964603a20546865205b60496e737472756374696f6e4964605d20746861742077696c6c2062652061666669726d656420627920746865206d65646961746f722ec5012a2060657870697279603a20416e204f7074696f6e616c2076616c756520666f7220646566696e696e67207768656e207468652061666669726d6174696f6e2077696c6c2065787069726520284e6f6e65206d65616e732069742077696c6c20616c776179732062652076616c6964292e8077697468647261775f61666669726d6174696f6e5f61735f6d65646961746f72040138696e737472756374696f6e5f696479020134496e737472756374696f6e4964001614d10152656d6f76657320746865206d65646961746f7227732061666669726d6174696f6e20666f722074686520696e737472756374696f6e202d2073686f756c64206f6e6c792062652063616c6c6564206279206d65646961746f72732c206f74686572776973652069742077696c6c206661696c2e002c2320417267756d656e7473b02a20606f726967696e603a20546865207365636f6e64617279206b6579206f66207468652073656e6465722e45012a2060696e737472756374696f6e5f6964603a20546865205b60496e737472756374696f6e4964605d20746861742077696c6c2068617665207468652061666669726d6174696f6e2072656d6f7665642e7872656a6563745f696e737472756374696f6e5f61735f6d65646961746f72080138696e737472756374696f6e5f696479020134496e737472756374696f6e49640001406e756d6265725f6f665f617373657473610701484f7074696f6e3c4173736574436f756e743e00171c750152656a6563747320616e206578697374696e6720696e737472756374696f6e202d2073686f756c64206f6e6c792062652063616c6c6564206279206d65646961746f72732c206f74686572776973652069742077696c6c206661696c2e002c2320417267756d656e747335012a2060696e737472756374696f6e5f696460202d20746865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e206265696e672072656a65637465642e01022a20606e756d6265725f6f665f61737365747360202d20616e206f7074696f6e616c205b604173736574436f756e74605d20746861742077696c6c206265207573656420666f72206120707265636973652066656520657374696d6174696f6e206265666f726520657865637574696e67207468652065787472696e7369632e0035024e6f74653a2063616c6c696e672074686520727063206d6574686f6420606765745f657865637574655f696e737472756374696f6e5f696e666f602072657475726e7320616e20696e7374616e6365206f66205b6045786563757465496e737472756374696f6e496e666f605d2c20776869636820636f6e7461696e2074686520617373657420636f756e742e406c6f636b5f696e737472756374696f6e08011c696e73745f696479020134496e737472756374696f6e49640001307765696768745f6c696d697428011857656967687400183c5d014d6f7665732074686520696e737472756374696f6e2073746174757320746f20604c6f636b6564466f72457865637574696f6e602e20546869732066756e6374696f6e206d7573742062652063616c6c6564206279206155016d65646961746f72206f662074686520696e737472756374696f6e20616e642077696c6c206f6e6c79207375636565642069662074686520666f6c6c6f77696e6720636f6e646974696f6e7320617265206d65743a982d20416c6c2061666669726d6174696f6e732068617665206265656e2072656365697665642ee42d20496e737472756374696f6e2069732070656e64696e67206f7220686173206661696c6564206174206c65617374206f6e652074696d652eb82d20416c6c206d65646961746f7227732061666669726d6174696f6e7320617265207374696c6c2076616c69642eac2d20416c6c206173736574732061726520696e2074686520616c6c6f7765642076656e7565206c6973742e01012d20416c6c2073656e6465727320686176652074686520726967687420616d6f756e74206f6620617373657473206265696e67207472616e736665727265642e11012d20416c6c2073656e6465727320616e64207265636569766572732061726520636f6d706c69616e7420616e6420686176652076616c69642043444420636c61696d732ea42d20416c6c2061737365747327207374617469737469637320617265207374696c6c2076616c69642e742d20546865726520617265206e6f2066726f7a656e206173736574732e002c2320417267756d656e7473ec2a20606f726967696e60202d20546865206f726967696e206f66207468652063616c6c2c2073706563696679696e67207468652063616c6c65722e11012a2060696e73745f696460202d20546865205b60496e737472756374696f6e4964605d206f662074686520696e737472756374696f6e20746f206265206c6f636b65642e61012a20607765696768745f6c696d697460202d2041206d6178696d756d205b60576569676874605d2076616c756520746f206265206368617267656420666f72206c6f636b696e672074686520696e737472756374696f6e2e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e410700000245070045070c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e74385265636569707444657461696c7308244163636f756e7449640100444f6666436861696e5369676e61747572650149070018010c75696430010c753634000138696e737472756374696f6e5f696479020134496e737472756374696f6e49640001186c65675f6964d50301144c656749640001187369676e65720001244163636f756e7449640001247369676e6174757265490701444f6666436861696e5369676e61747572650001206d65746164617461d903015c4f7074696f6e3c526563656970744d657461646174613e00004907082873705f72756e74696d65384d756c74695369676e617475726500010c1c45643235353139040015020148656432353531393a3a5369676e61747572650000001c53723235353139040015020148737232353531393a3a5369676e617475726500010014456364736104004d07014065636473613a3a5369676e6174757265000200004d0700000341000000080051070c4c626f756e6465645f636f6c6c656374696f6e7344626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401f0045300000400fc012c42547265655365743c543e0000550704184f7074696f6e0404540159070108104e6f6e6500000010536f6d6504005907000001000059070c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e744041666669726d6174696f6e436f756e7400000c014873656e6465725f61737365745f636f756e745d0701284173736574436f756e7400015072656365697665725f61737365745f636f756e745d0701284173736574436f756e740001386f6666636861696e5f636f756e7410010c75333200005d070c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e74284173736574436f756e7400000c012066756e6769626c6510010c7533320001306e6f6e5f66756e6769626c6510010c7533320001246f66665f636861696e10010c7533320000610704184f7074696f6e040454015d070108104e6f6e6500000010536f6d6504005d07000001000065070c4c626f756e6465645f636f6c6c656374696f6e7344626f756e6465645f62747265655f7365743c426f756e6465644254726565536574080454019c0453000004007d02012c42547265655365743c543e000069070c4470616c6c65745f737461746973746963731870616c6c65741043616c6c040454000110587365745f6163746976655f61737365745f737461747308012061737365745f6964b0011c41737365744964000128737461745f74797065736d07014842547265655365743c53746174547970653e00003c80536574207468652061637469766520617373657420737461745f74797065732e002c2320417267756d656e747331012d20606f726967696e60202d2061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ef42d206061737365745f696460202d20746865205b6041737365744964605d20746f206368616e67652074686520616374697665207374617473206f6e2e09012d2060737461745f747970657360202d20746865206e6577207374617420747970657320746f207265706c61636520616e79206578697374696e672074797065732e002023204572726f727329012d206053746174547970654c696d69745265616368656460202d20746f6f206d616e79207374617420747970657320656e61626c656420666f7220746865206061737365745f6964602e85012d206043616e6e6f7452656d6f76655374617454797065496e55736560202d2063616e206e6f742072656d6f7665206120737461742074797065207468617420697320696e20757365206279207472616e7366657220636f6e646974696f6e732e2d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e003423205065726d697373696f6e731c2d204167656e741c2d2041737365746062617463685f7570646174655f61737365745f73746174730c012061737365745f6964b0011c41737365744964000124737461745f74797065fd030120537461745479706500011876616c7565737107015042547265655365743c537461745570646174653e00013ce8416c6c6f77206120747275737465642069737375657220746f20696e69742f726573796e632061737365742f636f6d70616e792073746174732e002c2320417267756d656e747331012d20606f726967696e60202d2061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ef42d206061737365745f696460202d20746865205b6041737365744964605d20746f206368616e67652074686520616374697665207374617473206f6e2e902d2060737461745f7479706560202d2073746174207479706520746f207570646174652eb02d206076616c75657360202d20557064617465642076616c75657320666f722060737461745f74797065602e002023204572726f727311012d206053746174547970654d697373696e6760202d2060737461745f7479706560206973206e6f7420656e61626c656420666f7220746865206061737365745f6964602e2d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e003423205065726d697373696f6e731c2d204167656e741c2d204173736574747365745f61737365745f7472616e736665725f636f6d706c69616e636508012061737365745f6964b0011c4173736574496400014c7472616e736665725f636f6e646974696f6e737507016c42547265655365743c5472616e73666572436f6e646974696f6e3e00023c90536574206173736574207472616e7366657220636f6d706c69616e63652072756c65732e002c2320417267756d656e747331012d20606f726967696e60202d2061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ef42d206061737365745f696460202d20746865205b6041737365744964605d20746f206368616e67652074686520616374697665207374617473206f6e2e61012d20607472616e736665725f636f6e646974696f6e7360202d20746865206e6577207472616e7366657220636f6e646974696f6e20746f207265706c61636520616e79206578697374696e6720636f6e646974696f6e732e002023204572726f727361012d20605472616e73666572436f6e646974696f6e4c696d69745265616368656460202d20746f6f206d616e79207472616e7366657220636f6e64697469746f6e20656e61626c656420666f72206061737365745f6964602e9d012d206053746174547970654d697373696e6760202d2061207472616e7366657220636f6e646974696f6e2072657175697265732061207374617420747970652074686174206973206e6f7420656e61626c656420666f7220746865206061737365745f6964602e2d012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f72206061737365745f6964602e003423205065726d697373696f6e731c2d204167656e741c2d2041737365744c7365745f656e7469746965735f6578656d70740c012469735f6578656d7074200110626f6f6c0001286578656d70745f6b65792d0401685472616e73666572436f6e646974696f6e4578656d70744b6579000120656e7469746965737d02015042547265655365743c4964656e7469747949643e00033811015365742f756e73657420656e746974696573206578656d70742066726f6d20616e2061737365742773207472616e7366657220636f6d706c69616e63652072756c65732e002c2320417267756d656e747351012d20606f726967696e60202d2061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f6620606578656d70745f6b65792e6173736574602ee02d206069735f6578656d707460202d20656e61626c652f64697361626c65206578656d7074696f6e20666f722060656e746974696573602e1d012d20606578656d70745f6b657960202d2074686520617373657420616e642073746174207479706520746f206578656d7074207468652060656e746974696573602066726f6d2eec2d2060656e74697469657360202d2074686520656e74697469657320746f207365742f756e73657420746865206578656d7074696f6e20666f722e002023204572726f727321012d2060556e617574686f72697a65644167656e746020696620606f726967696e60206973206e6f74206167656e742d7065726d697373696f6e656420666f7220606173736574602e003423205065726d697373696f6e731c2d204167656e741c2d204173736574040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e6d070420425472656553657404045401fd03000400f9030000007107042042547265655365740404540111040004000d04000000750704204254726565536574040454012904000400250400000079070c2870616c6c65745f73746f1870616c6c65741043616c6c04045400011c446372656174655f66756e647261697365722801486f66666572696e675f706f7274666f6c696ff0012c506f7274666f6c696f49640001386f66666572696e675f6173736574b0011c4173736574496400014472616973696e675f706f7274666f6c696ff0012c506f7274666f6c696f496400013472616973696e675f6173736574b0011c4173736574496400011474696572737d0701385665633c5072696365546965723e00012076656e75655f6964c903011c56656e7565496400011473746172740d0101444f7074696f6e3c543a3a4d6f6d656e743e00010c656e640d0101444f7074696f6e3c543a3a4d6f6d656e743e0001486d696e696d756d5f696e766573746d656e7418011c42616c616e636500013c66756e647261697365725f6e616d653d04013846756e647261697365724e616d65000070d84372656174652061206e65772066756e6472616973657220666f72206120736563757269747920746f6b656e206f66666572696e672e003901546869732066756e6374696f6e20637265617465732061207469657265642070726963696e672066756e6472616973657220776865726520696e766573746f72732063616e2070757263686173652d01746f6b656e7320617420646966666572656e7420707269636520706f696e74732e205468652066756e64726169736572207573657320506f6c796d657368277320736574746c656d656e74f8696e66726173747275637475726520746f20656e7375726520636f6d706c69616e7420616e642073656375726520746f6b656e207472616e73666572732e00302320506172616d65746572733d012a20606f66666572696e675f706f7274666f6c696f60202d20506f7274666f6c696f20636f6e7461696e696e672074686520746f6b656e73206265696e67206f66666572656420666f722073616c65f82a20606f66666572696e675f617373657460202d204173736574204944206f662074686520736563757269747920746f6b656e206265696e6720736f6c6411012a206072616973696e675f706f7274666f6c696f60202d20506f7274666f6c696f20746861742077696c6c207265636569766520746865207261697365642066756e64732d012a206072616973696e675f617373657460202d204173736574204944206f6620746865207061796d656e7420746f6b656e2028652e672e2c20504f4c59582c20737461626c65636f696e2965012a2060746965727360202d20566563746f72206f662070726963652074696572732028312d3130207469657273292c2065616368207769746820746f74616c20616d6f756e7420616e642070726963652070657220756e697439012a206076656e75655f696460202d2053544f2076656e756520494420666f722068616e646c696e6720736574746c656d656e747320286d757374206265206f776e65642062792063616c6c65722925012a2060737461727460202d204f7074696f6e616c2073746172742074696d653b20696620604e6f6e65602c2066756e6472616973657220626567696e7320696d6d6564696174656c7911012a2060656e6460202d204f7074696f6e616c20656e642074696d653b20696620604e6f6e65602c2066756e647261697365722072756e7320696e646566696e6974656c7949012a20606d696e696d756d5f696e766573746d656e7460202d204d696e696d756d20616d6f756e74206f66206072616973696e675f6173736574602072657175697265642070657220696e766573746d656e7425012a206066756e647261697365725f6e616d6560202d2048756d616e2d7265616461626c65206e616d6520666f7220554920646973706c617920286c656e677468206c696d6974656429005823205065726d697373696f6e732052657175697265644d012a202a2a4173736574204167656e742a2a3a2043616c6c6572206d75737420626520616e20617574686f72697a65642065787465726e616c206167656e7420666f7220606f66666572696e675f61737365746099012a202a2a506f7274666f6c696f20437573746f64792a2a3a2043616c6c6572206d757374206861766520637573746f6479206f6620626f746820606f66666572696e675f706f7274666f6c696f6020616e64206072616973696e675f706f7274666f6c696f6061012a202a2a56656e7565204f776e6572736869702a2a3a2054686520737065636966696564206076656e75655f696460206d75737420626520616e2053544f2076656e7565206f776e6564206279207468652063616c6c6572002023204572726f727329012a2060496e76616c696456656e756560202d2056656e756520646f65736e27742065786973742c2077726f6e6720747970652c206f72206e6f74206f776e65642062792063616c6c657255012a2060496e76616c69645072696365546965727360202d20496e76616c6964207469657220636f6e66696775726174696f6e2028302074696572732c203e31302074696572732c207a65726f20616d6f756e747329e02a2060496e76616c69644f66666572696e6757696e646f7760202d2053746172742074696d6520697320616674657220656e642074696d65ec2a20604f766572666c6f7760202d20546f74616c206f66666572696e6720616d6f756e742063616c63756c6174696f6e206f766572666c6f77656418696e766573741801386f66666572696e675f6173736574b0011c4173736574496400013466756e647261697365725f69643904013046756e647261697365724964000150696e766573746d656e745f706f7274666f6c696ff0012c506f7274666f6c696f496400011c66756e64696e67850701c446756e64696e674d6574686f643c543a3a4163636f756e7449642c20543a3a4f6666436861696e5369676e61747572653e00013c70757263686173655f616d6f756e7418011c42616c616e63650001246d61785f70726963652104013c4f7074696f6e3c42616c616e63653e00017cec496e7665737420696e20612066756e64726169736572207573696e67206f6e2d636861696e206f72206f66662d636861696e2066756e64696e672e003101546869732066756e6374696f6e20616c6c6f777320696e766573746f727320746f20707572636861736520746f6b656e732066726f6d20616e206163746976652066756e647261697365722e2d0154686520696e766573746d656e742069732070726f636573736564207468726f756768206d756c7469706c6520707269636520746965727320696e206f726465722c207374617274696e6729017769746820746865206c6f776573742d70726963656420746965722e205468652070757263686173652063726561746573206120736574746c656d656e7420696e737472756374696f6e150174686174207472616e736665727320746f6b656e7320616e64207061796d656e74206265747765656e2074686520617070726f70726961746520706f7274666f6c696f732e00302320506172616d65746572730d012a20606f66666572696e675f617373657460202d204173736574204944206f662074686520736563757269747920746f6b656e206265696e672070757263686173656411012a206066756e647261697365725f696460202d20556e69717565206964656e746966696572206f66207468652066756e6472616973657220746f20696e7665737420696e35012a2060696e766573746d656e745f706f7274666f6c696f60202d20506f7274666f6c696f2077686572652070757263686173656420746f6b656e732077696c6c206265206465706f736974656441012a206066756e64696e6760202d205061796d656e74206d6574686f643a2065697468657220604f6e436861696e28706f7274666f6c696f5f6964296020666f72206f6e2d636861696e206173736574734d0120206f7220604f6666436861696e28726563656970745f64657461696c73296020666f72206f66662d636861696e2072656365697074732077697468207369676e617475726520766572696669636174696f6e0d012a206070757263686173655f616d6f756e7460202d204e756d626572206f6620606f66666572696e675f61737365746020746f6b656e7320746f20707572636861736541012a20606d61785f707269636560202d204f7074696f6e616c206d6178696d756d2070726963652070657220746f6b656e3b206966207370656369666965642c20696e766573746d656e74206661696c73d8202069662074686520626c656e646564207072696365206163726f737320746965727320657863656564732074686973206c696d6974005823205065726d697373696f6e732052657175697265642d012a202a2a506f7274666f6c696f20437573746f64792a2a3a2043616c6c6572206d757374206861766520637573746f6479206f662060696e766573746d656e745f706f7274666f6c696f6031012a202a2a46756e64696e6720506f7274666f6c696f2a2a3a204966207573696e67206f6e2d636861696e2066756e64696e672c2063616c6c6572206d757374206861766520637573746f6479ec20206f66207468652066756e64696e6720706f7274666f6c696f2073706563696669656420696e20746865206046756e64696e674d6574686f6460002023204572726f7273ec2a206046756e647261697365724e6f74466f756e6460202d205370656369666965642066756e6472616973657220646f65736e2774206578697374d82a206046756e647261697365724e6f744c69766560202d2046756e647261697365722069732066726f7a656e206f7220636c6f73656429012a206046756e647261697365724578706972656460202d2043757272656e742074696d65206973206f7574736964652066756e647261697365722773206163746976652077696e646f7739012a2060496e73756666696369656e74546f6b656e7352656d61696e696e6760202d204e6f7420656e6f75676820746f6b656e7320617661696c61626c65206163726f737320616c6c20746965727335012a2060496e766573746d656e74416d6f756e74546f6f4c6f7760202d20546f74616c20636f73742069732062656c6f77206d696e696d756d20696e766573746d656e74207468726573686f6c642d012a20604d61785072696365457863656564656460202d20426c656e646564207072696365206578636565647320696e766573746f722773206d6178696d756d207072696365206c696d697445012a20604f6666636861696e46756e64696e674e6f74416c6c6f77656460202d204f66662d636861696e2066756e64696e67206e6f7420656e61626c656420666f7220746869732066756e6472616973657219012a2060496e76616c69645369676e617475726560202d204f66662d636861696e2072656365697074207369676e617475726520766572696669636174696f6e206661696c656444667265657a655f66756e647261697365720801386f66666572696e675f6173736574b0011c4173736574496400013466756e647261697365725f69643904013046756e647261697365724964000248ec54656d706f726172696c7920667265657a6520612066756e6472616973657220746f2070726576656e74206e657720696e766573746d656e74732e0025015768656e20612066756e647261697365722069732066726f7a656e2c2069742063616e6e6f7420616363657074206e657720696e766573746d656e7473206275742072656d61696e7315016f746865727769736520696e746163742e20546869732069732075736566756c20666f722070617573696e67206163746976697479207768696c65207265736f6c76696e671101697373756573206f7220647572696e67206d61696e74656e616e636520706572696f64732e205468652066756e647261697365722063616e20626520756e66726f7a656e886c6174657220746f20726573756d65206e6f726d616c206f7065726174696f6e732e00302320506172616d657465727319012a20606f66666572696e675f617373657460202d204173736574204944206173736f6369617465642077697468207468652066756e6472616973657220746f20667265657a6505012a206066756e647261697365725f696460202d20556e69717565206964656e746966696572206f66207468652066756e6472616973657220746f20667265657a65005823205065726d697373696f6e732052657175697265644d012a202a2a4173736574204167656e742a2a3a2043616c6c6572206d75737420626520616e20617574686f72697a65642065787465726e616c206167656e7420666f7220606f66666572696e675f617373657460002023204572726f7273ec2a206046756e647261697365724e6f74466f756e6460202d205370656369666965642066756e6472616973657220646f65736e277420657869737415012a206046756e64726169736572436c6f73656460202d2046756e647261697365722068617320616c7265616479206265656e207065726d616e656e746c7920636c6f73656401012a2060556e617574686f72697a656460202d2043616c6c6572206c61636b73207265717569726564206173736574206167656e74207065726d697373696f6e734c756e667265657a655f66756e647261697365720801386f66666572696e675f6173736574b0011c4173736574496400013466756e647261697365725f69643904013046756e647261697365724964000344d0526573756d6520612066726f7a656e2066756e6472616973657220746f20616c6c6f77206e657720696e766573746d656e74732e001d01546869732066756e6374696f6e20756e667265657a657320612070726576696f75736c792066726f7a656e2066756e647261697365722c2072657475726e696e6720697420746f0d01746865204c697665207374617475732077686572652069742063616e20616363657074206e657720696e766573746d656e74732e205468652066756e64726169736572f46d757374206e6f74206265207065726d616e656e746c7920636c6f73656420666f722074686973206f7065726174696f6e20746f20737563636565642e00302320506172616d657465727321012a20606f66666572696e675f617373657460202d204173736574204944206173736f6369617465642077697468207468652066756e6472616973657220746f20756e667265657a650d012a206066756e647261697365725f696460202d20556e69717565206964656e746966696572206f66207468652066756e6472616973657220746f20756e667265657a65005823205065726d697373696f6e732052657175697265644d012a202a2a4173736574204167656e742a2a3a2043616c6c6572206d75737420626520616e20617574686f72697a65642065787465726e616c206167656e7420666f7220606f66666572696e675f617373657460002023204572726f7273ec2a206046756e647261697365724e6f74466f756e6460202d205370656369666965642066756e6472616973657220646f65736e277420657869737451012a206046756e64726169736572436c6f73656460202d2046756e6472616973657220686173206265656e207065726d616e656e746c7920636c6f73656420616e642063616e6e6f7420626520756e66726f7a656e01012a2060556e617574686f72697a656460202d2043616c6c6572206c61636b73207265717569726564206173736574206167656e74207065726d697373696f6e73606d6f646966795f66756e647261697365725f77696e646f771001386f66666572696e675f6173736574b0011c4173736574496400013466756e647261697365725f69643904013046756e6472616973657249640001147374617274300124543a3a4d6f6d656e7400010c656e640d0101444f7074696f6e3c543a3a4d6f6d656e743e0004580d014d6f64696679207468652074696d652077696e646f77207768656e20612066756e647261697365722069732061637469766520666f7220696e766573746d656e74732e002101546869732066756e6374696f6e20616c6c6f777320617574686f72697a6564206167656e747320746f207570646174652074686520737461727420616e6420656e642074696d657315016f6620616e206163746976652066756e647261697365722e20546869732063616e2062652075736566756c20666f7220657874656e64696e672066756e6472616973696e671501706572696f64732c2061646a757374696e67206c61756e63682074696d696e672c206f7220726573706f6e64696e6720746f206d61726b657420636f6e646974696f6e732e0d015468652066756e64726169736572206d757374206e6f74206265207065726d616e656e746c7920636c6f73656420746f206d6f64696679206974732077696e646f772e00302320506172616d657465727319012a20606f66666572696e675f617373657460202d204173736574204944206173736f6369617465642077697468207468652066756e6472616973657220746f206d6f6469667905012a206066756e647261697365725f696460202d20556e69717565206964656e746966696572206f66207468652066756e6472616973657220746f206d6f6469667931012a2060737461727460202d204e65772073746172742074696d6520666f72207468652066756e64726169736572202863616e20626520696e207468652070617374206f72206675747572652931012a2060656e6460202d204e6577206f7074696f6e616c20656e642074696d653b20696620604e6f6e65602c207468652066756e647261697365722072756e7320696e646566696e6974656c79005823205065726d697373696f6e732052657175697265644d012a202a2a4173736574204167656e742a2a3a2043616c6c6572206d75737420626520616e20617574686f72697a65642065787465726e616c206167656e7420666f7220606f66666572696e675f617373657460002023204572726f7273ec2a206046756e647261697365724e6f74466f756e6460202d205370656369666965642066756e6472616973657220646f65736e2774206578697374f42a206046756e64726169736572436c6f73656460202d2046756e6472616973657220686173206265656e207065726d616e656e746c7920636c6f7365644d012a206046756e647261697365724578706972656460202d2046756e647261697365722068617320616c7265616479206578706972656420287061737420697473206f726967696e616c20656e642074696d652901012a2060496e76616c69644f66666572696e6757696e646f7760202d204e65772073746172742074696d65206973206166746572206e657720656e642074696d6501012a2060556e617574686f72697a656460202d2043616c6c6572206c61636b73207265717569726564206173736574206167656e74207065726d697373696f6e731073746f700801386f66666572696e675f6173736574b0011c4173736574496400013466756e647261697365725f69643904013046756e64726169736572496400054ce85065726d616e656e746c792073746f7020612066756e6472616973657220616e6420756e6c6f636b2072656d61696e696e6720746f6b656e732e001501546869732066756e6374696f6e207065726d616e656e746c7920636c6f73657320612066756e647261697365722c2070726576656e74696e6720616e7920667572746865721501696e766573746d656e74732e20416e792072656d61696e696e6720746f6b656e73207468617420686176656e2774206265656e20736f6c642061726520756e6c6f636b65640901616e642072657475726e656420746f20746865206f66666572696e6720706f7274666f6c696f2e204f6e63652073746f707065642c20612066756e647261697365725063616e6e6f74206265207265737461727465642e00302320506172616d657465727311012a20606f66666572696e675f617373657460202d204173736574204944206173736f6369617465642077697468207468652066756e6472616973657220746f2073746f70fc2a206066756e647261697365725f696460202d20556e69717565206964656e746966696572206f66207468652066756e6472616973657220746f2073746f70005823205065726d697373696f6e732052657175697265644d012a202a2a4173736574204167656e742a2a3a2043616c6c6572206d75737420626520616e20617574686f72697a65642065787465726e616c206167656e7420666f7220606f66666572696e675f617373657460b820204f5220626520746865206f726967696e616c2063726561746f72206f66207468652066756e64726169736572002023204572726f7273ec2a206046756e647261697365724e6f74466f756e6460202d205370656369666965642066756e6472616973657220646f65736e277420657869737415012a206046756e64726169736572436c6f73656460202d2046756e647261697365722068617320616c7265616479206265656e207065726d616e656e746c7920636c6f736564d02a2060556e617574686f72697a656460202d2043616c6c6572206c61636b73207265717569726564207065726d697373696f6e735c656e61626c655f6f6666636861696e5f66756e64696e670c01386f66666572696e675f6173736574b0011c4173736574496400013466756e647261697365725f69643904013046756e6472616973657249640001187469636b6572290101185469636b6572000650c8456e61626c65206f66662d636861696e2066756e64696e6720737570706f727420666f7220612066756e647261697365722e001901546869732066756e6374696f6e20616c6c6f777320612066756e6472616973657220746f20616363657074206f66662d636861696e207061796d656e7473207468726f756768190163727970746f67726170686963616c6c79207369676e65642072656365697074732e204f6e636520656e61626c65642c20696e766573746f72732063616e20757365207468650d0160696e76657374602066756e6374696f6e2077697468206046756e64696e674d6574686f643a3a4f6666436861696e6020746f2070726f76696465207061796d656e74c4726563656970747320696e7374656164206f66206f6e2d636861696e20706f7274666f6c696f207472616e73666572732e00302320506172616d6574657273f02a20606f66666572696e675f617373657460202d204173736574204944206173736f6369617465642077697468207468652066756e647261697365725d012a206066756e647261697365725f696460202d20556e69717565206964656e746966696572206f66207468652066756e6472616973657220746f20656e61626c65206f66662d636861696e2066756e64696e6720666f7249012a20607469636b657260202d205469636b65722073796d626f6c206f6620746865206f66662d636861696e20617373657420746861742077696c6c206265206163636570746564206173207061796d656e74005823205065726d697373696f6e732052657175697265644d012a202a2a4173736574204167656e742a2a3a2043616c6c6572206d75737420626520616e20617574686f72697a65642065787465726e616c206167656e7420666f7220606f66666572696e675f617373657460b820204f5220626520746865206f726967696e616c2063726561746f72206f66207468652066756e64726169736572002023204572726f7273ec2a206046756e647261697365724e6f74466f756e6460202d205370656369666965642066756e6472616973657220646f65736e2774206578697374f42a206046756e64726169736572436c6f73656460202d2046756e6472616973657220686173206265656e207065726d616e656e746c7920636c6f736564d02a2060556e617574686f72697a656460202d2043616c6c6572206c61636b73207265717569726564207065726d697373696f6e73040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e7d070000028107008107082870616c6c65745f73746f245072696365546965720000080114746f74616c18011c42616c616e6365000114707269636518011c42616c616e636500008507082870616c6c65745f73746f3446756e64696e674d6574686f6408244163636f756e7449640100444f6666436861696e5369676e617475726501490701081c4f6e436861696e0400f0012c506f7274666f6c696f4964000000204f6666436861696e0400890701d846756e647261697365725265636569707444657461696c733c4163636f756e7449642c204f6666436861696e5369676e61747572653e0001000089070c4c706f6c796d6573685f7072696d6974697665730c73746f6046756e647261697365725265636569707444657461696c7308244163636f756e7449640100444f6666436861696e5369676e61747572650149070010010c75696430010c7536340001187369676e65720001244163636f756e7449640001247369676e6174757265490701444f6666436861696e5369676e61747572650001206d65746164617461d903015c4f7074696f6e3c526563656970744d657461646174613e00008d070c3c70616c6c65745f74726561737572791870616c6c65741043616c6c0404540001083064697362757273656d656e7404013462656e65666963696172696573910701785665633c42656e65666963696172793c42616c616e63654f663c543e3e3e00001c51014974207472616e73666572732062616c616e6365732066726f6d20747265617375727920746f2065616368206f662062656e6566696369617269657320616e642074686520737065636966696320616d6f756e7444666f722065616368206f66207468656d2e001c23204572726f72c42a20604261644f726967696e603a204f6e6c7920726f6f742063616e2065786563757465207472616e73616374696f6e2e5d012a2060496e73756666696369656e7442616c616e6365603a2049662074726561737572792062616c616e636573206973206e6f7420656e6f75676820746f20636f76657220616c6c2062656e656669636961726965732e25012a2060496e76616c69644964656e74697479603a204966206f6e65206f66207468652062656e656669636961726965732068617320616e20696e76616c6964206964656e746974792e347265696d62757273656d656e74040118616d6f756e7418013042616c616e63654f663c543e00010c1d014974207472616e7366657273207468652073706563696669632060616d6f756e74602066726f6d20606f726967696e60206163636f756e7420696e746f2074726561737572792e0049014f6e6c79206163636f756e747320776869636820617265206173736f63696174656420746f20616e206964656e746974792063616e206d616b65206120646f6e6174696f6e20746f2074726561737572792e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e91070000029507009507084c706f6c796d6573685f7072696d6974697665732c42656e6566696369617279041c42616c616e636501180008010869649c01284964656e746974794964000118616d6f756e7418011c42616c616e6365000099070c3870616c6c65745f7574696c6974791870616c6c65741043616c6c04045400011c14626174636804011463616c6c739d07017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e0000487c53656e642061206261746368206f662064697370617463682063616c6c732e00b04d61792062652063616c6c65642066726f6d20616e79206f726967696e2065786365707420604e6f6e65602e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e0055014966206f726967696e20697320726f6f74207468656e207468652063616c6c7320617265206469737061746368656420776974686f757420636865636b696e67206f726967696e2066696c7465722e202854686973ec696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e0034232320436f6d706c6578697479d02d204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e005501546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e31016576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e207468655501604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d6164654d01616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c65746564604c6576656e74206973206465706f73697465642e2072656c61795f74780c0118746172676574000130543a3a4163636f756e7449640001247369676e617475726549070150543a3a4f6666436861696e5369676e617475726500011063616c6ca1070198556e6971756543616c6c3c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000134a052656c617920612063616c6c20666f722061207461726765742066726f6d20616e206f726967696e00510152656c6179696e6720696e207468697320636f6e746578742072656665727320746f20746865206162696c697479206f66206f726967696e20746f206d616b6520612063616c6c206f6e20626568616c66206f661c7461726765742e00684665657320617265206368617267656420746f206f726967696e00302320506172616d6574657273842d2060746172676574603a204163636f756e7420746f2062652072656c61796564e82d20607369676e6174757265603a205369676e61747572652066726f6d2074617267657420617574686f72697a696e67207468652072656c6179c02d206063616c6c603a2043616c6c20746f2062652072656c61796564206f6e20626568616c66206f66207461726765740040504f4c594d4553483a2061646465642e2462617463685f616c6c04011463616c6c739d07017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000234ec53656e642061206261746368206f662064697370617463682063616c6c7320616e642061746f6d6963616c6c792065786563757465207468656d2e21015468652077686f6c65207472616e73616374696f6e2077696c6c20726f6c6c6261636b20616e64206661696c20696620616e79206f66207468652063616c6c73206661696c65642e00b04d61792062652063616c6c65642066726f6d20616e79206f726967696e2065786365707420604e6f6e65602e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e0055014966206f726967696e20697320726f6f74207468656e207468652063616c6c7320617265206469737061746368656420776974686f757420636865636b696e67206f726967696e2066696c7465722e202854686973ec696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e0034232320436f6d706c6578697479d02d204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c64697370617463685f617308012461735f6f726967696ea5070154426f783c543a3a50616c6c6574734f726967696e3e00011063616c6c3906017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000318c84469737061746368657320612066756e6374696f6e2063616c6c207769746820612070726f7669646564206f726967696e2e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e0034232320436f6d706c65786974791c2d204f2831292e2c666f7263655f626174636804011463616c6c739d07017c5665633c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e0004347c53656e642061206261746368206f662064697370617463682063616c6c732ed4556e6c696b6520606261746368602c20697420616c6c6f7773206572726f727320616e6420776f6e277420696e746572727570742e00b04d61792062652063616c6c65642066726f6d20616e79206f726967696e2065786365707420604e6f6e65602e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e004d014966206f726967696e20697320726f6f74207468656e207468652063616c6c732061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e202854686973ec696e636c7564657320627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e0034232320436f6d706c6578697479d02d204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c776974685f77656967687408011063616c6c3906017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000118776569676874280118576569676874000518c4446973706174636820612066756e6374696f6e2063616c6c2077697468206120737065636966696564207765696768742e002d01546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b8526f6f74206f726967696e20746f20737065636966792074686520776569676874206f66207468652063616c6c2e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e3461735f64657269766174697665080114696e6465784d03010c75313600011063616c6c3906017c426f783c3c5420617320436f6e6669673e3a3a52756e74696d6543616c6c3e000918dc53656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e00550146696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e207768696368bc757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e9d07000002390600a107083870616c6c65745f7574696c69747928556e6971756543616c6c040443013906000801146e6f6e6365300148417574686f72697a6174696f6e4e6f6e636500011063616c6c39060118426f783c433e0000a5070c60706f6c796d6573685f72756e74696d655f646576656c6f701c72756e74696d65304f726967696e43616c6c65720001101873797374656d0400a90701746672616d655f73797374656d3a3a4f726967696e3c52756e74696d653e00000044506f6c796d657368436f6d6d69747465650400ad0701f870616c6c65745f636f6d6d69747465653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6d6d69747465653a3a496e7374616e6365313e00090048546563686e6963616c436f6d6d69747465650400b10701f870616c6c65745f636f6d6d69747465653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6d6d69747465653a3a496e7374616e6365333e000b004055706772616465436f6d6d69747465650400b50701f870616c6c65745f636f6d6d69747465653a3a4f726967696e3c52756e74696d652c2070616c6c65745f636f6d6d69747465653a3a496e7374616e6365343e000d0000a9070c346672616d655f737570706f7274206469737061746368245261774f726967696e04244163636f756e7449640100010c10526f6f74000000185369676e656404000001244163636f756e744964000100104e6f6e6500020000ad070c4070616c6c65745f636f6d6d69747465651870616c6c6574245261774f726967696e08244163636f756e7449640100044900010420456e646f7273656400000000b1070c4070616c6c65745f636f6d6d69747465651870616c6c6574245261774f726967696e08244163636f756e7449640100044900010420456e646f7273656400000000b5070c4070616c6c65745f636f6d6d69747465651870616c6c6574245261774f726967696e08244163636f756e7449640100044900010420456e646f7273656400000000b9070c2c70616c6c65745f626173651870616c6c65741043616c6c040454000100040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ebd070c5870616c6c65745f65787465726e616c5f6167656e74731870616c6c65741043616c6c040454000120306372656174655f67726f757008012061737365745f6964b0011c417373657449640001147065726d73c0015045787472696e7369635065726d697373696f6e73000048ec43726561746573206120637573746f6d206167656e742067726f7570202841472920666f722074686520676976656e206061737365745f6964602e00d45468652041472077696c6c206861766520746865207065726d697373696f6e7320617320676976656e20627920607065726d73602e290154686973206e6577204147206973207468656e2061737369676e656420606964203d204147496453657175656e63653a3a6765742829202b20316020617320697473206041474964602c4101776869636820796f752063616e2075736520617320604167656e7447726f75703a3a437573746f6d2869642960207768656e20616464696e67206167656e747320666f72206061737365745f6964602e002c2320417267756d656e7473dc2d2060617373657449446020746865205b60417373657449645d20746f206164642074686520637573746f6d2067726f757020666f722e902d20607065726d7360207468617420746865206e65772041472077696c6c20686176652e002023204572726f727339012d2060556e617574686f72697a65644167656e746020696620606f726967696e6020776173206e6f7420617574686f72697a656420617320616e206167656e7420746f2063616c6c20746869732e21012d2060546f6f4c6f6e676020696620607065726d73602068616420736f6d6520737472696e67206f72206c697374206c656e67746820746861742077617320746f6f206c6f6e672e25012d2060436f756e7465724f766572666c6f776020696620604147496453657175656e63653a3a6765742829202b20316020776f756c642065786365656420607533323a3a4d4158602e003423205065726d697373696f6e731c2a2041737365741c2a204167656e74547365745f67726f75705f7065726d697373696f6e730c012061737365745f6964b0011c41737365744964000108696441010110414749640001147065726d73c0015045787472696e7369635065726d697373696f6e7300013c59015570646174657320746865207065726d697373696f6e73206f662074686520637573746f6d204147206964656e74696669656420627920606964602c20666f722074686520676976656e206061737365745f6964602e002c2320417267756d656e7473d02d2060617373657449446020746865205b60417373657449645d2074686520637573746f6d2041472062656c6f6e677320746f2eac2d206069646020666f722074686520637573746f6d2041472077697468696e206061737365745f6964602e942d20607065726d736020746f207570646174652074686520637573746f6d20414720746f2e002023204572726f727339012d2060556e617574686f72697a65644167656e746020696620606f726967696e6020776173206e6f7420617574686f72697a656420617320616e206167656e7420746f2063616c6c20746869732e21012d2060546f6f4c6f6e676020696620607065726d73602068616420736f6d6520737472696e67206f72206c697374206c656e67746820746861742077617320746f6f206c6f6e672ecc2d20604e6f53756368414760206966206069646020646f6573206e6f74206964656e74696679206120637573746f6d2041472e003423205065726d697373696f6e731c2a2041737365741c2a204167656e743072656d6f76655f6167656e7408012061737365745f6964b0011c417373657449640001146167656e749c01284964656e746974794964000238a452656d6f76652074686520676976656e20606167656e74602066726f6d206061737365745f6964602e002c2320417267756d656e7473e82d2060617373657449446020746865205b60417373657449645d2074686174206861732074686520606167656e746020746f2072656d6f76652e882d20606167656e7460206f66206061737365745f69646020746f2072656d6f76652e002023204572726f727339012d2060556e617574686f72697a65644167656e746020696620606f726967696e6020776173206e6f7420617574686f72697a656420617320616e206167656e7420746f2063616c6c20746869732ee02d20604e6f74416e4167656e746020696620606167656e7460206973206e6f7420616e206167656e74206f66206061737365745f6964602ee82d206052656d6f76696e674c61737446756c6c4167656e746020696620606167656e746020697320746865206c6173742066756c6c206f6e652e003423205065726d697373696f6e731c2a2041737365741c2a204167656e7420616264696361746504012061737365745f6964b0011c4173736574496400032c884162646963617465206167656e747368697020666f72206061737365745f6964602e002c2320417267756d656e7473ec2d2060617373657449446020746865205b60417373657449645d206f66207768696368207468652063616c6c657220697320616e206167656e742e002023204572726f7273ec2d20604e6f74416e4167656e7460206966207468652063616c6c6572206973206e6f7420616e206167656e74206f66206061737365745f6964602efc2d206052656d6f76696e674c61737446756c6c4167656e7460206966207468652063616c6c657220697320746865206c6173742066756c6c206167656e742e003423205065726d697373696f6e731c2a204173736574306368616e67655f67726f75700c012061737365745f6964b0011c417373657449640001146167656e749c01284964656e74697479496400011467726f75703d0101284167656e7447726f7570000440f44368616e676520746865206167656e742067726f7570207468617420606167656e74602062656c6f6e677320746f20696e206061737365745f6964602e002c2320417267756d656e7473c02d2060617373657449446020746865205b60417373657449645d2074686174206861732074686520606167656e74602ec02d20606167656e7460206f66206061737365745f69646020746f206368616e6765207468652067726f757020666f722ed02d206067726f757060207468617420606167656e74602077696c6c2062656c6f6e6720746f20696e206061737365745f6964602e002023204572726f727339012d2060556e617574686f72697a65644167656e746020696620606f726967696e6020776173206e6f7420617574686f72697a656420617320616e206167656e7420746f2063616c6c20746869732ecc2d20604e6f53756368414760206966206069646020646f6573206e6f74206964656e74696679206120637573746f6d2041472ee02d20604e6f74416e4167656e746020696620606167656e7460206973206e6f7420616e206167656e74206f66206061737365745f6964602e2d012d206052656d6f76696e674c61737446756c6c4167656e746020696620606167656e7460207761732061206046756c6c60206f6e6520616e64206973206265696e672064656d6f7465642e003423205065726d697373696f6e731c2a2041737365741c2a204167656e744c6163636570745f6265636f6d655f6167656e7404011c617574685f696430010c753634000540010141636365707420616e20617574686f72697a6174696f6e20627920616e206167656e742022416c696365222077686f206973737565642060617574685f696460d4746f20616c736f206265636f6d6520616e206167656e74206f662074686520617373657420416c696365207370656369666965642e002c2320417267756d656e7473d02d2060617574685f696460206964656e74696679696e672074686520617574686f72697a6174696f6e20746f206163636570742e002023204572726f727345012d20604572726f723a3a496e76616c6964417574686f72697a6174696f6e602069662060617574685f69646020646f6573206e6f7420657869737420666f722074686520676976656e2063616c6c65722e35012d20604572726f723a3a417574686f72697a6174696f6e45787069726564602069662060617574685f69646020697320666f7220616e206175746820746861742068617320657870697265642e4d012d20604572726f723a3a426164417574686f72697a6174696f6e54797065602069662060617574685f69646020776173206e6f7420666f72206120604265636f6d654167656e7460206175746820747970652e25012d2060556e617574686f72697a65644167656e74602069662022416c69636522206973206e6f74207065726d697373696f6e656420746f2070726f766964652074686520617574682e0d012d20604e6f53756368414760206966207468652067726f757020726566657272656420746f206120637573746f6d207468617420646f6573206e6f742065786973742e09012d2060416c7265616479416e4167656e7460206966207468652063616c6c657220697320616c726561647920616e206167656e74206f66207468652061737365742e003423205065726d697373696f6e731c2a204167656e74646372656174655f67726f75705f616e645f6164645f6175746810012061737365745f6964b0011c417373657449640001147065726d73c0015045787472696e7369635065726d697373696f6e730001187461726765749c01284964656e7469747949640001186578706972790d0101444f7074696f6e3c543a3a4d6f6d656e743e000614e85574696c6974792065787472696e73696320746f20626174636820606372656174655f67726f75706020616e642020606164645f61757468602e003423205065726d697373696f6e731c2a2041737365741c2a204167656e74786372656174655f616e645f6368616e67655f637573746f6d5f67726f75700c012061737365745f6964b0011c417373657449640001147065726d73c0015045787472696e7369635065726d697373696f6e730001146167656e749c01284964656e74697479496400071455015574696c6974792065787472696e73696320746f20626174636820606372656174655f67726f75706020616e642020606368616e67655f67726f75706020666f7220637573746f6d2067726f757073206f6e6c792e003423205065726d697373696f6e731c2a2041737365741c2a204167656e74040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ec1070c3870616c6c65745f72656c617965721870616c6c65741043616c6c040454000118387365745f706179696e675f6b6579080120757365725f6b6579000130543a3a4163636f756e74496400012c706f6c79785f6c696d697418011c42616c616e6365000020bd014372656174657320616e20617574686f72697a6174696f6e20746f20616c6c6f772060757365725f6b65796020746f20616363657074207468652063616c6c65722028606f726967696e203d3d20706179696e675f6b6579602920617320746865697220737562736964697365722e002c2320417267756d656e74739c2d2060757365725f6b657960207468652075736572206b657920746f207375627369646973652ee42d2060706f6c79785f6c696d6974602074686520696e697469616c20504f4c5958206c696d697420666f72207468697320737562736964792e002023204572726f727331012d2060556e617574686f72697a656443616c6c65726020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2063616c6c20746869732065787472696e7369632e446163636570745f706179696e675f6b657904011c617574685f696430010c753634000138944163636570747320612060706179696e675f6b65796020617574686f72697a6174696f6e2e002c2320417267756d656e7473e82d2060617574685f6964602074686520617574686f72697a6174696f6e20696420746f2061636365707420612060706179696e675f6b6579602e002023204572726f727345012d20604572726f723a3a496e76616c6964417574686f72697a6174696f6e602069662060617574685f69646020646f6573206e6f7420657869737420666f722074686520676976656e2063616c6c65722e2d012d20604572726f723a3a417574686f72697a6174696f6e45787069726564602069662060617574685f6964602074686520617574686f72697a6174696f6e2068617320657870697265642e6d012d20604572726f723a3a426164417574686f72697a6174696f6e54797065602069662060617574685f69646020776173206e6f742061206041646452656c61796572506179696e674b65796020617574686f72697a6174696f6e2ea5012d20604e6f74417574686f72697a6564466f72557365724b65796020696620606f726967696e60206973206e6f7420617574686f72697a656420746f206163636570742074686520617574686f72697a6174696f6e20666f72207468652060757365725f6b6579602ed9012d20604e6f74417574686f72697a6564466f72506179696e674b6579602069662074686520617574686f72697a6174696f6e20776173206372656174656420616e206964656e7469747920646966666572656e742066726f6d207468652060706179696e675f6b6579602773206964656e746974792e31012d2060557365724b65794364644d697373696e6760206966207468652060757365725f6b657960206973206e6f7420617474616368656420746f2061204344442764206964656e746974792e41012d2060506179696e674b65794364644d697373696e6760206966207468652060706179696e675f6b657960206973206e6f7420617474616368656420746f2061204344442764206964656e746974792e31012d2060556e617574686f72697a656443616c6c65726020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2063616c6c20746869732065787472696e7369632e4472656d6f76655f706179696e675f6b6579080120757365725f6b6579000130543a3a4163636f756e744964000128706179696e675f6b6579000130543a3a4163636f756e74496400022cac52656d6f766573207468652060706179696e675f6b6579602066726f6d20612060757365725f6b6579602e002c2320417267756d656e7473d42d2060757365725f6b657960207468652075736572206b657920746f2072656d6f76652074686520737562736964792066726f6d2e09012d2060706179696e675f6b6579602074686520706179696e67206b6579207468617420776173207375627369646973696e67207468652060757365725f6b6579602e002023204572726f72738d012d20604e6f74417574686f72697a6564466f72557365724b65796020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2072656d6f766520746865207375627369647920666f72207468652060757365725f6b6579602ef82d20604e6f506179696e674b657960206966207468652060757365725f6b65796020646f65736e2774206861766520612060706179696e675f6b6579602e31012d20604e6f74506179696e674b657960206966207468652060706179696e675f6b65796020646f65736e2774206d61746368207468652063757272656e742060706179696e675f6b6579602e31012d2060556e617574686f72697a656443616c6c65726020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2063616c6c20746869732065787472696e7369632e487570646174655f706f6c79785f6c696d6974080120757365725f6b6579000130543a3a4163636f756e74496400012c706f6c79785f6c696d697418011c42616c616e6365000328b4557064617465732074686520617661696c61626c6520504f4c595820666f7220612060757365725f6b6579602e002c2320417267756d656e74731d012d2060757365725f6b657960207468652075736572206b6579206f6620746865207375627369647920746f207570646174652074686520617661696c61626c6520504f4c59582e35012d2060706f6c79785f6c696d6974602074686520616d6f756e74206f6620504f4c595820617661696c61626c6520666f72207375627369646973696e67207468652060757365725f6b6579602e002023204572726f7273f82d20604e6f506179696e674b657960206966207468652060757365725f6b65796020646f65736e2774206861766520612060706179696e675f6b6579602e11012d20604e6f74506179696e674b65796020696620606f726967696e6020646f65736e2774206d61746368207468652063757272656e742060706179696e675f6b6579602e31012d2060556e617574686f72697a656443616c6c65726020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2063616c6c20746869732065787472696e7369632e50696e6372656173655f706f6c79785f6c696d6974080120757365725f6b6579000130543a3a4163636f756e744964000118616d6f756e7418011c42616c616e636500042cb8496e6372656173652074686520617661696c61626c6520504f4c595820666f7220612060757365725f6b6579602e002c2320417267756d656e74731d012d2060757365725f6b657960207468652075736572206b6579206f6620746865207375627369647920746f207570646174652074686520617661696c61626c6520504f4c59582e0d012d2060616d6f756e74602074686520616d6f756e74206f6620504f4c595820746f2061646420746f207468652073756273696479206f662060757365725f6b6579602e002023204572726f7273f82d20604e6f506179696e674b657960206966207468652060757365725f6b65796020646f65736e2774206861766520612060706179696e675f6b6579602e11012d20604e6f74506179696e674b65796020696620606f726967696e6020646f65736e2774206d61746368207468652063757272656e742060706179696e675f6b6579602e31012d2060556e617574686f72697a656443616c6c65726020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2063616c6c20746869732065787472696e7369632e3d012d20604f7665726c6f776020696620746865207375627369647927732072656d61696e696e6720504f4c595820776f756c642068617665206f766572666c6f7765642060753132383a3a4d4158602e5064656372656173655f706f6c79785f6c696d6974080120757365725f6b6579000130543a3a4163636f756e744964000118616d6f756e7418011c42616c616e636500052cb844656372656173652074686520617661696c61626c6520504f4c595820666f7220612060757365725f6b6579602e002c2320417267756d656e74731d012d2060757365725f6b657960207468652075736572206b6579206f6620746865207375627369647920746f207570646174652074686520617661696c61626c6520504f4c59582e21012d2060616d6f756e74602074686520616d6f756e74206f6620504f4c595820746f2072656d6f76652066726f6d207468652073756273696479206f662060757365725f6b6579602e002023204572726f7273f82d20604e6f506179696e674b657960206966207468652060757365725f6b65796020646f65736e2774206861766520612060706179696e675f6b6579602e11012d20604e6f74506179696e674b65796020696620606f726967696e6020646f65736e2774206d61746368207468652063757272656e742060706179696e675f6b6579602e31012d2060556e617574686f72697a656443616c6c65726020696620606f726967696e60206973206e6f7420617574686f72697a656420746f2063616c6c20746869732065787472696e7369632e09012d20604f7665726c6f776020696620746865207375627369647920686173206c657373207468656e2060616d6f756e746020504f4c59582072656d61696e696e672e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ec5070c4070616c6c65745f636f6e7472616374731870616c6c65741043616c6c0404540001283c63616c6c5f6f6c645f77656967687414011064657374790501504163636f756e7449644c6f6f6b75704f663c543e00011476616c7565c901013042616c616e63654f663c543e0001246761735f6c696d69742c01244f6c6457656967687400015473746f726167655f6465706f7369745f6c696d6974c90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e0001106461746138011c5665633c75383e0000041501446570726563617465642076657273696f6e206966205b6053656c663a3a63616c6c605d20666f722075736520696e20616e20696e2d73746f72616765206043616c6c602e80696e7374616e74696174655f776974685f636f64655f6f6c645f77656967687418011476616c7565c901013042616c616e63654f663c543e0001246761735f6c696d69742c01244f6c6457656967687400015473746f726167655f6465706f7369745f6c696d6974c90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e000110636f646538011c5665633c75383e0001106461746138011c5665633c75383e00011073616c7438011c5665633c75383e0001045901446570726563617465642076657273696f6e206966205b6053656c663a3a696e7374616e74696174655f776974685f636f6465605d20666f722075736520696e20616e20696e2d73746f72616765206043616c6c602e58696e7374616e74696174655f6f6c645f77656967687418011476616c7565c901013042616c616e63654f663c543e0001246761735f6c696d69742c01244f6c6457656967687400015473746f726167655f6465706f7369745f6c696d6974c90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e000124636f64655f6861736834012c436f6465486173683c543e0001106461746138011c5665633c75383e00011073616c7438011c5665633c75383e0002043101446570726563617465642076657273696f6e206966205b6053656c663a3a696e7374616e7469617465605d20666f722075736520696e20616e20696e2d73746f72616765206043616c6c602e2c75706c6f61645f636f64650c0110636f646538011c5665633c75383e00015473746f726167655f6465706f7369745f6c696d6974c90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e00012c64657465726d696e69736dcd07012c44657465726d696e69736d000360ec55706c6f6164206e65772060636f64656020776974686f757420696e7374616e74696174696e67206120636f6e74726163742066726f6d2069742e00210149662074686520636f646520646f6573206e6f7420616c72656164792065786973742061206465706f7369742069732072657365727665642066726f6d207468652063616c6c65724501616e6420756e7265736572766564206f6e6c79207768656e205b6053656c663a3a72656d6f76655f636f6465605d2069732063616c6c65642e205468652073697a65206f66207468652072657365727665ac646570656e6473206f6e207468652073697a65206f662074686520737570706c6965642060636f6465602e00310149662074686520636f646520616c72656164792065786973747320696e2073746f726167652069742077696c6c207374696c6c2072657475726e20604f6b6020616e642075706772616465739474686520696e2073746f726167652076657273696f6e20746f207468652063757272656e74d05b60496e737472756374696f6e576569676874733a3a76657273696f6e605d28496e737472756374696f6e57656967687473292e0055012d206064657465726d696e69736d603a20496620746869732069732073657420746f20616e79206f746865722076616c756520627574205b6044657465726d696e69736d3a3a456e666f72636564605d207468656e5d012020746865206f6e6c792077617920746f20757365207468697320636f646520697320746f2064656c65676174652063616c6c20696e746f2069742066726f6d20616e206f6666636861696e20657865637574696f6e2ebc202053657420746f205b6044657465726d696e69736d3a3a456e666f72636564605d20696620696e20646f7562742e001823204e6f7465005901416e796f6e652063616e20696e7374616e7469617465206120636f6e74726163742066726f6d20616e792075706c6f6164656420636f646520616e6420746875732070726576656e74206974732072656d6f76616c2e4101546f2061766f6964207468697320736974756174696f6e206120636f6e7374727563746f7220636f756c6420656d706c6f792061636365737320636f6e74726f6c20736f20746861742069742063616e39016f6e6c7920626520696e7374616e746961746564206279207065726d697373696f6e656420656e7469746965732e205468652073616d652069732074727565207768656e2075706c6f6164696e67a07468726f756768205b6053656c663a3a696e7374616e74696174655f776974685f636f6465605d2e005101557365205b6044657465726d696e69736d3a3a52656c61786564605d206578636c75736976656c7920666f72206e6f6e2d64657465726d696e697374696320636f64652e204966207468652075706c6f616465644901636f64652069732064657465726d696e69737469632c2073706563696679696e67205b6044657465726d696e69736d3a3a52656c61786564605d2077696c6c20626520646973726567617264656420616e646c726573756c7420696e206869676865722067617320636f7374732e2c72656d6f76655f636f6465040124636f64655f6861736834012c436f6465486173683c543e000410350152656d6f76652074686520636f64652073746f72656420756e6465722060636f64655f686173686020616e6420726566756e6420746865206465706f73697420746f20697473206f776e65722e0045014120636f64652063616e206f6e6c792062652072656d6f76656420627920697473206f726967696e616c2075706c6f616465722028697473206f776e65722920616e64206f6e6c79206966206974206973646e6f74207573656420627920616e7920636f6e74726163742e207365745f636f646508011064657374790501504163636f756e7449644c6f6f6b75704f663c543e000124636f64655f6861736834012c436f6465486173683c543e000528090150726976696c656765642066756e6374696f6e2074686174206368616e6765732074686520636f6465206f6620616e206578697374696e6720636f6e74726163742e004501546869732074616b65732063617265206f66207570646174696e6720726566636f756e747320616e6420616c6c206f74686572206e6563657373617279206f7065726174696f6e732e2052657475726e73e8616e206572726f7220696620656974686572207468652060636f64655f6861736860206f722060646573746020646f206e6f742065786973742e001823204e6f74650031015468697320646f6573202a2a6e6f742a2a206368616e6765207468652061646472657373206f662074686520636f6e747261637420696e207175657374696f6e2e2054686973206d65616e733d01746861742074686520636f6e74726163742061646472657373206973206e6f206c6f6e67657220646572697665642066726f6d2069747320636f646520686173682061667465722063616c6c696e67487468697320646973706174636861626c652e1063616c6c14011064657374790501504163636f756e7449644c6f6f6b75704f663c543e00011476616c7565c901013042616c616e63654f663c543e0001246761735f6c696d697428011857656967687400015473746f726167655f6465706f7369745f6c696d6974c90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e0001106461746138011c5665633c75383e00064005014d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e00302320506172616d657465727300a82a206064657374603a2041646472657373206f662074686520636f6e747261637420746f2063616c6c2efc2a206076616c7565603a205468652062616c616e636520746f207472616e736665722066726f6d2074686520606f726967696e6020746f206064657374602e15012a20606761735f6c696d6974603a2054686520676173206c696d697420656e666f72636564207768656e20657865637574696e672074686520636f6e7374727563746f722e55012a206073746f726167655f6465706f7369745f6c696d6974603a20546865206d6178696d756d20616d6f756e74206f662062616c616e636520746861742063616e20626520636861726765642066726f6d20746865a4202063616c6c657220746f2070617920666f72207468652073746f7261676520636f6e73756d65642ec42a206064617461603a2054686520696e707574206461746120746f207061737320746f2074686520636f6e74726163742e0025012a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c206265ac657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e15012a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e45012a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c11016120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e54696e7374616e74696174655f776974685f636f646518011476616c7565c901013042616c616e63654f663c543e0001246761735f6c696d697428011857656967687400015473746f726167655f6465706f7369745f6c696d6974c90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e000110636f646538011c5665633c75383e0001106461746138011c5665633c75383e00011073616c7438011c5665633c75383e0007643101496e7374616e7469617465732061206e657720636f6e74726163742066726f6d2074686520737570706c6965642060636f646560206f7074696f6e616c6c79207472616e7366657272696e6734736f6d652062616c616e63652e0021015468697320646973706174636861626c6520686173207468652073616d65206566666563742061732063616c6c696e67205b6053656c663a3a75706c6f61645f636f6465605d202b3d015b6053656c663a3a696e7374616e7469617465605d2e2042756e646c696e67207468656d20746f6765746865722070726f766964657320656666696369656e6379206761696e732e20506c65617365d8616c736f20636865636b2074686520646f63756d656e746174696f6e206f66205b6053656c663a3a75706c6f61645f636f6465605d2e00302320506172616d6574657273004d012a206076616c7565603a205468652062616c616e636520746f207472616e736665722066726f6d2074686520606f726967696e6020746f20746865206e65776c79206372656174656420636f6e74726163742e15012a20606761735f6c696d6974603a2054686520676173206c696d697420656e666f72636564207768656e20657865637574696e672074686520636f6e7374727563746f722e55012a206073746f726167655f6465706f7369745f6c696d6974603a20546865206d6178696d756d20616d6f756e74206f662062616c616e636520746861742063616e20626520636861726765642f7265736572766564c8202066726f6d207468652063616c6c657220746f2070617920666f72207468652073746f7261676520636f6e73756d65642ecc2a2060636f6465603a2054686520636f6e747261637420636f646520746f206465706c6f7920696e207261772062797465732ef42a206064617461603a2054686520696e707574206461746120746f207061737320746f2074686520636f6e747261637420636f6e7374727563746f722e31012a206073616c74603a205573656420666f722074686520616464726573732064657269766174696f6e2e20536565205b6050616c6c65743a3a636f6e74726163745f61646472657373605d2e0094496e7374616e74696174696f6e20697320657865637574656420617320666f6c6c6f77733a0039012d2054686520737570706c6965642060636f646560206973206465706c6f7965642c20616e6420612060636f64655f6861736860206973206372656174656420666f72207468617420636f64652e59012d204966207468652060636f64655f686173686020616c726561647920657869737473206f6e2074686520636861696e2074686520756e6465726c79696e672060636f6465602077696c6c206265207368617265642e49012d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e6465722c20636f64655f6861736820616e64207468652073616c742e01012d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732ec02d20546865206076616c756560206973207472616e7366657272656420746f20746865206e6577206163636f756e742e41012d2054686520606465706c6f79602066756e6374696f6e20697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e2c696e7374616e746961746518011476616c7565c901013042616c616e63654f663c543e0001246761735f6c696d697428011857656967687400015473746f726167655f6465706f7369745f6c696d6974c90701c44f7074696f6e3c3c42616c616e63654f663c543e20617320636f6465633a3a486173436f6d706163743e3a3a547970653e000124636f64655f6861736834012c436f6465486173683c543e0001106461746138011c5665633c75383e00011073616c7438011c5665633c75383e000814fc496e7374616e746961746573206120636f6e74726163742066726f6d20612070726576696f75736c79206465706c6f796564207761736d2062696e6172792e003501546869732066756e6374696f6e206973206964656e746963616c20746f205b6053656c663a3a696e7374616e74696174655f776974685f636f6465605d2062757420776974686f7574207468654901636f6465206465706c6f796d656e7420737465702e20496e73746561642c207468652060636f64655f6861736860206f6620616e206f6e2d636861696e206465706c6f796564207761736d2062696e617279446d75737420626520737570706c6965642e1c6d6967726174650401307765696768745f6c696d697428011857656967687400091059015768656e2061206d6967726174696f6e20697320696e2070726f67726573732c207468697320646973706174636861626c652063616e206265207573656420746f2072756e206d6967726174696f6e2073746570732e610143616c6c73207468617420636f6e7472696275746520746f20616476616e63696e6720746865206d6967726174696f6e20686176652074686569722066656573207761697665642c20617320697427732068656c7066756c4501666f722074686520636861696e2e204e6f74652074686174207768696c6520746865206d6967726174696f6e20697320696e2070726f67726573732c207468652070616c6c65742077696c6c20616c736fd06c657665726167652074686520606f6e5f69646c656020686f6f6b7320746f2072756e206d6967726174696f6e2073746570732e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ec90704184f7074696f6e04045401c9010108104e6f6e6500000010536f6d650400c9010000010000cd070c4070616c6c65745f636f6e747261637473107761736d2c44657465726d696e69736d00010820456e666f726365640000001c52656c6178656400010000d1070c48706f6c796d6573685f636f6e7472616374731870616c6c65741043616c6c0404540001186c696e7374616e74696174655f776974685f636f64655f7065726d731c0124656e646f776d656e7418011c42616c616e63650001246761735f6c696d697428011857656967687400015473746f726167655f6465706f7369745f6c696d69742104013c4f7074696f6e3c42616c616e63653e000110636f646538011c5665633c75383e0001106461746138011c5665633c75383e00011073616c7438011c5665633c75383e0001147065726d73a8012c5065726d697373696f6e730000602d01496e7374616e746961746573206120736d61727420636f6e747261637420646566696e696e6720697420776974682074686520676976656e2060636f64656020616e64206073616c74602e00c454686520636f6e74726163742077696c6c2062652061747461636865642061732061207365636f6e64617279206b65792ce07769746820607065726d736020617320697473207065726d697373696f6e732c20746f20606f726967696e602773206964656e746974792e00e054686520636f6e7472616374206973207472616e736665727265642060656e646f776d656e746020616d6f756e74206f6620504f4c59582e98546869732069732064697374696e63742066726f6d2074686520606761735f6c696d6974602c1101776869636820636f6e74726f6c7320686f77206d7563682067617320746865206465706c6f796d656e7420636f6465206d6179206174206d6f737420636f6e73756d652e002c2320417267756d656e7473e82d2060656e646f776d656e746020616d6f756e74206f6620504f4c595820746f207472616e7366657220746f2074686520636f6e74726163742e55012d20606761735f6c696d69746020666f7220686f77206d756368206761732074686520606465706c6f796020636f646520696e2074686520636f6e7472616374206d6179206174206d6f737420636f6e73756d652e51012d206073746f726167655f6465706f7369745f6c696d69746020546865206d6178696d756d20616d6f756e74206f662062616c616e636520746861742063616e20626520636861726765642f7265736572766564c8202066726f6d207468652063616c6c657220746f2070617920666f72207468652073746f7261676520636f6e73756d65642ee82d2060636f646560207769746820746865205741534d2062696e61727920646566696e696e672074686520736d61727420636f6e74726163742ef02d206064617461602054686520696e707574206461746120746f207061737320746f2074686520636f6e747261637420636f6e7374727563746f722eb82d206073616c7460207573656420666f7220636f6e747261637420616464726573732064657269766174696f6e2e210120202042792076617279696e6720746869732c207468652073616d652060636f6465602063616e206265207573656420756e646572207468652073616d65206964656e746974792ebc2d20607065726d7360207468617420746865206e6577207365636f6e64617279206b65792077696c6c20686176652e002023204572726f727365012d20416c6c20746865206572726f727320696e206070616c6c65745f636f6e7472616374733a3a43616c6c3a3a696e7374616e74696174655f776974685f636f6465602063616e20616c736f2068617070656e20686572652ef02d204344442f5065726d697373696f6e732061726520636865636b65642c20756e6c696b6520696e206070616c6c65745f636f6e747261637473602e21012d204572726f72732074686174206172697365207768656e20616464696e672061206e6577207365636f6e64617279206b65792063616e20616c736f206f6363757220686572652e6c696e7374616e74696174655f776974685f686173685f7065726d731c0124656e646f776d656e7418011c42616c616e63650001246761735f6c696d697428011857656967687400015473746f726167655f6465706f7369745f6c696d69742104013c4f7074696f6e3c42616c616e63653e000124636f64655f6861736834012c436f6465486173683c543e0001106461746138011c5665633c75383e00011073616c7438011c5665633c75383e0001147065726d73a8012c5065726d697373696f6e7300016c3901496e7374616e746961746573206120736d61727420636f6e747261637420646566696e696e67207573696e672074686520676976656e2060636f64655f686173686020616e64206073616c74602e007c556e6c696b652060696e7374616e74696174655f776974685f636f6465602c69017468697320617373756d65732074686174206174206c65617374206f6e6520636f6e74726163742077697468207468652073616d65205741534d20636f64652068617320616c7265616479206265656e2075706c6f616465642e00c454686520636f6e74726163742077696c6c2062652061747461636865642061732061207365636f6e64617279206b65792ce07769746820607065726d736020617320697473207065726d697373696f6e732c20746f20606f726967696e602773206964656e746974792e00e054686520636f6e7472616374206973207472616e736665727265642060656e646f776d656e746020616d6f756e74206f6620504f4c59582e98546869732069732064697374696e63742066726f6d2074686520606761735f6c696d6974602c1101776869636820636f6e74726f6c7320686f77206d7563682067617320746865206465706c6f796d656e7420636f6465206d6179206174206d6f737420636f6e73756d652e002c2320417267756d656e7473e82d2060656e646f776d656e746020616d6f756e74206f6620504f4c595820746f207472616e7366657220746f2074686520636f6e74726163742e55012d20606761735f6c696d69746020666f7220686f77206d756368206761732074686520606465706c6f796020636f646520696e2074686520636f6e7472616374206d6179206174206d6f737420636f6e73756d652e51012d206073746f726167655f6465706f7369745f6c696d69746020546865206d6178696d756d20616d6f756e74206f662062616c616e636520746861742063616e20626520636861726765642f7265736572766564c8202066726f6d207468652063616c6c657220746f2070617920666f72207468652073746f7261676520636f6e73756d65642ec42d2060636f64655f6861736860206f6620616e20616c72656164792075706c6f61646564205741534d2062696e6172792ef02d206064617461602054686520696e707574206461746120746f207061737320746f2074686520636f6e747261637420636f6e7374727563746f722eb82d206073616c7460207573656420666f7220636f6e747261637420616464726573732064657269766174696f6e2e210120202042792076617279696e6720746869732c207468652073616d652060636f6465602063616e206265207573656420756e646572207468652073616d65206964656e746974792ebc2d20607065726d7360207468617420746865206e6577207365636f6e64617279206b65792077696c6c20686176652e002023204572726f72733d012d20416c6c20746865206572726f727320696e206070616c6c65745f636f6e7472616374733a3a43616c6c3a3a696e7374616e7469617465602063616e20616c736f2068617070656e20686572652ef02d204344442f5065726d697373696f6e732061726520636865636b65642c20756e6c696b6520696e206070616c6c65745f636f6e747261637473602e21012d204572726f72732074686174206172697365207768656e20616464696e672061206e6577207365636f6e64617279206b65792063616e20616c736f206f6363757220686572652e747570646174655f63616c6c5f72756e74696d655f77686974656c69737404011c75706461746573d50701605665633c2845787472696e73696349642c20626f6f6c293e000214745570646174652043616c6c52756e74696d652077686974656c6973742e002c2320417267756d656e7473002023204572726f727390696e7374616e74696174655f776974685f636f64655f61735f7072696d6172795f6b6579180124656e646f776d656e7418011c42616c616e63650001246761735f6c696d697428011857656967687400015473746f726167655f6465706f7369745f6c696d69742104013c4f7074696f6e3c42616c616e63653e000110636f646538011c5665633c75383e0001106461746138011c5665633c75383e00011073616c7438011c5665633c75383e0003302d01496e7374616e746961746573206120736d61727420636f6e747261637420646566696e696e6720697420776974682074686520676976656e2060636f64656020616e64206073616c74602e007d0154686520636f6e74726163742077696c6c2062652061747461636865642061732061207072696d617279206b6579206f662061206e65776c792063726561746564206368696c64206964656e74697479206f66207468652063616c6c65722e002c2320417267756d656e7473ec2d2060656e646f776d656e74603a20416d6f756e74206f6620504f4c595820746f207472616e7366657220746f2074686520636f6e74726163742e59012d20606761735f6c696d6974603a20466f7220686f77206d756368206761732074686520606465706c6f796020636f646520696e2074686520636f6e7472616374206d6179206174206d6f737420636f6e73756d652e19022d206073746f726167655f6465706f7369745f6c696d6974603a20546865206d6178696d756d20616d6f756e74206f662062616c616e636520746861742063616e20626520636861726765642f72657365727665642066726f6d207468652063616c6c657220746f2070617920666f72207468652073746f7261676520636f6e73756d65642ed82d2060636f6465603a20546865205741534d2062696e61727920646566696e696e672074686520736d61727420636f6e74726163742ef42d206064617461603a2054686520696e707574206461746120746f207061737320746f2074686520636f6e747261637420636f6e7374727563746f722ed5012d206073616c74603a205573656420666f7220636f6e747261637420616464726573732064657269766174696f6e2e2042792076617279696e6720746869732c207468652073616d652060636f6465602063616e206265207573656420756e646572207468652073616d65206964656e746974792e0090696e7374616e74696174655f776974685f686173685f61735f7072696d6172795f6b6579180124656e646f776d656e7418011c42616c616e63650001246761735f6c696d697428011857656967687400015473746f726167655f6465706f7369745f6c696d69742104013c4f7074696f6e3c42616c616e63653e000124636f64655f6861736834012c436f6465486173683c543e0001106461746138011c5665633c75383e00011073616c7438011c5665633c75383e0004383901496e7374616e746961746573206120736d61727420636f6e747261637420646566696e696e67207573696e672074686520676976656e2060636f64655f686173686020616e64206073616c74602e00e901556e6c696b652060696e7374616e74696174655f776974685f636f6465602c207468697320617373756d65732074686174206174206c65617374206f6e6520636f6e74726163742077697468207468652073616d65205741534d20636f64652068617320616c7265616479206265656e2075706c6f616465642e007d0154686520636f6e74726163742077696c6c2062652061747461636865642061732061207072696d617279206b6579206f662061206e65776c792063726561746564206368696c64206964656e74697479206f66207468652063616c6c65722e002c2320417267756d656e7473ec2d2060656e646f776d656e74603a20616d6f756e74206f6620504f4c595820746f207472616e7366657220746f2074686520636f6e74726163742e59012d20606761735f6c696d6974603a20666f7220686f77206d756368206761732074686520606465706c6f796020636f646520696e2074686520636f6e7472616374206d6179206174206d6f737420636f6e73756d652e19022d206073746f726167655f6465706f7369745f6c696d6974603a20546865206d6178696d756d20616d6f756e74206f662062616c616e636520746861742063616e20626520636861726765642f72657365727665642066726f6d207468652063616c6c657220746f2070617920666f72207468652073746f7261676520636f6e73756d65642ec82d2060636f64655f68617368603a206f6620616e20616c72656164792075706c6f61646564205741534d2062696e6172792ef42d206064617461603a2054686520696e707574206461746120746f207061737320746f2074686520636f6e747261637420636f6e7374727563746f722ed5012d206073616c74603a207573656420666f7220636f6e747261637420616464726573732064657269766174696f6e2e2042792076617279696e6720746869732c207468652073616d652060636f6465602063616e206265207573656420756e646572207468652073616d65206964656e746974792e002c757067726164655f61706908010c6170697d04010c4170690001306e6578745f75706772616465dd0701384e657874557067726164653c543e000500040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ed507000002d90700d9070000040885042000dd070848706f6c796d6573685f636f6e7472616374732c4e657874557067726164650404540000080134636861696e5f76657273696f6e81040130436861696e56657273696f6e0001206170695f68617368e1070138417069436f6465486173683c543e0000e1070848706f6c796d6573685f636f6e7472616374732c417069436f64654861736804045400000401106861736834012c436f6465486173683c543e0000e5070c3c70616c6c65745f707265696d6167651870616c6c65741043616c6c040454000114346e6f74655f707265696d616765040114627974657338011c5665633c75383e000010745265676973746572206120707265696d616765206f6e2d636861696e2e00550149662074686520707265696d616765207761732070726576696f75736c79207265717565737465642c206e6f2066656573206f72206465706f73697473206172652074616b656e20666f722070726f766964696e67550174686520707265696d6167652e204f74686572776973652c2061206465706f7369742069732074616b656e2070726f706f7274696f6e616c20746f207468652073697a65206f662074686520707265696d6167652e3c756e6e6f74655f707265696d6167650401106861736834011c543a3a48617368000118dc436c65617220616e20756e72657175657374656420707265696d6167652066726f6d207468652072756e74696d652073746f726167652e00fc496620606c656e602069732070726f76696465642c207468656e2069742077696c6c2062652061206d7563682063686561706572206f7065726174696f6e2e0001012d206068617368603a205468652068617368206f662074686520707265696d61676520746f2062652072656d6f7665642066726f6d207468652073746f72652eb82d20606c656e603a20546865206c656e677468206f662074686520707265696d616765206f66206068617368602e40726571756573745f707265696d6167650401106861736834011c543a3a48617368000210410152657175657374206120707265696d6167652062652075706c6f6164656420746f2074686520636861696e20776974686f757420706179696e6720616e792066656573206f72206465706f736974732e00550149662074686520707265696d6167652072657175657374732068617320616c7265616479206265656e2070726f7669646564206f6e2d636861696e2c20776520756e7265736572766520616e79206465706f7369743901612075736572206d6179206861766520706169642c20616e642074616b652074686520636f6e74726f6c206f662074686520707265696d616765206f7574206f662074686569722068616e64732e48756e726571756573745f707265696d6167650401106861736834011c543a3a4861736800030cbc436c65617220612070726576696f75736c79206d616465207265717565737420666f72206120707265696d6167652e002d014e4f54453a2054484953204d555354204e4f542042452043414c4c4544204f4e20606861736860204d4f52452054494d4553205448414e2060726571756573745f707265696d616765602e38656e737572655f75706461746564040118686173686573ad0401305665633c543a3a486173683e00040cbc456e737572652074686174207468652062756c6b206f66207072652d696d616765732069732075706772616465642e003d015468652063616c6c65722070617973206e6f20666565206966206174206c6561737420393025206f66207072652d696d616765732077657265207375636365737366756c6c7920757064617465642e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732ee9070c2870616c6c65745f6e66741870616c6c65741043616c6c040454000110546372656174655f6e66745f636f6c6c656374696f6e0c012061737365745f6964ed07013c4f7074696f6e3c417373657449643e0001206e66745f74797065f107015c4f7074696f6e3c4e6f6e46756e6769626c65547970653e00013c636f6c6c656374696f6e5f6b657973f50701444e4654436f6c6c656374696f6e4b657973000044744372657465732061206e657720604e4654436f6c6c656374696f6e602e002c2320417267756d656e7473c5012a20606f726967696e60202d20636f6e7461696e7320746865207365636f6e64617279206b6579206f66207468652063616c6c65722028692e652e2077686f207369676e656420746865207472616e73616374696f6e20746f206578656375746520746869732066756e6374696f6e292e95012a206061737365745f696460202d206f7074696f6e616c205b6041737365744964605d206173736f63696174656420746f20746865206e657720636f6c6c656374696f6e2e20604e6f6e65602077696c6c206372656174652061206e65772061737365742e89012a20606e66745f7479706560202d20696e206361736520746865206173736574206861736e2774206265656e2063726561746564207965742c206f6e652077696c6c206265206372656174656420776974682074686520676976656e20747970652e79012a2060636f6c6c656374696f6e5f6b65797360202d20616c6c206d616e6461746f7279206d65746164617461206b65797320746861742074686520746f6b656e7320696e2074686520636f6c6c656374696f6e206d75737420686176652e00242323204572726f727371012d2060436f6c6c656374696f6e416c726564795265676973746572656460202d206966207468652061737365745f696420697320616c7265616479206173736f63696174656420746f20616e204e465420636f6c6c656374696f6e2e09012d2060496e76616c696441737365745479706560202d20696620746865206173736f636961746564206173736574206973206e6f74206f662074797065204e46542ed1012d20604d61784e756d6265724f664b657973457863656564656460202d20696620746865206e756d626572206f66206d65746164617461206b65797320666f722074686520636f6c6c656374696f6e2069732067726561746572207468616e20746865206d6178696d756d20616c6c6f7765642eb1012d2060556e726567697374657265644d657461646174614b657960202d20696620616e79206f6620746865206d65746164617461206b657973206e656564656420666f722074686520636f6c6c656374696f6e20686173206e6f74206265656e20726567697374657265642e45012d20604475706c69636174654d657461646174614b657960202d2069662061206475706c6963617465206d65746164617461206b65797320686173206265656e2070617373656420617320696e7075742e003423205065726d697373696f6e731c2a2041737365742469737375655f6e66740c012061737365745f6964b0011c4173736574496400015c6e66745f6d657461646174615f61747472696275746573fd0701645665633c4e46544d657461646174614174747269627574653e000138706f7274666f6c696f5f6b696e64f40134506f7274666f6c696f4b696e640001447049737375657320616e204e465420746f207468652063616c6c65722e002c2320417267756d656e74733d012a20606f726967696e60202d2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed42a206061737365745f696460202d20746865205b6041737365744964605d206f6620746865204e465420636f6c6c656374696f6e2e45012a20606e66745f6d657461646174615f6174747269627574657360202d20616c6c206d616e6461746f7279206d65746164617461206b65797320616e642076616c75657320666f7220746865204e46542e11012d2060706f7274666f6c696f5f6b696e6460202d2074686520706f7274666f6c696f20746861742077696c6c207265636569766520746865206d696e746564206e66742e00242323204572726f727385012d2060436f6c6c656374696f6e4e6f74466f756e6460202d2069662074686520636f6c6c656374696f6e206173736f63696174656420746f2074686520676976656e2061737365745f696420686173206e6f74206265656e20637265617465642ec9022d2060496e76616c69644d6574616461746141747472696275746560202d20696620746865206e756d626572206f662061747472696275746573206973206e6f7420657175616c20746f20746865206e756d6265722073657420696e2074686520636f6c6c656374696f6e206f7220617474656d7074696e6720746f2073657420612076616c756520666f722061206b6579206e6f7420646566696e69656420696e2074686520636f6c6c656374696f6e2e45012d20604475706c69636174654d657461646174614b657960202d2069662061206475706c6963617465206d65746164617461206b65797320686173206265656e2070617373656420617320696e7075742e00003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f2872656465656d5f6e667410012061737365745f6964b0011c417373657449640001186e66745f6964ad0301144e46544964000138706f7274666f6c696f5f6b696e64f40134506f7274666f6c696f4b696e640001386e756d6265725f6f665f6b657973050801284f7074696f6e3c75383e00023cc852656465656d732074686520676976656e204e46542066726f6d207468652063616c6c6572277320706f7274666f6c696f2e002c2320417267756d656e74733d012a20606f726967696e60202d2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ed42a206061737365745f696460202d20746865205b6041737365744964605d206f6620746865204e465420636f6c6c656374696f6e2eb02a20606e66745f696460202d20746865206964206f6620746865204e465420746f206265206275726e65642ee42a2060706f7274666f6c696f5f6b696e6460202d2074686520706f7274666f6c696f207468617420636f6e7461696e7320746865206e66742e00242323204572726f727385012d2060436f6c6c656374696f6e4e6f74466f756e6460202d2069662074686520636f6c6c656374696f6e206173736f63696174656420746f2074686520676976656e2061737365745f696420686173206e6f74206265656e20637265617465642e0d012d20604e46544e6f74466f756e6460202d2069662074686520676976656e204e465420646f6573206e6f7420657869737420696e2074686520706f7274666f6c696f2e003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f4c636f6e74726f6c6c65725f7472616e736665720c01106e667473a50301104e465473000140736f757263655f706f7274666f6c696ff0012c506f7274666f6c696f496400015863616c6c6572735f706f7274666f6c696f5f6b696e64f40134506f7274666f6c696f4b696e6400032c3501466f7263657320746865207472616e73666572206f66204e4654732066726f6d206120676976656e20706f7274666f6c696f20746f207468652063616c6c6572277320706f7274666f6c696f2e002c2320417267756d656e74733d012a20606f726967696e60202d2069732061207369676e6572207468617420686173207065726d697373696f6e7320746f2061637420617320616e206167656e74206f66206061737365745f6964602ee02a20606e66745f696460202d20746865205b604e46544964605d206f6620746865204e465420746f206265207472616e736665727265642e21012a2060736f757263655f706f7274666f6c696f60202d20746865205b60506f7274666f6c696f4964605d20746861742063757272656e746c7920686f6c647320746865204e46542e35012a206063616c6c6572735f706f7274666f6c696f5f6b696e6460202d20746865205b60506f7274666f6c696f4b696e64605d206f66207468652063616c6c6572277320706f7274666f6c696f2e003423205065726d697373696f6e731c2a2041737365742c2a20506f7274666f6c696f040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732eed0704184f7074696f6e04045401b00108104e6f6e6500000010536f6d650400b00000010000f10704184f7074696f6e04045401e5010108104e6f6e6500000010536f6d650400e5010000010000f5070c4c706f6c796d6573685f7072696d6974697665730c6e6674444e4654436f6c6c656374696f6e4b65797300000400f90701545665633c41737365744d657461646174614b65793e0000f907000002690200fd0700000201080001080c4c706f6c796d6573685f7072696d6974697665730c6e6674504e46544d65746164617461417474726962757465000008010c6b65796902014041737365744d657461646174614b657900011476616c75653502014841737365744d6574616461746156616c75650000050804184f7074696f6e04045401080108104e6f6e6500000010536f6d65040008000001000009080c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c65741043616c6c0404540001143c7375626d69745f756e7369676e65640801307261775f736f6c7574696f6e0d0801b0426f783c526177536f6c7574696f6e3c536f6c7574696f6e4f663c543a3a4d696e6572436f6e6669673e3e3e00011c7769746e657373dd080158536f6c7574696f6e4f72536e617073686f7453697a65000038a45375626d6974206120736f6c7574696f6e20666f722074686520756e7369676e65642070686173652e00c8546865206469737061746368206f726967696e20666f20746869732063616c6c206d757374206265205f5f6e6f6e655f5f2e003d0154686973207375626d697373696f6e20697320636865636b6564206f6e2074686520666c792e204d6f72656f7665722c207468697320756e7369676e656420736f6c7574696f6e206973206f6e6c79550176616c696461746564207768656e207375626d697474656420746f2074686520706f6f6c2066726f6d20746865202a2a6c6f63616c2a2a206e6f64652e204566666563746976656c792c2074686973206d65616e735d0174686174206f6e6c79206163746976652076616c696461746f72732063616e207375626d69742074686973207472616e73616374696f6e207768656e20617574686f72696e67206120626c6f636b202873696d696c617240746f20616e20696e686572656e74292e005901546f2070726576656e7420616e7920696e636f727265637420736f6c7574696f6e2028616e642074687573207761737465642074696d652f776569676874292c2074686973207472616e73616374696f6e2077696c6c4d0170616e69632069662074686520736f6c7574696f6e207375626d6974746564206279207468652076616c696461746f7220697320696e76616c696420696e20616e79207761792c206566666563746976656c799c70757474696e6720746865697220617574686f72696e6720726577617264206174207269736b2e00e04e6f206465706f736974206f7220726577617264206973206173736f63696174656420776974682074686973207375626d697373696f6e2e6c7365745f6d696e696d756d5f756e747275737465645f73636f72650401406d617962655f6e6578745f73636f7265e10801544f7074696f6e3c456c656374696f6e53636f72653e000114b05365742061206e65772076616c756520666f7220604d696e696d756d556e7472757374656453636f7265602e00d84469737061746368206f726967696e206d75737420626520616c69676e656420776974682060543a3a466f7263654f726967696e602e00f05468697320636865636b2063616e206265207475726e6564206f66662062792073657474696e67207468652076616c756520746f20604e6f6e65602e747365745f656d657267656e63795f656c656374696f6e5f726573756c74040120737570706f727473e5080158537570706f7274733c543a3a4163636f756e7449643e0002205901536574206120736f6c7574696f6e20696e207468652071756575652c20746f2062652068616e646564206f757420746f2074686520636c69656e74206f6620746869732070616c6c657420696e20746865206e6578748863616c6c20746f2060456c656374696f6e50726f76696465723a3a656c656374602e004501546869732063616e206f6e6c79206265207365742062792060543a3a466f7263654f726967696e602c20616e64206f6e6c79207768656e207468652070686173652069732060456d657267656e6379602e00610154686520736f6c7574696f6e206973206e6f7420636865636b656420666f7220616e7920666561736962696c69747920616e6420697320617373756d656420746f206265207472757374776f727468792c20617320616e795101666561736962696c69747920636865636b20697473656c662063616e20696e207072696e6369706c652063617573652074686520656c656374696f6e2070726f6365737320746f206661696c202864756520746f686d656d6f72792f77656967687420636f6e73747261696e73292e187375626d69740401307261775f736f6c7574696f6e0d0801b0426f783c526177536f6c7574696f6e3c536f6c7574696f6e4f663c543a3a4d696e6572436f6e6669673e3e3e0003249c5375626d6974206120736f6c7574696f6e20666f7220746865207369676e65642070686173652e00d0546865206469737061746368206f726967696e20666f20746869732063616c6c206d757374206265205f5f7369676e65645f5f2e005d0154686520736f6c7574696f6e20697320706f74656e7469616c6c79207175657565642c206261736564206f6e2074686520636c61696d65642073636f726520616e642070726f6365737365642061742074686520656e64506f6620746865207369676e65642070686173652e005d0141206465706f73697420697320726573657276656420616e64207265636f7264656420666f722074686520736f6c7574696f6e2e204261736564206f6e20746865206f7574636f6d652c2074686520736f6c7574696f6e15016d696768742062652072657761726465642c20736c61736865642c206f722067657420616c6c206f7220612070617274206f6620746865206465706f736974206261636b2e4c676f7665726e616e63655f66616c6c6261636b0801406d617962655f6d61785f766f746572738d01012c4f7074696f6e3c7533323e0001446d617962655f6d61785f746172676574738d01012c4f7074696f6e3c7533323e00041080547269676765722074686520676f7665726e616e63652066616c6c6261636b2e004901546869732063616e206f6e6c792062652063616c6c6564207768656e205b6050686173653a3a456d657267656e6379605d20697320656e61626c65642c20617320616e20616c7465726e617469766520746fc063616c6c696e67205b6043616c6c3a3a7365745f656d657267656e63795f656c656374696f6e5f726573756c74605d2e040d01436f6e7461696e7320612076617269616e742070657220646973706174636861626c652065787472696e736963207468617420746869732070616c6c6574206861732e0d08089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173652c526177536f6c7574696f6e040453011108000c0120736f6c7574696f6e110801045300011473636f72659d040134456c656374696f6e53636f7265000114726f756e6410010c75333200001108085c706f6c796d6573685f72756e74696d655f636f6d6d6f6e384e706f73536f6c7574696f6e31360000400118766f74657331150800000118766f74657332210800000118766f74657333350800000118766f74657334410800000118766f746573354d0800000118766f74657336590800000118766f74657337650800000118766f74657338710800000118766f746573397d080000011c766f746573313089080000011c766f746573313195080000011c766f7465733132a1080000011c766f7465733133ad080000011c766f7465733134b9080000011c766f7465733135c5080000011c766f7465733136d1080000001508000002190800190800000408b9041d08001d080000064d0300210800000225080025080000040cb90429081d08002908000004081d082d08002d0800000631080031080c3473705f61726974686d65746963287065725f7468696e677318506572553136000004004d03010c7531360000350800000239080039080000040cb9043d081d08003d0800000302000000290800410800000245080045080000040cb90449081d08004908000003030000002908004d0800000251080051080000040cb90455081d080055080000030400000029080059080000025d08005d080000040cb90461081d0800610800000305000000290800650800000269080069080000040cb9046d081d08006d0800000306000000290800710800000275080075080000040cb90479081d08007908000003070000002908007d0800000281080081080000040cb90485081d080085080000030800000029080089080000028d08008d080000040cb90491081d0800910800000309000000290800950800000299080099080000040cb9049d081d08009d080000030a000000290800a108000002a50800a5080000040cb904a9081d0800a9080000030b000000290800ad08000002b10800b1080000040cb904b5081d0800b5080000030c000000290800b908000002bd0800bd080000040cb904c1081d0800c1080000030d000000290800c508000002c90800c9080000040cb904cd081d0800cd080000030e000000290800d108000002d50800d5080000040cb904d9081d0800d9080000030f000000290800dd08089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f706861736558536f6c7574696f6e4f72536e617073686f7453697a650000080118766f74657273b904010c75333200011c74617267657473b904010c7533320000e10804184f7074696f6e040454019d040108104e6f6e6500000010536f6d6504009d040000010000e508000002e90800e9080000040800ed0800ed08084473705f6e706f735f656c656374696f6e731c537570706f727404244163636f756e744964010000080114746f74616c18013c457874656e64656442616c616e6365000118766f74657273f10801845665633c284163636f756e7449642c20457874656e64656442616c616e6365293e0000f108000002f50800f50800000408001800f9080c4070616c6c65745f636f6d6d69747465651870616c6c657434506f6c796d657368566f746573042c426c6f636b4e756d626572011000100114696e64657810013450726f706f73616c496e646578000110617965734901013c5665633c4964656e7469747949643e0001106e6179734901013c5665633c4964656e7469747949643e0001186578706972795901015c4d61796265426c6f636b3c426c6f636b4e756d6265723e0000fd080c4070616c6c65745f636f6d6d69747465651870616c6c6574144572726f72080454000449000124344475706c6963617465566f7465000004804475706c696361746520766f74657320617265206e6f7420616c6c6f7765642e284e6f74414d656d6265720001088841204449442069736e27742070617274206f662074686520636f6d6d69747465652ed454686520444944206d61792065697468657220626520612063616c6c6572206f7220736f6d65206f7468657220636f6e746578742e384e6f5375636850726f706f73616c000204444e6f20737563682070726f706f73616c2e3c50726f706f73616c457870697265640003049050726f706f73616c206578697374732c206275742069742068617320657870697265642e444475706c696361746550726f706f73616c0004044c4475706c69636174652070726f706f73616c2e544d69736d617463686564566f74696e67496e646578000504604d69736d61746368656420766f74696e6720696e6465782e44496e76616c696450726f706f7274696f6e0006049450726f706f7274696f6e206d757374206265206120726174696f6e616c206e756d6265722e3c4669727374566f746552656a65637400070cfc466972737420766f7465206f6e20612070726f706f73616c20637265617465732069742c20736f206974206d75737420626520616e20617070726f76616c2e0101416c6c2070726f706f73616c7320617265206d6f74696f6e7320746f206578656375746520736f6d657468696e6720617320224743206d616a6f72697479222efc546f2072656a65637420652e672e2c2061205049502c2061206d6f74696f6e20746f2072656a6563742073686f756c64206265202a617070726f7665642a2e5450726f706f73616c734c696d697452656163686564000804b44d6178696d756d206e756d626572206f662070726f706f73616c7320686173206265656e20726561636865642e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e01090c3070616c6c65745f67726f75701870616c6c6574144572726f72080454000449000118544f6e6c795072696d6172794b6579416c6c6f776564000004b04f6e6c79207072696d617279206b6579206f6620746865206964656e7469747920697320616c6c6f7765642e3c4475706c69636174654d656d6265720001047c47726f7570206d656d6265722077617320616464656420616c72656164792e304e6f537563684d656d626572000204a443616e27742072656d6f76652061206d656d626572207468617420646f65736e27742065786973742e504c6173744d656d62657243616e6e6f7451756974000304a84c617374206d656d626572206f662074686520636f6d6d69747465652063616e206e6f7420717569742e684163746976654d656d626572734c696d697445786365656465640004045d01546865206c696d697420666f7220746865206e756d626572206f6620636f6e63757272656e7420616374697665206d656d6265727320666f7220746869732067726f757020686173206265656e2065786365656465642e684163746976654d656d626572734c696d69744f766572666c6f770005041501416374697665206d656d626572206c696d6974207761732067726561746572207468616e206d6178696d756d20636f6d6d6974746565206d656d62657273206c696d69742e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e05090c4070616c6c65745f636f6d6d69747465651870616c6c6574144572726f72080454000449000124344475706c6963617465566f7465000004804475706c696361746520766f74657320617265206e6f7420616c6c6f7765642e284e6f74414d656d6265720001088841204449442069736e27742070617274206f662074686520636f6d6d69747465652ed454686520444944206d61792065697468657220626520612063616c6c6572206f7220736f6d65206f7468657220636f6e746578742e384e6f5375636850726f706f73616c000204444e6f20737563682070726f706f73616c2e3c50726f706f73616c457870697265640003049050726f706f73616c206578697374732c206275742069742068617320657870697265642e444475706c696361746550726f706f73616c0004044c4475706c69636174652070726f706f73616c2e544d69736d617463686564566f74696e67496e646578000504604d69736d61746368656420766f74696e6720696e6465782e44496e76616c696450726f706f7274696f6e0006049450726f706f7274696f6e206d757374206265206120726174696f6e616c206e756d6265722e3c4669727374566f746552656a65637400070cfc466972737420766f7465206f6e20612070726f706f73616c20637265617465732069742c20736f206974206d75737420626520616e20617070726f76616c2e0101416c6c2070726f706f73616c7320617265206d6f74696f6e7320746f206578656375746520736f6d657468696e6720617320224743206d616a6f72697479222efc546f2072656a65637420652e672e2c2061205049502c2061206d6f74696f6e20746f2072656a6563742073686f756c64206265202a617070726f7665642a2e5450726f706f73616c734c696d697452656163686564000804b44d6178696d756d206e756d626572206f662070726f706f73616c7320686173206265656e20726561636865642e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e09090c3070616c6c65745f67726f75701870616c6c6574144572726f72080454000449000118544f6e6c795072696d6172794b6579416c6c6f776564000004b04f6e6c79207072696d617279206b6579206f6620746865206964656e7469747920697320616c6c6f7765642e3c4475706c69636174654d656d6265720001047c47726f7570206d656d6265722077617320616464656420616c72656164792e304e6f537563684d656d626572000204a443616e27742072656d6f76652061206d656d626572207468617420646f65736e27742065786973742e504c6173744d656d62657243616e6e6f7451756974000304a84c617374206d656d626572206f662074686520636f6d6d69747465652063616e206e6f7420717569742e684163746976654d656d626572734c696d697445786365656465640004045d01546865206c696d697420666f7220746865206e756d626572206f6620636f6e63757272656e7420616374697665206d656d6265727320666f7220746869732067726f757020686173206265656e2065786365656465642e684163746976654d656d626572734c696d69744f766572666c6f770005041501416374697665206d656d626572206c696d6974207761732067726561746572207468616e206d6178696d756d20636f6d6d6974746565206d656d62657273206c696d69742e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e0d090c4070616c6c65745f636f6d6d69747465651870616c6c6574144572726f72080454000449000124344475706c6963617465566f7465000004804475706c696361746520766f74657320617265206e6f7420616c6c6f7765642e284e6f74414d656d6265720001088841204449442069736e27742070617274206f662074686520636f6d6d69747465652ed454686520444944206d61792065697468657220626520612063616c6c6572206f7220736f6d65206f7468657220636f6e746578742e384e6f5375636850726f706f73616c000204444e6f20737563682070726f706f73616c2e3c50726f706f73616c457870697265640003049050726f706f73616c206578697374732c206275742069742068617320657870697265642e444475706c696361746550726f706f73616c0004044c4475706c69636174652070726f706f73616c2e544d69736d617463686564566f74696e67496e646578000504604d69736d61746368656420766f74696e6720696e6465782e44496e76616c696450726f706f7274696f6e0006049450726f706f7274696f6e206d757374206265206120726174696f6e616c206e756d6265722e3c4669727374566f746552656a65637400070cfc466972737420766f7465206f6e20612070726f706f73616c20637265617465732069742c20736f206974206d75737420626520616e20617070726f76616c2e0101416c6c2070726f706f73616c7320617265206d6f74696f6e7320746f206578656375746520736f6d657468696e6720617320224743206d616a6f72697479222efc546f2072656a65637420652e672e2c2061205049502c2061206d6f74696f6e20746f2072656a6563742073686f756c64206265202a617070726f7665642a2e5450726f706f73616c734c696d697452656163686564000804b44d6178696d756d206e756d626572206f662070726f706f73616c7320686173206265656e20726561636865642e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e11090c3070616c6c65745f67726f75701870616c6c6574144572726f72080454000449000118544f6e6c795072696d6172794b6579416c6c6f776564000004b04f6e6c79207072696d617279206b6579206f6620746865206964656e7469747920697320616c6c6f7765642e3c4475706c69636174654d656d6265720001047c47726f7570206d656d6265722077617320616464656420616c72656164792e304e6f537563684d656d626572000204a443616e27742072656d6f76652061206d656d626572207468617420646f65736e27742065786973742e504c6173744d656d62657243616e6e6f7451756974000304a84c617374206d656d626572206f662074686520636f6d6d69747465652063616e206e6f7420717569742e684163746976654d656d626572734c696d697445786365656465640004045d01546865206c696d697420666f7220746865206e756d626572206f6620636f6e63757272656e7420616374697665206d656d6265727320666f7220746869732067726f757020686173206265656e2065786365656465642e684163746976654d656d626572734c696d69744f766572666c6f770005041501416374697665206d656d626572206c696d6974207761732067726561746572207468616e206d6178696d756d20636f6d6d6974746565206d656d62657273206c696d69742e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e1509000004080000001909000004080030001d09000004081909000021090c4c706f6c796d6573685f7072696d697469766573206d756c74697369674450726f706f73616c566f7465436f756e740000080124617070726f76616c7330010c75363400012872656a656374696f6e7330010c753634000025090c4c706f6c796d6573685f7072696d697469766573206d756c74697369673450726f706f73616c537461746504184d6f6d656e740130011018416374697665040114756e74696c0d0101384f7074696f6e3c4d6f6d656e743e0000004c457865637574696f6e5375636365737366756c0001003c457865637574696f6e4661696c65640002002052656a6563746564000300002909083c70616c6c65745f6d756c74697369671c56657273696f6e00000400080108753800002d090c3c70616c6c65745f6d756c74697369671870616c6c6574144572726f720404540001683c50726f706f73616c4d697373696e67000004705468652070726f706f73616c20646f6573206e6f742065786973742e344465636f64696e674572726f72000104444d756c746973696720616464726573732e5452657175697265645369676e65727349735a65726f000204d45265717569726564206e756d626572206f66207369676e657273206d7573742062652067726561746572207468656e207a65726f2e284e6f74415369676e6572000304344e6f742061207369676e65722e384e6f537563684d756c7469736967000404444e6f2073756368206d756c74697369672e404e6f74456e6f7567685369676e65727300050835014e6f7420656e6f756768207369676e6572732e2020546865206e756d626572206f66207369676e6572732068617320746f2062652067726561746572207468656e206f7220657175616c20746fd0746865207265717569726564206e756d626572206f66207369676e65727320746f20617070726f76652070726f706f73616c732e344e6f6e63654f766572666c6f770006044441206e6f6e6365206f766572666c6f772e30416c7265616479566f74656400070438416c726561647920766f7465642e38416c7265616479415369676e657200080444416c72656164792061207369676e65722e404964656e746974794e6f7441646d696e000904b84964656e746974792070726f7669646564206973206e6f7420746865206d756c746973696727732061646d696e2e404964656e746974794e6f745061796572000a04b84964656e746974792070726f7669646564206973206e6f7420746865206d756c746973696727732070617965722e404368616e67654e6f74416c6c6f776564000b0425014368616e67696e67206d756c746973696720706172616d6574657273206e6f7420616c6c6f7765642073696e6365206d756c74697369672069732061207072696d617279206b65792e745369676e6572416c72656164794c696e6b6564546f4d756c7469736967000c0411015369676e657220697320616e206163636f756e74206b6579207468617420697320616c7265616479206173736f63696174656420776974682061206d756c74697369672e745369676e6572416c72656164794c696e6b6564546f4964656e74697479000d0415015369676e657220697320616e206163636f756e74206b6579207468617420697320616c7265616479206173736f636961746564207769746820616e206964656e746974792e444e657374696e674e6f74416c6c6f776564000e04c441206d756c74697369672063616e27742062652061207369676e6572206f6620616e6f74686572206d756c74697369672e5c50726f706f73616c416c726561647952656a6563746564000f047450726f706f73616c207761732072656a6563746564206561726c6965723c50726f706f73616c457870697265640010045050726f706f73616c2068617320657870697265645c50726f706f73616c416c726561647945786563757465640011047450726f706f73616c20776173206578656375746564206561726c6965723c4d6178576569676874546f6f4c6f77001204a84d617820776569676874206e6f7420656e6f75676820746f20657865637574652070726f706f73616c2e5c4d756c74697369674d697373696e674964656e746974790013049c4d756c7469736967206973206e6f7420617474616368656420746f20616e206964656e7469747938546f6f4d616e795369676e65727300140494547269656420746f206164642f72656d6f766520746f6f206d616e79207369676e6572732e2c4e6f506179696e674469640015048c4d756c746973696720646f65736e27742068617665206120706179696e67204449442e44496e76616c69644578706972794461746500160474457870697279206d75737420626520696e20746865206675747572652e4c496e76616c69646174656450726f706f73616c001704e45468652070726f706f73616c20686173206265656e20696e76616c6964617465642061667465722061206d756c74697367207570646174652e3441646d696e4e6f74466f756e64001804584d756c746973696720686173206e6f2061646d696e2e50426164417574686f72697a6174696f6e547970650019046d015468652065787472696e736963206578706563746564206120646966666572656e742060417574686f72697a6174696f6e5479706560207468616e2077686174207468652060646174612e617574685f747970652829602069732e045c4d756c7469736967206d6f64756c65206572726f72732e31090c4470616c6c65745f76616c696461746f7273147479706573645065726d697373696f6e65644964656e7469747950726566730000080138696e74656e6465645f636f756e7410010c75333200013472756e6e696e675f636f756e7410010c753332000035090c4470616c6c65745f76616c696461746f72731870616c6c6574144572726f720404540001246453746173684964656e74697479446f65734e6f744578697374000004d456616c696461746f72206f72206e6f6d696e61746f72207374617368206964656e7469747920646f6573206e6f742065786973742e7053746173684964656e746974794e6f745065726d697373696f6e6564000104bc56616c696461746f722773207374617368206964656e74697479206973206e6f74207065726d697373696f6e65642e744964656e746974794973416c72656164795065726d697373696f6e6564000204985065726d697373696f6e65642076616c696461746f7220616c7265616479206578697374732e504964656e7469747949734d697373696e674344440003048c4964656e7469747920686173206e6f7420676f6e65207468726f75676874204344442e98496e74656e646564436f756e744973457863656564696e67436f6e73656e7375734c696d697400040435015768656e2074686520696e74656e646564206e756d626572206f662076616c696461746f727320746f2072756e206973203e3d20322f33206f66206076616c696461746f725f636f756e74602e404964656e746974794e6f74466f756e64000504e44964656e7469747920776173206e6f7420666f756e6420696e20746865207065726d697373696f6e6564206964656e7469747920706f6f6c2e4456616c696461746f724e6f74466f756e64000604a44e6f2076616c696461746f722077617320666f756e6420666f722074686520676976656e206b65792e44436f6d6d697373696f6e546f6f486967680007049c56616c696461746f7220636f6d6d69697373696f6e2069732061626f7665206d6178696d756d2e4c436f6d6d697373696f6e556e6368616e676564000804e84e657720636f6d6d697373696f6e206d75737420626520646966666572656e742066726f6d2070726576696f757320636f6d6d697373696f6e2e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e3909083870616c6c65745f7374616b696e67345374616b696e674c656467657204045400001401147374617368000130543a3a4163636f756e744964000114746f74616cc901013042616c616e63654f663c543e000118616374697665c901013042616c616e63654f663c543e000124756e6c6f636b696e67890601f0426f756e6465645665633c556e6c6f636b4368756e6b3c42616c616e63654f663c543e3e2c20543a3a4d6178556e6c6f636b696e674368756e6b733e0001586c65676163795f636c61696d65645f726577617264733d090194426f756e6465645665633c457261496e6465782c20543a3a486973746f727944657074683e00003d090c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401100453000004006d0601185665633c543e00004109083870616c6c65745f7374616b696e672c4e6f6d696e6174696f6e7304045400000c011c74617267657473450901b4426f756e6465645665633c543a3a4163636f756e7449642c204d61784e6f6d696e6174696f6e734f663c543e3e0001307375626d69747465645f696e100120457261496e64657800012873757070726573736564200110626f6f6c000045090c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e6465645665630804540100045300000400050101185665633c543e00004909083870616c6c65745f7374616b696e6734416374697665457261496e666f0000080114696e646578100120457261496e64657800011473746172740d01012c4f7074696f6e3c7536343e00004d09000004081000005109082873705f7374616b696e675450616765644578706f737572654d65746164617461041c42616c616e6365011800100114746f74616cc901011c42616c616e636500010c6f776ec901011c42616c616e636500013c6e6f6d696e61746f725f636f756e7410010c753332000128706167655f636f756e7410011050616765000055090000040c100010005909082873705f7374616b696e67304578706f737572655061676508244163636f756e74496401001c42616c616e6365011800080128706167655f746f74616cc901011c42616c616e63650001186f7468657273cd0101ac5665633c496e646976696475616c4578706f737572653c4163636f756e7449642c2042616c616e63653e3e00005d09083870616c6c65745f7374616b696e673c457261526577617264506f696e747304244163636f756e744964010000080114746f74616c10012c526577617264506f696e74000128696e646976696475616c6109018042547265654d61703c4163636f756e7449642c20526577617264506f696e743e00006109042042547265654d617008044b010004560110000400650900000065090000026909006909000004080010006d090000027109007109083870616c6c65745f7374616b696e6738556e6170706c696564536c61736808244163636f756e74496401001c42616c616e636501180014012476616c696461746f720001244163636f756e74496400010c6f776e18011c42616c616e63650001186f7468657273f10801645665633c284163636f756e7449642c2042616c616e6365293e0001247265706f7274657273050101385665633c4163636f756e7449643e0001187061796f757418011c42616c616e636500007509000004088101180079090c3870616c6c65745f7374616b696e6720736c617368696e6734536c617368696e675370616e7300001001287370616e5f696e6465781001245370616e496e6465780001286c6173745f7374617274100120457261496e6465780001486c6173745f6e6f6e7a65726f5f736c617368100120457261496e6465780001147072696f726d0601345665633c457261496e6465783e00007d090c3870616c6c65745f7374616b696e6720736c617368696e67285370616e5265636f7264041c42616c616e636501180008011c736c617368656418011c42616c616e6365000120706169645f6f757418011c42616c616e636500008109103870616c6c65745f7374616b696e671870616c6c65741870616c6c6574144572726f72040454000188344e6f74436f6e74726f6c6c6572000004644e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f745374617368000104504e6f742061207374617368206163636f756e742e34416c7265616479426f6e64656400020460537461736820697320616c726561647920626f6e6465642e34416c726561647950616972656400030474436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d7074795461726765747300040460546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e646578000504404475706c696361746520696e6465782e44496e76616c6964536c617368496e64657800060484536c617368207265636f726420696e646578206f7574206f6620626f756e64732e40496e73756666696369656e74426f6e6400070c590143616e6e6f74206861766520612076616c696461746f72206f72206e6f6d696e61746f7220726f6c652c20776974682076616c7565206c657373207468616e20746865206d696e696d756d20646566696e65642062793d01676f7665726e616e6365202873656520604d696e56616c696461746f72426f6e646020616e6420604d696e4e6f6d696e61746f72426f6e6460292e20496620756e626f6e64696e67206973207468651501696e74656e74696f6e2c20606368696c6c6020666972737420746f2072656d6f7665206f6e65277320726f6c652061732076616c696461746f722f6e6f6d696e61746f722e304e6f4d6f72654368756e6b730008049043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b000904a043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e3046756e646564546172676574000a04c8417474656d7074696e6720746f2074617267657420612073746173682074686174207374696c6c206861732066756e64732e48496e76616c6964457261546f526577617264000b0458496e76616c69642065726120746f207265776172642e68496e76616c69644e756d6265724f664e6f6d696e6174696f6e73000c0478496e76616c6964206e756d626572206f66206e6f6d696e6174696f6e732e484e6f74536f72746564416e64556e69717565000d04804974656d7320617265206e6f7420736f7274656420616e6420756e697175652e38416c7265616479436c61696d6564000e0409015265776172647320666f72207468697320657261206861766520616c7265616479206265656e20636c61696d656420666f7220746869732076616c696461746f722e2c496e76616c696450616765000f04844e6f206e6f6d696e61746f7273206578697374206f6e207468697320706167652e54496e636f7272656374486973746f72794465707468001004c0496e636f72726563742070726576696f757320686973746f727920646570746820696e7075742070726f76696465642e58496e636f7272656374536c617368696e675370616e73001104b0496e636f7272656374206e756d626572206f6620736c617368696e67207370616e732070726f76696465642e2042616453746174650012043901496e7465726e616c20737461746520686173206265636f6d6520736f6d65686f7720636f7272757074656420616e6420746865206f7065726174696f6e2063616e6e6f7420636f6e74696e75652e38546f6f4d616e795461726765747300130494546f6f206d616e79206e6f6d696e6174696f6e207461726765747320737570706c6965642e244261645461726765740014043d0141206e6f6d696e6174696f6e207461726765742077617320737570706c69656420746861742077617320626c6f636b6564206f72206f7468657277697365206e6f7420612076616c696461746f722e4043616e6e6f744368696c6c4f74686572001504550154686520757365722068617320656e6f75676820626f6e6420616e6420746875732063616e6e6f74206265206368696c6c656420666f72636566756c6c7920627920616e2065787465726e616c20706572736f6e2e44546f6f4d616e794e6f6d696e61746f72730016084d0154686572652061726520746f6f206d616e79206e6f6d696e61746f727320696e207468652073797374656d2e20476f7665726e616e6365206e6565647320746f2061646a75737420746865207374616b696e67b473657474696e677320746f206b656570207468696e6773207361666520666f72207468652072756e74696d652e44546f6f4d616e7956616c696461746f7273001708550154686572652061726520746f6f206d616e792076616c696461746f722063616e6469646174657320696e207468652073797374656d2e20476f7665726e616e6365206e6565647320746f2061646a75737420746865d47374616b696e672073657474696e677320746f206b656570207468696e6773207361666520666f72207468652072756e74696d652e40436f6d6d697373696f6e546f6f4c6f77001804e0436f6d6d697373696f6e20697320746f6f206c6f772e204d757374206265206174206c6561737420604d696e436f6d6d697373696f6e602e2c426f756e644e6f744d657400190458536f6d6520626f756e64206973206e6f74206d65742e50436f6e74726f6c6c657244657072656361746564001a04010155736564207768656e20617474656d7074696e6720746f20757365206465707265636174656420636f6e74726f6c6c6572206163636f756e74206c6f6769632e4c43616e6e6f74526573746f72654c6564676572001b045843616e6e6f742072657365742061206c65646765722e6c52657761726444657374696e6174696f6e52657374726963746564001c04ac50726f7669646564207265776172642064657374696e6174696f6e206973206e6f7420616c6c6f7765642e384e6f74456e6f75676846756e6473001d049c4e6f7420656e6f7567682066756e647320617661696c61626c6520746f2077697468647261772e5c5669727475616c5374616b65724e6f74416c6c6f776564001e04a84f7065726174696f6e206e6f7420616c6c6f77656420666f72207669727475616c207374616b6572732e3c43616e6e6f74526561705374617368001f04f4537461736820636f756c64206e6f7420626520726561706564206173206f746865722070616c6c6574206d6967687420646570656e64206f6e2069742e3c416c72656164794d696772617465640020040901546865207374616b65206f662074686973206163636f756e7420697320616c7265616479206d6967726174656420746f206046756e6769626c656020686f6c64732e285265737472696374656400210859014163636f756e7420697320726573747269637465642066726f6d2070617274696369706174696f6e20696e207374616b696e672e2054686973206d61792068617070656e20696620746865206163636f756e74206973c47374616b696e6720696e20616e6f746865722077617920616c72656164792c20737563682061732076696120706f6f6c2e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e85090c2873705f7374616b696e671c6f6666656e6365384f6666656e636544657461696c7308205265706f727465720100204f6666656e64657201c101000801206f6666656e646572c10101204f6666656e6465720001247265706f7274657273050101345665633c5265706f727465723e0000890900000408b438008d09000002910900910900000408009906009509000002990900990900000408109d09009d090c2873705f7374616b696e671c6f6666656e63653c4f6666656e63655365766572697479000004008101011c50657262696c6c0000a10900000408a5093800a5090c1c73705f636f72651863727970746f244b65795479706549640000040048011c5b75383b20345d0000a9090c3870616c6c65745f73657373696f6e1870616c6c6574144572726f7204045400011430496e76616c696450726f6f6600000460496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f7249640001049c4e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b65790002046452656769737465726564206475706c6963617465206b65792e184e6f4b657973000304a44e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e244e6f4163636f756e7400040419014b65792073657474696e67206163636f756e74206973206e6f74206c6976652c20736f206974277320696d706f737369626c6520746f206173736f6369617465206b6579732e04744572726f7220666f72207468652073657373696f6e2070616c6c65742ead090c4c626f756e6465645f636f6c6c656374696f6e73407765616b5f626f756e6465645f766563385765616b426f756e646564566563080454019d06045300000400b10901185665633c543e0000b1090000029d0600b509083870616c6c65745f6772616e6470612c53746f726564537461746504044e01100110104c6976650000003050656e64696e6750617573650801307363686564756c65645f61741001044e00011464656c61791001044e000100185061757365640002003450656e64696e67526573756d650801307363686564756c65645f61741001044e00011464656c61791001044e00030000b909083870616c6c65745f6772616e6470614c53746f72656450656e64696e674368616e676508044e0110144c696d697400001001307363686564756c65645f61741001044e00011464656c61791001044e0001406e6578745f617574686f726974696573bd09016c426f756e646564417574686f726974794c6973743c4c696d69743e000118666f726365648d0101244f7074696f6e3c4e3e0000bd090c4c626f756e6465645f636f6c6c656374696f6e73407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401ad01045300000400a90101185665633c543e0000c1090c3870616c6c65745f6772616e6470611870616c6c6574144572726f7204045400011c2c50617573654661696c65640000080501417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a42865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c65640001081101417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e67000204e8417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e000304bc43616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e60496e76616c69644b65794f776e65727368697050726f6f66000404310141206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c696445717569766f636174696f6e50726f6f660005043101416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f727400060415014120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e048054686520604572726f726020656e756d206f6620746869732070616c6c65742ec50900000408341000c9090c4c626f756e6465645f636f6c6c656374696f6e73407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401b901045300000400cd0901185665633c543e0000cd09000002b90100d1090c4070616c6c65745f696d5f6f6e6c696e651870616c6c6574144572726f7204045400010828496e76616c69644b6579000004604e6f6e206578697374656e74207075626c6963206b65792e4c4475706c696361746564486561727462656174000104544475706c696361746564206865617274626561742e048054686520604572726f726020656e756d206f6620746869732070616c6c65742ed5090c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e6465645665630804540134045300000400ad0401185665633c543e0000d9090c2c70616c6c65745f7375646f1870616c6c6574144572726f720404540001042c526571756972655375646f0000047c53656e646572206d75737420626520746865205375646f206163636f756e7404644572726f7220666f7220746865205375646f2070616c6c6574dd090c3070616c6c65745f6173736574147479706573485469636b6572526567697374726174696f6e0404540130000801146f776e65729c01284964656e7469747949640001186578706972790d0101244f7074696f6e3c543e0000e1090c3070616c6c65745f6173736574147479706573605469636b6572526567697374726174696f6e436f6e6669670404540130000801446d61785f7469636b65725f6c656e677468080108753800014c726567697374726174696f6e5f6c656e6774680d0101244f7074696f6e3c543e0000e5090c3070616c6c65745f617373657414747970657330417373657444657461696c730000100130746f74616c5f737570706c7918011c42616c616e63650001246f776e65725f6469649c01284964656e746974794964000124646976697369626c65200110626f6f6c00012861737365745f74797065dd0101244173736574547970650000e90900000408b09c00ed0900000408b0010200f10900000408b0050200f50900000408b0690200f90900000408b0450200fd0900000408b0490200010a000004089cb000050a000004089c290100090a083070616c6c65745f61737365741c56657273696f6e00000400080108753800000d0a0c3070616c6c65745f61737365741870616c6c6574144572726f720404540001c830556e617574686f72697a65640000046c5468652075736572206973206e6f7420617574686f72697a65642e4c4173736574416c7265616479437265617465640001048c54686520746f6b656e2068617320616c7265616479206265656e20637265617465642e345469636b6572546f6f4c6f6e6700020490546865207469636b6572206c656e677468206973206f76657220746865206c696d69742e545469636b65724e6f74416c7068616e756d6572696300030498546865207469636b657220686173206e6f6e2d616c7068616e756d657269632070617274732e5c5469636b6572416c726561647952656769737465726564000404c4546865207469636b657220697320616c7265616479207265676973746572656420746f20736f6d656f6e6520656c73652e54546f74616c537570706c7941626f76654c696d69740005049054686520746f74616c20737570706c792069732061626f766520746865206c696d69742e2c4e6f537563684173736574000604a84e6f20746f6b656e206173736f63696174656420746f2074686520676976656e2061737365742049442e34416c726561647946726f7a656e0007047054686520746f6b656e20697320616c72656164792066726f7a656e2e284e6f74416e4f776e6572000804984e6f7420616e206f776e6572206f662074686520746f6b656e206f6e20457468657265756d2e3c42616c616e63654f766572666c6f77000904a8416e206f766572666c6f77207768696c652063616c63756c6174696e67207468652062616c616e63652e4c546f74616c537570706c794f766572666c6f77000a04bc416e206f766572666c6f77207768696c652063616c63756c6174696e672074686520746f74616c20737570706c792e48496e76616c69644772616e756c6172697479000b045c416e20696e76616c6964206772616e756c61726974792e244e6f7446726f7a656e000c0464546865206173736574206d7573742062652066726f7a656e2e3c496e76616c69645472616e73666572000d04845472616e736665722076616c69646174696f6e20636865636b206661696c65642e4c496e73756666696369656e7442616c616e6365000e04945468652073656e6465722062616c616e6365206973206e6f742073756666696369656e742e544173736574416c7265616479446976697369626c65000f047c54686520746f6b656e20697320616c726561647920646976697369626c652e60496e76616c6964457468657265756d5369676e617475726500100494416e20696e76616c696420457468657265756d206045636473615369676e6174757265602e645469636b6572526567697374726174696f6e457870697265640011048c526567697374726174696f6e206f66207469636b65722068617320657870697265642e5053656e64657253616d6541735265636569766572001204845472616e736665727320746f2073656c6620617265206e6f7420616c6c6f776564244e6f53756368446f630013048854686520676976656e20446f63756d656e7420646f6573206e6f742065786973742e704d61784c656e6774684f6641737365744e616d654578636565646564001404bc4d6178696d756d206c656e677468206f66206173736574206e616d6520686173206265656e2065786365656465642e8446756e64696e67526f756e644e616d654d61784c656e6774684578636565646564001504ec4d6178696d756d206c656e677468206f66207468652066756e64696e6720726f756e64206e616d6520686173206265656e2065786365656465642e58496e76616c696441737365744964656e7469666965720016048c536f6d65206041737365744964656e746966696572602077617320696e76616c69642e84496e766573746f72556e697175656e657373436c61696d4e6f74416c6c6f776564001704e8496e766573746f7220556e697175656e65737320636c61696d7320617265206e6f7420616c6c6f77656420666f7220746869732061737365742e60496e76616c6964437573746f6d417373657454797065496400180470496e76616c69642060437573746f6d4173736574547970654964602e8841737365744d657461646174614e616d654d61784c656e677468457863656564656400190405014d6178696d756d206c656e677468206f6620746865206173736574206d657461646174612074797065206e616d6520686173206265656e2065786365656465642e8c41737365744d6574616461746156616c75654d61784c656e6774684578636565646564001a04f44d6178696d756d206c656e677468206f6620746865206173736574206d657461646174612076616c756520686173206265656e2065786365656465642e9441737365744d65746164617461547970654465664d61784c656e6774684578636565646564001b041d014d6178696d756d206c656e677468206f6620746865206173736574206d65746164617461207479706520646566696e6974696f6e20686173206265656e2065786365656465642e6441737365744d657461646174614b657949734d697373696e67001c04784173736574204d65746164617461206b6579206973206d697373696e672e6841737365744d6574616461746156616c756549734c6f636b6564001d047c4173736574204d657461646174612076616c7565206973206c6f636b65642e8841737365744d657461646174614c6f63616c4b6579416c7265616479457869737473001e04cc4173736574204d65746164617461204c6f63616c207479706520616c72656164792065786973747320666f722061737365742e8c41737365744d65746164617461476c6f62616c4b6579416c7265616479457869737473001f04a84173736574204d6574616461746120476c6f62616c207479706520616c7265616479206578697374732e5c5469636b65724669727374427974654e6f7456616c6964002004c85469636b6572732073686f756c642073746172742077697468206174206c65617374206f6e652076616c696420627974652e68556e65787065637465644e6f6e46756e6769626c65546f6b656e0021042101417474656d707420746f2063616c6c20616e2065787472696e7369632074686174206973206f6e6c79207065726d697474656420666f722066756e6769626c6520746f6b656e732e6c496e636f6d70617469626c654173736574547970655570646174650022047d01417474656d707420746f20757064617465207468652074797065206f662061206e6f6e2066756e6769626c6520746f6b656e20746f20612066756e6769626c6520746f6b656e206f7220746865206f74686572207761792061726f756e642e9841737365744d657461646174614b657942656c6f6e6773546f4e4654436f6c6c656374696f6e002304f4417474656d707420746f2064656c6574652061206b65792074686174206973206e656564656420666f7220616e204e465420636f6c6c656374696f6e2e6441737365744d6574616461746156616c75654973456d707479002404bc417474656d707420746f206c6f636b2061206d657461646174612076616c7565207468617420697320656d7074792e784e756d6265724f6641737365744d65646961746f72734578636565646564002504ec4e756d626572206f66206173736574206d65646961746f727320776f756c642065786365656420746865206d6178696d756d20616c6c6f7765642e58496e76616c69645469636b65724368617261637465720026041d01496e76616c6964207469636b657220636861726163746572202d2076616c6964207365743a2041602e2e605a60206030602e2e60396020605f6020602d6020602e6020602f602e68496e76616c69645472616e7366657246726f7a656e4173736574002704bc4661696c656420746f207472616e7366657220746865206173736574202d2061737365742069732066726f7a656e2e80496e76616c69645472616e73666572436f6d706c69616e63654661696c757265002804b84661696c656420746f207472616e7366657220616e204e4654202d20636f6d706c69616e6365206661696c65642e84496e76616c69645472616e73666572496e76616c69645265636569766572434444002904e44661696c656420746f207472616e7366657220746865206173736574202d20726563656976657220636464206973206e6f742076616c69642e7c496e76616c69645472616e73666572496e76616c696453656e646572434444002a04dc4661696c656420746f207472616e7366657220746865206173736574202d2073656e64657220636464206973206e6f742076616c69642e685469636b6572526567697374726174696f6e4e6f74466f756e64002b04fc546865207469636b657220726567697374726174696f6e206173736f63696174656420746f20746865207469636b657220776173206e6f7420666f756e642e785469636b65724973416c72656164794c696e6b6564546f416e4173736574002c04bc54686520676976656e207469636b657220697320616c7265616479206c696e6b656420746f20616e2061737365742e584173736574496447656e65726174696f6e4572726f72002d04cc416e20756e6578706563746564206572726f72207768656e2067656e65726174696e672061206e65772061737365742049442e6c5469636b65724e6f7452656769737465726564546f43616c6c6572002e04a0546865207469636b657220646f65736e27742062656c6f6e6720746f207468652063616c6c65722e7441737365744973416c72656164794c696e6b6564546f415469636b6572002f04b854686520676976656e20617373657420697320616c7265616479206c696e6b656420746f2061207469636b65722e6c5469636b657249734e6f744c696e6b6564546f5468654173736574003004c854686520676976656e207469636b6572206973206e6f74206c696e6b656420746f2074686520676976656e2061737365742e50426164417574686f72697a6174696f6e547970650031046d015468652065787472696e736963206578706563746564206120646966666572656e742060417574686f72697a6174696f6e5479706560207468616e2077686174207468652060646174612e617574685f747970652829602069732e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e110a0000040889029c00150a0c6070616c6c65745f636f72706f726174655f616374696f6e7330646973747269627574696f6e1c56657273696f6e0000040008010875380000190a106070616c6c65745f636f72706f726174655f616374696f6e7330646973747269627574696f6e1870616c6c6574144572726f7204045400013c3043414e6f7442656e65666974000004d441206361706974616c20646973747269627574696f6e20776173206d61646520666f722061206e6f6e2d62656e656669742043412e34416c7265616479457869737473000104a84120646973747269627574696f6e20616c72656164792065786973747320666f7220746869732043412e4c4578706972794265666f72655061796d656e7400020829014120646973747269627574696f6e732070726f766964656420657870697279206461746520776173207374726963746c79206265666f726520697473207061796d656e7420646174652e2101496e206f7468657220776f7264732c2065766572797468696e6720746f206469737472696275746520776f756c6420696d6d6564696174656c7920626520666f726665697465642e44486f6c646572416c726561647950616964000304d454686520746f6b656e20686f6c6465722068617320616c7265616479206265656e20706169642074686569722062656e656669742e484e6f53756368446973747269627574696f6e000404c441206361706974616c20646973747269627574696f6e20646f65736e277420657869737420666f7220746869732043412e5843616e6e6f74436c61696d4265666f726553746172740005046101446973747269627574696f6e20616c6c6f746d656e742063616e6e6f7420626520636c61696d6564206173207468652063757272656e742074696d65206973206265666f72652073746172742d6f662d7061796d656e742e5843616e6e6f74436c61696d41667465724578706972790006046901446973747269627574696f6e27732065787069727920686173207061737365642e204449442063616e6e6f7420636c61696d20616e796d6f726520616e642068617320666f72666569746564207468652062656e65666974732e8042616c616e6365506572536861726550726f647563744f766572666c6f77656400070429014d756c7469706c69636174696f6e206f66207468652062616c616e636520776974682074686520706572207368617265207061796f757420616d6f756e74206f766572666c6f7765642e584e6f74446973747269627574696f6e43726561746f72000804c0444944206973206e6f7420746865206f6e652077686f20637265617465642074686520646973747269627574696f6e2e40416c72656164795265636c61696d6564000904d44449442077686f20637265617465642074686520646973747269627574696f6e20616c726561647920646964207265636c61696d2e284e6f7445787069726564000a04f0446973747269627574696f6e20686164206e6f742065787069726564207965742c206f722074686572652773206e6f2065787069727920646174652e4c446973747269627574696f6e53746172746564000b0401014120646973747269627574696f6e20686173206265656e206163746976617465642c20617320607061796d656e745f6174203c3d206e6f776020686f6c64732e6c496e73756666696369656e7452656d61696e696e67416d6f756e74000c042d014120646973747269627574696f6e2068617320696e73756666696369656e742072656d61696e696e6720616d6f756e74206f662063757272656e637920746f20646973747269627574652e60446973747269627574696f6e416d6f756e7449735a65726f000d0494446973747269627574696f6e2060616d6f756e74602063616e6e6f74206265207a65726f2e68446973747269627574696f6e506572536861726549735a65726f000e04a0446973747269627574696f6e20607065725f7368617265602063616e6e6f74206265207a65726f2e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e1d0a00000408b09d0200210a000004081d0a9c00250a0000029d0200290a1064706f6c796d6573685f636f6d6d6f6e5f7574696c69746965731874726169747328636865636b706f696e743c4e657874436865636b706f696e747300000c011c6e6578745f61743001184d6f6d656e74000134746f74616c5f70656e64696e6730010c7536340001247363686564756c65732d0a017042547265654d61703c5363686564756c6549642c204d6f6d656e743e00002d0a042042547265654d617008044b01a10204560130000400310a000000310a000002350a00350a00000408a1023000390a00000408b0a102003d0a0c3070616c6c65745f617373657428636865636b706f696e741c56657273696f6e0000040008010875380000410a103070616c6c65745f617373657428636865636b706f696e741870616c6c6574144572726f72040454000118384e6f537563685363686564756c65000004cc4120636865636b706f696e74207363686564756c6520646f6573206e6f7420657869737420666f72207468652061737365742e505363686564756c654e6f7452656d6f7661626c650001041d014120636865636b706f696e74207363686564756c65206973206e6f742072656d6f7661626c6520617320607265665f636f756e74287363686564756c655f696429203e2030602e685363686564756c65734f7665724d6178436f6d706c65786974790002042501546865206e6577207363686564756c6520776f756c642070757420746865206173736574206f76657220746865206d6178696d756d20636f6d706c657869747920616c6c6f7765642e3c5363686564756c654973456d7074790003047c43616e27742063726561746520616e20656d707479207363686564756c652e405363686564756c6546696e697368656400040494546865207363686564756c6520686173206e6f206d6f726520636865636b706f696e74732e745363686564756c6548617345787069726564436865636b706f696e747300050494546865207363686564756c6520686173206578706972656420636865636b706f696e74732e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e450a0c4c706f6c796d6573685f7072696d69746976657348636f6d706c69616e63655f6d616e616765723c4173736574436f6d706c69616e63650000080118706175736564200110626f6f6c000130726571756972656d656e7473e10201685665633c436f6d706c69616e6365526571756972656d656e743e0000490a086470616c6c65745f636f6d706c69616e63655f6d616e616765721c56657273696f6e00000400080108753800004d0a0c6470616c6c65745f636f6d706c69616e63655f6d616e616765721870616c6c6574144572726f7204045400011c30556e617574686f72697a65640000045c55736572206973206e6f7420617574686f72697a65642e2c4469644e6f74457869737400010438446964206e6f742065786973742e78496e76616c6964436f6d706c69616e6365526571756972656d656e744964000204a0436f6d706c69616e636520726571756972656d656e7420696420646f65736e27742065786973742e84496e636f72726563744f7065726174696f6e4f6e54727573746564497373756572000304a04973737565722065786973742062757420747279696e6720746f2061646420697420616761696e2e7c4475706c6963617465436f6d706c69616e6365526571756972656d656e7473000404b0546865726520617265206475706c696361746520636f6d706c69616e636520726571756972656d656e74732e7c436f6d706c69616e6365526571756972656d656e74546f6f436f6d706c6578000504150154686520776f7273742063617365207363656e6172696f206f662074686520636f6d706c69616e636520726571756972656d656e7420697320746f6f20636f6d706c65782e4c5765696768744c696d697445786365656465640006040501546865206d6178696d756d20776569676874206c696d697420666f7220657865637574696e67207468652066756e6374696f6e207761732065786365656465642e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e510a00000408b08d0200550a086070616c6c65745f636f72706f726174655f616374696f6e731c56657273696f6e0000040008010875380000590a0c6070616c6c65745f636f72706f726174655f616374696f6e731870616c6c6574144572726f7204045400012c3844657461696c73546f6f4c6f6e67000004d8546865206064657461696c7360206f66206120434120657863656564656420746865206d617820616c6c6f776564206c656e6774682e3c4475706c69636174654469645461780001082101412077697468686f6c64696e6720746178206f7665727269646520666f72206120676976656e204449442077617320737065636966696564206d6f7265207468616e206f6e63652e050154686520636861696e207265667573656420746f206d616b6520612063686f6963652c20616e642068656e63652074686572652077617320616e206572726f722e3c546f6f4d616e794469645461786573000204c8546f6f206d616e792077697468686f6c64696e6720746178206f76657272696465732077657265207370656369666965642e40546f6f4d616e79546172676574496473000304e4546f6f206d616e79206964656e74697469657320696e20605461726765744964656e746974696573602077657265207370656369666965642e484e6f53756368436865636b706f696e74496400040405014f6e204341206372656174696f6e2c206120636865636b706f696e74204944207761732070726f766964656420776869636820646f65736e27742065786973742e204e6f537563684341000504a44120434120776974682074686520676976656e2060434149646020646964206e6f742065786973742e304e6f5265636f7264446174650006048854686520434120646964206e6f7420686176652061207265636f726420646174652e505265636f7264446174654166746572537461727400070cdc412043412773207265636f7264206461746520776173207374726963746c792061667465722074686520227374617274222074696d652c8c7768657265202273746172742220697320636f6e7465787420646570656e64656e742e8101466f72206578616d706c652c20697420636f756c6420626520746865207374617274206f6620612062616c6c6f742c206f72207468652073746172742d6f662d7061796d656e7420696e206361706974616c20646973747269627574696f6e2e5c4465636c4461746541667465725265636f726444617465000804ec412043412773206465636c61726174696f6e206461746520776173207374726963746c7920616674657220697473207265636f726420646174652e404465636c44617465496e467574757265000904b4412043412773206465636c61726174696f6e2064617465206f636375727320696e20746865206675747572652e3c4e6f74546172676574656442794341000a046c434120646f6573206e6f742074617267657420746865204449442e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e5d0a0000024d0300610a0000021800650a0c6070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f741c56657273696f6e0000040008010875380000690a106070616c6c65745f636f72706f726174655f616374696f6e731862616c6c6f741870616c6c6574144572726f720404540001382c43414e6f744e6f74696365000004e04120636f72706f726174652062616c6c6f7420776173206d61646520666f722061206e6f6e20604973737565724e6f74696365602043412e34416c7265616479457869737473000104b84120636f72706f726174652062616c6c6f7420616c72656164792065786973747320666f7220746869732043412e304e6f5375636842616c6c6f74000204b44120636f72706f726174652062616c6c6f7420646f65736e277420657869737420666f7220746869732043412e3453746172744166746572456e6400030411014120636f72706f726174652062616c6c6f7427732073746172742074696d6520776173207374726963746c79206166746572207468652062616c6c6f74277320656e642e2c4e6f774166746572456e640004040d014120636f72706f726174652062616c6c6f74277320656e642074696d6520776173207374726963746c79206265666f7265207468652063757272656e742074696d652e5c4e756d6265724f6643686f696365734f766572666c6f770005043901496620736f6d65206d6f74696f6e20696e206120636f72706f726174652062616c6c6f7420686173206d6f72652063686f69636573207468616e20776f756c642066697420696e2060753136602e50566f74696e67416c7265616479537461727465640006040101566f74696e67207374617274656420616c72656164792e20416d656e64696e6720612062616c6c6f74206973206e6f206c6f6e67657220706f737369626c652e40566f74696e674e6f745374617274656400070468566f74696e67206861736e27742073746172746564207965742e48566f74696e67416c7265616479456e64656400080454566f74696e6720656e64656420616c72656164792e3857726f6e67566f7465436f756e74000904150150726f7669646564206c697374206f662062616c616e63657320646f6573206e6f74206d617463682074686520746f74616c206e756d626572206f662063686f696365732e44496e73756666696369656e74566f746573000a043d01566f74696e6720706f7765722075736564206279206120444944206f6e2061206d6f74696f6e2065786365656473207468617420776869636820697320617661696c61626c6520746f207468656d2e444e6f5375636852435646616c6c6261636b000b04bc546865205243562066616c6c6261636b206f6620736f6d652063686f69636520646f6573206e6f742065786973742e3052435653656c664379636c65000c04b4546865205243562066616c6c6261636b20706f696e747320746f20746865206f726967696e2063686f6963652e345243564e6f74416c6c6f776564000d048c524356206973206e6f7420616c6c6f77656420666f7220746869732062616c6c6f742e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e6d0a0c4870616c6c65745f7065726d697373696f6e731870616c6c6574144572726f7204045400010448556e617574686f72697a656443616c6c6572000004ec5468652063616c6c6572206973206e6f7420617574686f72697a656420746f2063616c6c207468652063757272656e742065787472696e7369632e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e710a0c2c70616c6c65745f7069707314747970657330506970734d65746164617461042c426c6f636b4e756d62657201100018010869645d030114506970496400010c75726c5102012c4f7074696f6e3c55726c3e00012c6465736372697074696f6e610301584f7074696f6e3c5069704465736372697074696f6e3e000128637265617465645f617410012c426c6f636b4e756d62657200014c7472616e73616374696f6e5f76657273696f6e10010c7533320001186578706972795901015c4d61796265426c6f636b3c426c6f636b4e756d6265723e0000750a000004085d030000790a0c2c70616c6c65745f706970731474797065732c4465706f736974496e666f04244163636f756e7449640100000801146f776e65720001244163636f756e744964000118616d6f756e7418011c42616c616e636500007d0a0c2c70616c6c65745f706970731474797065730c506970082050726f706f73616c013906244163636f756e7449640100000c010869645d030114506970496400012070726f706f73616c3906012050726f706f73616c00012070726f706f7365725503014c50726f706f7365723c4163636f756e7449643e0000810a0c2c70616c6c65745f7069707314747970657330566f74696e67526573756c740000100128617965735f636f756e7410010c753332000128617965735f7374616b6518011c42616c616e63650001286e6179735f636f756e7410010c7533320001286e6179735f7374616b6518011c42616c616e63650000850a0c2c70616c6c65745f7069707314747970657310566f746500000800200110626f6f6c000018011c42616c616e63650000890a0c2c70616c6c65745f7069707314747970657340536e617073686f744d65746164617461082c426c6f636b4e756d6265720110244163636f756e7449640100000c0128637265617465645f617410012c426c6f636b4e756d62657200011c6d6164655f62790001244163636f756e744964000108696471030128536e617073686f74496400008d0a082c70616c6c65745f706970731c56657273696f6e0000040008010875380000910a0c2c70616c6c65745f706970731870616c6c6574144572726f720404540001508452657363686564756c654e6f74427952656c65617365436f6f7264696e61746f7200000431014f6e6c79207468652047432072656c6561736520636f6f7264696e61746f7220697320616c6c6f77656420746f2072657363686564756c652070726f706f73616c20657865637574696f6e2e404e6f7446726f6d436f6d6d756e697479000108ec54686520676976656e20646973706174636861626c652063616c6c206973206e6f742076616c696420666f7220746869732070726f706f73616c2ecc5468652070726f706f73616c206d7573742062652066726f6d2074686520636f6d6d756e6974792c206275742069736e27742e384e6f744279436f6d6d6974746565000208ec54686520676976656e20646973706174636861626c652063616c6c206973206e6f742076616c696420666f7220746869732070726f706f73616c2ec45468652070726f706f73616c206d7573742062652066726f6d206120636f6d6d69747465652c206275742069736e27742e44546f6f4d616e794163746976655069707300030831015468652063757272656e74206e756d626572206f6620616374697665202870656e64696e67206f72207363686564756c6564292050495073206578636565647320746865206d6178696d756d9c616e64207468652070726f706f73616c206973206e6f74206279206120636f6d6d69747465652e40496e636f72726563744465706f736974000404bc50726f706f7365722073706563696669657320616e20696e636f7272656374206465706f73697420616d6f756e742e4c496e73756666696369656e744465706f736974000504cc50726f706f7365722063616e6e6f74206166666f726420746f206c6f636b20746865206d696e696d756d206465706f7369742e384e6f5375636850726f706f73616c000604705468652070726f706f73616c20646f6573206e6f742065786973742e4c4e6f7441436f6d6d69747465654d656d626572000704dc5468652063616c6c6572206973206e6f742061206d656d626572206f662074686520676f7665726e616e636520636f6d6d69747465652e60496e76616c6964467574757265426c6f636b4e756d62657200080405015468652073706563696669656420626c6f636b206e756d626572206973206c657373207468616e207468652063757272656e7420626c6f636b206e756d6265722e544e756d6265724f66566f7465734578636565646564000904b8546865206e756d626572206f6620766f74657320657863656564732074686520616c6c6f776564206c696d69742e685374616b65416d6f756e744f66566f7465734578636565646564000a04d4546865207374616b6520616d6f756e74206f66206120766f746520657863656564732074686520616c6c6f776564206c696d69742e584d697373696e6743757272656e744964656e74697479000b046c5468652063757272656e7420444944206973206d697373696e672e58496e636f727265637450726f706f73616c5374617465000c0415015468652070726f706f73616c206973206e6f7420696e2074686520636f727265637420737461746520666f722074686520726571756573746564206f7065726174696f6e2e3443616e6e6f74536b6970506970000d04fc5768656e20656e616374696e6720736e617073686f7420726573756c74732c20616e20756e736b69707061626c65205049502077617320736b69707065642e58536e617073686f74526573756c74546f6f4c61726765000e041501547269656420746f20656e61637420726573756c747320666f722074686520736e617073686f74207175657565206f766572666c6f77696e6720697473206c656e6774682e48536e617073686f7449644d69736d61746368000f046901547269656420746f20656e61637420726573756c7420666f7220504950207769746820616e20494420646966666572656e742066726f6d20746861742061742074686520706f736974696f6e20696e207468652071756575652e705363686564756c656450726f706f73616c446f65736e744578697374001004fc457865637574696f6e206f662061207363686564756c65642070726f706f73616c206661696c65642062656361757365206974206973206d697373696e672e6c50726f706f73616c4e6f74496e5363686564756c65645374617465001104fc412070726f706f73616c2074686174206973206e6f7420696e2061207363686564756c65642073746174652063616e6e6f742062652065786563757465642e30496e76616c696450697049640012040101496e76616c6964205049502049442e2050697020696420776173206e6f7420657870656374656420746f20626520696e20746865206c6976652071756575652e3c496e76616c69645461736b4e616d65001304805461736b4e616d652063616e6e6f74206578636565642033322062797465732e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e950a000004089cf800990a000004089c9503009d0a00000408f0b000a10a000004089cf000a50a00000408f0a90a00a90a00000408b0ad0300ad0a0c4070616c6c65745f706f7274666f6c696f1870616c6c65741c56657273696f6e0000040008010875380000b10a0c4070616c6c65745f706f7274666f6c696f1870616c6c6574144572726f7204045400015454506f7274666f6c696f446f65734e6f7445786973740000047054686520706f7274666f6c696f20646f65736e27742065786973742e70496e73756666696369656e74506f7274666f6c696f42616c616e63650001049c496e73756666696369656e742062616c616e636520666f722061207472616e73616374696f6e2e6844657374696e6174696f6e497353616d65506f7274666f6c696f000204e854686520736f7572636520616e642064657374696e6174696f6e20706f7274666f6c696f732073686f756c6420626520646966666572656e742e64506f7274666f6c696f4e616d65416c7265616479496e557365000304310154686520706f7274666f6c696f20636f756c646e27742062652072656e616d65642062656361757365207468652063686f73656e206e616d6520697320616c726561647920696e207573652e945365636f6e646172794b65794e6f74417574686f72697a6564466f72506f7274666f6c696f000404fc546865207365636f6e64617279206b6579206973206e6f7420617574686f72697a656420746f206163636573732074686520706f7274666f6c696f2873292e54556e617574686f72697a6564437573746f6469616e000504f454686520706f72666f6c696f277320637573746f6479206973207769746820736f6d656f6e65206f74686572207468616e207468652063616c6c65722e60496e73756666696369656e74546f6b656e734c6f636b6564000604bc43616e206e6f7420756e6c6f636b206d6f726520746f6b656e73207468616e207768617420617265206c6f636b656444506f7274666f6c696f4e6f74456d707479000704bc54686520706f7274666f6c696f207374696c6c2068617320736f6d652061737365742062616c616e6365206c6566746c446966666572656e744964656e74697479506f7274666f6c696f73000804b454686520706f7274666f6c696f732062656c6f6e6720746f20646966666572656e74206964656e746974696573604e6f4475706c6963617465417373657473416c6c6f776564000904804475706c696361746520617373657420616d6f6e6720746865206974656d732e584e46544e6f74466f756e64496e506f7274666f6c696f000a04a0546865204e465420646f6573206e6f7420657869737420696e2074686520706f7274666f6c696f2e404e4654416c72656164794c6f636b6564000b0468546865204e465420697320616c7265616479206c6f636b65642e304e46544e6f744c6f636b6564000c0478546865204e465420686173206e65766572206265656e206c6f636b65642e68496e76616c69645472616e736665724e46544e6f744f776e6564000d04c04f6e6c79206f776e6564204e4654732063616e206265206d6f766564206265747765656e20706f7274666f6c696f732e68496e76616c69645472616e736665724e465449734c6f636b6564000e04c04c6f636b6564204e4654732063616e206e6f74206265206d6f766564206265747765656e20706f7274666f6c696f732e34456d7074795472616e73666572000f04a0547279696e6720746f206d6f766520616e20616d6f756e74206f66207a65726f206173736574732e5c4d697373696e674f776e6572735065726d697373696f6e00100439015468652063616c6c657220646f65736e27742068617665207065726d697373696f6e20746f2063726561746520706f7274666f6c696f73206f6e20746865206f776e6572277320626568616c662ea0496e76616c69645472616e7366657253656e64657249644d61746368657352656365697665724964001104fc5468652073656e646572206964656e746974792063616e2774206265207468652073616d6520617320746865207265636569766572206964656e746974792e5853656c664164646974696f6e4e6f74416c6c6f776564001204d8416464696e6720697473656c6620617320616e20416c6c6f776564437573746f6469616e206973206e6f74207065726d69747465642e50426164417574686f72697a6174696f6e547970650013046d015468652065787472696e736963206578706563746564206120646966666572656e742060417574686f72697a6174696f6e5479706560207468616e2077686174207468652060646174612e617574685f747970652829602069732e9444656661756c74506f7274666f6c696f7343616e6e6f7448617665437573746f6469616e73001404a844656661756c7420706f7274666f6c696f732063616e6e6f74206861766520637573746f6469616e732e048054686520604572726f726020656e756d206f6620746869732070616c6c65742eb50a0c4c70616c6c65745f70726f746f636f6c5f6665651870616c6c6574144572726f7204045400010c68496e73756666696369656e744163636f756e7442616c616e6365000004b0496e73756666696369656e74206163636f756e742062616c616e636520746f2070617920746865206665652e4c556e48616e646c6564496d62616c616e636573000104884e6f742061626c6520746f2068616e646c65642074686520696d62616c616e63657368496e73756666696369656e745375627369647942616c616e6365000204b0496e73756666696369656e7420737562736964792062616c616e636520746f2070617920746865206665652e048054686520604572726f726020656e756d206f6620746869732070616c6c65742eb90a0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401bd0a045300000400d10a01185665633c543e0000bd0a04184f7074696f6e04045401c10a0108104e6f6e6500000010536f6d650400c10a0000010000c10a084070616c6c65745f7363686564756c6572245363686564756c656414104e616d6501041043616c6c01c50a2c426c6f636b4e756d62657201103450616c6c6574734f726967696e01a507244163636f756e7449640100001401206d617962655f6964c10301304f7074696f6e3c4e616d653e0001207072696f726974790801487363686564756c653a3a5072696f7269747900011063616c6cc50a011043616c6c0001386d617962655f706572696f646963390701944f7074696f6e3c7363686564756c653a3a506572696f643c426c6f636b4e756d6265723e3e0001186f726967696ea507013450616c6c6574734f726967696e0000c50a10346672616d655f737570706f72741874726169747324707265696d616765731c426f756e646564080454013906044801c90a010c184c656761637904011068617368340124483a3a4f757470757400000018496e6c696e650400cd0a0134426f756e646564496e6c696e65000100184c6f6f6b757008011068617368340124483a3a4f757470757400010c6c656e10010c75333200020000c90a0c2873705f72756e74696d65187472616974732c426c616b6554776f32353600000000cd0a0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401080453000004003801185665633c543e0000d10a000002bd0a00d50a084070616c6c65745f7363686564756c65722c5265747279436f6e6669670418506572696f640110000c0134746f74616c5f72657472696573080108753800012472656d61696e696e670801087538000118706572696f64100118506572696f640000d90a0c4070616c6c65745f7363686564756c65721870616c6c6574144572726f72040454000114404661696c6564546f5363686564756c65000004644661696c656420746f207363686564756c6520612063616c6c204e6f74466f756e640001047c43616e6e6f742066696e6420746865207363686564756c65642063616c6c2e5c546172676574426c6f636b4e756d626572496e50617374000204a4476976656e2074617267657420626c6f636b206e756d62657220697320696e2074686520706173742e4852657363686564756c654e6f4368616e6765000304f052657363686564756c65206661696c6564206265636175736520697420646f6573206e6f74206368616e6765207363686564756c65642074696d652e144e616d6564000404d0417474656d707420746f207573652061206e6f6e2d6e616d65642066756e6374696f6e206f6e2061206e616d6564207461736b2e048054686520604572726f726020656e756d206f6620746869732070616c6c65742edd0a0c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e741456656e7565000008011c63726561746f729c01284964656e74697479496400012876656e75655f74797065d103012456656e7565547970650000e10a00000408c903790200e50a00000408c9030000e90a000004089cc90300ed0a0c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e742c496e737472756374696f6e08184d6f6d656e7401302c426c6f636b4e756d626572011000180138696e737472756374696f6e5f696479020134496e737472756374696f6e496400012076656e75655f6964e503013c4f7074696f6e3c56656e756549643e00013c736574746c656d656e745f74797065e903016c536574746c656d656e74547970653c426c6f636b4e756d6265723e000128637265617465645f61740d0101384f7074696f6e3c4d6f6d656e743e00012874726164655f646174650d0101384f7074696f6e3c4d6f6d656e743e00012876616c75655f646174650d0101384f7074696f6e3c4d6f6d656e743e0000f10a000004087902d50300f50a0c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e74244c656753746174757304244163636f756e7449640100010c4050656e64696e67546f6b656e4c6f636b00000040457865637574696f6e50656e64696e6700010050457865637574696f6e546f4265536b697070656408000001244163636f756e744964000030010c75363400020000f90a000004087902f000fd0a0c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e744441666669726d6174696f6e53746174757300010c1c556e6b6e6f776e0000001c50656e64696e670001002041666669726d656400020000010b00000408f0790200050b00000408b0c90300090b0c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e7444496e737472756374696f6e537461747573042c426c6f636b4e756d626572011001181c556e6b6e6f776e0000001c50656e64696e67000100184661696c65640002001c53756363657373040010012c426c6f636b4e756d6265720003002052656a6563746564040010012c426c6f636b4e756d626572000400484c6f636b6564466f72457865637574696f6e000500000d0b0000040879029c00110b0c4c706f6c796d6573685f7072696d69746976657328736574746c656d656e74644d65646961746f7241666669726d6174696f6e5374617475730404540130010c1c556e6b6e6f776e0000001c50656e64696e670001002041666669726d65640401186578706972790d0101244f7074696f6e3c543e00020000150b0c4470616c6c65745f736574746c656d656e741870616c6c65741c56657273696f6e0000040008010875380000190b0c4470616c6c65745f736574746c656d656e741870616c6c6574144572726f720404540001cc30496e76616c696456656e75650000045456656e756520646f6573206e6f742065786973742e30556e617574686f72697a6564000104a853656e64657220646f6573206e6f742068617665207265717569726564207065726d697373696f6e732e58496e737472756374696f6e4e6f7441666669726d656400020488496e737472756374696f6e20686173206e6f74206265656e2061666669726d65642e48556e617574686f72697a65645369676e6572000304985369676e6572206973206e6f7420617574686f72697a6564206279207468652076656e75652e5452656365697074416c7265616479436c61696d6564000404545265636569707420616c726561647920757365642e44556e617574686f72697a656456656e7565000504a456656e756520646f6573206e6f742068617665207265717569726564207065726d697373696f6e732e5c496e737472756374696f6e4461746573496e76616c696400060474496e737472756374696f6e2068617320696e76616c696420646174657370496e737472756374696f6e536574746c65426c6f636b506173736564000704a8496e737472756374696f6e27732074617267657420736574746c6520626c6f636b20726561636865642e40496e76616c69645369676e6174757265000804784f6666636861696e207369676e617475726520697320696e76616c69642e4853616d6553656e64657252656365697665720009048453656e64657220616e6420726563656976657220617265207468652073616d652e44536574746c654f6e50617374426c6f636b000a0461015468652070726f766964656420736574746c656d656e7420626c6f636b206e756d62657220697320696e20746865207061737420616e642063616e6e6f74206265207573656420627920746865207363686564756c65722e6c556e657870656374656441666669726d6174696f6e537461747573000b0445015468652063757272656e7420696e737472756374696f6e2061666669726d6174696f6e2073746174757320646f6573206e6f7420737570706f7274207468652072657175657374656420616374696f6e2e404661696c6564546f5363686564756c65000c048c5363686564756c696e67206f6620616e20696e737472756374696f6e206661696c732e48556e6b6e6f776e496e737472756374696f6e000d0474496e737472756374696f6e2073746174757320697320756e6b6e6f776e4c5369676e6572416c7265616479457869737473000e04845369676e657220697320616c726561647920616464656420746f2076656e75652e485369676e6572446f65734e6f744578697374000f04745369676e6572206973206e6f7420616464656420746f2076656e75652e285a65726f416d6f756e7400100494496e737472756374696f6e206c656720616d6f756e742063616e2774206265207a65726f2e80496e737472756374696f6e536574746c65426c6f636b4e6f7452656163686564001104d8496e737472756374696f6e20736574746c656d656e7420626c6f636b20686173206e6f7420796574206265656e20726561636865642e4443616c6c657249734e6f74415061727479001204b85468652063616c6c6572206973206e6f742061207061727479206f66207468697320696e737472756374696f6e2e5c4d61784e756d6265724f664e46547345786365656465640013041501546865206e756d626572206f66206e667473206265696e67207472616e7366657272656420696e2074686520696e737472756374696f6e207761732065786365656465642e944e756d6265724f665472616e736665727265644e465473556e646572657374696d61746564001404f854686520676976656e206e756d626572206f66206e667473206265696e67207472616e736665727265642077617320756e646572657374696d617465642e6052656365697074466f72496e76616c69644c656754797065001504ec4f66662d636861696e2072656365697074732063616e206f6e6c79206265207573656420666f72206f66662d636861696e206c656720747970652e4c5765696768744c696d697445786365656465640016040501546865206d6178696d756d20776569676874206c696d697420666f7220657865637574696e67207468652066756e6374696f6e207761732065786365656465642e844d61784e756d6265724f6646756e6769626c654173736574734578636565646564001704cc546865206d6178696d756d206e756d626572206f662066756e6769626c6520617373657473207761732065786365656465642e844d61784e756d6265724f664f6666436861696e4173736574734578636565646564001804d0546865206d6178696d756d206e756d626572206f66206f66662d636861696e20617373657473207761732065786365656465642e9c4e756d6265724f6646756e6769626c655472616e7366657273556e646572657374696d61746564001904e854686520676976656e206e756d626572206f662066756e6769626c65207472616e73666572732077617320756e646572657374696d617465642e5c556e65787065637465644f4646436861696e4173736574001a04904173736574496420636f756c64206e6f7420626520666f756e64206f6e20636861696e2e644f6666436861696e417373657443616e7442654c6f636b6564001b04884f66662d436861696e206173736574732063616e6e6f74206265206c6f636b65642e9c4e756d6265724f664f6666436861696e5472616e7366657273556e646572657374696d61746564001c04ec54686520676976656e206e756d626572206f66206f66662d636861696e207472616e73666572732077617320756e646572657374696d617465642e2c4c65674e6f74466f756e64001d04884e6f206c656720776974682074686520676976656e2069642077617320666f756e6470496e70757457656967687449734c6573735468616e4d696e696d756d001e04cc54686520696e70757420776569676874206973206c657373207468616e20746865206d696e696d756d2072657175697265642e6c4d61784e756d6265724f6652656365697074734578636565646564001f04b0546865206d6178696d756d206e756d626572206f66207265636569707473207761732065786365656465642e884e6f74416c6c41666669726d6174696f6e73486176654265656e5265636569766564002004e054686572652061726520706172746965732077686f2068617665206e6f742061666669726d65642074686520696e737472756374696f6e2e90496e76616c6964496e737472756374696f6e537461747573466f72457865637574696f6e00210489014f6e6c79205b60496e737472756374696f6e5374617475733a3a50656e64696e67605d206f72205b60496e737472756374696f6e5374617475733a3a4661696c6564605d20696e737472756374696f6e732063616e2062652065786563757465642e8c4661696c6564546f52656c656173654c6f636b4f725472616e73666572417373657473002204150154686520696e737472756374696f6e206661696c656420746f2072656c65617365206173736574206c6f636b73206f72207472616e7366657220746865206173736574732e4c4475706c696361746552656365697074556964002304d04e6f206475706c6963617465207569642061726520616c6c6f77656420666f7220646966666572656e742072656365697074732e7452656365697074496e737472756374696f6e49644d6973736d61746368002404190154686520696e737472756374696f6e20696420696e20616c6c207265636569707473206d757374206d61746368207468652065787472696e73696320706172616d657465722e644d756c7469706c655265636569707473466f724f6e654c6567002504cc4d756c7469706c6520726563656970747320666f72207468652073616d65206c656720617265206e6f7420616c6c6f7765642e4c556e65787065637465644c656753746174757300260470416e20696e76616c696420686173206265656e20726561636865642e704e756d6265724f6656656e75655369676e6572734578636565646564002704c4546865206d6178696d756d206e756d626572206f662076656e7565207369676e657273207761732065786365656465642e5043616c6c657249734e6f74414d65646961746f72002804c05468652063616c6c6572206973206e6f742061206d65646961746f7220696e2074686520696e737472756374696f6e2e44496e76616c696445787069727944617465002904c4546865206d65646961746f722773206578706972792064617465206d75737420626520696e20746865206675747572652e684d65646961746f7241666669726d6174696f6e45787069726564002a04e854686520657870697279206461746520666f7220746865206d65646961746f7227732061666669726d6174696f6e20686173207061737365642e704f6666436861696e4173736574734d757374486176654156656e7565002b04884f6666636861696e20617373657473206d757374206861766520612076656e75652e60556e6578706563746564536574746c656d656e7454797065002c046c556e657870656374656420736574746c656d656e7420747970652e90496e76616c6964496e737472756374696f6e537461747573466f7252656a656374696f6e002d04c05b60496e737472756374696f6e5374617475733a3a556e6b6e6f77605d2063616e27742062652072656a65637465642e544c6f636b54696d657374616d704e6f74466f756e64002e04dc416c6c206c6f636b656420696e737472756374696f6e73206d7573742072656769737465722061206c6f636b2074696d657374616d702e7045786365656465644d6178696d756d4c6f636b696e67506572696f64002f04c854686520696e737472756374696f6e20686173206265656e206c6f636b656420666f7220746f6f206d7563682074696d652e844661696c656441737365745472616e7366657272696e67436f6e646974696f6e73003004f04e6f7420616c6c20636f6e646974696f6e7320666f72207472616e7366657272696e67207468652061737365742068617665206265656e206d65742e94496e76616c6964496e737472756374696f6e537461747573466f725769746864726177616c003104d84c6f636b656420696e737472756374696f6e732063616e277420686176652061666669726d6174696f6e732077697468647261776e2e3c496e76616c69645461736b4e616d65003204805461736b4e616d652063616e6e6f74206578636565642033322062797465732e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e1d0b0c4c626f756e6465645f636f6c6c656374696f6e7344626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401fd030453000004006d07012c42547265655365743c543e0000210b00000408250b150400250b0c4c706f6c796d6573685f7072696d697469766573287374617469737469637328537461743173744b6579000008012061737365745f6964b0011c41737365744964000124737461745f74797065fd03012053746174547970650000290b0c4c706f6c796d6573685f7072696d6974697665734c7472616e736665725f636f6d706c69616e63655c41737365745472616e73666572436f6d706c69616e63650404530000080118706175736564200110626f6f6c000130726571756972656d656e74732d0b0194426f756e64656442547265655365743c5472616e73666572436f6e646974696f6e2c20533e00002d0b0c4c626f756e6465645f636f6c6c656374696f6e7344626f756e6465645f62747265655f7365743c426f756e64656442547265655365740804540129040453000004007507012c42547265655365743c543e0000310b000004082d049c00350b084470616c6c65745f737461746973746963731c56657273696f6e0000040008010875380000390b0c4470616c6c65745f737461746973746963731870616c6c6574144572726f7204045400011c80496e76616c69645472616e73666572537461746973746963734661696c757265000004d4496e76616c6964207472616e73666572205b605472616e73666572436f6e646974696f6e605d206e6f74207265737065637465642e3c53746174547970654d697373696e67000104605374617454797065206973206e6f7420656e61626c65642e8453746174547970654e656564656442795472616e73666572436f6e646974696f6e000204a05374617454797065206973206e6565646564206279205472616e73666572436f6e646974696f6e2e6443616e6e6f7452656d6f76655374617454797065496e557365000304a84120537461747479706520697320696e2075736520616e642063616e27742062652072656d6f7665642e5053746174547970654c696d697452656163686564000404f4546865206c696d6974206f662053746174547970657320616c6c6f77656420666f7220616e20617373657420686173206265656e20726561636865642e745472616e73666572436f6e646974696f6e4c696d6974526561636865640005041901546865206c696d6974206f66205472616e73666572436f6e646974696f6e7320616c6c6f77656420666f7220616e20617373657420686173206265656e20726561636865642e4c5765696768744c696d697445786365656465640006040501546865206d6178696d756d20776569676874206c696d697420666f7220657865637574696e67207468652066756e6374696f6e207761732065786365656465642e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e3d0b00000408b0390400410b082870616c6c65745f73746f1c56657273696f6e0000040008010875380000450b0c2870616c6c65745f73746f1870616c6c6574144572726f7204045400013830556e617574686f72697a6564000004190153656e64657220646f6573206e6f742068617665207265717569726564207065726d697373696f6e7320666f722074686520726571756573746564206f7065726174696f6e2e204f766572666c6f77000104e8416e2061726974686d65746963206f7065726174696f6e20726573756c74656420696e206f766572666c6f77206f7220756e646572666c6f772e6c496e73756666696369656e74546f6b656e7352656d61696e696e6700020439015468652066756e6472616973657220646f6573206e6f74206861766520656e6f75676820746f6b656e732072656d61696e696e6720746f2066756c66696c2074686520696e766573746d656e742e4846756e647261697365724e6f74466f756e64000304f0546865207370656369666965642066756e6472616973657220646f6573206e6f7420657869737420666f722074686520676976656e2061737365742e4446756e647261697365724e6f744c69766500040405015468652066756e64726169736572206973206e6f7420696e2061206c69766520737461746520286569746865722066726f7a656e206f722073746f70706564292e4046756e64726169736572436c6f736564000504d85468652066756e6472616973657220686173206265656e207065726d616e656e746c7920636c6f736564206f722073746f707065642e4446756e64726169736572457870697265640006041d01417474656d7074696e6720746f20696e746572616374207769746820612066756e647261697365722061667465722069747320656e642074696d6520686173207061737365642e30496e76616c696456656e756500070435015468652070726f76696465642076656e756520697320696e76616c69642028646f6573206e6f742065786973742c2077726f6e6720747970652c206f722077726f6e672063726561746f72292e44496e76616c6964507269636554696572730008044d014f6e65206f72206d6f7265207072696365207469657273206861766520696e76616c696420706172616d657465727320287a65726f20746f74616c2c20746f6f206d616e792074696572732c206574632e292e54496e76616c69644f66666572696e6757696e646f7700090439015468652066756e647261697365722074696d652077696e646f772068617320696e76616c696420706172616d6574657273202873746172742074696d6520616674657220656e642074696d65292e404d617850726963654578636565646564000a044d015468652063616c63756c617465642070726963652070657220746f6b656e206578636565647320746865206d6178696d756d207072696365207370656369666965642062792074686520696e766573746f722e58496e766573746d656e74416d6f756e74546f6f4c6f77000b04510154686520696e766573746d656e7420616d6f756e742069732062656c6f7720746865206d696e696d756d20696e766573746d656e74207468726573686f6c6420666f7220746869732066756e647261697365722e40496e76616c69645369676e6174757265000c041101546865206f66662d636861696e2072656365697074207369676e617475726520697320696e76616c6964206f7220636f756c64206e6f742062652076657269666965642e644f6666636861696e46756e64696e674e6f74416c6c6f776564000d04ec4f66662d636861696e2066756e64696e6720686173206e6f74206265656e20656e61626c656420666f7220746869732066756e647261697365722e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e490b0c3c70616c6c65745f74726561737572791870616c6c6574144572726f720404540001084c496e73756666696369656e7442616c616e63650000047850726f706f73657227732062616c616e636520697320746f6f206c6f772e3c496e76616c69644964656e7469747900010488496e76616c6964206964656e7469747920666f722064697362757273656d656e742e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e4d0b0c3870616c6c65745f7574696c6974791870616c6c6574144572726f7204045400011430546f6f4d616e7943616c6c730000045c546f6f206d616e792063616c6c7320626174636865642e40496e76616c69645369676e6174757265000108744f6666636861696e207369676e617475726520697320696e76616c696438504f4c594d455348206572726f72405461726765744364644d697373696e670002088054617267657420646f6573206e6f74206861766520612076616c69642043444438504f4c594d455348206572726f7230496e76616c69644e6f6e63650003106850726f7669646564206e6f6e63652077617320696e76616c696411014966207468652070726f7669646564206e6f6e6365203c2063757272656e74206e6f6e63652c207468652063616c6c2077617320616c72656164792065786563757465645d014966207468652070726f7669646564206e6f6e6365203e2063757272656e74206e6f6e63652c207468652063616c6c287329206265666f7265207468652063757272656e74206661696c656420746f206578656375746538504f4c594d455348206572726f725c556e61626c65546f4465726976654163636f756e744964000404984465636f64696e672064657269766174697665206163636f756e74204964206661696c65642e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e510b0c2c70616c6c65745f626173651870616c6c6574144572726f720404540001081c546f6f4c6f6e6700000880457863656564656420612067656e65726963206c656e677468206c696d69742e1d01546865206c696d697420636f756c6420626520666f7220616e7920736f7274206f66206c69737473206f66207468696e67732c20696e636c7564696e67206120737472696e672e3c436f756e7465724f766572666c6f77000118b85468652073657175656e636520636f756e74657220666f7220736f6d657468696e67206f766572666c6f7765642e001d015768656e20746869732068617070656e7320646570656e6473206f6e20652e672e2c20746865206361706163697479206f6620746865206964656e74696669657220747970652e3901466f72206578616d706c652c207765206d69676874206861766520607075622073747275637420506970496428753332293b602c207769746820607533323a3a4d4158602063617061636974792e5901496e2070726163746963652c207468657365206572726f72732077696c6c206e657665722068617070656e20627574206e6f20636f646520706174682073686f756c6420726573756c7420696e20612070616e69632cfc736f20746865736520636f726e6572206361736573206e65656420746f20626520636f7665726564207769746820616e206572726f722076617269616e742e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e550b00000408b0410100590b0c5870616c6c65745f65787465726e616c5f6167656e74731870616c6c65741c56657273696f6e00000400080108753800005d0b0c5870616c6c65745f65787465726e616c5f6167656e74731870616c6c6574144572726f7204045400011c204e6f537563684147000004f0416e20414720776974682074686520676976656e2060414749646020646964206e6f7420657869737420666f7220746865206041737365744964602e44556e617574686f72697a65644167656e74000104e8546865206167656e74206973206e6f7420617574686f72697a656420746f2063616c6c207468652063757272656e742065787472696e7369632e38416c7265616479416e4167656e74000204ec5468652070726f766964656420606167656e746020697320616c726561647920616e206167656e7420666f7220746865206041737365744964602e284e6f74416e4167656e74000304dc5468652070726f766964656420606167656e7460206973206e6f7420616e206167656e7420666f7220746865206041737365744964602e5452656d6f76696e674c61737446756c6c4167656e74000408e054686973206167656e7420697320746865206c6173742066756c6c206f6e652c20616e642069742773206265696e672072656d6f7665642c686d616b696e6720746865206173736574206f727068616e65642e845365636f6e646172794b65794e6f74417574686f72697a6564466f7241737365740005041d015468652063616c6c65722773207365636f6e64617279206b657920646f6573206e6f74206861766520746865207265717569726564206173736574207065726d697373696f6e2e50426164417574686f72697a6174696f6e547970650006046d015468652065787472696e736963206578706563746564206120646966666572656e742060417574686f72697a6174696f6e5479706560207468616e2077686174207468652060646174612e617574685f747970652829602069732e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e610b0c3870616c6c65745f72656c617965721870616c6c65741c53756273696479040c416363010000080128706179696e675f6b657900010c41636300012472656d61696e696e6718011c42616c616e63650000650b0c3870616c6c65745f72656c617965721870616c6c6574144572726f7204045400012044557365724b65794364644d697373696e67000004cc5468652060757365725f6b657960206973206e6f7420617474616368656420746f2061204344442764206964656e746974792e4c506179696e674b65794364644d697373696e67000104cc5468652060757365725f6b657960206973206e6f7420617474616368656420746f2061204344442764206964656e746974792e2c4e6f506179696e674b6579000204ac5468652060757365725f6b65796020646f65736e2774206861766520612060706179696e675f6b6579602e304e6f74506179696e674b6579000304b05468652060757365725f6b65796020686173206120646966666572656e742060706179696e675f6b6579602e644e6f74417574686f72697a6564466f72506179696e674b6579000404b8546865207369676e6572206973206e6f7420617574686f72697a656420666f722060706179696e675f6b6579602e5c4e6f74417574686f72697a6564466f72557365724b6579000504b0546865207369676e6572206973206e6f7420617574686f72697a656420666f722060757365725f6b6579602e204f766572666c6f77000604b85468652072656d61696e696e6720504f4c595820666f722060757365725f6b657960206f766572666c6f7765642e50426164417574686f72697a6174696f6e547970650007046d015468652065787472696e736963206578706563746564206120646966666572656e742060417574686f72697a6174696f6e5479706560207468616e2077686174207468652060646174612e617574685f747970652829602069732e048054686520604572726f726020656e756d206f6620746869732070616c6c65742e690b0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401080453000004003801185665633c543e00006d0b0c4070616c6c65745f636f6e747261637473107761736d20436f6465496e666f04045400001401146f776e65720001384163636f756e7449644f663c543e00011c6465706f736974c901013042616c616e63654f663c543e000120726566636f756e742c010c75363400012c64657465726d696e69736dcd07012c44657465726d696e69736d000120636f64655f6c656e10010c7533320000710b0c4070616c6c65745f636f6e7472616374731c73746f7261676530436f6e7472616374496e666f040454000020011c747269655f6964cd0a0118547269654964000124636f64655f6861736834012c436f6465486173683c543e00013473746f726167655f627974657310010c75333200013473746f726167655f6974656d7310010c75333200015073746f726167655f627974655f6465706f73697418013042616c616e63654f663c543e00015073746f726167655f6974656d5f6465706f73697418013042616c616e63654f663c543e00015073746f726167655f626173655f6465706f73697418013042616c616e63654f663c543e00015464656c65676174655f646570656e64656e63696573750b011d01426f756e64656442547265654d61703c436f6465486173683c543e2c2042616c616e63654f663c543e2c20543a3a0a4d617844656c6567617465446570656e64656e636965733e0000750b0c4c626f756e6465645f636f6c6c656374696f6e7344626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b013404560118045300000400790b013842547265654d61703c4b2c20563e0000790b042042547265654d617008044b0134045601180004007d0b0000007d0b000002810b00810b00000408341800850b0c4070616c6c65745f636f6e7472616374731c73746f726167655044656c6574696f6e51756575654d616e616765720404540000080138696e736572745f636f756e74657210010c75333200013864656c6574655f636f756e74657210010c7533320000890b0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401080453000004003801185665633c543e00008d0b0c4070616c6c65745f636f6e747261637473207363686564756c65205363686564756c6504045400000801186c696d697473910b01184c696d69747300014c696e737472756374696f6e5f77656967687473950b0154496e737472756374696f6e576569676874733c543e0000910b0c4070616c6c65745f636f6e747261637473207363686564756c65184c696d69747300001c01306576656e745f746f7069637310010c7533320001306d656d6f72795f706167657310010c75333200012c7375626a6563745f6c656e10010c75333200012c7061796c6f61645f6c656e10010c75333200013872756e74696d655f6d656d6f727910010c75333200016076616c696461746f725f72756e74696d655f6d656d6f727910010c7533320001386576656e745f7265665f74696d6530010c7536340000950b0c4070616c6c65745f636f6e747261637473207363686564756c6548496e737472756374696f6e5765696768747304045400000401106261736510010c7533320000990b084070616c6c65745f636f6e7472616374732c456e7669726f6e6d656e7404045400001801286163636f756e745f69649d0b017c456e7669726f6e6d656e74547970653c4163636f756e7449644f663c543e3e00011c62616c616e6365a10b0174456e7669726f6e6d656e74547970653c42616c616e63654f663c543e3e00011068617368a50b01c8456e7669726f6e6d656e74547970653c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a486173683e000118686173686572a90b01d4456e7669726f6e6d656e74547970653c3c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a48617368696e673e00012474696d657374616d70ad0b0170456e7669726f6e6d656e74547970653c4d6f6d656e744f663c543e3e000130626c6f636b5f6e756d626572b10b0188456e7669726f6e6d656e74547970653c426c6f636b4e756d626572466f723c543e3e00009d0b084070616c6c65745f636f6e7472616374733c456e7669726f6e6d656e74547970650404540100000000a10b084070616c6c65745f636f6e7472616374733c456e7669726f6e6d656e74547970650404540118000000a50b084070616c6c65745f636f6e7472616374733c456e7669726f6e6d656e74547970650404540134000000a90b084070616c6c65745f636f6e7472616374733c456e7669726f6e6d656e745479706504045401c90a000000ad0b084070616c6c65745f636f6e7472616374733c456e7669726f6e6d656e74547970650404540130000000b10b084070616c6c65745f636f6e7472616374733c456e7669726f6e6d656e74547970650404540110000000b50b084070616c6c65745f636f6e7472616374732841706956657273696f6e000004004d03010c7531360000b90b0c4070616c6c65745f636f6e7472616374731870616c6c6574144572726f720404540001943c496e76616c69645363686564756c650000041901496e76616c6964207363686564756c6520737570706c6965642c20652e672e2077697468207a65726f20776569676874206f662061206261736963206f7065726174696f6e2e40496e76616c696443616c6c466c6167730001043501496e76616c696420636f6d62696e6174696f6e206f6620666c61677320737570706c69656420746f20607365616c5f63616c6c60206f7220607365616c5f64656c65676174655f63616c6c602e204f75744f66476173000204b854686520657865637574656420636f6e7472616374206578686175737465642069747320676173206c696d69742e504f7574707574427566666572546f6f536d616c6c0003040101546865206f75747075742062756666657220737570706c69656420746f206120636f6e7472616374204150492063616c6c2077617320746f6f20736d616c6c2e385472616e736665724661696c65640004083501506572666f726d696e672074686520726571756573746564207472616e73666572206661696c65642e2050726f6261626c7920626563617573652074686572652069736e277420656e6f75676894667265652062616c616e636520696e207468652073656e6465722773206163636f756e742e4c4d617843616c6c4465707468526561636865640005082101506572666f726d696e6720612063616c6c207761732064656e6965642062656361757365207468652063616c6c696e67206465707468207265616368656420746865206c696d6974946f6620776861742069732073706563696669656420696e20746865207363686564756c652e40436f6e74726163744e6f74466f756e64000604bc4e6f20636f6e74726163742077617320666f756e64206174207468652073706563696669656420616464726573732e30436f6465546f6f4c617267650007083d0154686520636f646520737570706c69656420746f2060696e7374616e74696174655f776974685f636f646560206578636565647320746865206c696d69742073706563696669656420696e207468654463757272656e74207363686564756c652e30436f64654e6f74466f756e64000804c44e6f20636f646520636f756c6420626520666f756e642061742074686520737570706c69656420636f646520686173682e40436f6465496e666f4e6f74466f756e64000904d84e6f20636f646520696e666f20636f756c6420626520666f756e642061742074686520737570706c69656420636f646520686173682e2c4f75744f66426f756e6473000a0425014120627566666572206f757473696465206f662073616e64626f78206d656d6f7279207761732070617373656420746f206120636f6e7472616374204150492066756e6374696f6e2e384465636f64696e674661696c6564000b042901496e7075742070617373656420746f206120636f6e7472616374204150492066756e6374696f6e206661696c656420746f206465636f646520617320657870656374656420747970652e3c436f6e747261637454726170706564000c0488436f6e7472616374207472617070656420647572696e6720657865637574696f6e2e3456616c7565546f6f4c61726765000d04cc5468652073697a6520646566696e656420696e2060543a3a4d617856616c756553697a6560207761732065786365656465642e605465726d696e617465645768696c655265656e7472616e74000e0819015465726d696e6174696f6e206f66206120636f6e7472616374206973206e6f7420616c6c6f776564207768696c652074686520636f6e747261637420697320616c7265616479e06f6e207468652063616c6c20737461636b2e2043616e2062652074726967676572656420627920607365616c5f7465726d696e617465602e38496e707574466f72776172646564000f044101607365616c5f63616c6c6020666f72776172646564207468697320636f6e74726163747320696e7075742e204974207468657265666f7265206973206e6f206c6f6e67657220617661696c61626c652e5052616e646f6d5375626a656374546f6f4c6f6e67001004d8546865207375626a6563742070617373656420746f20607365616c5f72616e646f6d60206578636565647320746865206c696d69742e34546f6f4d616e79546f706963730011041d0154686520616d6f756e74206f6620746f706963732070617373656420746f20607365616c5f6465706f7369745f6576656e747360206578636565647320746865206c696d69742e404e6f436861696e457874656e73696f6e00120c450154686520636861696e20646f6573206e6f742070726f76696465206120636861696e20657874656e73696f6e2e2043616c6c696e672074686520636861696e20657874656e73696f6e20726573756c74734d01696e2074686973206572726f722e204e6f74652074686174207468697320757375616c6c79202073686f756c646e27742068617070656e206173206465706c6f79696e67207375636820636f6e7472616374733069732072656a65637465642e3c58434d4465636f64654661696c6564001304844661696c656420746f206465636f6465207468652058434d2070726f6772616d2e444475706c6963617465436f6e7472616374001404c84120636f6e74726163742077697468207468652073616d65204163636f756e74496420616c7265616479206578697374732e5c5465726d696e61746564496e436f6e7374727563746f7200150cb84120636f6e74726163742073656c66206465737472756374656420696e2069747320636f6e7374727563746f722e00d0546869732063616e2062652074726967676572656420627920612063616c6c20746f20607365616c5f7465726d696e617465602e405265656e7472616e636544656e6965640016100d01412063616c6c20747269656420746f20696e766f6b65206120636f6e7472616374207468617420697320666c6167676564206173206e6f6e2d7265656e7472616e742e5d01546865206f6e6c79206f74686572206361757365206973207468617420612063616c6c2066726f6d206120636f6e747261637420696e746f207468652072756e74696d6520747269656420746f2063616c6c206261636b4901696e746f206070616c6c65742d636f6e747261637473602e205468697320776f756c64206d616b65207468652077686f6c652070616c6c6574207265656e7472616e7420776974682072656761726420746fbc636f6e747261637420636f646520657865637574696f6e207768696368206973206e6f7420737570706f727465642e4453746174654368616e676544656e6965640017044d014120636f6e747261637420617474656d7074656420746f20696e766f6b652061207374617465206d6f64696679696e6720415049207768696c65206265696e6720696e20726561642d6f6e6c79206d6f64652e7053746f726167654465706f7369744e6f74456e6f75676846756e647300180421014f726967696e20646f65736e2774206861766520656e6f7567682062616c616e636520746f20706179207468652072657175697265642073746f72616765206465706f736974732e7053746f726167654465706f7369744c696d69744578686175737465640019040d014d6f72652073746f72616765207761732063726561746564207468616e20616c6c6f776564206279207468652073746f72616765206465706f736974206c696d69742e24436f6465496e557365001a044901436f64652072656d6f76616c207761732064656e69656420626563617573652074686520636f6465206973207374696c6c20696e20757365206279206174206c65617374206f6e6520636f6e74726163742e40436f6e74726163745265766572746564001b10250154686520636f6e74726163742072616e20746f20636f6d706c6574696f6e20627574206465636964656420746f20726576657274206974732073746f72616765206368616e6765732e4901506c65617365206e6f746520746861742074686973206572726f72206973206f6e6c792072657475726e65642066726f6d2065787472696e736963732e205768656e2063616c6c6564206469726563746c795d016f72207669612052504320616e20604f6b602077696c6c2062652072657475726e65642e20496e20746869732063617365207468652063616c6c6572206e6565647320746f20696e73706563742074686520666c616773c4746f2064657465726d696e652077686574686572206120726576657273696f6e206861732074616b656e20706c6163652e30436f646552656a6563746564001c20f854686520636f6e7472616374277320636f64652077617320666f756e6420746f20626520696e76616c696420647572696e672076616c69646174696f6e2e004d01546865206d6f7374206c696b656c79206361757365206f662074686973206973207468617420616e20415049207761732075736564207768696368206973206e6f7420737570706f727465642062792074686551016e6f64652e20546869732068617070656e7320696620616e206f6c646572206e6f6465206973207573656420776974682061206e65772076657273696f6e206f6620696e6b212e20547279207570646174696e67a8796f7572206e6f646520746f20746865206e657765737420617661696c61626c652076657273696f6e2e00510141206d6f72652064657461696c6564206572726f722063616e20626520666f756e64206f6e20746865206e6f646520636f6e736f6c65206966206465627567206d657373616765732061726520656e61626c6564a8627920737570706c79696e6720602d6c72756e74696d653a3a636f6e7472616374733d6465627567602e3c496e64657465726d696e6973746963001d042901416e20696e64657465726d696e697374696320636f646520776173207573656420696e206120636f6e746578742077686572652074686973206973206e6f74207065726d69747465642e4c4d6967726174696f6e496e50726f6772657373001e042501412070656e64696e67206d6967726174696f6e206e6565647320746f20636f6d706c657465206265666f7265207468652065787472696e7369632063616e2062652063616c6c65642e504e6f4d6967726174696f6e506572666f726d6564001f040d014d6967726174652064697370617463682063616c6c2077617320617474656d7074656420627574206e6f206d6967726174696f6e2077617320706572666f726d65642e784d617844656c6567617465446570656e64656e6369657352656163686564002004150154686520636f6e747261637420686173207265616368656420697473206d6178696d756d206e756d626572206f662064656c656761746520646570656e64656e636965732e6844656c6567617465446570656e64656e63794e6f74466f756e64002104150154686520646570656e64656e637920776173206e6f7420666f756e6420696e2074686520636f6e747261637427732064656c656761746520646570656e64656e636965732e7c44656c6567617465446570656e64656e6379416c7265616479457869737473002204f854686520636f6e747261637420616c726561647920646570656e6473206f6e2074686520676976656e2064656c656761746520646570656e64656e63792e8443616e6e6f7441646453656c66417344656c6567617465446570656e64656e6379002304290143616e206e6f742061646420612064656c656761746520646570656e64656e637920746f2074686520636f64652068617368206f662074686520636f6e747261637420697473656c662e544f75744f665472616e7369656e7453746f72616765002404ac43616e206e6f7420616464206d6f7265206461746120746f207472616e7369656e742073746f726167652e048054686520604572726f726020656e756d206f6620746869732070616c6c65742ebd0b0c48706f6c796d6573685f636f6e7472616374731870616c6c65741c56657273696f6e0000040008010875380000c10b0c48706f6c796d6573685f636f6e7472616374731870616c6c6574144572726f7204045400013034496e76616c696446756e634964000004a4496e76616c6964206066756e635f6964602070726f76696465642066726f6d20636f6e74726163742e48496e76616c696452756e74696d6543616c6c0001049c4661696c656420746f206465636f646520612076616c6964206052756e74696d6543616c6c602e445265616453746f726167654661696c6564000204fc605265616453746f7261676560206661696c656420746f2077726974652076616c756520696e746f2074686520636f6e74726163742773206275666665722e54446174614c65667441667465724465636f64696e67000304d444617461206c65667420696e20696e707574207768656e206465636f64696e6720617267756d656e7473206f6620612063616c6c2e34496e4c656e546f6f4c617267650004043901496e70757420646174612074686174206120636f6e747261637420706173736564207768656e207573696e672074686520436861696e457874656e73696f6e2077617320746f6f206c617267652e384f75744c656e546f6f4c61726765000504ec4f757470757420646174612072657475726e65642066726f6d2074686520436861696e457874656e73696f6e2077617320746f6f206c617267652e68496e7374616e746961746f72576974684e6f4964656e74697479000608b04120636f6e74726163742077617320617474656d7074656420746f20626520696e7374616e7469617465642c0d01627574206e6f206964656e746974792077617320676976656e20746f206173736f636961746520746865206e657720636f6e74726163742773206b657920776974682e4452756e74696d6543616c6c44656e696564000704cc45787472696e736963206973206e6f7420616c6c6f77656420746f2062652063616c6c656420627920636f6e7472616374732e5043616c6c65724e6f74415072696d6172794b6579000804805468652063616c6c6572206973206e6f742061207072696d617279206b65792e544d697373696e674b65795065726d697373696f6e73000904985365636f6e64617279206b6579207065726d697373696f6e7320617265206d697373696e672e4c496e76616c6964436861696e56657273696f6e000a049c4f6e6c792066757475726520636861696e2076657273696f6e732061726520616c6c6f7765642e4c4e6f5570677261646573537570706f72746564000b04d4546865726520617265206e6f2061706920757067726164657320737570706f7274656420666f722074686520636f6e74726163742e048054686520604572726f726020656e756d206f6620746869732070616c6c65742ec50b083c70616c6c65745f707265696d616765404f6c645265717565737453746174757308244163636f756e74496401001c42616c616e6365011801082c556e72657175657374656408011c6465706f736974f5080150284163636f756e7449642c2042616c616e63652900010c6c656e10010c753332000000245265717565737465640c011c6465706f736974c90b01704f7074696f6e3c284163636f756e7449642c2042616c616e6365293e000114636f756e7410010c75333200010c6c656e8d01012c4f7074696f6e3c7533323e00010000c90b04184f7074696f6e04045401f5080108104e6f6e6500000010536f6d650400f5080000010000cd0b083c70616c6c65745f707265696d616765345265717565737453746174757308244163636f756e7449640100185469636b657401d10b01082c556e7265717565737465640801187469636b6574d50b014c284163636f756e7449642c205469636b65742900010c6c656e10010c753332000000245265717565737465640c01306d617962655f7469636b6574d90b016c4f7074696f6e3c284163636f756e7449642c205469636b6574293e000114636f756e7410010c7533320001246d617962655f6c656e8d01012c4f7074696f6e3c7533323e00010000d10b14346672616d655f737570706f72741874726169747318746f6b656e732066756e6769626c6544486f6c64436f6e73696465726174696f6e1404410004460004520004440008467000000400180128463a3a42616c616e63650000d50b0000040800d10b00d90b04184f7074696f6e04045401d50b0108104e6f6e6500000010536f6d650400d50b0000010000dd0b0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401080453000004003801185665633c543e0000e10b0c3c70616c6c65745f707265696d6167651870616c6c6574144572726f7204045400012018546f6f426967000004a0507265696d61676520697320746f6f206c6172676520746f2073746f7265206f6e2d636861696e2e30416c72656164794e6f746564000104a4507265696d6167652068617320616c7265616479206265656e206e6f746564206f6e2d636861696e2e344e6f74417574686f72697a6564000204c85468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e2e204e6f744e6f746564000304fc54686520707265696d6167652063616e6e6f742062652072656d6f7665642073696e636520697420686173206e6f7420796574206265656e206e6f7465642e2452657175657374656400040409014120707265696d616765206d6179206e6f742062652072656d6f766564207768656e20746865726520617265206f75747374616e64696e672072657175657374732e304e6f745265717565737465640005042d0154686520707265696d61676520726571756573742063616e6e6f742062652072656d6f7665642073696e6365206e6f206f75747374616e64696e672072657175657374732065786973742e1c546f6f4d616e7900060455014d6f7265207468616e20604d41585f484153485f555047524144455f42554c4b5f434f554e54602068617368657320776572652072657175657374656420746f206265207570677261646564206174206f6e63652e18546f6f466577000704e4546f6f206665772068617368657320776572652072657175657374656420746f2062652075706772616465642028692e652e207a65726f292e048054686520604572726f726020656e756d206f6620746869732070616c6c65742ee50b0c4c706f6c796d6573685f7072696d6974697665730c6e6674344e4654436f6c6c656374696f6e000008010869649104013c4e4654436f6c6c656374696f6e496400012061737365745f6964b0011c417373657449640000e90b04204254726565536574040454016902000400f907000000ed0b00000408f10b690200f10b000004089104ad0300f50b0c2870616c6c65745f6e66741870616c6c6574144572726f720404540001743c42616c616e63654f766572666c6f77000004a8416e206f766572666c6f77207768696c652063616c63756c6174696e67207468652062616c616e63652e4042616c616e6365556e646572666c6f77000104ac416e20756e646572666c6f77207768696c652063616c63756c6174696e67207468652062616c616e63652e68436f6c6c656374696f6e416c7265647952656769737465726564000204e05468652061737365745f696420697320616c7265616479206173736f63696174656420746f20616e204e465420636f6c6c656374696f6e2e48436f6c6c656374696f6e4e6f74466f756e6400030488546865204e465420636f6c6c656374696f6e20646f6573206e6f742065786973742e504475706c69636174654d657461646174614b6579000404d841206475706c6963617465206d65746164617461206b657920686173206265656e2070617373656420617320706172616d657465722e3c4475706c6963617465644e46544964000504784475706c69636174652069647320617265206e6f7420616c6c6f7765642e40496e76616c69644173736574547970650006049c546865206173736574206d757374206265206f662074797065206e6f6e2d66756e6769626c652e60496e76616c69644d657461646174614174747269627574650007048d0145697468657220746865206e756d626572206f66206b657973206f7220746865206b6579206964656e74696669657220646f6573206e6f74206d6174636820746865206b65797320646566696e656420666f722074686520636f6c6c656374696f6e2e90496e76616c69644e46545472616e73666572436f6c6c656374696f6e4e6f74466f756e64000804d44661696c656420746f207472616e7366657220616e204e4654202d204e465420636f6c6c656374696f6e206e6f7420666f756e642e7c496e76616c69644e46545472616e7366657253616d65506f7274666f6c696f00090409014661696c656420746f207472616e7366657220616e204e4654202d20617474656d707420746f206d6f766520746f207468652073616d6520706f7274666f6c696f2e74496e76616c69644e46545472616e736665724e46544e6f744f776e6564000a04dc4661696c656420746f207472616e7366657220616e204e4654202d204e4654206e6f7420666f756e6420696e20706f7274666f6c696f2e7c496e76616c69644e46545472616e73666572436f756e744f766572666c6f77000b04e84661696c656420746f207472616e7366657220616e204e4654202d206964656e7469747920636f756e7420776f756c64206f766572666c6f772e8c496e76616c69644e46545472616e73666572436f6d706c69616e63654661696c757265000c04b84661696c656420746f207472616e7366657220616e204e4654202d20636f6d706c69616e6365206661696c65642e74496e76616c69644e46545472616e7366657246726f7a656e4173736574000d04b04661696c656420746f207472616e7366657220616e204e4654202d2061737365742069732066726f7a656e2e8c496e76616c69644e46545472616e73666572496e73756666696369656e74436f756e74000e043d014661696c656420746f207472616e7366657220616e204e4654202d20746865206e756d626572206f66206e66747320696e20746865206964656e7469747920697320696e73756666696369656e742e5c4d61784e756d6265724f664b6579734578636565646564000f04c4546865206d6178696d756d206e756d626572206f66206d65746164617461206b657973207761732065786365656465642e744d61784e756d6265724f664e4654735065724c656745786365656465640010041501546865206d6178696d756d206e756d626572206f66206e667473206265696e67207472616e7366657272656420696e206f6e65206c6567207761732065786365656465642e2c4e46544e6f74466f756e640011045c546865204e465420646f6573206e6f742065786973742e5c556e726567697374657265644d657461646174614b6579001204e84174206c65617374206f6e65206f6620746865206d65746164617461206b65797320686173206e6f74206265656e20726567697374657265642e245a65726f436f756e74001304a44974206973206e6f7420706f737369626c6520746f207472616e7366657272207a65726f206e66742e38537570706c794f766572666c6f77001404c4416e206f766572666c6f77207768696c652063616c63756c6174696e6720746865207570646174656420737570706c792e3c537570706c79556e646572666c6f77001504c8416e20756e646572666c6f77207768696c652063616c63756c6174696e6720746865207570646174656420737570706c792e74496e76616c69644e46545472616e736665724e465449734c6f636b6564001604a84661696c656420746f207472616e7366657220616e204e4654202d206e6674206973206c6f636b65642eac496e76616c69644e46545472616e7366657253656e64657249644d61746368657352656365697665724964001704fc5468652073656e646572206964656e746974792063616e2774206265207468652073616d6520617320746865207265636569766572206964656e746974792e90496e76616c69644e46545472616e73666572496e76616c69645265636569766572434444001804805468652072656365697665722068617320616e20696e76616c6964204344442e88496e76616c69644e46545472616e73666572496e76616c696453656e646572434444001904785468652073656e6465722068617320616e20696e76616c6964204344442e38496e76616c696441737365744964001a04c854686572652773206e6f206173736574206173736f63696174656420746f2074686520676976656e2061737365745f69642e2c4e465449734c6f636b6564001b0448546865204e4654206973206c6f636b65642e784e756d6265724f664b65797349734c6573735468616e4578706563746564001c04fc546865206e756d626572206f66206b65797320696e2074686520636f6c6c656374696f6e2069732067726561746572207468616e2074686520696e7075742e048054686520604572726f726020656e756d206f6620746869732070616c6c65742ef90b089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f7068617365345265616479536f6c7574696f6e08244163636f756e74496400284d617857696e6e65727300000c0120737570706f727473fd0b0198426f756e646564537570706f7274733c4163636f756e7449642c204d617857696e6e6572733e00011473636f72659d040134456c656374696f6e53636f726500011c636f6d707574659904013c456c656374696f6e436f6d707574650000fd0b0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401e908045300000400e50801185665633c543e0000010c089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f706861736534526f756e64536e617073686f7408244163636f756e744964010024566f7465725479706501050c00080118766f74657273090c01385665633c566f746572547970653e00011c74617267657473050101385665633c4163636f756e7449643e0000050c0000040c0030450900090c000002050c000d0c0c4c626f756e6465645f636f6c6c656374696f6e732c626f756e6465645f76656328426f756e64656456656308045401110c045300000400150c01185665633c543e0000110c0000040c9d04101000150c000002110c00190c0c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f7068617365187369676e6564405369676e65645375626d697373696f6e0c244163636f756e74496401001c42616c616e6365011820536f6c7574696f6e0111080010010c77686f0001244163636f756e74496400011c6465706f73697418011c42616c616e63650001307261775f736f6c7574696f6e0d080154526177536f6c7574696f6e3c536f6c7574696f6e3e00012063616c6c5f66656518011c42616c616e636500001d0c0c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c6574144572726f7204045400013c6850726544697370617463684561726c795375626d697373696f6e000004645375626d697373696f6e2077617320746f6f206561726c792e6c507265446973706174636857726f6e6757696e6e6572436f756e740001048857726f6e67206e756d626572206f662077696e6e6572732070726573656e7465642e6450726544697370617463685765616b5375626d697373696f6e000204905375626d697373696f6e2077617320746f6f207765616b2c2073636f72652d776973652e3c5369676e6564517565756546756c6c0003044901546865207175657565207761732066756c6c2c20616e642074686520736f6c7574696f6e20776173206e6f7420626574746572207468616e20616e79206f6620746865206578697374696e67206f6e65732e585369676e656443616e6e6f745061794465706f73697400040494546865206f726967696e206661696c656420746f2070617920746865206465706f7369742e505369676e6564496e76616c69645769746e657373000504a05769746e657373206461746120746f20646973706174636861626c6520697320696e76616c69642e4c5369676e6564546f6f4d756368576569676874000604b8546865207369676e6564207375626d697373696f6e20636f6e73756d657320746f6f206d756368207765696768743c4f637743616c6c57726f6e67457261000704984f4357207375626d697474656420736f6c7574696f6e20666f722077726f6e6720726f756e645c4d697373696e67536e617073686f744d65746164617461000804a8536e617073686f74206d657461646174612073686f756c6420657869737420627574206469646e27742e58496e76616c69645375626d697373696f6e496e646578000904d06053656c663a3a696e736572745f7375626d697373696f6e602072657475726e656420616e20696e76616c696420696e6465782e3843616c6c4e6f74416c6c6f776564000a04985468652063616c6c206973206e6f7420616c6c6f776564206174207468697320706f696e742e3846616c6c6261636b4661696c6564000b044c5468652066616c6c6261636b206661696c65642c426f756e644e6f744d6574000c0448536f6d6520626f756e64206e6f74206d657438546f6f4d616e7957696e6e657273000d049c5375626d697474656420736f6c7574696f6e2068617320746f6f206d616e792077696e6e657273645072654469737061746368446966666572656e74526f756e64000e04b85375626d697373696f6e2077617320707265706172656420666f72206120646966666572656e7420726f756e642e040d014572726f72206f66207468652070616c6c657420746861742063616e2062652072657475726e656420696e20726573706f6e736520746f20646973706174636865732e210c102873705f72756e74696d651c67656e657269634c756e636865636b65645f65787472696e73696348556e636865636b656445787472696e736963101c416464726573730179051043616c6c013906245369676e617475726501490714457874726101250c00040038000000250c00000420290c2d0c310c350c3d0c410c450c490c00290c10306672616d655f73797374656d28657874656e73696f6e7348636865636b5f737065635f76657273696f6e40436865636b5370656356657273696f6e040454000000002d0c10306672616d655f73797374656d28657874656e73696f6e7340636865636b5f74785f76657273696f6e38436865636b547856657273696f6e04045400000000310c10306672616d655f73797374656d28657874656e73696f6e7334636865636b5f67656e6573697330436865636b47656e6573697304045400000000350c10306672616d655f73797374656d28657874656e73696f6e733c636865636b5f6d6f7274616c69747938436865636b4d6f7274616c69747904045400000400390c010c4572610000390c102873705f72756e74696d651c67656e657269630c6572610c4572610001010420496d6d6f7274616c0000001c4d6f7274616c31040008000001001c4d6f7274616c32040008000002001c4d6f7274616c33040008000003001c4d6f7274616c34040008000004001c4d6f7274616c35040008000005001c4d6f7274616c36040008000006001c4d6f7274616c37040008000007001c4d6f7274616c38040008000008001c4d6f7274616c3904000800000900204d6f7274616c313004000800000a00204d6f7274616c313104000800000b00204d6f7274616c313204000800000c00204d6f7274616c313304000800000d00204d6f7274616c313404000800000e00204d6f7274616c313504000800000f00204d6f7274616c313604000800001000204d6f7274616c313704000800001100204d6f7274616c313804000800001200204d6f7274616c313904000800001300204d6f7274616c323004000800001400204d6f7274616c323104000800001500204d6f7274616c323204000800001600204d6f7274616c323304000800001700204d6f7274616c323404000800001800204d6f7274616c323504000800001900204d6f7274616c323604000800001a00204d6f7274616c323704000800001b00204d6f7274616c323804000800001c00204d6f7274616c323904000800001d00204d6f7274616c333004000800001e00204d6f7274616c333104000800001f00204d6f7274616c333204000800002000204d6f7274616c333304000800002100204d6f7274616c333404000800002200204d6f7274616c333504000800002300204d6f7274616c333604000800002400204d6f7274616c333704000800002500204d6f7274616c333804000800002600204d6f7274616c333904000800002700204d6f7274616c343004000800002800204d6f7274616c343104000800002900204d6f7274616c343204000800002a00204d6f7274616c343304000800002b00204d6f7274616c343404000800002c00204d6f7274616c343504000800002d00204d6f7274616c343604000800002e00204d6f7274616c343704000800002f00204d6f7274616c343804000800003000204d6f7274616c343904000800003100204d6f7274616c353004000800003200204d6f7274616c353104000800003300204d6f7274616c353204000800003400204d6f7274616c353304000800003500204d6f7274616c353404000800003600204d6f7274616c353504000800003700204d6f7274616c353604000800003800204d6f7274616c353704000800003900204d6f7274616c353804000800003a00204d6f7274616c353904000800003b00204d6f7274616c363004000800003c00204d6f7274616c363104000800003d00204d6f7274616c363204000800003e00204d6f7274616c363304000800003f00204d6f7274616c363404000800004000204d6f7274616c363504000800004100204d6f7274616c363604000800004200204d6f7274616c363704000800004300204d6f7274616c363804000800004400204d6f7274616c363904000800004500204d6f7274616c373004000800004600204d6f7274616c373104000800004700204d6f7274616c373204000800004800204d6f7274616c373304000800004900204d6f7274616c373404000800004a00204d6f7274616c373504000800004b00204d6f7274616c373604000800004c00204d6f7274616c373704000800004d00204d6f7274616c373804000800004e00204d6f7274616c373904000800004f00204d6f7274616c383004000800005000204d6f7274616c383104000800005100204d6f7274616c383204000800005200204d6f7274616c383304000800005300204d6f7274616c383404000800005400204d6f7274616c383504000800005500204d6f7274616c383604000800005600204d6f7274616c383704000800005700204d6f7274616c383804000800005800204d6f7274616c383904000800005900204d6f7274616c393004000800005a00204d6f7274616c393104000800005b00204d6f7274616c393204000800005c00204d6f7274616c393304000800005d00204d6f7274616c393404000800005e00204d6f7274616c393504000800005f00204d6f7274616c393604000800006000204d6f7274616c393704000800006100204d6f7274616c393804000800006200204d6f7274616c393904000800006300244d6f7274616c31303004000800006400244d6f7274616c31303104000800006500244d6f7274616c31303204000800006600244d6f7274616c31303304000800006700244d6f7274616c31303404000800006800244d6f7274616c31303504000800006900244d6f7274616c31303604000800006a00244d6f7274616c31303704000800006b00244d6f7274616c31303804000800006c00244d6f7274616c31303904000800006d00244d6f7274616c31313004000800006e00244d6f7274616c31313104000800006f00244d6f7274616c31313204000800007000244d6f7274616c31313304000800007100244d6f7274616c31313404000800007200244d6f7274616c31313504000800007300244d6f7274616c31313604000800007400244d6f7274616c31313704000800007500244d6f7274616c31313804000800007600244d6f7274616c31313904000800007700244d6f7274616c31323004000800007800244d6f7274616c31323104000800007900244d6f7274616c31323204000800007a00244d6f7274616c31323304000800007b00244d6f7274616c31323404000800007c00244d6f7274616c31323504000800007d00244d6f7274616c31323604000800007e00244d6f7274616c31323704000800007f00244d6f7274616c31323804000800008000244d6f7274616c31323904000800008100244d6f7274616c31333004000800008200244d6f7274616c31333104000800008300244d6f7274616c31333204000800008400244d6f7274616c31333304000800008500244d6f7274616c31333404000800008600244d6f7274616c31333504000800008700244d6f7274616c31333604000800008800244d6f7274616c31333704000800008900244d6f7274616c31333804000800008a00244d6f7274616c31333904000800008b00244d6f7274616c31343004000800008c00244d6f7274616c31343104000800008d00244d6f7274616c31343204000800008e00244d6f7274616c31343304000800008f00244d6f7274616c31343404000800009000244d6f7274616c31343504000800009100244d6f7274616c31343604000800009200244d6f7274616c31343704000800009300244d6f7274616c31343804000800009400244d6f7274616c31343904000800009500244d6f7274616c31353004000800009600244d6f7274616c31353104000800009700244d6f7274616c31353204000800009800244d6f7274616c31353304000800009900244d6f7274616c31353404000800009a00244d6f7274616c31353504000800009b00244d6f7274616c31353604000800009c00244d6f7274616c31353704000800009d00244d6f7274616c31353804000800009e00244d6f7274616c31353904000800009f00244d6f7274616c3136300400080000a000244d6f7274616c3136310400080000a100244d6f7274616c3136320400080000a200244d6f7274616c3136330400080000a300244d6f7274616c3136340400080000a400244d6f7274616c3136350400080000a500244d6f7274616c3136360400080000a600244d6f7274616c3136370400080000a700244d6f7274616c3136380400080000a800244d6f7274616c3136390400080000a900244d6f7274616c3137300400080000aa00244d6f7274616c3137310400080000ab00244d6f7274616c3137320400080000ac00244d6f7274616c3137330400080000ad00244d6f7274616c3137340400080000ae00244d6f7274616c3137350400080000af00244d6f7274616c3137360400080000b000244d6f7274616c3137370400080000b100244d6f7274616c3137380400080000b200244d6f7274616c3137390400080000b300244d6f7274616c3138300400080000b400244d6f7274616c3138310400080000b500244d6f7274616c3138320400080000b600244d6f7274616c3138330400080000b700244d6f7274616c3138340400080000b800244d6f7274616c3138350400080000b900244d6f7274616c3138360400080000ba00244d6f7274616c3138370400080000bb00244d6f7274616c3138380400080000bc00244d6f7274616c3138390400080000bd00244d6f7274616c3139300400080000be00244d6f7274616c3139310400080000bf00244d6f7274616c3139320400080000c000244d6f7274616c3139330400080000c100244d6f7274616c3139340400080000c200244d6f7274616c3139350400080000c300244d6f7274616c3139360400080000c400244d6f7274616c3139370400080000c500244d6f7274616c3139380400080000c600244d6f7274616c3139390400080000c700244d6f7274616c3230300400080000c800244d6f7274616c3230310400080000c900244d6f7274616c3230320400080000ca00244d6f7274616c3230330400080000cb00244d6f7274616c3230340400080000cc00244d6f7274616c3230350400080000cd00244d6f7274616c3230360400080000ce00244d6f7274616c3230370400080000cf00244d6f7274616c3230380400080000d000244d6f7274616c3230390400080000d100244d6f7274616c3231300400080000d200244d6f7274616c3231310400080000d300244d6f7274616c3231320400080000d400244d6f7274616c3231330400080000d500244d6f7274616c3231340400080000d600244d6f7274616c3231350400080000d700244d6f7274616c3231360400080000d800244d6f7274616c3231370400080000d900244d6f7274616c3231380400080000da00244d6f7274616c3231390400080000db00244d6f7274616c3232300400080000dc00244d6f7274616c3232310400080000dd00244d6f7274616c3232320400080000de00244d6f7274616c3232330400080000df00244d6f7274616c3232340400080000e000244d6f7274616c3232350400080000e100244d6f7274616c3232360400080000e200244d6f7274616c3232370400080000e300244d6f7274616c3232380400080000e400244d6f7274616c3232390400080000e500244d6f7274616c3233300400080000e600244d6f7274616c3233310400080000e700244d6f7274616c3233320400080000e800244d6f7274616c3233330400080000e900244d6f7274616c3233340400080000ea00244d6f7274616c3233350400080000eb00244d6f7274616c3233360400080000ec00244d6f7274616c3233370400080000ed00244d6f7274616c3233380400080000ee00244d6f7274616c3233390400080000ef00244d6f7274616c3234300400080000f000244d6f7274616c3234310400080000f100244d6f7274616c3234320400080000f200244d6f7274616c3234330400080000f300244d6f7274616c3234340400080000f400244d6f7274616c3234350400080000f500244d6f7274616c3234360400080000f600244d6f7274616c3234370400080000f700244d6f7274616c3234380400080000f800244d6f7274616c3234390400080000f900244d6f7274616c3235300400080000fa00244d6f7274616c3235310400080000fb00244d6f7274616c3235320400080000fc00244d6f7274616c3235330400080000fd00244d6f7274616c3235340400080000fe00244d6f7274616c3235350400080000ff00003d0c10306672616d655f73797374656d28657874656e73696f6e732c636865636b5f6e6f6e636528436865636b4e6f6e636504045400000400b9040120543a3a4e6f6e63650000410c10306672616d655f73797374656d28657874656e73696f6e7330636865636b5f7765696768742c436865636b57656967687404045400000000450c086870616c6c65745f7472616e73616374696f6e5f7061796d656e74604368617267655472616e73616374696f6e5061796d656e7404045400000400c901013042616c616e63654f663c543e0000490c084870616c6c65745f7065726d697373696f6e734453746f726543616c6c4d6574616461746104045400000000c81853797374656d011853797374656d4c1c4163636f756e7401010402000c4101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008004e8205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e3845787472696e736963436f756e74000010040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e40496e686572656e74734170706c696564010020040004a4205768657468657220616c6c20696e686572656e74732068617665206265656e206170706c6965642e2c426c6f636b576569676874010024180000000000000488205468652063757272656e742077656967687420666f722074686520626c6f636b2e40416c6c45787472696e736963734c656e000010040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b486173680101040510348000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101040510380400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d6265720100101000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801003480000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e1844696765737401003c040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301004c04001ca0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e001d01204e4f54453a20546865206974656d20697320756e626f756e6420616e642073686f756c64207468657265666f7265206e657665722062652072656164206f6e20636861696e2ed020497420636f756c64206f746865727769736520696e666c6174652074686520506f562073697a65206f66206120626c6f636b2e002d01204576656e747320686176652061206c6172676520696e2d6d656d6f72792073697a652e20426f7820746865206576656e747320746f206e6f7420676f206f75742d6f662d6d656d6f7279fc206a75737420696e206361736520736f6d656f6e65207374696c6c207265616473207468656d2066726f6d2077697468696e207468652072756e74696d652e284576656e74436f756e74010010100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101040234b1040400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e005901205468652076616c756520686173207468652074797065206028426c6f636b4e756d626572466f723c543e2c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e484c61737452756e74696d65557067726164650000b50404000455012053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e545570677261646564546f553332526566436f756e740100200400044d012054727565206966207765206861766520757067726164656420736f207468617420607479706520526566436f756e74602069732060753332602e2046616c7365202864656661756c7429206966206e6f742e605570677261646564546f547269706c65526566436f756e740100200400085d012054727565206966207765206861766520757067726164656420736f2074686174204163636f756e74496e666f20636f6e7461696e73207468726565207479706573206f662060526566436f756e74602e2046616c736548202864656661756c7429206966206e6f742e38457865637574696f6e50686173650000a904040004882054686520657865637574696f6e207068617365206f662074686520626c6f636b2e44417574686f72697a6564557067726164650000c104040004b82060536f6d6560206966206120636f6465207570677261646520686173206265656e20617574686f72697a65642e6045787472696e7369635765696768745265636c61696d65640100280800001ca02054686520776569676874207265636c61696d656420666f72207468652065787472696e7369632e002101205468697320696e666f726d6174696f6e20697320617661696c61626c6520756e74696c2074686520656e64206f66207468652065787472696e73696320657865637574696f6e2e2101204d6f726520707265636973656c79207468697320696e666f726d6174696f6e2069732072656d6f76656420696e20606e6f74655f6170706c6965645f65787472696e736963602e007101204c6f67696320646f696e6720736f6d6520706f73742064697370617463682077656967687420726564756374696f6e206d7573742075706461746520746869732073746f7261676520746f2061766f6964206475706c69636174652c20726564756374696f6e2e01c50401581830426c6f636b57656967687473d50401020700c817a804000b00204aa9d10113ffffffffffffffff02daf89a00010b80914b872e011366666666666666a6010b0098f73e5d0113ffffffffffffffbf01000002daf89a00010b80199ef1a2011366666666666666e6010b00204aa9d10113ffffffffffffffff01070088526a7413000000000000004002daf89a0000000004d020426c6f636b20262065787472696e7369637320776569676874733a20626173652076616c75657320616e64206c696d6974732e2c426c6f636b4c656e677468e50430000078000000a0000000a00004a820546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e38426c6f636b48617368436f756e74101000100000045501204d6178696d756d206e756d626572206f6620626c6f636b206e756d62657220746f20626c6f636b2068617368206d617070696e677320746f206b65657020286f6c64657374207072756e6564206669727374292e204462576569676874ed044080f0fa020000000000c2eb0b000000000409012054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e1c56657273696f6ef104310530706f6c796d6573685f64657630706f6c796d6573685f6465760100000000127a000000000060df6acb689907609b0500000037e397fc7c91f5e40200000040fe3ad401f8959a06000000d2bc9897eed08f1503000000f78b278be53f454c02000000ed99c5acb25eedf503000000cbca25e39f14238702000000687ad44ad37f03c201000000bc9d89904f5b923f0100000068b66ba122c93fa70200000037c8bb1350a9a2a802000000f3ff14d5ab52705902000000ab3c0572291feb8b0100000018ef58a3b67ba77001000000329342994773047f01000000001a0b29f17d01f401000000f28e8080b6e2dfd004000000bb6ba9053c5c9d7804000000595ac34c5ea1f5fe010000009ea061a615cee2fe0200000053df5001418f3b460200000098cf18c375950e1f02000000608339ce0e76adf300000000fbc577b9d747efd60100000007000000010484204765742074686520636861696e277320696e2d636f64652076657273696f6e2e28535335385072656669784d03082a0014a8205468652064657369676e61746564205353353820707265666978206f66207468697320636861696e2e0039012054686973207265706c6163657320746865202273733538466f726d6174222070726f7065727479206465636c6172656420696e2074686520636861696e20737065632e20526561736f6e20697331012074686174207468652072756e74696d652073686f756c64206b6e6f772061626f7574207468652070726566697820696e206f7264657220746f206d616b6520757365206f662069742061737020616e206964656e746966696572206f662074686520636861696e2e010505001042616265011042616265442845706f6368496e64657801003020000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f726974696573010009050400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f740100190520000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f740100190520000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e65737301000480000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e6050656e64696e6745706f6368436f6e6669674368616e676500001d0504000461012050656e64696e672065706f636820636f6e66696775726174696f6e206368616e676520746861742077696c6c206265206170706c696564207768656e20746865206e6578742065706f636820697320656e61637465642e384e65787452616e646f6d6e657373010004800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e3c4e657874417574686f7269746965730100090504000460204e6578742065706f636820617574686f7269746965732e305365676d656e74496e6465780100101000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f8205765206d616b6520612074726164652d6f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101040510290504000415012054574f582d4e4f54453a20605365676d656e74496e6465786020697320616e20696e6372656173696e6720696e74656765722c20736f2074686973206973206f6b61792e2c496e697469616c697a65640000310504000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e4c417574686f7256726652616e646f6d6e6573730100c10304001015012054686973206669656c642073686f756c6420616c7761797320626520706f70756c6174656420647572696e6720626c6f636b2070726f63657373696e6720756e6c6573731901207365636f6e6461727920706c61696e20736c6f74732061726520656e61626c65642028776869636820646f6e277420636f6e7461696e206120565246206f7574707574292e0049012049742069732073657420696e20606f6e5f66696e616c697a65602c206265666f72652069742077696c6c20636f6e7461696e207468652076616c75652066726f6d20746865206c61737420626c6f636b2e2845706f636853746172740100bd03200000000000000000145d012054686520626c6f636b206e756d62657273207768656e20746865206c61737420616e642063757272656e742065706f6368206861766520737461727465642c20726573706563746976656c7920604e2d316020616e641420604e602e4901204e4f54453a20576520747261636b207468697320697320696e206f7264657220746f20616e6e6f746174652074686520626c6f636b206e756d626572207768656e206120676976656e20706f6f6c206f66590120656e74726f7079207761732066697865642028692e652e20697420776173206b6e6f776e20746f20636861696e206f6273657276657273292e2053696e63652065706f6368732061726520646566696e656420696e590120736c6f74732c207768696368206d617920626520736b69707065642c2074686520626c6f636b206e756d62657273206d6179206e6f74206c696e6520757020776974682074686520736c6f74206e756d626572732e204c6174656e657373010010100000000014d820486f77206c617465207468652063757272656e7420626c6f636b20697320636f6d706172656420746f2069747320706172656e742e001501205468697320656e74727920697320706f70756c617465642061732070617274206f6620626c6f636b20657865637574696f6e20616e6420697320636c65616e65642075701101206f6e20626c6f636b2066696e616c697a6174696f6e2e205175657279696e6720746869732073746f7261676520656e747279206f757473696465206f6620626c6f636bb020657865637574696f6e20636f6e746578742073686f756c6420616c77617973207969656c64207a65726f2e2c45706f6368436f6e6669670000490504000861012054686520636f6e66696775726174696f6e20666f72207468652063757272656e742065706f63682e2053686f756c64206e6576657220626520604e6f6e656020617320697420697320696e697469616c697a656420696e242067656e657369732e3c4e65787445706f6368436f6e666967000049050400082d012054686520636f6e66696775726174696f6e20666f7220746865206e6578742065706f63682c20604e6f6e65602069662074686520636f6e6669672077696c6c206e6f74206368616e6765e82028796f752063616e2066616c6c6261636b20746f206045706f6368436f6e6669676020696e737465616420696e20746861742063617365292e34536b697070656445706f63687301004d0504002029012041206c697374206f6620746865206c6173742031303020736b69707065642065706f63687320616e642074686520636f72726573706f6e64696e672073657373696f6e20696e64657870207768656e207468652065706f63682077617320736b69707065642e0031012054686973206973206f6e6c79207573656420666f722076616c69646174696e672065717569766f636174696f6e2070726f6f66732e20416e2065717569766f636174696f6e2070726f6f663501206d75737420636f6e7461696e732061206b65792d6f776e6572736869702070726f6f6620666f72206120676976656e2073657373696f6e2c207468657265666f7265207765206e656564206139012077617920746f2074696520746f6765746865722073657373696f6e7320616e642065706f636820696e64696365732c20692e652e207765206e65656420746f2076616c69646174652074686174290120612076616c696461746f722077617320746865206f776e6572206f66206120676976656e206b6579206f6e206120676976656e2073657373696f6e2c20616e64207768617420746865b0206163746976652065706f636820696e6465782077617320647572696e6720746861742073657373696f6e2e01590500103445706f63684475726174696f6e302078000000000000000cec2054686520616d6f756e74206f662074696d652c20696e20736c6f74732c207468617420656163682065706f63682073686f756c64206c6173742e1901204e4f54453a2043757272656e746c79206974206973206e6f7420706f737369626c6520746f206368616e6765207468652065706f6368206475726174696f6e20616674657221012074686520636861696e2068617320737461727465642e20417474656d7074696e6720746f20646f20736f2077696c6c20627269636b20626c6f636b2070726f64756374696f6e2e444578706563746564426c6f636b54696d653020f40100000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e384d6178417574686f7269746965731010a08601000488204d6178206e756d626572206f6620617574686f72697469657320616c6c6f776564344d61784e6f6d696e61746f727310100004000004d420546865206d6178696d756d206e756d626572206f66206e6f6d696e61746f727320666f7220656163682076616c696461746f722e016905012454696d657374616d70012454696d657374616d70080c4e6f7701003020000000000000000004a0205468652063757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e24446964557064617465010020040010d82057686574686572207468652074696d657374616d7020686173206265656e207570646174656420696e207468697320626c6f636b2e00550120546869732076616c7565206973207570646174656420746f206074727565602075706f6e207375636365737366756c207375626d697373696f6e206f6620612074696d657374616d702062792061206e6f64652e4501204974206973207468656e20636865636b65642061742074686520656e64206f66206561636820626c6f636b20657865637574696f6e20696e2074686520606f6e5f66696e616c697a656020686f6f6b2e016d050004344d696e696d756d506572696f643020fa00000000000000188c20546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e004d012042652061776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e4901206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f61012064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20466f72206578616d706c652c20696e2074686520417572612070616c6c65742069742077696c6c20626520646f75626c6520746869737020706572696f64206f6e2064656661756c742073657474696e67732e00021c496e6469636573011c496e646963657304204163636f756e7473000104021071050400048820546865206c6f6f6b75702066726f6d20696e64657820746f206163636f756e742e0175050180041c4465706f736974184040420f0000000000000000000000000004ac20546865206465706f736974206e656564656420666f7220726573657276696e6720616e20696e6465782e017d050328417574686f72736869700128417574686f72736869700418417574686f720000000400046420417574686f72206f662063757272656e7420626c6f636b2e00000000042042616c616e636573012042616c616e6365731c34546f74616c49737375616e6365010018400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e40496e61637469766549737375616e636501001840000000000000000000000000000000000409012054686520746f74616c20756e697473206f66206f75747374616e64696e672064656163746976617465642062616c616e636520696e207468652073797374656d2e1c4163636f756e74010104020014010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080600901205468652042616c616e6365732070616c6c6574206578616d706c65206f662073746f72696e67207468652062616c616e6365206f6620616e206163636f756e742e00282023204578616d706c650034206060606e6f636f6d70696c65b02020696d706c2070616c6c65745f62616c616e6365733a3a436f6e66696720666f722052756e74696d65207b19022020202074797065204163636f756e7453746f7265203d2053746f726167654d61705368696d3c53656c663a3a4163636f756e743c52756e74696d653e2c206672616d655f73797374656d3a3a50726f76696465723c52756e74696d653e2c204163636f756e7449642c2053656c663a3a4163636f756e74446174613c42616c616e63653e3e0c20207d102060606000150120596f752063616e20616c736f2073746f7265207468652062616c616e6365206f6620616e206163636f756e7420696e20746865206053797374656d602070616c6c65742e00282023204578616d706c650034206060606e6f636f6d70696c65b02020696d706c2070616c6c65745f62616c616e6365733a3a436f6e66696720666f722052756e74696d65207b7420202074797065204163636f756e7453746f7265203d2053797374656d0c20207d102060606000510120427574207468697320636f6d657320776974682074726164656f6666732c2073746f72696e67206163636f756e742062616c616e63657320696e207468652073797374656d2070616c6c65742073746f7265736d0120606672616d655f73797374656d60206461746120616c6f6e677369646520746865206163636f756e74206461746120636f6e747261727920746f2073746f72696e67206163636f756e742062616c616e63657320696e207468652901206042616c616e636573602070616c6c65742c20776869636820757365732061206053746f726167654d61706020746f2073746f72652062616c616e6365732064617461206f6e6c792e4101204e4f54453a2054686973206973206f6e6c79207573656420696e207468652063617365207468617420746869732070616c6c6574206973207573656420746f2073746f72652062616c616e6365732e144c6f636b7301010402008105040010b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e00ad0120557365206f66206c6f636b73206973206465707265636174656420696e206661766f7572206f6620667265657a65732e20536565206068747470733a2f2f6769746875622e636f6d2f706172697479746563682f7375627374726174652f70756c6c2f31323935312f602052657365727665730101040200910504000ca4204e616d6564207265736572766573206f6e20736f6d65206163636f756e742062616c616e6365732e00b10120557365206f66207265736572766573206973206465707265636174656420696e206661766f7572206f6620686f6c64732e20536565206068747470733a2f2f6769746875622e636f6d2f706172697479746563682f7375627374726174652f70756c6c2f31323935312f6014486f6c647301010402009d050400046c20486f6c6473206f6e206163636f756e742062616c616e6365732e1c467265657a65730101040200b9050400048820467265657a65206c6f636b73206f6e206163636f756e742062616c616e6365732e01c505018410484578697374656e7469616c4465706f73697418400000000000000000000000000000000020410120546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e204d5553542042452047524541544552205448414e205a45524f2100590120496620796f75202a7265616c6c792a206e65656420697420746f206265207a65726f2c20796f752063616e20656e61626c652074686520666561747572652060696e7365637572655f7a65726f5f65646020666f72610120746869732070616c6c65742e20486f77657665722c20796f7520646f20736f20617420796f7572206f776e207269736b3a20746869732077696c6c206f70656e2075702061206d616a6f7220446f5320766563746f722e590120496e206361736520796f752068617665206d756c7469706c6520736f7572636573206f662070726f7669646572207265666572656e6365732c20796f75206d617920616c736f2067657420756e65787065637465648c206265686176696f757220696620796f7520736574207468697320746f207a65726f2e00f020426f74746f6d206c696e653a20446f20796f757273656c662061206661766f757220616e64206d616b65206974206174206c65617374206f6e6521204d61784c6f636b7310103200000010f420546865206d6178696d756d206e756d626572206f66206c6f636b7320746861742073686f756c64206578697374206f6e20616e206163636f756e742edc204e6f74207374726963746c7920656e666f726365642c20627574207573656420666f722077656967687420657374696d6174696f6e2e00ad0120557365206f66206c6f636b73206973206465707265636174656420696e206661766f7572206f6620667265657a65732e20536565206068747470733a2f2f6769746875622e636f6d2f706172697479746563682f7375627374726174652f70756c6c2f31323935312f602c4d617852657365727665731010320000000c0d0120546865206d6178696d756d206e756d626572206f66206e616d656420726573657276657320746861742063616e206578697374206f6e20616e206163636f756e742e00b10120557365206f66207265736572766573206973206465707265636174656420696e206661766f7572206f6620686f6c64732e20536565206068747470733a2f2f6769746875622e636f6d2f706172697479746563682f7375627374726174652f70756c6c2f31323935312f60284d6178467265657a657310100000000004610120546865206d6178696d756d206e756d626572206f6620696e646976696475616c20667265657a65206c6f636b7320746861742063616e206578697374206f6e20616e206163636f756e7420617420616e792074696d652e01cd0505485472616e73616374696f6e5061796d656e7401485472616e73616374696f6e5061796d656e7408444e6578744665654d756c7469706c6965720100d10540000064a7b3b6e00d0000000000000000003853746f7261676556657273696f6e0100d50504000001d905019404604f7065726174696f6e616c4665654d756c7469706c696572080405545901204120666565206d756c7469706c69657220666f7220604f7065726174696f6e616c602065787472696e7369637320746f20636f6d7075746520227669727475616c207469702220746f20626f6f73742074686569722c20607072696f726974796000510120546869732076616c7565206973206d756c7469706c69656420627920746865206066696e616c5f6665656020746f206f627461696e206120227669727475616c20746970222074686174206973206c61746572f420616464656420746f20612074697020636f6d706f6e656e7420696e20726567756c617220607072696f72697479602063616c63756c6174696f6e732e4d01204974206d65616e732074686174206120604e6f726d616c60207472616e73616374696f6e2063616e2066726f6e742d72756e20612073696d696c61726c792d73697a656420604f7065726174696f6e616c6041012065787472696e736963202877697468206e6f20746970292c20627920696e636c7564696e672061207469702076616c75652067726561746572207468616e20746865207669727475616c207469702e003c20606060727573742c69676e6f726540202f2f20466f7220604e6f726d616c608c206c6574207072696f72697479203d207072696f726974795f63616c6328746970293b0054202f2f20466f7220604f7065726174696f6e616c601101206c6574207669727475616c5f746970203d2028696e636c7573696f6e5f666565202b2074697029202a204f7065726174696f6e616c4665654d756c7469706c6965723bc4206c6574207072696f72697479203d207072696f726974795f63616c6328746970202b207669727475616c5f746970293b1020606060005101204e6f746520746861742073696e636520776520757365206066696e616c5f6665656020746865206d756c7469706c696572206170706c69657320616c736f20746f2074686520726567756c61722060746970605d012073656e74207769746820746865207472616e73616374696f6e2e20536f2c206e6f74206f6e6c7920646f657320746865207472616e73616374696f6e206765742061207072696f726974792062756d702062617365646101206f6e207468652060696e636c7573696f6e5f666565602c2062757420776520616c736f20616d706c6966792074686520696d70616374206f662074697073206170706c69656420746f20604f7065726174696f6e616c6038207472616e73616374696f6e732e0006204964656e7469747901204964656e7469747960284469645265636f726473000104069cdd050400045420444944202d3e206964656e7469747920696e666f2c497344696446726f7a656e010104069c20040004e420444944202d3e20626f6f6c207468617420696e64696361746573206966207365636f6e64617279206b657973206172652066726f7a656e2e3043757272656e74506179657200000004000405012049742073746f726573207468652063757272656e74206761732066656520706179657220666f72207468652063757272656e74207472616e73616374696f6e2e18436c61696d730001080502e1050901040004f020285461726765742049442c20636c61696d20747970652920286973737565722c73636f706529202d3e204173736f63696174656420636c61696d7330437573746f6d436c61696d730001040521013804000494204375736f746d436c61696d547970654964202d3e20537472696e6720636f6e7374616e744c437573746f6d436c61696d73496e7665727365000104023821010400049420537472696e6720636f6e7374616e74202d3e20437573746f6d436c61696d54797065496454437573746f6d436c61696d496453657175656e6365010021011000000000047820546865206e6578742060437573746f6d436c61696d547970654964602e284b65795265636f7264730001040500ed050400042901204d61702066726f6d204163636f756e74496420746f20604b65795265636f726460207468617420686f6c647320746865206b65792773207479706520616e64206964656e746974792e5c4b657945787472696e7369635065726d697373696f6e730001040500c0040004a42041207365636f6e64617279206b657927732065787472696e736963207065726d697373696f6e732e4c4b657941737365745065726d697373696f6e730001040500ac040004942041207365636f6e64617279206b65792773206173736574207065726d697373696f6e732e5c4b6579506f7274666f6c696f5065726d697373696f6e730001040500ec040004a42041207365636f6e64617279206b6579277320706f7274666f6c696f207065726d697373696f6e732e1c4469644b6579730101080605f1052004000401012041207265766572736520646f75626c65206d617020746f20616c6c6f772066696e64696e6720616c6c206b65797320666f7220616e206964656e746974792e444d756c7469507572706f73654e6f6e636501003020000000000000000004bc204e6f6e636520746f20656e7375726520756e6971756520616374696f6e732e207374617274732066726f6d20312e684f6666436861696e417574686f72697a6174696f6e4e6f6e6365010104069c3020000000000000000004c820417574686f72697a6174696f6e206e6f6e636520706572204964656e746974792e20496e697469616c6c7920697320302e38417574686f72697a6174696f6e730001080205f505fd05040004b020416c6c20617574686f72697a6174696f6e73207468617420616e206964656e746974792f6b6579206861734c417574686f72697a6174696f6e73476976656e01010806050106f90584000000000000000000000000000000000000000000000000000000000000000000044d0120416c6c20617574686f72697a6174696f6e73207468617420616e206964656e746974792068617320676976656e2e2028417574686f72697a65722c20617574685f6964202d3e20617574686f72697a6564297043646441757468466f725072696d6172794b6579526f746174696f6e0100200400085d01204120636f6e66696720666c616720746861742c206966207365742c20696e7374727563747320616e20617574686f72697a6174696f6e2066726f6d2061204344442070726f766964657220696e206f7264657220746f9c206368616e676520746865207072696d617279206b6579206f6620616e206964656e746974792e3853746f7261676556657273696f6e01000506040004442053746f726167652076657273696f6e2e484163636f756e744b6579526566436f756e740101040200302000000000000000001cc420486f77206d616e7920227374726f6e6722207265666572656e63657320746f20746865206163636f756e74206b65792e00fc205374726f6e67207265666572656e6365732077696c6c20626c6f636b2061206b65792066726f6d206c656176696e672069742773206964656e746974792e00cc2050616c6c657473207573696e6720227374726f6e6722207265666572656e63657320746f206163636f756e74206b6579733aac202a2052656c617965723a20466f722060757365725f6b65796020616e642060706179696e675f6b6579600024506172656e74446964000104069c9c040004c020506172656e74206964656e7469747920696620746865204449442069732061206368696c64204964656e746974792e204368696c644469640101080606090620040004050120416c6c206368696c64206964656e746974696573206f66206120706172656e742028692e6520506172656e744449442c204368696c644449442c207472756529484e756d6265724f66476976656e4175746873010104069c10100000000004ec20547261636b20746865206e756d626572206f6620617574686f72697a6174696f6e7320676976656e2062792065616368206964656e746974792e584f75746461746564417574686f72697a6174696f6e7300010402f90530040004bc20547261636b7320616c6c20617574686f72697a6174696f6e732074686174206d7573742062652064656c657465643443757272656e74417574684964010030200000000000000000047c20436f6e74726f6c732074686520617574686f72697a6174696f6e2069642e010d0601980830496e697469616c504f4c595818400000000000000000000000000000000004c820504f4c595820676976656e20746f207072696d617279206b657973206f6620616c6c206e6577204964656e746974696573344d6178476976656e417574687310100004000004dc204d6178696d756d206e756d626572206f6620617574686f72697a6174696f6e7320616e206964656e746974792063616e20676976652e012506074c4364645365727669636550726f766964657273014c4364645365727669636550726f7669646572730c344163746976654d656d6265727301004901040004ec205468652063757272656e74202261637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e3c496e6163746976654d656d6265727301002906040004f4205468652063757272656e742022696e61637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e484163746976654d656d626572734c696d6974010010100000000004c4204c696d6974206f6620686f77206d616e79202261637469766522206d656d626572732074686572652063616e2062652e013106014501000135060844506f6c796d657368436f6d6d69747465650144506f6c796d657368436f6d6d6974746565202450726f706f73616c730100ad04040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f6600010406343906040004882041637475616c2070726f706f73616c20666f72206120676976656e20686173682e18566f74696e670001040634f908040004d420506f6c796d657368566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e74010010100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100490104000498205468652063757272656e74206d656d62657273206f662074686520636f6d6d69747465652e34566f74655468726573686f6c640100bd03200000000000000000048020566f7465207468726573686f6c6420666f7220616e20617070726f76616c2e4852656c65617365436f6f7264696e61746f7200009c040004582052656c6561736520636f6f726964696e61746f722e3045787069726573416674657201005901040104a42054696d6520616674657220776869636820612070726f706f73616c2077696c6c206578706972652e013d06014d010001fd08094c436f6d6d69747465654d656d62657273686970014c436f6d6d69747465654d656d626572736869700c344163746976654d656d6265727301004901040004ec205468652063757272656e74202261637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e3c496e6163746976654d656d6265727301002906040004f4205468652063757272656e742022696e61637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e484163746976654d656d626572734c696d6974010010100000000004c4204c696d6974206f6620686f77206d616e79202261637469766522206d656d626572732074686572652063616e2062652e014106015d01000101090a48546563686e6963616c436f6d6d69747465650148546563686e6963616c436f6d6d6974746565202450726f706f73616c730100ad04040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f6600010406343906040004882041637475616c2070726f706f73616c20666f72206120676976656e20686173682e18566f74696e670001040634f908040004d420506f6c796d657368566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e74010010100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100490104000498205468652063757272656e74206d656d62657273206f662074686520636f6d6d69747465652e34566f74655468726573686f6c640100bd03200000000000000000048020566f7465207468726573686f6c6420666f7220616e20617070726f76616c2e4852656c65617365436f6f7264696e61746f7200009c040004582052656c6561736520636f6f726964696e61746f722e3045787069726573416674657201005901040104a42054696d6520616674657220776869636820612070726f706f73616c2077696c6c206578706972652e014506016101000105090b70546563686e6963616c436f6d6d69747465654d656d626572736869700170546563686e6963616c436f6d6d69747465654d656d626572736869700c344163746976654d656d6265727301004901040004ec205468652063757272656e74202261637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e3c496e6163746976654d656d6265727301002906040004f4205468652063757272656e742022696e61637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e484163746976654d656d626572734c696d6974010010100000000004c4204c696d6974206f6620686f77206d616e79202261637469766522206d656d626572732074686572652063616e2062652e014906016501000109090c4055706772616465436f6d6d6974746565014055706772616465436f6d6d6974746565202450726f706f73616c730100ad04040004902054686520686173686573206f6620746865206163746976652070726f706f73616c732e2850726f706f73616c4f6600010406343906040004882041637475616c2070726f706f73616c20666f72206120676976656e20686173682e18566f74696e670001040634f908040004d420506f6c796d657368566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e3450726f706f73616c436f756e74010010100000000004482050726f706f73616c7320736f206661722e1c4d656d626572730100490104000498205468652063757272656e74206d656d62657273206f662074686520636f6d6d69747465652e34566f74655468726573686f6c640100bd03200000000000000000048020566f7465207468726573686f6c6420666f7220616e20617070726f76616c2e4852656c65617365436f6f7264696e61746f7200009c040004582052656c6561736520636f6f726964696e61746f722e3045787069726573416674657201005901040104a42054696d6520616674657220776869636820612070726f706f73616c2077696c6c206578706972652e014d0601690100010d090d6855706772616465436f6d6d69747465654d656d62657273686970016855706772616465436f6d6d69747465654d656d626572736869700c344163746976654d656d6265727301004901040004ec205468652063757272656e74202261637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e3c496e6163746976654d656d6265727301002906040004f4205468652063757272656e742022696e61637469766522206d656d626572736869702c2073746f72656420617320616e206f726465726564205665632e484163746976654d656d626572734c696d6974010010100000000004c4204c696d6974206f6620686f77206d616e79202261637469766522206d656d626572732074686572652063616e2062652e015106016d01000111090e204d756c746953696701204d756c746953696740344d756c74695369674e6f6e6365010030200000000000000000042101204e6f6e636520746f20656e7375726520756e69717565204d756c746953696720616464726573736573206172652067656e6572617465643b207374617274732066726f6d20312e3c4d756c74695369675369676e6572730101080605150920040004cc205369676e657273206f662061206d756c74697369672e20286d756c74697369672c207369676e657229203d3e20626f6f6c2e3c4e756d6265724f665369676e65727301010406003020000000000000000004cc204e756d626572206f6620617070726f7665642f6163636570746564207369676e657273206f662061206d756c74697369672e544d756c74695369675369676e73526571756972656401010406003020000000000000000004e020436f6e6669726d6174696f6e73207265717569726564206265666f72652070726f63657373696e672061206d756c74697369672074782e384e65787450726f706f73616c49640101040600302000000000000000000cc4204e6578742070726f706f73616c20696420666f722061206d756c74697369672e20205374617274732066726f6d20302e0074206d756c7469736967203d3e206e6578742070726f706f73616c2069642450726f706f73616c7300010805051909390604000cb82050726f706f73616c732070726573656e74656420666f7220766f74696e6720746f2061206d756c74697369672e00b4206d756c7469736967202d3e2070726f706f73616c206964203d3e204f7074696f6e3c50726f706f73616c3e2e14566f74657301010805051d092004000c8820496e646976696475616c206d756c7469736967207369676e657220766f7465732e00ac20286d756c74697369672c2070726f706f73616c5f696429202d3e207369676e6572203d3e20766f74652e24506179696e6744696400010406009c040010090120546865206d756c7469736967277320706179696e67206964656e746974792e2020546865207072696d617279206b6579206f662074686973206964656e74697479f8207061797320746865207472616e73616374696f6e2f70726f746f63616c2066656573206f6620746865206d756c74697369672070726f706f73616c732e0080206d756c7469736967202d3e204f7074696f6e3c4964656e7469747949643e2e2041646d696e44696400010406009c040010050120546865206d756c746973696727732061646d696e206964656e746974792e2020546865207072696d617279206b6579206f662074686973206964656e7469747994206861732061646d696e20636f6e74726f6c206f76657220746865206d756c74697369672e0080206d756c7469736967202d3e204f7074696f6e3c4964656e7469747949643e2e4850726f706f73616c566f7465436f756e747300010805051909210904000ce82054686520636f756e74206f6620617070726f76616c732f72656a656374696f6e73206f662061206d756c74697369672070726f706f73616c2e00d8206d756c7469736967202d3e2070726f706f73616c206964203d3e204f7074696f6e3c50726f706f73616c566f7465436f756e743e2e3850726f706f73616c53746174657300010805051909250904000c8420546865207374617465206f662061206d756c74697369672070726f706f73616c00c8206d756c7469736967202d3e2070726f706f73616c206964203d3e204f7074696f6e3c50726f706f73616c53746174653e2e40457865637574696f6e5265656e747279010020040004882050726f706f73616c20657865637574696f6e207265656e7472792067756172642e4041757468546f50726f706f73616c4964000108050519093004000cbc2050656e64696e67206a6f696e206964656e7469747920617574686f72697a6174696f6e2070726f706f73616c732e00b0206d756c7469736967202d3e2061757468206964203d3e204f7074696f6e3c70726f706f73616c2069643e2e485472616e73616374696f6e56657273696f6e010010100000000004f420546865206c617374207472616e73616374696f6e2076657273696f6e2c207573656420666f7220606f6e5f72756e74696d655f75706772616465602e4c4c617374496e76616c696450726f706f73616c00010406003004000c450120546865206c6173742070726f706f73616c206964206265666f726520746865206d756c7469736967206368616e676564207369676e657273206f72207369676e6174757265732072657175697265642e0080206d756c7469736967203d3e204f7074696f6e3c70726f706f73616c2069643e3853746f7261676556657273696f6e01002909040004442053746f726167652076657273696f6e2e01550601710104284d61785369676e657273101032000000040501204d6178696d756d206e756d626572206f66207369676e65727320746861742063616e2062652061646465642f72656d6f76656420696e206f6e652063616c6c2e012d090f2856616c696461746f7273012856616c696461746f72730c505065726d697373696f6e65644964656e74697479000104059c3109040004ec20456e74697469657320746861742061726520616c6c6f77656420746f2072756e206f70657261746f722f76616c696461746f72206e6f6465732e48536c617368696e67416c6c6f776564466f7201007d01040204b420536c617368696e672073776974636820666f722076616c696461746f72732026204e6f6d696e61746f72732e5856616c696461746f72436f6d6d697373696f6e436170010081011000000000049d0120416c6c6f777320666c65786962696c69747920696e20636f6d6d697373696f6e2e2045766572792076616c696461746f722068617320636f6d6d697373696f6e20746861742073686f756c6420626520696e207468652072616e6765205b302c204361705d2e015d060179010c5c4d617856616c696461746f725065724964656e746974799502101009050008e8204d6178696d756d20616d6f756e74206f662076616c696461746f727320746861742063616e2072756e20627920616e206964656e746974792ef82049742077696c6c206265204d617856616c696461746f725065724964656e74697479202a2053656c663a3a76616c696461746f725f636f756e7428292e844d61785661726961626c65496e666c6174696f6e546f74616c49737375616e636518400080c6a47e8d03000000000000000000041501204d6178696d756d20616d6f756e74206f6620746f74616c2069737375616e63652061667465722077686963682066697865642072657761726473206b69636b7320696e2e444669786564596561726c79526577617264184000c0444a547f0000000000000000000004390120596561726c7920746f74616c2072657761726420616d6f756e7420746861742067657473206469737472696275746564207768656e2066697865642072657761726473206b69636b7320696e2e013509101c5374616b696e67011c5374616b696e67a83856616c696461746f72436f756e740100101000000000049c2054686520696465616c206e756d626572206f66206163746976652076616c696461746f72732e544d696e696d756d56616c696461746f72436f756e740100101000000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100050104000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010405000004000c0101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e404d696e4e6f6d696e61746f72426f6e64010018400000000000000000000000000000000004210120546865206d696e696d756d2061637469766520626f6e6420746f206265636f6d6520616e64206d61696e7461696e2074686520726f6c65206f662061206e6f6d696e61746f722e404d696e56616c696461746f72426f6e64010018400000000000000000000000000000000004210120546865206d696e696d756d2061637469766520626f6e6420746f206265636f6d6520616e64206d61696e7461696e2074686520726f6c65206f6620612076616c696461746f722e484d696e696d756d4163746976655374616b65010018400000000000000000000000000000000004110120546865206d696e696d756d20616374697665206e6f6d696e61746f72207374616b65206f6620746865206c617374207375636365737366756c20656c656374696f6e2e344d696e436f6d6d697373696f6e0100810110000000000ce820546865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e20746861742076616c696461746f72732063616e207365742e00802049662073657420746f206030602c206e6f206c696d6974206578697374732e184c6564676572000104020039090400104501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e007501204e6f74653a20416c6c2074686520726561647320616e64206d75746174696f6e7320746f20746869732073746f72616765202a4d5553542a20626520646f6e65207468726f75676820746865206d6574686f6473206578706f736564e8206279205b605374616b696e674c6564676572605d20746f20656e73757265206461746120616e64206c6f636b20636f6e73697374656e63792e1450617965650001040500890104000ce42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e2856616c696461746f7273010104050091010800000c450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e50436f756e746572466f7256616c696461746f7273010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170484d617856616c696461746f7273436f756e7400001004000c310120546865206d6178696d756d2076616c696461746f7220636f756e74206265666f72652077652073746f7020616c6c6f77696e67206e65772076616c696461746f727320746f206a6f696e2e00d0205768656e20746869732076616c7565206973206e6f74207365742c206e6f206c696d6974732061726520656e666f726365642e284e6f6d696e61746f72730001040500410904004c750120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f207468656972206e6f6d696e6174696f6e20707265666572656e6365732c206e616d656c79207468652076616c696461746f72732074686174582074686579207769736820746f20737570706f72742e003901204e6f7465207468617420746865206b657973206f6620746869732073746f72616765206d6170206d69676874206265636f6d65206e6f6e2d6465636f6461626c6520696e2063617365207468652d01206163636f756e742773205b604e6f6d696e6174696f6e7351756f74613a3a4d61784e6f6d696e6174696f6e73605d20636f6e66696775726174696f6e206973206465637265617365642e9020496e2074686973207261726520636173652c207468657365206e6f6d696e61746f7273650120617265207374696c6c206578697374656e7420696e2073746f726167652c207468656972206b657920697320636f727265637420616e64207265747269657661626c652028692e652e2060636f6e7461696e735f6b657960710120696e6469636174657320746861742074686579206578697374292c206275742074686569722076616c75652063616e6e6f74206265206465636f6465642e205468657265666f72652c20746865206e6f6e2d6465636f6461626c656d01206e6f6d696e61746f72732077696c6c206566666563746976656c79206e6f742d65786973742c20756e74696c20746865792072652d7375626d697420746865697220707265666572656e6365732073756368207468617420697401012069732077697468696e2074686520626f756e6473206f6620746865206e65776c79207365742060436f6e6669673a3a4d61784e6f6d696e6174696f6e73602e006101205468697320696d706c696573207468617420603a3a697465725f6b65797328292e636f756e7428296020616e6420603a3a6974657228292e636f756e74282960206d696768742072657475726e20646966666572656e746d012076616c75657320666f722074686973206d61702e204d6f72656f7665722c20746865206d61696e20603a3a636f756e7428296020697320616c69676e656420776974682074686520666f726d65722c206e616d656c79207468656c206e756d626572206f66206b65797320746861742065786973742e006d01204c6173746c792c20696620616e79206f6620746865206e6f6d696e61746f7273206265636f6d65206e6f6e2d6465636f6461626c652c20746865792063616e206265206368696c6c656420696d6d6564696174656c7920766961b8205b6043616c6c3a3a6368696c6c5f6f74686572605d20646973706174636861626c6520627920616e796f6e652e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e50436f756e746572466f724e6f6d696e61746f7273010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170385669727475616c5374616b65727300010405005501040018c8205374616b6572732077686f73652066756e647320617265206d616e61676564206279206f746865722070616c6c6574732e00750120546869732070616c6c657420646f6573206e6f74206170706c7920616e79206c6f636b73206f6e207468656d2c207468657265666f7265207468657920617265206f6e6c79207669727475616c6c7920626f6e6465642e20546865796d012061726520657870656374656420746f206265206b65796c657373206163636f756e747320616e642068656e63652073686f756c64206e6f7420626520616c6c6f77656420746f206d7574617465207468656972206c65646765727101206469726563746c792076696120746869732070616c6c65742e20496e73746561642c207468657365206163636f756e747320617265206d616e61676564206279206f746865722070616c6c65747320616e64206163636573736564290120766961206c6f77206c6576656c20617069732e205765206b65657020747261636b206f66207468656d20746f20646f206d696e696d616c20696e7465677269747920636865636b732e60436f756e746572466f725669727475616c5374616b657273010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170484d61784e6f6d696e61746f7273436f756e7400001004000c310120546865206d6178696d756d206e6f6d696e61746f7220636f756e74206265666f72652077652073746f7020616c6c6f77696e67206e65772076616c696461746f727320746f206a6f696e2e00d0205768656e20746869732076616c7565206973206e6f74207365742c206e6f206c696d6974732061726520656e666f726365642e2843757272656e744572610000100400105c205468652063757272656e742065726120696e6465782e006501205468697320697320746865206c617465737420706c616e6e6564206572612c20646570656e64696e67206f6e20686f77207468652053657373696f6e2070616c6c657420717565756573207468652076616c696461746f7280207365742c206974206d6967687420626520616374697665206f72206e6f742e2441637469766545726100004909040010d820546865206163746976652065726120696e666f726d6174696f6e2c20697420686f6c647320696e64657820616e642073746172742e0059012054686520616374697665206572612069732074686520657261206265696e672063757272656e746c792072657761726465642e2056616c696461746f7220736574206f66207468697320657261206d757374206265ac20657175616c20746f205b6053657373696f6e496e746572666163653a3a76616c696461746f7273605d2e5445726173537461727453657373696f6e496e6465780001040510100400105501205468652073657373696f6e20696e646578206174207768696368207468652065726120737461727420666f7220746865206c617374205b60436f6e6669673a3a486973746f72794465707468605d20657261732e006101204e6f74653a205468697320747261636b7320746865207374617274696e672073657373696f6e2028692e652e2073657373696f6e20696e646578207768656e20657261207374617274206265696e672061637469766529f020666f7220746865206572617320696e20605b43757272656e74457261202d20484953544f52595f44455054482c2043757272656e744572615d602e2c457261735374616b65727301010805054d09c5010c0000002078204578706f73757265206f662076616c696461746f72206174206572612e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00cc2049732069742072656d6f766564206166746572205b60436f6e6669673a3a486973746f72794465707468605d20657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e002901204e6f74653a20446570726563617465642073696e6365207631342e205573652060457261496e666f6020696e737465616420746f20776f726b2077697468206578706f73757265732e4c457261735374616b6572734f7665727669657700010805054d095109040030b82053756d6d617279206f662076616c696461746f72206578706f73757265206174206120676976656e206572612e007101205468697320636f6e7461696e732074686520746f74616c207374616b6520696e20737570706f7274206f66207468652076616c696461746f7220616e64207468656972206f776e207374616b652e20496e206164646974696f6e2c75012069742063616e20616c736f206265207573656420746f2067657420746865206e756d626572206f66206e6f6d696e61746f7273206261636b696e6720746869732076616c696461746f7220616e6420746865206e756d626572206f666901206578706f73757265207061676573207468657920617265206469766964656420696e746f2e20546865207061676520636f756e742069732075736566756c20746f2064657465726d696e6520746865206e756d626572206f66ac207061676573206f6620726577617264732074686174206e6565647320746f20626520636c61696d65642e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742eac2053686f756c64206f6e6c79206265206163636573736564207468726f7567682060457261496e666f602e00cc2049732069742072656d6f766564206166746572205b60436f6e6669673a3a486973746f72794465707468605d20657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206f766572766965772069732072657475726e65642e48457261735374616b657273436c697070656401010805054d09c5010c000000409820436c6970706564204578706f73757265206f662076616c696461746f72206174206572612e006501204e6f74653a205468697320697320646570726563617465642c2073686f756c64206265207573656420617320726561642d6f6e6c7920616e642077696c6c2062652072656d6f76656420696e20746865206675747572652e3101204e657720604578706f737572656073206172652073746f72656420696e2061207061676564206d616e6e657220696e2060457261735374616b65727350616765646020696e73746561642e00590120546869732069732073696d696c617220746f205b60457261735374616b657273605d20627574206e756d626572206f66206e6f6d696e61746f7273206578706f736564206973207265647563656420746f20746865a82060543a3a4d61784578706f737572655061676553697a65602062696767657374207374616b6572732e1d0120284e6f74653a20746865206669656c642060746f74616c6020616e6420606f776e60206f6620746865206578706f737572652072656d61696e7320756e6368616e676564292ef42054686973206973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e005d012054686973206973206b657965642066697374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00cc2049742069732072656d6f766564206166746572205b60436f6e6669673a3a486973746f72794465707468605d20657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e002901204e6f74653a20446570726563617465642073696e6365207631342e205573652060457261496e666f6020696e737465616420746f20776f726b2077697468206578706f73757265732e40457261735374616b657273506167656400010c05050555095909040018c020506167696e61746564206578706f73757265206f6620612076616c696461746f7220617420676976656e206572612e0071012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e2c207468656e207374617368206163636f756e7420616e642066696e616c6c79d42074686520706167652e2053686f756c64206f6e6c79206265206163636573736564207468726f7567682060457261496e666f602e00d4205468697320697320636c6561726564206166746572205b60436f6e6669673a3a486973746f72794465707468605d20657261732e38436c61696d65645265776172647301010805054d096d06040018dc20486973746f7279206f6620636c61696d656420706167656420726577617264732062792065726120616e642076616c696461746f722e0069012054686973206973206b657965642062792065726120616e642076616c696461746f72207374617368207768696368206d61707320746f2074686520736574206f66207061676520696e6465786573207768696368206861766538206265656e20636c61696d65642e00cc2049742069732072656d6f766564206166746572205b60436f6e6669673a3a486973746f72794465707468605d20657261732e484572617356616c696461746f72507265667301010805054d0991010800001411012053696d696c617220746f2060457261735374616b657273602c207468697320686f6c64732074686520707265666572656e636573206f662076616c696461746f72732e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00cc2049732069742072656d6f766564206166746572205b60436f6e6669673a3a486973746f72794465707468605d20657261732e4c4572617356616c696461746f7252657761726400010405101804000c2d012054686520746f74616c2076616c696461746f7220657261207061796f757420666f7220746865206c617374205b60436f6e6669673a3a486973746f72794465707468605d20657261732e0021012045726173207468617420686176656e27742066696e697368656420796574206f7220686173206265656e2072656d6f76656420646f65736e27742068617665207265776172642e4045726173526577617264506f696e747301010405105d0914000000000008d0205265776172647320666f7220746865206c617374205b60436f6e6669673a3a486973746f72794465707468605d20657261732e250120496620726577617264206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207265776172642069732072657475726e65642e3845726173546f74616c5374616b6501010405101840000000000000000000000000000000000811012054686520746f74616c20616d6f756e74207374616b656420666f7220746865206c617374205b60436f6e6669673a3a486973746f72794465707468605d20657261732e1d0120496620746f74616c206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207374616b652069732072657475726e65642e20466f7263654572610100990104000454204d6f6465206f662065726120666f7263696e672e404d61785374616b6564526577617264730000690604000c1901204d6178696d756d207374616b656420726577617264732c20692e652e207468652070657263656e74616765206f66207468652065726120696e666c6174696f6e20746861746c206973207573656420666f72207374616b6520726577617264732eac20536565205b457261207061796f75745d282e2f696e6465782e68746d6c236572612d7061796f7574292e4c536c6173685265776172644672616374696f6e0100810110000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401001840000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010405106d09040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100b10404001025012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e00c8204d75737420636f6e7461696e7320696e666f726d6174696f6e20666f72206572617320666f72207468652072616e67653abc20605b6163746976655f657261202d20626f756e64696e675f6475726174696f6e3b206163746976655f6572615d604c56616c696461746f72536c617368496e45726100010805054d097509040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e45726100010805054d0918040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e73000104050079090400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c6173680101040569097d09800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e5443757272656e74506c616e6e656453657373696f6e01001010000000000ce820546865206c61737420706c616e6e65642073657373696f6e207363686564756c6564206279207468652073657373696f6e2070616c6c65742e0071012054686973206973206261736963616c6c7920696e2073796e632077697468207468652063616c6c20746f205b6070616c6c65745f73657373696f6e3a3a53657373696f6e4d616e616765723a3a6e65775f73657373696f6e605d2e384368696c6c5468726573686f6c640000690604000c510120546865207468726573686f6c6420666f72207768656e2075736572732063616e2073746172742063616c6c696e6720606368696c6c5f6f746865726020666f72206f746865722076616c696461746f7273202f5901206e6f6d696e61746f72732e20546865207468726573686f6c6420697320636f6d706172656420746f207468652061637475616c206e756d626572206f662076616c696461746f7273202f206e6f6d696e61746f72732901202860436f756e74466f722a602920696e207468652073797374656d20636f6d706172656420746f2074686520636f6e66696775726564206d61782028604d61782a436f756e7460292e0161060185011830486973746f72794465707468101054000000508c204e756d626572206f66206572617320746f206b65657020696e20686973746f72792e00e820466f6c6c6f77696e6720696e666f726d6174696f6e206973206b65707420666f72206572617320696e20605b63757272656e745f657261202d090120486973746f727944657074682c2063757272656e745f6572615d603a2060457261735374616b657273602c2060457261735374616b657273436c6970706564602c050120604572617356616c696461746f725072656673602c20604572617356616c696461746f72526577617264602c206045726173526577617264506f696e7473602c4501206045726173546f74616c5374616b65602c206045726173537461727453657373696f6e496e646578602c2060436c61696d656452657761726473602c2060457261735374616b6572735061676564602c5c2060457261735374616b6572734f76657276696577602e00e4204d757374206265206d6f7265207468616e20746865206e756d626572206f6620657261732064656c617965642062792073657373696f6e2ef820492e652e2061637469766520657261206d75737420616c7761797320626520696e20686973746f72792e20492e652e20606163746976655f657261203ec42063757272656e745f657261202d20686973746f72795f646570746860206d7573742062652067756172616e746565642e001101204966206d6967726174696e6720616e206578697374696e672070616c6c65742066726f6d2073746f726167652076616c756520746f20636f6e6669672076616c75652cec20746869732073686f756c642062652073657420746f2073616d652076616c7565206f72206772656174657220617320696e2073746f726167652e001501204e6f74653a2060486973746f727944657074686020697320757365642061732074686520757070657220626f756e6420666f72207468652060426f756e646564566563602d01206974656d20605374616b696e674c65646765722e6c65676163795f636c61696d65645f72657761726473602e2053657474696e6720746869732076616c7565206c6f776572207468616ed820746865206578697374696e672076616c75652063616e206c65616420746f20696e636f6e73697374656e6369657320696e20746865150120605374616b696e674c65646765726020616e642077696c6c206e65656420746f2062652068616e646c65642070726f7065726c7920696e2061206d6967726174696f6e2ef020546865207465737420607265647563696e675f686973746f72795f64657074685f616272757074602073686f77732074686973206566666563742e3853657373696f6e735065724572611010030000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e10100700000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e48536c61736844656665724475726174696f6e101004000000100101204e756d626572206f662065726173207468617420736c6173686573206172652064656665727265642062792c20616674657220636f6d7075746174696f6e2e000d0120546869732073686f756c64206265206c657373207468616e2074686520626f6e64696e67206475726174696f6e2e2053657420746f203020696620736c617368657315012073686f756c64206265206170706c69656420696d6d6564696174656c792c20776974686f7574206f70706f7274756e69747920666f7220696e74657276656e74696f6e2e4c4d61784578706f737572655061676553697a651010400000002cb020546865206d6178696d756d2073697a65206f6620656163682060543a3a4578706f7375726550616765602e00290120416e20604578706f737572655061676560206973207765616b6c7920626f756e64656420746f2061206d6178696d756d206f6620604d61784578706f737572655061676553697a656030206e6f6d696e61746f72732e00210120466f72206f6c646572206e6f6e2d7061676564206578706f737572652c206120726577617264207061796f757420776173207265737472696374656420746f2074686520746f70210120604d61784578706f737572655061676553697a6560206e6f6d696e61746f72732e205468697320697320746f206c696d69742074686520692f6f20636f737420666f722074686548206e6f6d696e61746f72207061796f75742e005901204e6f74653a20604d61784578706f737572655061676553697a6560206973207573656420746f20626f756e642060436c61696d6564526577617264736020616e6420697320756e7361666520746f207265647563659020776974686f75742068616e646c696e6720697420696e2061206d6967726174696f6e2e484d6178556e6c6f636b696e674368756e6b7310102000000028050120546865206d6178696d756d206e756d626572206f662060756e6c6f636b696e6760206368756e6b732061205b605374616b696e674c6564676572605d2063616e090120686176652e204566666563746976656c792064657465726d696e657320686f77206d616e7920756e6971756520657261732061207374616b6572206d61792062653820756e626f6e64696e6720696e2e00f8204e6f74653a20604d6178556e6c6f636b696e674368756e6b736020697320757365642061732074686520757070657220626f756e6420666f722074686501012060426f756e64656456656360206974656d20605374616b696e674c65646765722e756e6c6f636b696e67602e2053657474696e6720746869732076616c75650501206c6f776572207468616e20746865206578697374696e672076616c75652063616e206c65616420746f20696e636f6e73697374656e6369657320696e20746865090120605374616b696e674c65646765726020616e642077696c6c206e65656420746f2062652068616e646c65642070726f7065726c7920696e20612072756e74696d650501206d6967726174696f6e2e20546865207465737420607265647563696e675f6d61785f756e6c6f636b696e675f6368756e6b735f616272757074602073686f7773342074686973206566666563742e01810911204f6666656e63657301204f6666656e636573081c5265706f72747300010405348509040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e58436f6e63757272656e745265706f727473496e64657801010805058909ad040400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e00019d010000121c53657373696f6e011c53657373696f6e1c2856616c696461746f7273010005010400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e646578010010100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e676564010020040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b65797301008d090400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f7273010095090400148020496e6469636573206f662064697361626c65642076616c696461746f72732e003d01205468652076656320697320616c77617973206b65707420736f7274656420736f20746861742077652063616e2066696e642077686574686572206120676976656e2076616c696461746f722069733d012064697361626c6564207573696e672062696e617279207365617263682e204974206765747320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e73642061206e657720736574206f66206964656e7469746965732e204e6578744b657973000104050099060400049c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e204b65794f776e657200010405a10900040004090120546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e01950601a1010001a9091348417574686f72697479446973636f766572790148417574686f72697479446973636f7665727908104b6579730100ad090400048c204b657973206f66207468652063757272656e7420617574686f72697479207365742e204e6578744b6579730100ad0904000480204b657973206f6620746865206e65787420617574686f72697479207365742e00000000141c4772616e647061011c4772616e6470611c1453746174650100b50904000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e67650000b909040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000010040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c65640000bd030400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e745365744964010030200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e00010405301004002859012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f722077686963682069747368206d656d62657273207765726520726573706f6e7369626c652e0045012054686973206973206f6e6c79207573656420666f722076616c69646174696e672065717569766f636174696f6e2070726f6f66732e20416e2065717569766f636174696f6e2070726f6f66206d7573744d0120636f6e7461696e732061206b65792d6f776e6572736869702070726f6f6620666f72206120676976656e2073657373696f6e2c207468657265666f7265207765206e65656420612077617920746f20746965450120746f6765746865722073657373696f6e7320616e64204752414e44504120736574206964732c20692e652e207765206e65656420746f2076616c6964617465207468617420612076616c696461746f7241012077617320746865206f776e6572206f66206120676976656e206b6579206f6e206120676976656e2073657373696f6e2c20616e642077686174207468652061637469766520736574204944207761735420647572696e6720746861742073657373696f6e2e00b82054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e2c417574686f7269746965730100bd0904000484205468652063757272656e74206c697374206f6620617574686f7269746965732e01a10601a5010c384d6178417574686f7269746965731010a0860100045c204d617820417574686f72697469657320696e20757365344d61784e6f6d696e61746f727310100004000004d420546865206d6178696d756d206e756d626572206f66206e6f6d696e61746f727320666f7220656163682076616c696461746f722e584d6178536574496453657373696f6e456e74726965733020150000000000000018390120546865206d6178696d756d206e756d626572206f6620656e747269657320746f206b65657020696e207468652073657420696420746f2073657373696f6e20696e646578206d617070696e672e0031012053696e6365207468652060536574496453657373696f6e60206d6170206973206f6e6c79207573656420666f722076616c69646174696e672065717569766f636174696f6e73207468697329012076616c75652073686f756c642072656c61746520746f2074686520626f6e64696e67206475726174696f6e206f66207768617465766572207374616b696e672073797374656d2069733501206265696e6720757365642028696620616e79292e2049662065717569766f636174696f6e2068616e646c696e67206973206e6f7420656e61626c6564207468656e20746869732076616c7565342063616e206265207a65726f2e01c1091528486973746f726963616c0128486973746f726963616c0848486973746f726963616c53657373696f6e730001040510c5090400045d01204d617070696e672066726f6d20686973746f726963616c2073657373696f6e20696e646963657320746f2073657373696f6e2d6461746120726f6f74206861736820616e642076616c696461746f7220636f756e742e2c53746f72656452616e67650000bd03040004e4205468652072616e6765206f6620686973746f726963616c2073657373696f6e732077652073746f72652e205b66697273742c206c61737429000000001620496d4f6e6c696e650120496d4f6e6c696e651038486561727462656174416674657201001010000000002c1d012054686520626c6f636b206e756d6265722061667465722077686963682069742773206f6b20746f2073656e64206865617274626561747320696e207468652063757272656e74242073657373696f6e2e0025012041742074686520626567696e6e696e67206f6620656163682073657373696f6e20776520736574207468697320746f20612076616c756520746861742073686f756c642066616c6c350120726f7567686c7920696e20746865206d6964646c65206f66207468652073657373696f6e206475726174696f6e2e20546865206964656120697320746f206669727374207761697420666f721901207468652076616c696461746f727320746f2070726f64756365206120626c6f636b20696e207468652063757272656e742073657373696f6e2c20736f207468617420746865a820686561727462656174206c61746572206f6e2077696c6c206e6f74206265206e65636573736172792e00390120546869732076616c75652077696c6c206f6e6c79206265207573656420617320612066616c6c6261636b206966207765206661696c20746f2067657420612070726f7065722073657373696f6e2d012070726f677265737320657374696d6174652066726f6d20604e65787453657373696f6e526f746174696f6e602c2061732074686f736520657374696d617465732073686f756c642062650101206d6f7265206163637572617465207468656e207468652076616c75652077652063616c63756c61746520666f7220604865617274626561744166746572602e104b6579730100c909040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730001080505bd0320040004350120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206053657373696f6e496e6465786020616e64206041757468496e646578602e38417574686f726564426c6f636b7301010805054d0910100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206056616c696461746f7249643c543e6020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e01c90601b5010440556e7369676e65645072696f726974793020ffffffffffffffff10f0204120636f6e66696775726174696f6e20666f722062617365207072696f72697479206f6620756e7369676e6564207472616e73616374696f6e732e0015012054686973206973206578706f73656420736f20746861742069742063616e2062652074756e656420666f7220706172746963756c61722072756e74696d652c207768656eb4206d756c7469706c652070616c6c6574732073656e6420756e7369676e6564207472616e73616374696f6e732e01d109176052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100d50904000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e0000000018105375646f01105375646f040c4b6579000000040004842054686520604163636f756e74496460206f6620746865207375646f206b65792e01d50601d5010001d90919144173736574011441737365748460556e697175655469636b6572526567697374726174696f6e000104022901dd090400042901204d61702065616368205b605469636b6572605d20746f2069747320726567697374726174696f6e2064657461696c7320285b605469636b6572526567697374726174696f6e605d292e305469636b6572436f6e6669670100e1090800000425012052657475726e73205b605469636b6572526567697374726174696f6e436f6e666967605d20666f7220617373657373696e672069662061207469636b65722069732076616c69642e1841737365747300010402b0e509040004e4204d6170732065616368205b6041737365744964605d20746f2069747320756e6465726c696e67205b60417373657444657461696c73605d2e2841737365744e616d657300010402b0e901040004d8204d6170732065616368205b6041737365744964605d20746f2069747320756e6465726c696e67205b6041737365744e616d65605d2e2442616c616e63654f660101080206e90918400000000000000000000000000000000004190120547261636b732074686520746f74616c205b6042616c616e6365605d20666f722065616368205b6041737365744964605d20706572205b604964656e746974794964605d2e4041737365744964656e7469666965727301010402b0ed010400041901204d6170732065616368205b6041737365744964605d20746f20697473206173736574206964656e7469666965727320285b6041737365744964656e746966696572605d292e50437573746f6d54797065496453657175656e63650100e10110000000000cc420546865206e65787420604173736574547970653a3a437573746f6d6020494420696e207468652073657175656e63652e00d0204e756d6265727320696e207468652073657175656e63652073746172742066726f6d203120726174686572207468616e20302e2c437573746f6d547970657301010405e10138040004f8204d61707320637573746f6d20617373657420747970652069647320746f20746865207265676973746572656420737472696e6720636f6e74656e74732e48437573746f6d5479706573496e76657273650001040238e101040004610120496e7665727365206d6170206f662060437573746f6d5479706573602c2066726f6d207265676973746572656420737472696e6720636f6e74656e747320746f20637573746f6d2061737365742074797065206964732e3046756e64696e67526f756e6401010402b001020400044101204d6170732065616368205b6041737365744964605d20746f20746865206e616d65206f662069747320666f756e64696e6720726f756e6420285b6046756e64696e67526f756e644e616d65605d292e50497373756564496e46756e64696e67526f756e6401010402ed091840000000000000000000000000000000000479012054686520746f74616c205b6042616c616e6365605d206f6620746f6b656e732069737375656420696e20616c6c207265636f726465642066756e64696e6720726f756e647320285b6046756e64696e67526f756e644e616d65605d292e1846726f7a656e01010402b02004000449012052657475726e7320607472756560206966207472616e736665727320666f7220746865206173736574206172652066726f7a656e2e204f74686572776973652c2072657475726e73206066616c7365602e384173736574446f63756d656e74730001080205f10909020400049c20416c6c205b60446f63756d656e74605d20617474616368656420746f20616e2061737365742e604173736574446f63756d656e7473496453657175656e636501010402b00502100000000004a0205b60446f63756d656e744964605d20636f756e74657220706572205b6041737365744964605d2e4c41737365744d6574616461746156616c7565730001080205f50935020400047c204d65746174646174612076616c75657320666f7220616e2061737365742e6441737365744d6574616461746156616c756544657461696c730001080205f5093d02040004a02044657461696c7320666f7220616e2061737365742773204d657461646174612076616c7565732e6c41737365744d657461646174614c6f63616c4e616d65546f4b65790001080202f909490204000488204173736574204d65746164617461204c6f63616c204e616d65202d3e204b65792e7041737365744d65746164617461476c6f62616c4e616d65546f4b657900010402450265020400048c204173736574204d6574616461746120476c6f62616c204e616d65202d3e204b65792e6c41737365744d657461646174614c6f63616c4b6579546f4e616d650001080205fd09450204000488204173736574204d65746164617461204c6f63616c204b6579202d3e204e616d652e7041737365744d65746164617461476c6f62616c4b6579546f4e616d6500010405650245020400048c204173736574204d6574616461746120476c6f62616c204b6579202d3e204e616d652e5c41737365744d657461646174614c6f63616c53706563730001080205fd094d0204000480204173736574204d65746164617461204c6f63616c204b65792073706563732e6041737365744d65746164617461476c6f62616c53706563730001040565024d0204000484204173736574204d6574616461746120476c6f62616c204b65792073706563732e6c4173736574734578656d707446726f6d41666669726d6174696f6e01010402b0200400041d012041206c697374206f66206173736574732074686174206578656d707420616c6c2075736572732066726f6d2061666669726d696e672069747320726563656976656d656e742e40507265417070726f76656441737365740101080602010a20040004250120416c6c20617373657473207468617420646f6e2774206e65656420616e2061666669726d6174696f6e20746f20626520726563656976656420627920616e206964656e746974792e484d616e6461746f72794d65646961746f727301010402b0e106040004c820546865206c697374206f66206d616e6461746f7279206d65646961746f727320666f72206576657279207469636b65722e7043757272656e7441737365744d657461646174614c6f63616c4b657900010402b04902040004e420546865206c617374205b6041737365744d657461646174614c6f63616c4b6579605d207573656420666f72205b6041737365744964605d2e7443757272656e7441737365744d65746164617461476c6f62616c4b657900006502040004ec20546865206c617374205b6041737365744d65746164617461476c6f62616c4b6579605d207573656420666f72206120676c6f62616c206b65792e485469636b6572734f776e65644279557365720101080602050a200400047420416c6c207469636b657273206f776e6564206279206120757365722e645365637572697479546f6b656e734f776e65644279557365720101080602010a200400047020416c6c20617373657473206f776e6564206279206120757365722e34417373657449645469636b657200010402b02901040004d8204d61707320616c6c205b6041737365744964605d207468617420617265206d617070656420746f2061205b605469636b6572605d2e345469636b657241737365744964000104022901b0040004dc204d61707320616c6c205b605469636b6572605d207468617420617265206c696e6b656420746f20616e205b6041737365744964605d2e2841737365744e6f6e6365010104060030200000000000000000040101204120706572206163636f756e74206e6f6e63652074686174206973207573656420666f722067656e65726174696e6720616e205b6041737365744964605d2e3853746f7261676556657273696f6e0100090a040004442053746f726167652076657273696f6e2e01d90601d901184841737365744e616d654d61784c656e6774681010800000000494204d6178206c656e67746820666f7220746865206e616d65206f6620616e2061737365742e6446756e64696e67526f756e644e616d654d61784c656e6774681010800000000498204d6178206c656e677468206f66207468652066756e64696e6720726f756e64206e616d652e6841737365744d657461646174614e616d654d61784c656e67746810100001000004b4204d6178206c656e67746820666f7220746865204173736574204d657461646174612074797065206e616d652e6c41737365744d6574616461746156616c75654d61784c656e67746810100020000004a4204d6178206c656e67746820666f7220746865204173736574204d657461646174612076616c75652e7441737365744d65746164617461547970654465664d61784c656e67746810100020000004cc204d6178206c656e67746820666f7220746865204173736574204d65746164617461207479706520646566696e6974696f6e2e444d617841737365744d65646961746f727310100400000004a8204d6178696d756d206e756d626572206f66206d65646961746f727320666f7220616e2061737365742e010d0a1a4c4361706974616c446973747269627574696f6e014c4361706974616c446973747269627574696f6e0c34446973747269627574696f6e73000104028902910204000c350120416c6c206361706974616c20646973747269627574696f6e732c207469656420746f207468656972207265737065637469766520636f72706f7261746520616374696f6e732028434173292e005c20284341496429203d3e20446973747269627574696f6e28486f6c6465725061696401010402110a2004000c8c2048617320616e20617373657420686f6c646572206265656e2070616964207965743f00a42028434149642c2044494429202d3e2057617320444944207061696420696e2074686520434149643f3853746f7261676556657273696f6e0100150a040004442053746f726167652076657273696f6e2e01e5060181020001190a1b28436865636b706f696e740128436865636b706f696e74302c546f74616c537570706c7901010802051d0a1840000000000000000000000000000000000cb420546f74616c20737570706c79206f662074686520746f6b656e2061742074686520636865636b706f696e742e00010120285b6041737365744964605d2c20636865636b706f696e74496429202d3e20746f74616c20737570706c7920617420676976656e20636865636b706f696e741c42616c616e63650101080205210a1840000000000000000000000000000000000c882042616c616e6365206f66206120444944206174206120636865636b706f696e742e00190120285b6041737365744964605d2c206469642c20636865636b706f696e7420494429202d3e2042616c616e6365206f66206120444944206174206120636865636b706f696e7450436865636b706f696e74496453657175656e636501010402b09d02200000000000000000108c20436865636b706f696e74732049442067656e657261746f722073657175656e63652ea8204944206f6620666972737420636865636b706f696e74206973203120696e7374656164206f6620302e009020285b6041737365744964605d29202d3e206e6f2e206f6620636865636b706f696e74733842616c616e6365557064617465730101080205e909250a040008bc20436865636b706f696e747320776865726520612044494427732062616c616e63652077617320757064617465642e050120285b6041737365744964605d2c2064696429202d3e205b636865636b706f696e7420494420776865726520757365722062616c616e6365206368616e6765645d2854696d657374616d707301010802051d0a30200000000000000000185c20436865636b706f696e742074696d657374616d70732e000901204576657279207363686564756c652d6f726967696e6174656420636865636b706f696e74206d6170732069747320494420746f20697473206475652074696d652e210120457665727920636865636b706f696e74206d616e75616c6c792063726561746564206d6170732069747320494420746f207468652074696d65206f66207265636f7264696e672e00e420285b6041737365744964605d29202d3e2028636865636b706f696e7420494429202d3e20636865636b706f696e742074696d657374616d70585363686564756c65734d6178436f6d706c657869747901003020000000000000000004e420546865206d6178696d756d20636f6d706c657869747920616c6c6f77656420666f7220616e2061737365742773207363686564756c65732e485363686564756c65496453657175656e636501010402b0a1022000000000000000000cb020436865636b706f696e74207363686564756c652049442073657175656e636520666f72206173736574732e007420285b6041737365744964605d29202d3e207363686564756c65204944544361636865644e657874436865636b706f696e747300010402b0290a040014a820436163686564206e65787420636865636b706f696e7420666f722065616368207363686564756c652e002d012054686973206973207573656420746f20717569636b6c792066696e6420746865206e65787420636865636b706f696e742066726f6d20612061737365742773207363686564756c65732e008820285b6041737365744964605d29202d3e206e65787420636865636b706f696e7473505363686564756c6564436865636b706f696e74730001080205390aa50204000c5c205363686564756c656420636865636b706f696e74732e00cc20285b6041737365744964605d2c207363686564756c6520494429202d3e207363686564756c6520636865636b706f696e7473405363686564756c65526566436f756e740101080205390a10100000000020010120486f77206d616e7920227374726f6e6722207265666572656e6365732061726520746865726520746f206120676976656e20605363686564756c654964603f00fc205468652070726573656e6365206f66206120227374726f6e6722207265666572656e63652c20696e207468652073656e7365206f66206052633c543e602ce020656e7461696c73207468617420746865207265666572656e636564207363686564756c652063616e6e6f742062652072656d6f7665642ed820546875732c206173206c6f6e6720617320607374726f6e675f7265665f636f756e74287363686564756c655f696429203e2030602cac206072656d6f76655f7363686564756c65287363686564756c655f696429602077696c6c206572726f722e00bc20285b6041737365744964605d2c207363686564756c6520494429202d3e207374726f6e672072656620636f756e74385363686564756c65506f696e74730101080205390a250a04000cc420416c6c2074686520636865636b706f696e7473206120676976656e207363686564756c65206f726967696e617465642e00b820285b6041737365744964605d2c207363686564756c6520494429202d3e205b636865636b706f696e742049445d3853746f7261676556657273696f6e01003d0a040004442053746f726167652076657273696f6e2e01ed060199020001410a1c44436f6d706c69616e63654d616e616765720144436f6d706c69616e63654d616e616765720c404173736574436f6d706c69616e63657301010402b0450a08000004f420436f6d706c69616e636520666f7220616e20617373657420285b6041737365744964605d202d3e205b604173736574436f6d706c69616e6365605d294854727573746564436c61696d49737375657201010402b0cd02040004f0204c697374206f66207472757374656420636c61696d20697373756572205b6041737365744964605d202d3e20497373756572204964656e746974793853746f7261676556657273696f6e0100490a040004442053746f726167652076657273696f6e2e01f10601b10204584d6178436f6e646974696f6e436f6d706c6578697479101032000000046d0120546865206d6178696d756d20636c61696d20726561647320746861742061726520616c6c6f77656420746f2068617070656e20696e20776f7273742063617365206f66206120636f6e646974696f6e207265736f6c7574696f6e014d0a1d3c436f72706f72617465416374696f6e013c436f72706f72617465416374696f6e24404d617844657461696c734c656e67746801001010000000001c5d012044657465726d696e657320746865206d6178696d756d206e756d626572206f6620627974657320746861742074686520667265652d666f726d206064657461696c7360206f6620612043412063616e2073746f72652e002901204e6f746520746861742074686973206973206e6f7420746865206e756d626572206f662060636861726073206f7220746865206e756d626572206f66205b6772617068656d65735d2e4101205768696c652074686973206d617920626520756e6e61747572616c20696e207465726d73206f662068756d616e20756e6465727374616e64696e67206f66206120746578742773206c656e6774682c6501206974206d6f726520636c6f73656c79207265666c656374732061637475616c2073746f7261676520636f73747320286027612760206973206368656170657220746f2073746f7265207468616e20616e20656d6f6a69292e00d0205b6772617068656d65735d3a2068747470733a2f2f656e2e77696b6970656469612e6f72672f77696b692f4772617068656d655c44656661756c745461726765744964656e74697469657301010402b0e90208000110ec20546865206964656e7469746965732074617267657465642062792064656661756c7420666f722043417320666f7220746869732061737365742c8c2065697468657220746f206265206578636c75646564206f7220696e636c756465642e007c202841737365744964203d3e20746172676574206964656e746974696573295444656661756c7457697468686f6c64696e6754617801010402b09502100000000020a901205468652064656661756c7420616d6f756e74206f662074617820746f2077697468686f6c6420282277697468686f6c64696e6720746178222c2057542920666f722074686973206173736574207768656e20646973747269627574696e67206469766964656e64732e00350120546f20756e6465727374616e642077697468686f6c64696e67207461782c20652e672e2c206c6574277320617373756d65207468617420796f7520686f6c642041434d45207368617265732ec42041434d45206e6f77206465636964657320746f2064697374726962757465203130302053454b20746f20416c6963652e590120416c696365206c6976657320696e2053776564656e2c20736f20536b617474657665726b6574202874686520537765646973682074617820617574686f72697479292077616e747320333025206f6620746861742e5d01205468656e2074686f736520313030202a2033302520617265207769746868656c642066726f6d20416c6963652c20616e642041434d452077696c6c2073656e64207468656d20746f20536b617474657665726b65742e006c202841737365744964203d3e202520746f2077697468686f6c64294444696457697468686f6c64696e6754617801010402b009030400104d012054686520616d6f756e74206f662074617820746f2077697468686f6c6420282277697468686f6c64696e6720746178222c2057542920666f722061206365727461696e20417373657449642078204449442e6d0120496620616e20656e7472792065786973747320666f722061206365727461696e204449442c206974206f7665727269646573207468652064656661756c7420696e206044656661756c7457697468686f6c64696e67546178602e008c202841737365744964203d3e205b286469642c202520746f2077697468686f6c64295d304341496453657175656e636501010402b08d02100000000008b820546865206e657874207065722d60417373657449646020434120494420696e207468652073657175656e63652e5101205468652066756c6c20494420697320646566696e6564206173206120636f6d62696e6174696f6e206f662060417373657449646020616e642061206e756d62657220696e20746869732073657175656e63652e40436f72706f72617465416374696f6e730001080205510af5020400146c20416c6c207265636f72646564204341732074687573206661722ea4204f6e6c792067656e6572696320696e666f726d6174696f6e2069732073746f72656420686572652e7d01205370656369666963206043414b696e6460732c20652e672e2c2062656e656669747320616e6420636f72706f726174652062616c6c6f74732c206d617920757365206164646974696f6e616c206f6e2d636861696e2073746f726167652e00b8202841737365744964203d3e206c6f63616c204944203d3e2074686520636f72706f7261746520616374696f6e29244341446f634c696e6b0101040289021503040014d0204173736f63696174696f6e732066726f6d2043417320746f2060446f63756d656e74607320766961207468656972204944732e5c202843414964203d3e205b446f63756d656e7449645d29000901205468652060436f72706f72617465416374696f6e7360206d61702073746f726573206041737365744964203d3e204c6f63616c4964203d3e20546865204341602c290120736f2077652063616e20696e666572206041737365744964203d3e2043414964602e205468657265666f72652c20776520646f6e2774206e656564206120646f75626c65206d61702e1c44657461696c730101040289021103040008e8204173736f6369617465732064657461696c7320696e20667265652d666f726d207465787420776974682061204341206279206974732049442e50202843414964203d3e20434144657461696c73293853746f7261676556657273696f6e0100550a040004442053746f726167652076657273696f6e2e01f50601e50208304d61785461726765744964731010e803000004cc204d6178206e756d626572206f66204449442073706563696669656420696e20605461726765744964656e746974696573602e284d6178446964576874731010e803000004c4204d6178206e756d626572206f66207065722d4449442077697468686f6c64696e6720746178206f76657272696465732e01590a1e3c436f72706f7261746542616c6c6f74013c436f72706f7261746542616c6c6f741c144d65746173000104028902210304000c80204d65746164617461206f66206120636f72706f726174652062616c6c6f742e005420284341496429203d3e2042616c6c6f744d6574612854696d6552616e6765730001040289021d03040010e42054696d652064657461696c73206f66206120636f72706f726174652062616c6c6f74206173736f636961746564207769746820612043412ed0205468652074696d657374616d70732064656e6f7465207768656e20766f74696e672073746172747320616e642073746f70732e006820284341496429203d3e2042616c6c6f7454696d6552616e6765404d6f74696f6e4e756d43686f696365730101040289025d0a040024c82053746f72657320686f77206d616e792063686f696365732074686572652061726520696e2065616368206d6f74696f6e2e00250120417420616c6c2074696d65732c2074686520696e76617269616e7420686f6c6473207468617420606d6f74696f6e5f63686f696365735b6964785d6020697320657175616c20746f310120606d657461732e756e7772617028292e6d6f74696f6e735b6964785d2e63686f696365732e6c656e2829602e20546861742069732c2074686973206973206a75737420612063616368652c1101207573656420746f2061766f6964206665746368696e6720616c6c20746865206d6f74696f6e732077697468207468656972206173736f6369617465642074657874732e0001012060753136602063686f696365732073686f756c64206265206d6f7265207468616e20656e6f75676820746f20666974207265616c207573652063617365732e00b020284341496429203d3e204e756d626572206f662063686f6963657320696e2065616368206d6f74696f6e2e0c52435601010402890220040010dc2049732072616e6b65642063686f69636520766f74696e6720285243562920656e61626c656420666f7220746869732062616c6c6f743f650120466f7220616e20756e6465727374616e64696e67206f6620686f77205243562069732068616e646c65642c20736565206e6f7465206f6e206042616c6c6f74566f7465602773206066616c6c6261636b60206669656c642e003c20284341496429203d3e20626f6f6c1c526573756c7473010104028902610a04001cb02053746f7265732074686520746f74616c20766f74652074616c6c79206f6e20656163682063686f6963652e006820524356206973206e6f74206163636f756e74656420666f722cd02061732074686572652061726520746f6f206d616e792077616e747320746f20696e74657270726574207468652067726170682c9c20616e64206265636175736520697420776f756c64206e6f7420626520656666696369656e742e008420284341496429203d3e205b63757272656e7420766f746520776569676874735d14566f7465730101080206110a4103040018ac2053746f726573206561636820444944277320766f74657320696e206120676976656e2062616c6c6f742ef8205365652074686520646f63756d656e746174696f6e206f66206042616c6c6f74566f74656020666f72206e6f746573206f6e2073656d616e746963732e008420284341496429203d3e202844494429203d3e205b766f7465207765696768745d001d012055736572206d75737420656e746572203020766f746520776569676874206966207468657920646f6e27742077616e7420746f20766f746520666f7220612063686f6963652e3853746f7261676556657273696f6e0100650a040004442053746f726167652076657273696f6e2e010d070119030001690a1f2c5065726d697373696f6e73012c5065726d697373696f6e73084443757272656e7450616c6c65744e616d650100c8040004c820546865206e616d65206f66207468652063757272656e742070616c6c65742028616b61206d6f64756c65206e616d65292e5c43757272656e74446973706174636861626c654e616d650100d8040004c820546865206e616d65206f66207468652063757272656e742066756e6374696f6e2028616b612065787472696e736963292e000000016d0a201050697073011050697073604c5072756e65486973746f726963616c50697073010020040004dc2053657420746f2060747275656020696620686973746f726963616c20504950732064617461206d7573742062652072656d6f7665642e584d696e696d756d50726f706f73616c4465706f7369740100184000000000000000000000000000000000041d0120546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f7220636f6d6d756e69747920504950206372656174696f6e2e5844656661756c74456e6163746d656e74506572696f6401001010000000000439012044656661756c7420656e6163746d656e7420706572696f6420746861742077696c6c2062652075736520616674657220612070726f706f73616c2069732061636365707465642062792047432e4050656e64696e6750697045787069727901005901040104ed01204e756d626572206f6620626c6f636b732069742077696c6c2074616b652c2061667465722061206050656e64696e67602050495020657870697265732c20617373756d696e6720697420686173206e6f74207472616e736974696f6e656420746f20616e6f74686572206050726f706f73616c5374617465602e3c4d6178506970536b6970436f756e740100080400048901204d6178696d756d2074696d65732061205049502063616e20626520736b6970706564206265666f72652074726967676572696e67206043616e6e6f74536b69705069706020696e2060656e6163745f736e617073686f745f726573756c7473602e384163746976655069704c696d6974010010100000000004b10120546865206d6178696d756d20616c6c6f776564206e756d62657220666f722061637469766520504950732e204f6e636520726561636865642c206e657720504950732063616e6e6f742062652070726f706f73656420627920636f6d6d756e697479206d656d626572732e34506970496453657175656e636501005d031000000000045c2050726f706f73616c2773206964656e7469666965722e48536e617073686f74496453657175656e6365010071031000000000045820536e6170686f742773206964656e7469666965722e38416374697665506970436f756e74010010100000000004a820546f74616c20636f756e74206f662070656e64696e67206f72207363686564756c656420504950732e4050726f706f73616c4d65746164617461000104055d03710a040004d020546865205b60506970734d65746164617461605d20666f7220656163682070726f706f73616c20285b605069704964605d292e204465706f736974730001080505750a790a040004ec20416c6c206c6f636b6564205b604465706f736974496e666f605d20706572205b605069704964605d20666f722065616368206163636f756e742e2450726f706f73616c73000104055d037d0a040004ac20546865205b60506970605d20666f7220656163682070726f706f73616c20285b605069704964605d292e3850726f706f73616c526573756c74010104055d03810aa00000000000000000000000000000000000000000000000000000000000000000000000000000000004d020546865205b60566f74696e67526573756c74605d20666f7220656163682070726f706f73616c20285b605069704964605d292e3450726f706f73616c566f7465730001080505750a850a04000401012054686520566f74657320285b60566f7465605d2920666f7220656163682070726f706f73616c20285b605069704964605d2920706572206163636f756e742e34506970546f5363686564756c65000104055d0310040004dc204d617073205049507320746f2074686520626c6f636b20617420776869636820746865792077696c6c2062652065786563757465642e244c697665517565756501007503040018cc2041206c697665207072696f7269747920717565756520286c6f77657374207072696f7269747920617420696e646578203029a0206f662070656e64696e67205049507320757020746f2074686520616374697665206c696d69742ef4205072696f7269747920697320646566696e65642062792074686520607765696768746020696e207468652060536e617073686f74746564506970602e00450120556e6c696b652060536e617073686f745175657565602c2074686973207175657565206973206c6976652c2067657474696e6720757064617465642077697468206561636820766f746520636173742e2d012054686520736e617073686f74206973207468657265666f726520657373656e7469616c6c79206120706f696e742d696e2d74696d6520636c6f6e65206f6620746869732071756575652e34536e617073686f74517565756501007503040014590120546865207072696f7269747920717565756520286c6f77657374207072696f7269747920617420696e646578203029206f6620504950732061742074686520706f696e74206f6620736e617073686f7474696e672ef4205072696f7269747920697320646566696e65642062792074686520607765696768746020696e207468652060536e617073686f74746564506970602e000901204120717565756564205049502063616e20626520736b69707065642e20446f696e6720736f2062756d70732074686520607069705f736b69705f636f756e74602e3501204f6e636520612028636f6e666967757261626c652920746872657368686f6c642069732065786365656465642c2061205049502063616e6e6f7420626520736b697070656420616761696e2e30536e617073686f744d6574610000890a0400046820546865205b60536e617073686f744d65746164617461605d2e30506970536b6970436f756e74010104055d0308040008d020546865206e756d626572206f662074696d65732061206365727461696e2050495020686173206265656e20736b69707065642e3501204f6e636520612028636f6e666967757261626c652920746872657368686f6c642069732065786365656465642c2061205049502063616e6e6f7420626520736b697070656420616761696e2e34436f6d6d69747465655069707301008d03040008d420416c6c206578697374696e672050495073207768657265207468652070726f706f736572206973206120636f6d6d69747465652e39012054686973206c6973742069732061206361636865206f6620616c6c2069647320696e206050726f706f73616c73602077697468206050726f706f7365723a3a436f6d6d6974746565285f29602e3850726f706f73616c537461746573000104055d036d03040004d02054686520285b6050726f706f73616c5374617465605d29206f66206120676976656e2050495020285b605069704964605d292e3850656e64696e67526566756e6473000104055d03200400049420416c6c20504950732074686174207374696c6c207265717569726520726566756e64732e3c566f746573546f42655072756e6564000104055d0320040004c020416c6c20504950732074686174207374696c6c207265717569726520766f74657320746f206265207072756e65642e3853746f7261676556657273696f6e01008d0a040004442053746f726167652076657273696f6e2e01110701510304604d6178526566756e6473416e64566f7465735072756e656410108000000004e020546865206d6178696d756d206e756d626572206f6620766f74657320746861742063616e206265207072756e6564206174206f6e63652e01910a2124506f7274666f6c696f0124506f7274666f6c696f344c4e657874506f7274666f6c696f4e756d626572010104069cf820010000000000000004cc20546865206e65787420706f7274666f6c696f2073657175656e6365206e756d626572206f6620616e206964656e746974792e28506f7274666f6c696f730001080605950a950304000c41012054686520736574206f66206578697374696e6720706f7274666f6c696f732077697468207468656972206e616d65732e2049662061206365727461696e2070616972206f6620612044494420616e64590120706f7274666f6c696f206e756d626572206d61707320746f20604e6f6e6560207468656e2073756368206120706f7274666f6c696f20646f65736e27742065786973742e20436f6e76657273656c792c206966206135012070616972206d61707320746f2060536f6d65286e616d652960207468656e2073756368206120706f7274666f6c696f2065786973747320616e642069732063616c6c656420606e616d65602e304e616d65546f4e756d6265720001080602990af8040008e420496e7665727365206d6170206f662060506f7274666f6c696f7360207573656420746f20656e737572652062696a6563746976697469792ca420616e6420756e697175656e657373206f66206e616d657320696e2060506f7274666f6c696f73602e4c506f7274666f6c696f4173736574436f756e7401010405f03020000000000000000004fc20486f77206d616e79206173736574732077697468206e6f6e2d7a65726f2062616c616e6365207468697320706f7274666f6c696f20636f6e7461696e732e58506f7274666f6c696f417373657442616c616e63657301010805029d0a1840000000000000000000000000000000000488205468652061737365742062616c616e636573206f6620706f7274666f6c696f732e54506f7274666f6c696f4c6f636b656441737365747301010805029d0a18400000000000000000000000000000000008a020416d6f756e74206f6620617373657473206c6f636b656420696e206120706f7274666f6c696f2e2d01205468657365206173736574732073686f7720757020696e20706f7274666f6c696f2062616c616e6365206275742063616e206e6f74206265207472616e7366657272656420617761792e48506f7274666f6c696f437573746f6469616e00010405f09c04000481012054686520637573746f6469616e206f66206120706172746963756c617220706f7274666f6c696f2e204e6f6e6520696d706c696573207468617420746865206964656e74697479206f776e65722069732074686520637573746f6469616e2e4c506f7274666f6c696f73496e437573746f64790101080605a10a2004000c550120547261636b7320616c6c2074686520706f7274666f6c696f7320696e20637573746f6479206f66206120706172746963756c6172206964656e746974792e204f6e6c79207573656420627920746865205549732ea501205768656e206074727565602069732073746f726564206173207468652076616c756520666f72206120676976656e2060286469642c2070696429602c206974206d65616e73207468617420607069646020697320696e20637573746f6479206f662060646964602ea501206066616c7365602076616c75657320617265206e65766572206578706c696369746c792073746f72656420696e20746865206d61702c20616e642061726520696e737465616420696e6665727265642062792074686520616273656e6365206f662061206b65792e30506f7274666f6c696f4e46540101080502a50a200400049420546865206e6674206173736f63696174656420746f2074686520706f7274666f6c696f2e48506f7274666f6c696f4c6f636b65644e46540101080502a50a200400049820416c6c206c6f636b6564206e667420666f72206120676976656e20706f7274666f6c696f2e54507265417070726f766564506f7274666f6c696f7301010805029d0a20040004450120416c6c20706f7274666f6c696f73207468617420646f6e2774206e65656420746f2061666669726d2074686520726563656976656d656e74206f66206120676976656e205b6041737365744964605d2e44416c6c6f776564437573746f6469616e7301010806060906200400043d0120437573746f6469616e7320616c6c6f77656420746f2063726561746520616e642074616b6520637573746f6479206f6620706f7274666f6c696f73206f6e20616e206964277320626568616c662e3853746f7261676556657273696f6e0100ad0a040004442053746f726167652076657273696f6e2e01210701910308604d61784e756d6265724f6646756e6769626c654d6f76657310100a000000043d01204d6178696d756d206e756d626572206f662066756e6769626c652061737365747320746861742063616e206265206d6f76656420696e20612073696e676c65207472616e736665722063616c6c2e504d61784e756d6265724f664e4654734d6f766573101064000000041101204d6178696d756d206e756d626572206f66204e46547320746861742063616e206265206d6f76656420696e20612073696e676c65207472616e736665722063616c6c2e01b10a222c50726f746f636f6c466565012c50726f746f636f6c4665650820426173654665657301010405310718400000000000000000000000000000000004150120546865206d617070696e67206f66206f7065726174696f6e206e616d657320746f2074686520626173652066656573206f662074686f7365206f7065726174696f6e732e2c436f656666696369656e740100b503200100000001000000041501205468652066656520636f656666696369656e74206173206120706f73697469766520726174696f6e616c20286e756d657261746f722c2064656e6f6d696e61746f72292e012d0701b1030001b50a23245363686564756c657201245363686564756c6572103c496e636f6d706c65746553696e6365000010040004f420426c6f636b206e756d62657220617420776869636820746865206167656e646120626567616e20696e636f6d706c65746520657865637574696f6e2e184167656e64610101040510b90a0400044d01204974656d7320746f2062652065786563757465642c20696e64657865642062792074686520626c6f636b206e756d626572207468617420746865792073686f756c64206265206578656375746564206f6e2e1c5265747269657300010402bd03d50a040004210120526574727920636f6e66696775726174696f6e7320666f72206974656d7320746f2062652065786563757465642c20696e6465786564206279207461736b20616464726573732e184c6f6f6b75700001040504bd03040010f8204c6f6f6b75702066726f6d2061206e616d6520746f2074686520626c6f636b206e756d62657220616e6420696e646578206f6620746865207461736b2e00590120466f72207633202d3e207634207468652070726576696f75736c7920756e626f756e646564206964656e7469746965732061726520426c616b65322d3235362068617368656420746f20666f726d2074686520763430206964656e7469746965732e01350701b90308344d6178696d756d57656967687428400b00806e87740113cccccccccccccccc04290120546865206d6178696d756d207765696768742074686174206d6179206265207363686564756c65642070657220626c6f636b20666f7220616e7920646973706174636861626c65732e504d61785363686564756c6564506572426c6f636b101032000000141d0120546865206d6178696d756d206e756d626572206f66207363686564756c65642063616c6c7320696e2074686520717565756520666f7220612073696e676c6520626c6f636b2e0018204e4f54453a5101202b20446570656e64656e742070616c6c657473272062656e63686d61726b73206d696768742072657175697265206120686967686572206c696d697420666f72207468652073657474696e672e205365742061c420686967686572206c696d697420756e646572206072756e74696d652d62656e63686d61726b736020666561747572652e01d90a2428536574746c656d656e740128536574746c656d656e745c2456656e7565496e666f00010405c903dd0a0400049820496e666f2061626f757420612076656e75652e2076656e75655f6964202d3e2076656e75651c44657461696c7301010405c903cd03040008e420467265652d666f726d20746578742061626f757420612076656e75652e2076656e75655f6964202d3e206056656e756544657461696c736060204f6e6c79206e656564656420666f72207468652055492e4456656e7565496e737472756374696f6e730101080505e10a550100107020496e737472756374696f6e7320756e64657220612076656e75652e60204f6e6c79206e656564656420666f72207468652055492e00842076656e75655f6964202d3e20696e737472756374696f6e5f6964202d3e2028293056656e75655369676e6572730101080505e50a20040004e4205369676e65727320616c6c6f776564206279207468652076656e75652e202876656e75655f69642c207369676e657229202d3e20626f6f6c285573657256656e7565730101080505e90a55010010782056656e7565732063726561746520627920616e206964656e746974792e60204f6e6c79206e656564656420666f72207468652055492e006c206964656e74697479202d3e2076656e75655f6964202d3e20282948496e737472756374696f6e44657461696c73010104057902ed0a34000000000000000000000000000411012044657461696c732061626f757420616e20696e737472756374696f6e2e20696e737472756374696f6e5f6964202d3e20696e737472756374696f6e5f64657461696c7350496e737472756374696f6e4c65675374617475730101080505f10af50a040004310120537461747573206f662061206c656720756e64657220616e20696e737472756374696f6e2e2028696e737472756374696f6e5f69642c206c65675f696429202d3e204c656753746174757364496e737472756374696f6e41666669726d7350656e64696e6701010405790230200000000000000000048101204e756d626572206f662061666669726d6174696f6e732070656e64696e67206265666f726520696e737472756374696f6e2069732065786563757465642e20696e737472756374696f6e5f6964202d3e2061666669726d5f70656e64696e673c41666669726d7352656365697665640101080505f90afd0a040004990120547261636b732061666669726d6174696f6e7320726563656976656420666f7220616e20696e737472756374696f6e2e2028696e737472756374696f6e5f69642c20636f756e7465725f706172747929202d3e2041666669726d6174696f6e537461747573405573657241666669726d6174696f6e730101080505010bfd0a04000855012048656c70732061207573657220747261636b2074686569722070656e64696e6720696e737472756374696f6e7320616e642061666669726d6174696f6e7320286f6e6c79206e656564656420666f72205549292ed42028636f756e7465725f70617274792c20696e737472756374696f6e5f696429202d3e2041666669726d6174696f6e537461747573305265636569707473557365640101080502190920040004150120547261636b7320726564656d7074696f6e206f662072656365697074732e20287369676e65722c20726563656970745f75696429202d3e20726563656970745f757365643856656e756546696c746572696e6701010402b020040004010220547261636b73206966206120746f6b656e2068617320656e61626c65642066696c746572696e672076656e75657320746861742063616e2063726561746520696e737472756374696f6e7320696e766f6c76696e6720746865697220746f6b656e2e2041737365744964202d3e2066696c746572696e675f656e61626c65643856656e7565416c6c6f774c6973740101080205050b20040008c1012056656e75657320746861742061726520616c6c6f77656420746f2063726561746520696e737472756374696f6e7320696e766f6c76696e67206120706172746963756c61722061737365742e204f6e6c7920757365642069662066696c746572696e6720697320656e61626c65642e8c20285b6041737365744964605d2c2076656e75655f696429202d3e20616c6c6f7765643056656e7565436f756e7465720100c903200000000000000000041901204e756d626572206f662076656e75657320696e207468652073797374656d202849742773206f6e65206d6f7265207468616e207468652061637475616c206e756d6265722948496e737472756374696f6e436f756e74657201007902200000000000000000043101204e756d626572206f6620696e737472756374696f6e7320696e207468652073797374656d202849742773206f6e65206d6f7265207468616e207468652061637475616c206e756d6265722940496e737472756374696f6e4d656d6f73000104057902900400044420496e737472756374696f6e206d656d6f4c496e737472756374696f6e5374617475736573010104057902090b040004e820496e737472756374696f6e2073746174757365732e20696e737472756374696f6e5f6964202d3e20496e737472756374696f6e5374617475733c496e737472756374696f6e4c6567730001080505f10af103040004ec204c65677320756e64657220616e20696e737472756374696f6e2e2028696e737472756374696f6e5f69642c206c65675f696429202d3e204c6567504f6666436861696e41666669726d6174696f6e730101080505f10afd0a040004d90120547261636b73207468652061666669726d6174696f6e2073746174757320666f72206f6666636861696e206c65677320696e206120696e737472756374696f6e2e205b6028496e737472756374696f6e49642c204c6567496429605d202d3e205b6041666669726d6174696f6e537461747573605d504e756d6265724f6656656e75655369676e65727301010405c90310100000000004b420547261636b7320746865206e756d626572206f66207369676e65727320656163682076656e7565206861732e80496e737472756374696f6e4d65646961746f727341666669726d6174696f6e7301010805060d0b110b040004a8205468652073746174757320666f7220746865206d65646961746f72732061666669726d6174696f6e2e3c4c6f636b656454696d657374616d7000010405790230040004250120546865206d6f6d656e742074686520696e737472756374696f6e20776173206d6f76656420746f2074686520604c6f636b6564466f72457865637574696f6e60207374617475732e3853746f7261676556657273696f6e0100150b040004442053746f726167652076657273696f6e2e013d0701c50320644d61784e756d6265724f6646756e6769626c6541737365747310100a000000041d01204d6178696d756d206e756d626572206f662066756e6769626c652061737365747320746861742063616e20626520696e20612073696e676c6520696e737472756374696f6e2e544d61784e756d6265724f664e4654735065724c656710100a00000004e4204d6178696d756d206e756d626572206f66204e46547320746861742063616e206265207472616e7366657272656420696e2061206c65672e3c4d61784e756d6265724f664e465473101064000000040501204d6178696d756d206e756d626572206f66204e46547320746861742063616e206265207472616e7366657272656420696e206120696e737472756374696f6e2e644d61784e756d6265724f664f6666436861696e41737365747310100a000000043501204d6178696d756d206e756d626572206f66206f66662d636861696e2061737365747320746861742063616e206265207472616e7366657272656420696e206120696e737472756374696f6e2e544d61784e756d6265724f66506f7274666f6c696f731010dc0000000478204d6178696d756d206e756d626572206f6620706f7274666f6c696f732e5c4d61784e756d6265724f6656656e75655369676e6572731010320000000484204d6178696d756d206e756d626572206f662076656e7565207369676e6572732e5c4d6178496e737472756374696f6e4d65646961746f7273101004000000046d01204d6178696d756d206e756d626572206d65646961746f727320696e2074686520696e737472756374696f6e206c6576656c20287468697320646f6573206e6f7420696e636c756465206173736574206d65646961746f7273292e444d6178696d756d4c6f636b506572696f64302000f915000000000004710120546865206d6178696d756d2074696d6520706572696f64207468617420616e20696e737472756374696f6e2063616e2062652068656c6420696e2074686520604c6f636b6564466f72457865637574696f6e60207374617475732e01190b25285374617469737469637301285374617469737469637314404163746976654173736574537461747301010402b01d0b040004c4204d617073206120736574206f66205b605374617454797065605d20666f722065616368205b6041737365744964605d2e28417373657453746174730101080202210b18400000000000000000000000000000000004342041737365742073746174732e6041737365745472616e73666572436f6d706c69616e63657301010402b0290b08000004d820546865205b6041737365745472616e73666572436f6d706c69616e6365605d20666f722065616368205b6041737365744964605d2e7c5472616e73666572436f6e646974696f6e4578656d7074456e7469746965730101080202310b20040004c420456e746974696573206578656d70742066726f6d2061205472616e7366657220436f6d706c69616e63652072756c652e3853746f7261676556657273696f6e0100350b0400046c2053746f72616765206d6967726174696f6e2076657273696f6e2e01690701f50308404d61785374617473506572417373657410100a00000004c0204d6178696d756d20737461747320746861742063616e20626520656e61626c656420666f7220616e2041737365742e744d61785472616e73666572436f6e646974696f6e73506572417373657410100400000004f8204d6178696d756d207472616e7366657220636f6e646974696f6e7320746861742063616e20626520656e61626c656420666f7220616e2041737365742e01390b260c53746f010c53746f142c46756e647261697365727300010802053d0b4104040008b020416c6c2066756e64726169736572732074686174206172652063757272656e746c792072756e6e696e672e9c2028417373657449642c2066756e647261697365725f696429202d3e2046756e647261697365723c46756e64726169736572436f756e7401010402b03904200000000000000000049c20546f74616c2066756e6472616973657273206372656174656420666f72206120746f6b656e2e3c46756e647261697365724e616d657300010802053d0b3d04040008b4204e616d6520666f72207468652046756e647261697365722e204f6e6c792075736564206f6666636861696e2eb02028417373657449642c2066756e647261697365725f696429202d3e2046756e64726169736572206e616d655c46756e647261697365724f6666636861696e417373657400010802053d0b29010400041901204966207468652066756e6472616973657220737570706f727473206f66662d636861696e2066756e64696e67207061796d656e7473207573696e672072656365697074732e3853746f7261676556657273696f6e0100410b0400046c2053746f72616765206d6967726174696f6e2076657273696f6e2e0179070135040001450b2720547265617375727900018d070155040001490b281c5574696c697479011c5574696c69747904184e6f6e6365730101040500302000000000000000000858204e6f6e636520666f72206072656c61795f7478602e4420504f4c594d4553483a2061646465642e019907015904044c626174636865645f63616c6c735f6c696d69741010aa2a000004a820546865206c696d6974206f6e20746865206e756d626572206f6620626174636865642063616c6c732e014d0b2910426173650001b907015d0404184d61784c656e10100008000010a020546865206d6178696d756d206c656e67746820676f7665726e696e672060546f6f4c6f6e67602e002d0120486f77206c656e677468732061726520636f6d707574656420746f20636f6d7061726520616761696e737420746869732076616c756520697320736974756174696f6e2062617365642e650120466f72206578616d706c652c20796f7520636f756c642068616c76652069742c20646f75626c652069742c20636f6d7075746520612073756d20666f7220736f6d652074726565206f6620737472696e67732c206574632e01510b2a3845787465726e616c4167656e7473013845787465726e616c4167656e747318304147496453657175656e636501010402b04101100000000010a820546865206e657874207065722d617373657420414720494420696e207468652073657175656e63652e005101205468652066756c6c20494420697320646566696e6564206173206120636f6d62696e6174696f6e206f662060417373657449646020616e642061206e756d62657220696e20746869732073657175656e63652c90207768696368207374617274732066726f6d20312c20726174686572207468616e20302e1c4167656e744f660101080202010a550100040d01204d61707320616e206167656e742028604964656e746974794964602920746f20616c6c2061737365747320746865792062656c6f6e6720746f2c20696620616e792e3047726f75704f664167656e740001080205e9093d010400043d01204d617073206167656e74732028604964656e746974794964602920666f7220616e2060417373657449646020746f207768617420414720746865792062656c6f6e6720746f2c20696620616e792e344e756d46756c6c4167656e747301010402b010100000000004e4204d61707320616e2060417373657449646020746f20746865206e756d626572206f66206046756c6c60206167656e747320666f722069742e4047726f75705065726d697373696f6e730001080205550bc0040004650120466f7220637573746f6d20414773206f6620616e206041737365744964602c206d61707320746f2077686174207065726d697373696f6e7320616e206167656e7420696e207468617420414720776f756c6420686176652e3853746f7261676556657273696f6e0100590b040004442053746f726167652076657273696f6e2e01bd0701650400015d0b2b1c52656c61796572011c52656c6179657204245375627369646965730001040200610b040018ec20546865207375627369647920666f7220612060757365725f6b657960206966207468657920617265206265696e6720737562736964697365642c882061732061206d61702060757365725f6b657960203d3e206053756273696479602e0009012041206b65792063616e206f6e6c792068617665206f6e65207375627369647920617420612074696d652e2020546f206368616e67652073756273696469736572731d012061206b6579206e6565647320746f2063616c6c206072656d6f76655f706179696e675f6b65796020746f2072656d6f7665207468652063757272656e7420737562736964792ca4206265666f726520746865792063616e206163636570742061206e657720737562736964697365722e01c1070169040001650b2c24436f6e7472616374730124436f6e7472616374731c305072697374696e65436f64650001040634690b040004cc2041206d617070696e672066726f6d206120636f6e7472616374277320636f6465206861736820746f2069747320636f64652e28436f6465496e666f4f6600010406346d0b040004e02041206d617070696e672066726f6d206120636f6e7472616374277320636f6465206861736820746f2069747320636f646520696e666f2e144e6f6e6365010030200000000000000000581d0120546869732069732061202a2a6d6f6e6f746f6e69632a2a20636f756e74657220696e6372656d656e746564206f6e20636f6e747261637420696e7374616e74696174696f6e2e0005012054686973206973207573656420696e206f7264657220746f2067656e657261746520756e6971756520747269652069647320666f7220636f6e7472616374732e2901205468652074726965206964206f662061206e657720636f6e74726163742069732063616c63756c617465642066726f6d2068617368286163636f756e745f69642c206e6f6e6365292e350120546865206e6f6e63652069732072657175697265642062656361757365206f74686572776973652074686520666f6c6c6f77696e672073657175656e636520776f756c64206c65616420746f84206120706f737369626c6520636f6c6c6973696f6e206f662073746f726167653a006820312e204372656174652061206e657720636f6e74726163742e6c20322e205465726d696e6174652074686520636f6e74726163742efc20332e20496d6d6564696174656c792072656372656174652074686520636f6e74726163742077697468207468652073616d65206163636f756e745f69642e00450120546869732069732062616420626563617573652074686520636f6e74656e7473206f6620612074726965206172652064656c65746564206c617a696c7920616e64207468657265206d6967687420626559012073746f72616765206f6620746865206f6c6420696e7374616e74696174696f6e207374696c6c20696e206974207768656e20746865206e657720636f6e747261637420697320637265617465642e20506c656173655901206e6f746520746861742077652063616e2774207265706c6163652074686520636f756e7465722062792074686520626c6f636b206e756d6265722062656361757365207468652073657175656e63652061626f766551012063616e2068617070656e20696e207468652073616d6520626c6f636b2e20576520616c736f2063616e2774206b65657020746865206163636f756e7420636f756e74657220696e206d656d6f7279206f6e6c79490120626563617573652073746f7261676520697320746865206f6e6c792077617920746f20636f6d6d756e6963617465206163726f737320646966666572656e742065787472696e7369637320696e20746865302073616d6520626c6f636b2e001c2023204e6f7465003d0120446f206e6f742075736520697420746f2064657465726d696e6520746865206e756d626572206f6620636f6e7472616374732e20497420776f6e27742062652064656372656d656e74656420696664206120636f6e74726163742069732064657374726f7965642e38436f6e7472616374496e666f4f660001040500710b04000ca82054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e00d02054574f582d4e4f54453a20534146452073696e636520604163636f756e7449646020697320612073656375726520686173682e3444656c6574696f6e51756575650001040510cd0a040010c8204576696374656420636f6e7472616374732074686174206177616974206368696c6420747269652064656c6574696f6e2e004901204368696c6420747269652064656c6574696f6e2069732061206865617679206f7065726174696f6e20646570656e64696e67206f6e2074686520616d6f756e74206f662073746f72616765206974656d7341012073746f72656420696e207361696420747269652e205468657265666f72652074686973206f7065726174696f6e20697320706572666f726d6564206c617a696c7920696e20606f6e5f69646c65602e5044656c6574696f6e5175657565436f756e7465720100850b200000000000000000084d0120412070616972206f66206d6f6e6f746f6e696320636f756e74657273207573656420746f20747261636b20746865206c617465737420636f6e7472616374206d61726b656420666f722064656c6574696f6ea820616e6420746865206c61746573742064656c6574656420636f6e747261637420696e2071756575652e4c4d6967726174696f6e496e50726f67726573730000890b04000861012041206d6967726174696f6e2063616e207370616e206163726f7373206d756c7469706c6520626c6f636b732e20546869732073746f7261676520646566696e6573206120637572736f7220746f20747261636b207468654d012070726f6772657373206f6620746865206d6967726174696f6e2c20656e61626c696e6720757320746f20726573756d652066726f6d20746865206c61737420636f6d706c6574656420706f736974696f6e2e01c507016d0434205363686564756c658d0b9004000000100000002000000000400000000000080000002060ea000000000000eb040000046820436f7374207363686564756c6520616e64206c696d6974732e384465706f73697450657242797465184060ea00000000000000000000000000001411012054686520616d6f756e74206f662062616c616e636520612063616c6c65722068617320746f2070617920666f7220656163682062797465206f662073746f726167652e001c2023204e6f7465002901204368616e67696e6720746869732076616c756520666f7220616e206578697374696e6720636861696e206d69676874206e65656420612073746f72616765206d6967726174696f6e2e4c44656661756c744465706f7369744c696d6974184000c027af0e00000000000000000000000445012046616c6c6261636b2076616c756520746f206c696d6974207468652073746f72616765206465706f7369742069662069742773206e6f74206265696e6720736574206279207468652063616c6c65722e384465706f7369745065724974656d1840f04902000000000000000000000000001405012054686520616d6f756e74206f662062616c616e636520612063616c6c65722068617320746f2070617920666f7220656163682073746f72616765206974656d2e001c2023204e6f7465002901204368616e67696e6720746869732076616c756520666f7220616e206578697374696e6720636861696e206d69676874206e65656420612073746f72616765206d6967726174696f6e2e70436f6465486173684c6f636b75704465706f73697450657263656e7481011000a3e111104501205468652070657263656e74616765206f66207468652073746f72616765206465706f73697420746861742073686f756c642062652068656c6420666f72207573696e67206120636f646520686173682e610120496e7374616e74696174696e67206120636f6e74726163742c206f722063616c6c696e67205b60636861696e5f657874656e73696f6e3a3a4578743a3a6c6f636b5f64656c65676174655f646570656e64656e6379605d49012070726f74656374732074686520636f64652066726f6d206265696e672072656d6f7665642e20496e206f7264657220746f2070726576656e7420616275736520746865736520616374696f6e7320617265c42070726f746563746564207769746820612070657263656e74616765206f662074686520636f6465206465706f7369742e284d6178436f64654c656e101000ec010014c020546865206d6178696d756d206c656e677468206f66206120636f6e747261637420636f646520696e2062797465732e005901205468652076616c75652073686f756c642062652063686f73656e206361726566756c6c792074616b696e6720696e746f20746865206163636f756e7420746865206f766572616c6c206d656d6f7279206c696d6974f020796f75722072756e74696d65206861732c2061732077656c6c20617320746865205b6d6178696d756d20616c6c6f7765642063616c6c737461636b5d012064657074685d28236173736f636961746564747970652e43616c6c537461636b292e204c6f6f6b20696e746f207468652060696e746567726974795f7465737428296020666f7220736f6d6520696e7369676874732e404d617853746f726167654b65794c656e10108000000004e020546865206d6178696d756d20616c6c6f7761626c65206c656e67746820696e20627974657320666f722073746f72616765206b6579732e5c4d61785472616e7369656e7453746f7261676553697a6510100000100008d020546865206d6178696d756d2073697a65206f6620746865207472616e7369656e742073746f7261676520696e2062797465732e3101205468697320696e636c75646573206b6579732c2076616c7565732c20616e642070726576696f757320656e7472696573207573656420666f722073746f7261676520726f6c6c6261636b2e5c4d617844656c6567617465446570656e64656e6369657310102000000008290120546865206d6178696d756d206e756d626572206f662064656c65676174655f646570656e64656e636965732074686174206120636f6e74726163742063616e206c6f636b2077697468d0205b60636861696e5f657874656e73696f6e3a3a4578743a3a6c6f636b5f64656c65676174655f646570656e64656e6379605d2e5c556e73616665556e737461626c65496e74657266616365200400241101204d616b6520636f6e74726163742063616c6c61626c652066756e6374696f6e73206d61726b65642061732060235b756e737461626c655d6020617661696c61626c652e003d0120436f6e7472616374732074686174207573652060235b756e737461626c655d602066756e6374696f6e7320776f6e27742062652061626c6520746f2062652075706c6f6164656420756e6c657373450120746869732069732073657420746f206074727565602e2054686973206973206f6e6c79206d65616e7420666f7220746573746e65747320616e6420646576206e6f64657320696e206f7264657220746f78206578706572696d656e742077697468206e65772066656174757265732e00282023205761726e696e6700c020446f202a2a6e6f742a2a2073657420746f20607472756560206f6e2070726f64756374696f6e7320636861696e732e444d617844656275674275666665724c656e10100000200004c420546865206d6178696d756d206c656e677468206f66207468652064656275672062756666657220696e2062797465732e2c456e7669726f6e6d656e74990b00102501205479706520746861742062756e646c657320746f67657468657220616c6c207468652072756e74696d6520636f6e666967757261626c6520696e746572666163652074797065732e0035012054686973206973206e6f742061207265616c20636f6e6669672e205765206a757374206d656e74696f6e207468652074797065206865726520617320636f6e7374616e7420736f2074686174f0206974732074797065206170706561727320696e20746865206d657461646174612e204f6e6c792076616c69642076616c756520697320602829602e2841706956657273696f6eb50b0804000c0901205468652076657273696f6e206f662074686520486f7374466e204150497320746861742061726520617661696c61626c6520696e207468652072756e74696d652e0068204f6e6c792076616c69642076616c756520697320602829602e01b90b2e44506f6c796d657368436f6e7472616374730144506f6c796d657368436f6e747261637473105043616c6c52756e74696d6557686974656c69737401010406850420040004f42057686974656c697374206f662065787472696e7369637320616c6c6f77656420746f2062652063616c6c65642066726f6d20636f6e7472616374732e3853746f7261676556657273696f6e0100bd0b040004442053746f726167652076657273696f6e2e384170694e65787455706772616465000104057d04dd070400040d012053746f7265732074686520636861696e2076657273696f6e20616e6420636f6465206861736820666f7220746865206e65787420636861696e20757067726164652e3843757272656e7441706948617368000104057d04e107040004a82053746f7265732074686520636f6465206861736820666f72207468652063757272656e74206170692e01d1070179040001c10b2f20507265696d6167650120507265696d6167650c24537461747573466f720001040634c50b0400049020546865207265717565737420737461747573206f66206120676976656e20686173682e4052657175657374537461747573466f720001040634cd0b0400049020546865207265717565737420737461747573206f66206120676976656e20686173682e2c507265696d616765466f7200010406c509dd0b04000001e5070189040001e10b300c4e6674010c4e667424304e756d6265724f664e4654730101080206e90930200000000000000000049c2054686520746f74616c206e756d626572206f66204e46547320706572206964656e746974792e3c436f6c6c656374696f6e417373657401010402b0910420000000000000000004bc2054686520636f6c6c656374696f6e20696420636f72726573706f6e64696e6720746f20656163682061737365742e28436f6c6c656374696f6e010104029104e50b6000000000000000000000000000000000000000000000000004c820416c6c20636f6c6c656374696f6e2064657461696c7320666f72206120676976656e20636f6c6c656374696f6e2069642e38436f6c6c656374696f6e4b657973010104029104e90b040004d020416c6c206d616e6461746f7279206d65746164617461206b65797320666f72206120676976656e20636f6c6c656374696f6e2e344d6574616461746156616c75650101080202ed0b3502040004450120546865206d657461646174612076616c7565206f6620616e206e667420676976656e2069747320636f6c6c656374696f6e2069642c20746f6b656e20696420616e64206d65746164617461206b65792e404e465473496e436f6c6c656374696f6e01010402b03020000000000000000004a82054686520746f74616c206e756d626572206f66204e46547320696e206120636f6c6c656374696f6e2e204e46544f776e65720001080202a90af00400046c20547261636b7320746865206f776e6572206f6620616e204e46543043757272656e744e46544964000104029104ad030400048820546865206c61737420604e4654496460207573656420666f7220616e204e46542e4c43757272656e74436f6c6c656374696f6e496400009104040004c820546865206c61737420604e4654436f6c6c656374696f6e496460207573656420666f72206120636f6c6c656374696f6e2e01e907018d0408644d61784e756d6265724f66436f6c6c656374696f6e4b6579730804ff00504d61784e756d6265724f664e465473436f756e7410100a0000000001f50b3168456c656374696f6e50726f76696465724d756c746950686173650168456c656374696f6e50726f76696465724d756c746950686173652814526f756e64010010100100000018ac20496e7465726e616c20636f756e74657220666f7220746865206e756d626572206f6620726f756e64732e00550120546869732069732075736566756c20666f722064652d6475706c69636174696f6e206f66207472616e73616374696f6e73207375626d697474656420746f2074686520706f6f6c2c20616e642067656e6572616c6c20646961676e6f7374696373206f66207468652070616c6c65742e004d012054686973206973206d6572656c7920696e6372656d656e746564206f6e6365207065722065766572792074696d65207468617420616e20757073747265616d2060656c656374602069732063616c6c65642e3043757272656e7450686173650100a1040400043c2043757272656e742070686173652e38517565756564536f6c7574696f6e0000f90b04000c3d012043757272656e74206265737420736f6c7574696f6e2c207369676e6564206f7220756e7369676e65642c2071756575656420746f2062652072657475726e65642075706f6e2060656c656374602e006020416c7761797320736f727465642062792073636f72652e20536e617073686f740000010c0400107020536e617073686f742064617461206f662074686520726f756e642e005d01205468697320697320637265617465642061742074686520626567696e6e696e67206f6620746865207369676e656420706861736520616e6420636c65617265642075706f6e2063616c6c696e672060656c656374602e2901204e6f74653a20546869732073746f726167652074797065206d757374206f6e6c79206265206d757461746564207468726f756768205b60536e617073686f7457726170706572605d2e384465736972656454617267657473000010040010cc2044657369726564206e756d626572206f66207461726765747320746f20656c65637420666f72207468697320726f756e642e00a8204f6e6c7920657869737473207768656e205b60536e617073686f74605d2069732070726573656e742e2901204e6f74653a20546869732073746f726167652074797065206d757374206f6e6c79206265206d757461746564207468726f756768205b60536e617073686f7457726170706572605d2e40536e617073686f744d657461646174610000dd080400109820546865206d65746164617461206f6620746865205b60526f756e64536e617073686f74605d00a8204f6e6c7920657869737473207768656e205b60536e617073686f74605d2069732070726573656e742e2901204e6f74653a20546869732073746f726167652074797065206d757374206f6e6c79206265206d757461746564207468726f756768205b60536e617073686f7457726170706572605d2e645369676e65645375626d697373696f6e4e657874496e646578010010100000000024010120546865206e65787420696e64657820746f2062652061737369676e656420746f20616e20696e636f6d696e67207369676e6564207375626d697373696f6e2e007501204576657279206163636570746564207375626d697373696f6e2069732061737369676e6564206120756e6971756520696e6465783b207468617420696e64657820697320626f756e6420746f207468617420706172746963756c61726501207375626d697373696f6e20666f7220746865206475726174696f6e206f662074686520656c656374696f6e2e204f6e20656c656374696f6e2066696e616c697a6174696f6e2c20746865206e65787420696e6465782069733020726573657420746f20302e0069012057652063616e2774206a7573742075736520605369676e65645375626d697373696f6e496e64696365732e6c656e2829602c206265636175736520746861742773206120626f756e646564207365743b20706173742069747359012063617061636974792c2069742077696c6c2073696d706c792073617475726174652e2057652063616e2774206a7573742069746572617465206f76657220605369676e65645375626d697373696f6e734d6170602cf4206265636175736520697465726174696f6e20697320736c6f772e20496e73746561642c2077652073746f7265207468652076616c756520686572652e5c5369676e65645375626d697373696f6e496e646963657301000d0c0400186d01204120736f727465642c20626f756e64656420766563746f72206f6620602873636f72652c20626c6f636b5f6e756d6265722c20696e64657829602c20776865726520656163682060696e6465786020706f696e747320746f2061782076616c756520696e20605369676e65645375626d697373696f6e73602e007101205765206e65766572206e65656420746f2070726f63657373206d6f7265207468616e20612073696e676c65207369676e6564207375626d697373696f6e20617420612074696d652e205369676e6564207375626d697373696f6e7375012063616e206265207175697465206c617267652c20736f2077652772652077696c6c696e6720746f207061792074686520636f7374206f66206d756c7469706c6520646174616261736520616363657373657320746f206163636573732101207468656d206f6e6520617420612074696d6520696e7374656164206f662072656164696e6720616e64206465636f64696e6720616c6c206f66207468656d206174206f6e63652e505369676e65645375626d697373696f6e734d61700001040510190c04001c7420556e636865636b65642c207369676e656420736f6c7574696f6e732e00690120546f676574686572207769746820605375626d697373696f6e496e6469636573602c20746869732073746f726573206120626f756e64656420736574206f6620605369676e65645375626d697373696f6e7360207768696c65ec20616c6c6f77696e6720757320746f206b656570206f6e6c7920612073696e676c65206f6e6520696e206d656d6f727920617420612074696d652e0069012054776f78206e6f74653a20746865206b6579206f6620746865206d617020697320616e206175746f2d696e6372656d656e74696e6720696e6465782077686963682075736572732063616e6e6f7420696e7370656374206f72f4206166666563743b2077652073686f756c646e2774206e65656420612063727970746f67726170686963616c6c7920736563757265206861736865722e544d696e696d756d556e7472757374656453636f726500009d040400105d0120546865206d696e696d756d2073636f7265207468617420656163682027756e747275737465642720736f6c7574696f6e206d7573742061747461696e20696e206f7264657220746f20626520636f6e7369646572656428206665617369626c652e00b82043616e206265207365742076696120607365745f6d696e696d756d5f756e747275737465645f73636f7265602e01090801950438544265747465725369676e65645468726573686f6c6481011000000000084d0120546865206d696e696d756d20616d6f756e74206f6620696d70726f76656d656e7420746f2074686520736f6c7574696f6e2073636f7265207468617420646566696e6573206120736f6c7574696f6e2061737820226265747465722220696e20746865205369676e65642070686173652e384f6666636861696e52657065617410100500000010b42054686520726570656174207468726573686f6c64206f6620746865206f6666636861696e20776f726b65722e00610120466f72206578616d706c652c20696620697420697320352c2074686174206d65616e732074686174206174206c65617374203520626c6f636b732077696c6c20656c61707365206265747765656e20617474656d7074738420746f207375626d69742074686520776f726b6572277320736f6c7574696f6e2e3c4d696e657254785072696f726974793020feffffffffffff7f04250120546865207072696f72697479206f662074686520756e7369676e6564207472616e73616374696f6e207375626d697474656420696e2074686520756e7369676e65642d7068617365505369676e65644d61785375626d697373696f6e731010000000001ce4204d6178696d756d206e756d626572206f66207369676e6564207375626d697373696f6e7320746861742063616e206265207175657565642e005501204974206973206265737420746f2061766f69642061646a757374696e67207468697320647572696e6720616e20656c656374696f6e2c20617320697420696d706163747320646f776e73747265616d2064617461650120737472756374757265732e20496e20706172746963756c61722c20605369676e65645375626d697373696f6e496e64696365733c543e6020697320626f756e646564206f6e20746869732076616c75652e20496620796f75f42075706461746520746869732076616c756520647572696e6720616e20656c656374696f6e2c20796f75205f6d7573745f20656e7375726520746861744d0120605369676e65645375626d697373696f6e496e64696365732e6c656e282960206973206c657373207468616e206f7220657175616c20746f20746865206e65772076616c75652e204f74686572776973652cf020617474656d70747320746f207375626d6974206e657720736f6c7574696f6e73206d617920636175736520612072756e74696d652070616e69632e3c5369676e65644d6178576569676874280800001494204d6178696d756d20776569676874206f662061207369676e656420736f6c7574696f6e2e005d01204966205b60436f6e6669673a3a4d696e6572436f6e666967605d206973206265696e6720696d706c656d656e74656420746f207375626d6974207369676e656420736f6c7574696f6e7320286f757473696465206f663d0120746869732070616c6c6574292c207468656e205b604d696e6572436f6e6669673a3a736f6c7574696f6e5f776569676874605d206973207573656420746f20636f6d7061726520616761696e73743020746869732076616c75652e405369676e65644d6178526566756e647310100000000004190120546865206d6178696d756d20616d6f756e74206f6620756e636865636b656420736f6c7574696f6e7320746f20726566756e64207468652063616c6c2066656520666f722e405369676e656452657761726442617365184000000000000000000000000000000000048820426173652072657761726420666f722061207369676e656420736f6c7574696f6e445369676e65644465706f7369744279746518400000000000000000000000000000000004a0205065722d62797465206465706f73697420666f722061207369676e656420736f6c7574696f6e2e4c5369676e65644465706f73697457656967687418400000000000000000000000000000000004a8205065722d776569676874206465706f73697420666f722061207369676e656420736f6c7574696f6e2e284d617857696e6e6572731010e803000010350120546865206d6178696d756d206e756d626572206f662077696e6e65727320746861742063616e20626520656c656374656420627920746869732060456c656374696f6e50726f7669646572604020696d706c656d656e746174696f6e2e005101204e6f74653a2054686973206d75737420616c776179732062652067726561746572206f7220657175616c20746f2060543a3a4461746150726f76696465723a3a646573697265645f746172676574732829602e384d696e65724d61784c656e677468101000006c0000384d696e65724d617857656967687428400b80c933df29011366666666666666a600544d696e65724d6178566f746573506572566f746572101010000000003c4d696e65724d617857696e6e6572731010e803000000011d0c32210c042040436865636b5370656356657273696f6e290c1038436865636b547856657273696f6e2d0c1030436865636b47656e65736973310c3438436865636b4d6f7274616c697479350c3428436865636b4e6f6e63653d0c55012c436865636b576569676874410c5501604368617267655472616e73616374696f6e5061796d656e74450c55014453746f726543616c6c4d65746164617461490c55017504"} \ No newline at end of file diff --git a/scripts/cli/src/helpers/poly_helper.ts b/scripts/cli/src/helpers/poly_helper.ts index e9d04e00e2..22713a9c6d 100644 --- a/scripts/cli/src/helpers/poly_helper.ts +++ b/scripts/cli/src/helpers/poly_helper.ts @@ -7,7 +7,7 @@ import { sendTx, ApiSingleton } from "../util/init"; export async function distributePoly(signer: KeyringPair, receiver: KeyringPair, amount: number): Promise { const api = await ApiSingleton.getInstance(); // Perform the transfers - const transaction = api.tx.balances.transfer(receiver.address, amount); + const transaction = api.tx.balances.transferWithMemo(receiver.address, amount, null); await sendTx(signer, transaction); } diff --git a/scripts/cli/src/helpers/staking_helper.ts b/scripts/cli/src/helpers/staking_helper.ts index dcfb5ccbc4..6068638ea1 100644 --- a/scripts/cli/src/helpers/staking_helper.ts +++ b/scripts/cli/src/helpers/staking_helper.ts @@ -6,13 +6,13 @@ import BN from "bn.js"; /** * @description Take the origin account as a stash and lock up `value` of its balance. */ -export async function bond(signer: KeyringPair, controller: KeyringPair, value: number, payee: string): Promise { +export async function bond(signer: KeyringPair, value: number, payee: string): Promise { const api = await ApiSingleton.getInstance(); - const transaction = api.tx.staking.bond(controller.publicKey, value, payee); + const transaction = api.tx.staking.bond(value, payee); await sendTx(signer, transaction); } -export async function addNominator(controller: KeyringPair[], stash: KeyringPair[], from: KeyringPair, validator: KeyringPair[]) { +export async function addNominator(stash: KeyringPair[], from: KeyringPair, validator: KeyringPair[]) { const api = await ApiSingleton.getInstance(); let transfer_amount = new BN(1).mul(new BN(10).pow(new BN(6))); let operators = [validator[0].address, validator[1].address]; @@ -20,15 +20,10 @@ export async function addNominator(controller: KeyringPair[], stash: KeyringPair // bond nominator first for (let i = 0; i < stash.length; i++) { - const tx = api.tx.staking.bond(controller[i].address, bond_amount, "Controller"); - await sendTx(stash[i], tx); - } - // fund controller keys - await distributePolyBatch(from, controller, transfer_amount.toNumber()); - - for (let i = 0; i < controller.length; i++) { - const tx = api.tx.staking.nominate(operators); - await sendTx(controller[i], tx); + const tx1 = api.tx.staking.bond(bond_amount, "Controller"); + await sendTx(stash[i], tx1); + const tx2 = api.tx.staking.nominate(operators); + await sendTx(stash[i], tx2); } } diff --git a/scripts/cli/src/interfaces/augment-api-consts.ts b/scripts/cli/src/interfaces/augment-api-consts.ts index 01051f2358..d734c33f15 100644 --- a/scripts/cli/src/interfaces/augment-api-consts.ts +++ b/scripts/cli/src/interfaces/augment-api-consts.ts @@ -6,21 +6,39 @@ import '@polkadot/api-base/types/consts'; import type { ApiTypes, AugmentedConst } from '@polkadot/api-base/types'; -import type { Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; +import type { bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; import type { Codec } from '@polkadot/types-codec/types'; import type { Perbill, Permill } from '@polkadot/types/interfaces/runtime'; -import type { FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, PalletContractsSchedule, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightToFeeCoefficient, SpWeightsWeightV2Weight } from '@polkadot/types/lookup'; +import type { FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, PalletContractsEnvironment, PalletContractsSchedule, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight } from '@polkadot/types/lookup'; export type __AugmentedConst = AugmentedConst; declare module '@polkadot/api-base/types/consts' { interface AugmentedConsts { asset: { + /** + * Max length for the Asset Metadata type name. + **/ assetMetadataNameMaxLength: u32 & AugmentedConst; + /** + * Max length for the Asset Metadata type definition. + **/ assetMetadataTypeDefMaxLength: u32 & AugmentedConst; + /** + * Max length for the Asset Metadata value. + **/ assetMetadataValueMaxLength: u32 & AugmentedConst; + /** + * Max length for the name of an asset. + **/ assetNameMaxLength: u32 & AugmentedConst; + /** + * Max length of the funding round name. + **/ fundingRoundNameMaxLength: u32 & AugmentedConst; + /** + * Maximum number of mediators for an asset. + **/ maxAssetMediators: u32 & AugmentedConst; /** * Generic const @@ -46,6 +64,10 @@ declare module '@polkadot/api-base/types/consts' { * Max number of authorities allowed **/ maxAuthorities: u32 & AugmentedConst; + /** + * The maximum number of nominators for each validator. + **/ + maxNominators: u32 & AugmentedConst; /** * Generic const **/ @@ -53,15 +75,45 @@ declare module '@polkadot/api-base/types/consts' { }; balances: { /** - * The minimum amount required to keep an account open. + * The minimum amount required to keep an account open. MUST BE GREATER THAN ZERO! + * + * If you *really* need it to be zero, you can enable the feature `insecure_zero_ed` for + * this pallet. However, you do so at your own risk: this will open up a major DoS vector. + * In case you have multiple sources of provider references, you may also get unexpected + * behaviour if you set this to zero. + * + * Bottom line: Do yourself a favour and make it at least one! **/ existentialDeposit: u128 & AugmentedConst; + /** + * The maximum number of individual freeze locks that can exist on an account at any time. + **/ + maxFreezes: u32 & AugmentedConst; + /** + * The maximum number of locks that should exist on an account. + * Not strictly enforced, but used for weight estimation. + * + * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` + **/ + maxLocks: u32 & AugmentedConst; + /** + * The maximum number of named reserves that can exist on an account. + * + * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` + **/ + maxReserves: u32 & AugmentedConst; /** * Generic const **/ [key: string]: Codec; }; base: { + /** + * The maximum length governing `TooLong`. + * + * How lengths are computed to compare against this value is situation based. + * For example, you could halve it, double it, compute a sum for some tree of strings, etc. + **/ maxLen: u32 & AugmentedConst; /** * Generic const @@ -69,6 +121,9 @@ declare module '@polkadot/api-base/types/consts' { [key: string]: Codec; }; complianceManager: { + /** + * The maximum claim reads that are allowed to happen in worst case of a condition resolution + **/ maxConditionComplexity: u32 & AugmentedConst; /** * Generic const @@ -77,32 +132,22 @@ declare module '@polkadot/api-base/types/consts' { }; contracts: { /** - * The maximum number of contracts that can be pending for deletion. - * - * When a contract is deleted by calling `seal_terminate` it becomes inaccessible - * immediately, but the deletion of the storage items it has accumulated is performed - * later. The contract is put into the deletion queue. This defines how many - * contracts can be queued up at the same time. If that limit is reached `seal_terminate` - * will fail. The action must be retried in a later block in that case. + * The version of the HostFn APIs that are available in the runtime. * - * The reasons for limiting the queue depth are: - * - * 1. The queue is in storage in order to be persistent between blocks. We want to limit - * the amount of storage that can be consumed. - * 2. The queue is stored in a vector and needs to be decoded as a whole when reading - * it at the end of each block. Longer queues take more weight to decode and hence - * limit the amount of items that can be deleted per block. + * Only valid value is `()`. **/ - deletionQueueDepth: u32 & AugmentedConst; + apiVersion: u16 & AugmentedConst; /** - * The maximum amount of weight that can be consumed per block for lazy trie removal. - * - * The amount of weight that is dedicated per block to work on the deletion queue. Larger - * values allow more trie keys to be deleted in each block but reduce the amount of - * weight that is left for transactions. See [`Self::DeletionQueueDepth`] for more - * information about the deletion queue. + * The percentage of the storage deposit that should be held for using a code hash. + * Instantiating a contract, or calling [`chain_extension::Ext::lock_delegate_dependency`] + * protects the code from being removed. In order to prevent abuse these actions are + * protected with a percentage of the code deposit. **/ - deletionWeightLimit: SpWeightsWeightV2Weight & AugmentedConst; + codeHashLockupDepositPercent: Perbill & AugmentedConst; + /** + * Fallback value to limit the storage deposit if it's not being set by the caller. + **/ + defaultDepositLimit: u128 & AugmentedConst; /** * The amount of balance a caller has to pay for each byte of storage. * @@ -120,9 +165,14 @@ declare module '@polkadot/api-base/types/consts' { **/ depositPerItem: u128 & AugmentedConst; /** - * The maximum length of a contract code in bytes. This limit applies to the instrumented - * version of the code. Therefore `instantiate_with_code` can fail even when supplying - * a wasm binary below this maximum size. + * Type that bundles together all the runtime configurable interface types. + * + * This is not a real config. We just mention the type here as constant so that + * its type appears in the metadata. Only valid value is `()`. + **/ + environment: PalletContractsEnvironment & AugmentedConst; + /** + * The maximum length of a contract code in bytes. * * The value should be chosen carefully taking into the account the overall memory limit * your runtime has, as well as the [maximum allowed callstack @@ -133,10 +183,20 @@ declare module '@polkadot/api-base/types/consts' { * The maximum length of the debug buffer in bytes. **/ maxDebugBufferLen: u32 & AugmentedConst; + /** + * The maximum number of delegate_dependencies that a contract can lock with + * [`chain_extension::Ext::lock_delegate_dependency`]. + **/ + maxDelegateDependencies: u32 & AugmentedConst; /** * The maximum allowable length in bytes for storage keys. **/ maxStorageKeyLen: u32 & AugmentedConst; + /** + * The maximum size of the transient storage in bytes. + * This includes keys, values, and previous entries used for storage rollback. + **/ + maxTransientStorageSize: u32 & AugmentedConst; /** * Cost schedule and limits. **/ @@ -159,7 +219,13 @@ declare module '@polkadot/api-base/types/consts' { [key: string]: Codec; }; corporateAction: { + /** + * Max number of per-DID withholding tax overrides. + **/ maxDidWhts: u32 & AugmentedConst; + /** + * Max number of DID specified in `TargetIdentities`. + **/ maxTargetIds: u32 & AugmentedConst; /** * Generic const @@ -172,21 +238,6 @@ declare module '@polkadot/api-base/types/consts' { * "better" in the Signed phase. **/ betterSignedThreshold: Perbill & AugmentedConst; - /** - * The minimum amount of improvement to the solution score that defines a solution as - * "better" in the Unsigned phase. - **/ - betterUnsignedThreshold: Perbill & AugmentedConst; - /** - * The maximum number of electable targets to put in the snapshot. - **/ - maxElectableTargets: u16 & AugmentedConst; - /** - * The maximum number of electing voters to put in the snapshot. At the moment, snapshots - * are only over a single block, but once multi-block elections are introduced they will - * take place over multiple blocks. - **/ - maxElectingVoters: u32 & AugmentedConst; /** * The maximum number of winners that can be elected by this `ElectionProvider` * implementation. @@ -197,6 +248,7 @@ declare module '@polkadot/api-base/types/consts' { minerMaxLength: u32 & AugmentedConst; minerMaxVotesPerVoter: u32 & AugmentedConst; minerMaxWeight: SpWeightsWeightV2Weight & AugmentedConst; + minerMaxWinners: u32 & AugmentedConst; /** * The priority of the unsigned transaction submitted in the unsigned-phase **/ @@ -208,10 +260,6 @@ declare module '@polkadot/api-base/types/consts' { * to submit the worker's solution. **/ offchainRepeat: u32 & AugmentedConst; - /** - * Base deposit for a signed solution. - **/ - signedDepositBase: u128 & AugmentedConst; /** * Per-byte deposit for a signed solution. **/ @@ -242,18 +290,10 @@ declare module '@polkadot/api-base/types/consts' { * this value. **/ signedMaxWeight: SpWeightsWeightV2Weight & AugmentedConst; - /** - * Duration of the signed phase. - **/ - signedPhase: u32 & AugmentedConst; /** * Base reward for a signed solution **/ signedRewardBase: u128 & AugmentedConst; - /** - * Duration of the unsigned phase. - **/ - unsignedPhase: u32 & AugmentedConst; /** * Generic const **/ @@ -264,6 +304,10 @@ declare module '@polkadot/api-base/types/consts' { * Max Authorities in use **/ maxAuthorities: u32 & AugmentedConst; + /** + * The maximum number of nominators for each validator. + **/ + maxNominators: u32 & AugmentedConst; /** * The maximum number of entries to keep in the set id to session index mapping. * @@ -279,7 +323,13 @@ declare module '@polkadot/api-base/types/consts' { [key: string]: Codec; }; identity: { + /** + * POLYX given to primary keys of all new Identities + **/ initialPOLYX: u128 & AugmentedConst; + /** + * Maximum number of authorizations an identity can give. + **/ maxGivenAuths: u32 & AugmentedConst; /** * Generic const @@ -327,6 +377,30 @@ declare module '@polkadot/api-base/types/consts' { **/ [key: string]: Codec; }; + pips: { + /** + * The maximum number of votes that can be pruned at once. + **/ + maxRefundsAndVotesPruned: u32 & AugmentedConst; + /** + * Generic const + **/ + [key: string]: Codec; + }; + portfolio: { + /** + * Maximum number of fungible assets that can be moved in a single transfer call. + **/ + maxNumberOfFungibleMoves: u32 & AugmentedConst; + /** + * Maximum number of NFTs that can be moved in a single transfer call. + **/ + maxNumberOfNFTsMoves: u32 & AugmentedConst; + /** + * Generic const + **/ + [key: string]: Codec; + }; scheduler: { /** * The maximum weight that may be scheduled per block for any dispatchables. @@ -334,6 +408,10 @@ declare module '@polkadot/api-base/types/consts' { maximumWeight: SpWeightsWeightV2Weight & AugmentedConst; /** * The maximum number of scheduled calls in the queue for a single block. + * + * NOTE: + * + Dependent pallets' benchmarks might require a higher limit for the setting. Set a + * higher limit under `runtime-benchmarks` feature. **/ maxScheduledPerBlock: u32 & AugmentedConst; /** @@ -342,10 +420,37 @@ declare module '@polkadot/api-base/types/consts' { [key: string]: Codec; }; settlement: { + /** + * The maximum time period that an instruction can be held in the `LockedForExecution` status. + **/ + maximumLockPeriod: u64 & AugmentedConst; + /** + * Maximum number mediators in the instruction level (this does not include asset mediators). + **/ + maxInstructionMediators: u32 & AugmentedConst; + /** + * Maximum number of fungible assets that can be in a single instruction. + **/ maxNumberOfFungibleAssets: u32 & AugmentedConst; + /** + * Maximum number of NFTs that can be transferred in a instruction. + **/ maxNumberOfNFTs: u32 & AugmentedConst; + /** + * Maximum number of NFTs that can be transferred in a leg. + **/ maxNumberOfNFTsPerLeg: u32 & AugmentedConst; + /** + * Maximum number of off-chain assets that can be transferred in a instruction. + **/ maxNumberOfOffChainAssets: u32 & AugmentedConst; + /** + * Maximum number of portfolios. + **/ + maxNumberOfPortfolios: u32 & AugmentedConst; + /** + * Maximum number of venue signers. + **/ maxNumberOfVenueSigners: u32 & AugmentedConst; /** * Generic const @@ -357,18 +462,14 @@ declare module '@polkadot/api-base/types/consts' { * Number of eras that staked funds must remain bonded for. **/ bondingDuration: u32 & AugmentedConst; - /** - * Yearly total reward amount that gets distributed when fixed rewards kicks in. - **/ - fixedYearlyReward: u128 & AugmentedConst; /** * Number of eras to keep in history. * * Following information is kept for eras in `[current_era - * HistoryDepth, current_era]`: `ErasStakers`, `ErasStakersClipped`, * `ErasValidatorPrefs`, `ErasValidatorReward`, `ErasRewardPoints`, - * `ErasTotalStake`, `ErasStartSessionIndex`, - * `StakingLedger.claimed_rewards`. + * `ErasTotalStake`, `ErasStartSessionIndex`, `ClaimedRewards`, `ErasStakersPaged`, + * `ErasStakersOverview`. * * Must be more than the number of eras delayed by session. * I.e. active era must always be in history. I.e. `active_era > @@ -378,23 +479,26 @@ declare module '@polkadot/api-base/types/consts' { * this should be set to same value or greater as in storage. * * Note: `HistoryDepth` is used as the upper bound for the `BoundedVec` - * item `StakingLedger.claimed_rewards`. Setting this value lower than + * item `StakingLedger.legacy_claimed_rewards`. Setting this value lower than * the existing value can lead to inconsistencies in the * `StakingLedger` and will need to be handled properly in a migration. * The test `reducing_history_depth_abrupt` shows this effect. **/ historyDepth: u32 & AugmentedConst; /** - * Maximum number of nominations per nominator. - **/ - maxNominations: u32 & AugmentedConst; - /** - * The maximum number of nominators rewarded for each validator. + * The maximum size of each `T::ExposurePage`. + * + * An `ExposurePage` is weakly bounded to a maximum of `MaxExposurePageSize` + * nominators. * - * For each validator only the `$MaxNominatorRewardedPerValidator` biggest stakers can - * claim their reward. This used to limit the i/o cost for the nominator payout. + * For older non-paged exposure, a reward payout was restricted to the top + * `MaxExposurePageSize` nominators. This is to limit the i/o cost for the + * nominator payout. + * + * Note: `MaxExposurePageSize` is used to bound `ClaimedRewards` and is unsafe to reduce + * without handling it in a migration. **/ - maxNominatorRewardedPerValidator: u32 & AugmentedConst; + maxExposurePageSize: u32 & AugmentedConst; /** * The maximum number of `unlocking` chunks a [`StakingLedger`] can * have. Effectively determines how many unique eras a staker may be @@ -408,15 +512,6 @@ declare module '@polkadot/api-base/types/consts' { * this effect. **/ maxUnlockingChunks: u32 & AugmentedConst; - /** - * Maximum amount of validators that can run by an identity. - * It will be MaxValidatorPerIdentity * Self::validator_count(). - **/ - maxValidatorPerIdentity: Permill & AugmentedConst; - /** - * Maximum amount of total issuance after which fixed rewards kicks in. - **/ - maxVariableInflationTotalIssuance: u128 & AugmentedConst; /** * Number of sessions per era. **/ @@ -434,7 +529,13 @@ declare module '@polkadot/api-base/types/consts' { [key: string]: Codec; }; statistics: { + /** + * Maximum stats that can be enabled for an Asset. + **/ maxStatsPerAsset: u32 & AugmentedConst; + /** + * Maximum transfer conditions that can be enabled for an Asset. + **/ maxTransferConditionsPerAsset: u32 & AugmentedConst; /** * Generic const @@ -467,7 +568,7 @@ declare module '@polkadot/api-base/types/consts' { **/ ss58Prefix: u16 & AugmentedConst; /** - * Get the chain's current version. + * Get the chain's in-code version. **/ version: SpVersionRuntimeVersion & AugmentedConst; /** @@ -477,10 +578,12 @@ declare module '@polkadot/api-base/types/consts' { }; timestamp: { /** - * The minimum period between blocks. Beware that this is different to the *expected* - * period that the block production apparatus provides. Your chosen consensus system will - * generally work with this to determine a sensible block time. e.g. For Aura, it will be - * double this period on default settings. + * The minimum period between blocks. + * + * Be aware that this is different to the *expected* period that the block production + * apparatus provides. Your chosen consensus system will generally work with this to + * determine a sensible block time. For example, in the Aura pallet it will be double this + * period on default settings. **/ minimumPeriod: u64 & AugmentedConst; /** @@ -490,13 +593,29 @@ declare module '@polkadot/api-base/types/consts' { }; transactionPayment: { /** - * The fee to be paid for making a transaction; the per-byte portion. - **/ - transactionByteFee: u128 & AugmentedConst; - /** - * The polynomial that is applied in order to derive fee from weight. + * A fee multiplier for `Operational` extrinsics to compute "virtual tip" to boost their + * `priority` + * + * This value is multiplied by the `final_fee` to obtain a "virtual tip" that is later + * added to a tip component in regular `priority` calculations. + * It means that a `Normal` transaction can front-run a similarly-sized `Operational` + * extrinsic (with no tip), by including a tip value greater than the virtual tip. + * + * ```rust,ignore + * // For `Normal` + * let priority = priority_calc(tip); + * + * // For `Operational` + * let virtual_tip = (inclusion_fee + tip) * OperationalFeeMultiplier; + * let priority = priority_calc(tip + virtual_tip); + * ``` + * + * Note that since we use `final_fee` the multiplier applies also to the regular `tip` + * sent with the transaction. So, not only does the transaction get a priority bump based + * on the `inclusion_fee`, but we also amplify the impact of tips applied to `Operational` + * transactions. **/ - weightToFee: Vec & AugmentedConst; + operationalFeeMultiplier: u8 & AugmentedConst; /** * Generic const **/ @@ -512,5 +631,24 @@ declare module '@polkadot/api-base/types/consts' { **/ [key: string]: Codec; }; + validators: { + /** + * Yearly total reward amount that gets distributed when fixed rewards kicks in. + **/ + fixedYearlyReward: u128 & AugmentedConst; + /** + * Maximum amount of validators that can run by an identity. + * It will be MaxValidatorPerIdentity * Self::validator_count(). + **/ + maxValidatorPerIdentity: Permill & AugmentedConst; + /** + * Maximum amount of total issuance after which fixed rewards kicks in. + **/ + maxVariableInflationTotalIssuance: u128 & AugmentedConst; + /** + * Generic const + **/ + [key: string]: Codec; + }; } // AugmentedConsts } // declare module diff --git a/scripts/cli/src/interfaces/augment-api-errors.ts b/scripts/cli/src/interfaces/augment-api-errors.ts index 01f38fd21f..0a8e2a1e22 100644 --- a/scripts/cli/src/interfaces/augment-api-errors.ts +++ b/scripts/cli/src/interfaces/augment-api-errors.ts @@ -28,6 +28,10 @@ declare module '@polkadot/api-base/types/errors' { * An unexpected error when generating a new asset ID. **/ AssetIdGenerationError: AugmentedError; + /** + * The given asset is already linked to a ticker. + **/ + AssetIsAlreadyLinkedToATicker: AugmentedError; /** * Asset Metadata Global type already exists. **/ @@ -64,6 +68,10 @@ declare module '@polkadot/api-base/types/errors' { * Maximum length of the asset metadata value has been exceeded. **/ AssetMetadataValueMaxLengthExceeded: AugmentedError; + /** + * The extrinsic expected a different `AuthorizationType` than what the `data.auth_type()` is. + **/ + BadAuthorizationType: AugmentedError; /** * An overflow while calculating the balance. **/ @@ -129,7 +137,7 @@ declare module '@polkadot/api-base/types/errors' { **/ MaxLengthOfAssetNameExceeded: AugmentedError; /** - * No security token associated to the given asset ID. + * No token associated to the given asset ID. **/ NoSuchAsset: AugmentedError; /** @@ -164,6 +172,10 @@ declare module '@polkadot/api-base/types/errors' { * The given ticker is already linked to an asset. **/ TickerIsAlreadyLinkedToAnAsset: AugmentedError; + /** + * The given ticker is not linked to the given asset. + **/ + TickerIsNotLinkedToTheAsset: AugmentedError; /** * The ticker has non-alphanumeric parts. **/ @@ -229,25 +241,65 @@ declare module '@polkadot/api-base/types/errors' { }; balances: { /** - * Value too low to create account due to existential deposit + * Beneficiary account must pre-exist. + **/ + DeadAccount: AugmentedError; + /** + * The delta cannot be zero. + **/ + DeltaZero: AugmentedError; + /** + * Value too low to create account due to existential deposit. **/ ExistentialDeposit: AugmentedError; /** - * Balance too low to send value + * A vesting schedule already exists for this account. + **/ + ExistingVestingSchedule: AugmentedError; + /** + * Transfer/payment would kill account. + **/ + Expendability: AugmentedError; + /** + * Balance too low to send value. **/ InsufficientBalance: AugmentedError; /** - * Account liquidity restrictions prevent withdrawal + * The issuance cannot be modified since it is already deactivated. + **/ + IssuanceDeactivated: AugmentedError; + /** + * Account liquidity restrictions prevent withdrawal. **/ LiquidityRestrictions: AugmentedError; /** - * Got an overflow after adding + * Lock Identifier not Found + **/ + LockIdentifierNotFound: AugmentedError; + /** + * Max Locks Exceeded + **/ + MaxLocksExceeded: AugmentedError; + /** + * Balance Overflow **/ Overflow: AugmentedError; /** - * Receiver does not have a valid CDD + * Number of freezes exceed `MaxFreezes`. + **/ + TooManyFreezes: AugmentedError; + /** + * Number of holds exceed `VariantCountOf`. + **/ + TooManyHolds: AugmentedError; + /** + * Number of named reserves exceed `MaxReserves`. + **/ + TooManyReserves: AugmentedError; + /** + * Vesting balance too high to send value. **/ - ReceiverCddMissing: AugmentedError; + VestingBalance: AugmentedError; /** * Generic error **/ @@ -465,6 +517,14 @@ declare module '@polkadot/api-base/types/errors' { [key: string]: AugmentedError; }; contracts: { + /** + * Can not add a delegate dependency to the code hash of the contract itself. + **/ + CannotAddSelfAsDelegateDependency: AugmentedError; + /** + * No code info could be found at the supplied code hash. + **/ + CodeInfoNotFound: AugmentedError; /** * Code removal was denied because the code is still in use by at least one contract. **/ @@ -474,10 +534,10 @@ declare module '@polkadot/api-base/types/errors' { **/ CodeNotFound: AugmentedError; /** - * The contract's code was found to be invalid during validation or instrumentation. + * The contract's code was found to be invalid during validation. * * The most likely cause of this is that an API was used which is not supported by the - * node. This hapens if an older node is used with a new version of ink!. Try updating + * node. This happens if an older node is used with a new version of ink!. Try updating * your node to the newest available version. * * A more detailed error can be found on the node console if debug messages are enabled @@ -509,19 +569,19 @@ declare module '@polkadot/api-base/types/errors' { **/ DecodingFailed: AugmentedError; /** - * Removal of a contract failed because the deletion queue is full. - * - * This can happen when calling `seal_terminate`. - * The queue is filled by deleting contracts and emptied by a fixed amount each block. - * Trying again during another block is the only way to resolve this issue. + * The contract already depends on the given delegate dependency. + **/ + DelegateDependencyAlreadyExists: AugmentedError; + /** + * The dependency was not found in the contract's delegate dependencies. **/ - DeletionQueueFull: AugmentedError; + DelegateDependencyNotFound: AugmentedError; /** * A contract with the same AccountId already exists. **/ DuplicateContract: AugmentedError; /** - * An indetermistic code was used in a context where this is not permitted. + * An indeterministic code was used in a context where this is not permitted. **/ Indeterministic: AugmentedError; /** @@ -533,20 +593,32 @@ declare module '@polkadot/api-base/types/errors' { **/ InvalidCallFlags: AugmentedError; /** - * A new schedule must have a greater version than the current one. + * Invalid schedule supplied, e.g. with zero weight of a basic operation. **/ - InvalidScheduleVersion: AugmentedError; + InvalidSchedule: AugmentedError; /** * Performing a call was denied because the calling depth reached the limit * of what is specified in the schedule. **/ MaxCallDepthReached: AugmentedError; + /** + * The contract has reached its maximum number of delegate dependencies. + **/ + MaxDelegateDependenciesReached: AugmentedError; + /** + * A pending migration needs to complete before the extrinsic can be called. + **/ + MigrationInProgress: AugmentedError; /** * The chain does not provide a chain extension. Calling the chain extension results * in this error. Note that this usually shouldn't happen as deploying such contracts * is rejected. **/ NoChainExtension: AugmentedError; + /** + * Migrate dispatch call was attempted but no migration was performed. + **/ + NoMigrationPerformed: AugmentedError; /** * A buffer outside of sandbox memory was passed to a contract API function. **/ @@ -555,6 +627,10 @@ declare module '@polkadot/api-base/types/errors' { * The executed contract exhausted its gas limit. **/ OutOfGas: AugmentedError; + /** + * Can not add more data to transient storage. + **/ + OutOfTransientStorage: AugmentedError; /** * The output buffer supplied to a contract API call was too small. **/ @@ -565,8 +641,15 @@ declare module '@polkadot/api-base/types/errors' { RandomSubjectTooLong: AugmentedError; /** * A call tried to invoke a contract that is flagged as non-reentrant. + * The only other cause is that a call from a contract into the runtime tried to call back + * into `pallet-contracts`. This would make the whole pallet reentrant with regard to + * contract code execution which is not supported. **/ ReentranceDenied: AugmentedError; + /** + * A contract attempted to invoke a state modifying API while being in read-only mode. + **/ + StateChangeDenied: AugmentedError; /** * More storage was created than allowed by the storage deposit limit. **/ @@ -599,6 +682,10 @@ declare module '@polkadot/api-base/types/errors' { * The size defined in `T::MaxValueSize` was exceeded. **/ ValueTooLarge: AugmentedError; + /** + * Failed to decode the XCM program. + **/ + XCMDecodeFailed: AugmentedError; /** * Generic error **/ @@ -744,6 +831,10 @@ declare module '@polkadot/api-base/types/errors' { * OCW submitted solution for wrong round **/ OcwCallWrongEra: AugmentedError; + /** + * Submission was prepared for a different round. + **/ + PreDispatchDifferentRound: AugmentedError; /** * Submission was too early. **/ @@ -786,6 +877,10 @@ declare module '@polkadot/api-base/types/errors' { * The provided `agent` is already an agent for the `AssetId`. **/ AlreadyAnAgent: AugmentedError; + /** + * The extrinsic expected a different `AuthorizationType` than what the `data.auth_type()` is. + **/ + BadAuthorizationType: AugmentedError; /** * An AG with the given `AGId` did not exist for the `AssetId`. **/ @@ -869,6 +964,10 @@ declare module '@polkadot/api-base/types/errors' { * Authorizations are not for the same DID. **/ AuthorizationsNotForSameDids: AugmentedError; + /** + * The extrinsic expected a different `AuthorizationType` than what the `data.auth_type()` is. + **/ + BadAuthorizationType: AugmentedError; /** * Cannot convert a `T::AccountId` to `AnySignature::Signer::AccountId`. **/ @@ -922,6 +1021,11 @@ declare module '@polkadot/api-base/types/errors' { * Account Id cannot be extracted from signer **/ InvalidAccountKey: AugmentedError; + /** + * Auth identified by an `auth_id` for a given `target` does not exist. + * The `target` might be wrong or the `auth_id` was never created at all. + **/ + InvalidAuthorization: AugmentedError; /** * An invalid authorization from the CDD provider. **/ @@ -946,10 +1050,6 @@ declare module '@polkadot/api-base/types/errors' { * Caller is missing an identity. **/ MissingIdentity: AugmentedError; - /** - * Multisig can not be unlinked from an identity while it still holds POLYX - **/ - MultiSigHasBalance: AugmentedError; /** * The Identity doesn't have a parent identity. **/ @@ -982,6 +1082,18 @@ declare module '@polkadot/api-base/types/errors' { * Signatory is not pre authorized by the identity **/ Unauthorized: AugmentedError; + /** + * The DID is missing a CDD claim. + **/ + UnauthorizedCallerDidMissingCdd: AugmentedError; + /** + * Frozen secondary key. + **/ + UnauthorizedCallerFrozenDid: AugmentedError; + /** + * The key does not have permissions to execute the extrinsic. + **/ + UnauthorizedCallerMissingPermissions: AugmentedError; /** * Only CDD service providers are allowed. **/ @@ -1032,6 +1144,10 @@ declare module '@polkadot/api-base/types/errors' { [key: string]: AugmentedError; }; multiSig: { + /** + * Multisig has no admin. + **/ + AdminNotFound: AugmentedError; /** * Already a signer. **/ @@ -1040,6 +1156,10 @@ declare module '@polkadot/api-base/types/errors' { * Already voted. **/ AlreadyVoted: AugmentedError; + /** + * The extrinsic expected a different `AuthorizationType` than what the `data.auth_type()` is. + **/ + BadAuthorizationType: AugmentedError; /** * Changing multisig parameters not allowed since multisig is a primary key. **/ @@ -1056,6 +1176,14 @@ declare module '@polkadot/api-base/types/errors' { * Identity provided is not the multisig's payer. **/ IdentityNotPayer: AugmentedError; + /** + * The proposal has been invalidated after a multisg update. + **/ + InvalidatedProposal: AugmentedError; + /** + * Expiry must be in the future. + **/ + InvalidExpiryDate: AugmentedError; /** * Max weight not enough to execute proposal. **/ @@ -1215,10 +1343,18 @@ declare module '@polkadot/api-base/types/errors' { * The maximum number of nfts being transferred in one leg was exceeded. **/ MaxNumberOfNFTsPerLegExceeded: AugmentedError; + /** + * The NFT is locked. + **/ + NFTIsLocked: AugmentedError; /** * The NFT does not exist. **/ NFTNotFound: AugmentedError; + /** + * The number of keys in the collection is greater than the input. + **/ + NumberOfKeysIsLessThanExpected: AugmentedError; /** * An overflow while calculating the updated supply. **/ @@ -1256,23 +1392,31 @@ declare module '@polkadot/api-base/types/errors' { **/ CannotSkipPip: AugmentedError; /** - * Proposer specifies an incorrect deposit + * Proposer specifies an incorrect deposit amount. **/ IncorrectDeposit: AugmentedError; /** - * Proposal is not in the correct state + * The proposal is not in the correct state for the requested operation. **/ IncorrectProposalState: AugmentedError; /** - * Proposer can't afford to lock minimum deposit + * Proposer cannot afford to lock the minimum deposit. **/ InsufficientDeposit: AugmentedError; /** - * When a block number is less than current block number. + * The specified block number is less than the current block number. **/ InvalidFutureBlockNumber: AugmentedError; /** - * Missing current DID + * Invalid PIP ID. Pip id was not expected to be in the live queue. + **/ + InvalidPipId: AugmentedError; + /** + * TaskName cannot exceed 32 bytes. + **/ + InvalidTaskName: AugmentedError; + /** + * The current DID is missing. **/ MissingCurrentIdentity: AugmentedError; /** @@ -1280,12 +1424,12 @@ declare module '@polkadot/api-base/types/errors' { **/ NoSuchProposal: AugmentedError; /** - * Not part of governance committee. + * The caller is not a member of the governance committee. **/ NotACommitteeMember: AugmentedError; /** * The given dispatchable call is not valid for this proposal. - * The proposal must be by community, but isn't. + * The proposal must be from a committee, but isn't. **/ NotByCommittee: AugmentedError; /** @@ -1294,7 +1438,7 @@ declare module '@polkadot/api-base/types/errors' { **/ NotFromCommunity: AugmentedError; /** - * When number of votes overflows. + * The number of votes exceeds the allowed limit. **/ NumberOfVotesExceeded: AugmentedError; /** @@ -1310,7 +1454,7 @@ declare module '@polkadot/api-base/types/errors' { **/ ScheduledProposalDoesntExist: AugmentedError; /** - * Tried to enact result for PIP with id different from that at the position in the queue. + * Tried to enact result for PIP with an ID different from that at the position in the queue. **/ SnapshotIdMismatch: AugmentedError; /** @@ -1318,11 +1462,11 @@ declare module '@polkadot/api-base/types/errors' { **/ SnapshotResultTooLarge: AugmentedError; /** - * When stake amount of a vote overflows. + * The stake amount of a vote exceeds the allowed limit. **/ StakeAmountOfVotesExceeded: AugmentedError; /** - * The current number of active (pending | scheduled) PIPs exceed the maximum + * The current number of active (pending or scheduled) PIPs exceeds the maximum * and the proposal is not by a committee. **/ TooManyActivePips: AugmentedError; @@ -1432,6 +1576,14 @@ declare module '@polkadot/api-base/types/errors' { [key: string]: AugmentedError; }; portfolio: { + /** + * The extrinsic expected a different `AuthorizationType` than what the `data.auth_type()` is. + **/ + BadAuthorizationType: AugmentedError; + /** + * Default portfolios cannot have custodians. + **/ + DefaultPortfoliosCannotHaveCustodians: AugmentedError; /** * The source and destination portfolios should be different. **/ @@ -1500,6 +1652,10 @@ declare module '@polkadot/api-base/types/errors' { * The secondary key is not authorized to access the portfolio(s). **/ SecondaryKeyNotAuthorizedForPortfolio: AugmentedError; + /** + * Adding itself as an AllowedCustodian is not permitted. + **/ + SelfAdditionNotAllowed: AugmentedError; /** * The porfolio's custody is with someone other than the caller. **/ @@ -1534,6 +1690,14 @@ declare module '@polkadot/api-base/types/errors' { * Preimage is too large to store on-chain. **/ TooBig: AugmentedError; + /** + * Too few hashes were requested to be upgraded (i.e. zero). + **/ + TooFew: AugmentedError; + /** + * More than `MAX_HASH_UPGRADE_BULK_COUNT` hashes were requested to be upgraded at once. + **/ + TooMany: AugmentedError; /** * Generic error **/ @@ -1558,6 +1722,10 @@ declare module '@polkadot/api-base/types/errors' { [key: string]: AugmentedError; }; relayer: { + /** + * The extrinsic expected a different `AuthorizationType` than what the `data.auth_type()` is. + **/ + BadAuthorizationType: AugmentedError; /** * The `user_key` doesn't have a `paying_key`. **/ @@ -1656,6 +1824,14 @@ declare module '@polkadot/api-base/types/errors' { * No duplicate uid are allowed for different receipts. **/ DuplicateReceiptUid: AugmentedError; + /** + * The instruction has been locked for too much time. + **/ + ExceededMaximumLockingPeriod: AugmentedError; + /** + * Not all conditions for transferring the asset have been met. + **/ + FailedAssetTransferringConditions: AugmentedError; /** * The instruction failed to release asset locks or transfer the assets. **/ @@ -1692,10 +1868,22 @@ declare module '@polkadot/api-base/types/errors' { * Only [`InstructionStatus::Pending`] or [`InstructionStatus::Failed`] instructions can be executed. **/ InvalidInstructionStatusForExecution: AugmentedError; + /** + * [`InstructionStatus::Unknow`] can't be rejected. + **/ + InvalidInstructionStatusForRejection: AugmentedError; + /** + * Locked instructions can't have affirmations withdrawn. + **/ + InvalidInstructionStatusForWithdrawal: AugmentedError; /** * Offchain signature is invalid. **/ InvalidSignature: AugmentedError; + /** + * TaskName cannot exceed 32 bytes. + **/ + InvalidTaskName: AugmentedError; /** * Venue does not exist. **/ @@ -1704,6 +1892,10 @@ declare module '@polkadot/api-base/types/errors' { * No leg with the given id was found **/ LegNotFound: AugmentedError; + /** + * All locked instructions must register a lock timestamp. + **/ + LockTimestampNotFound: AugmentedError; /** * The maximum number of fungible assets was exceeded. **/ @@ -1752,6 +1944,10 @@ declare module '@polkadot/api-base/types/errors' { * Off-Chain assets cannot be locked. **/ OffChainAssetCantBeLocked: AugmentedError; + /** + * Offchain assets must have a venue. + **/ + OffChainAssetsMustHaveAVenue: AugmentedError; /** * Receipt already used. **/ @@ -1804,6 +2000,10 @@ declare module '@polkadot/api-base/types/errors' { * AssetId could not be found on chain. **/ UnexpectedOFFChainAsset: AugmentedError; + /** + * Unexpected settlement type. + **/ + UnexpectedSettlementType: AugmentedError; /** * Instruction status is unknown **/ @@ -1830,6 +2030,10 @@ declare module '@polkadot/api-base/types/errors' { * Rewards for this era have already been claimed for this validator. **/ AlreadyClaimed: AugmentedError; + /** + * The stake of this account is already migrated to `Fungible` holds. + **/ + AlreadyMigrated: AugmentedError; /** * Controller is already paired. **/ @@ -1851,17 +2055,21 @@ declare module '@polkadot/api-base/types/errors' { **/ CannotChillOther: AugmentedError; /** - * Validator commiission is above maximum. + * Stash could not be reaped as other pallet might depend on it. **/ - CommissionTooHigh: AugmentedError; + CannotReapStash: AugmentedError; + /** + * Cannot reset a ledger. + **/ + CannotRestoreLedger: AugmentedError; /** * Commission is too low. Must be at least `MinCommission`. **/ CommissionTooLow: AugmentedError; /** - * New commission must be different from previous commission. + * Used when attempting to use deprecated controller account logic. **/ - CommissionUnchanged: AugmentedError; + ControllerDeprecated: AugmentedError; /** * Duplicate index. **/ @@ -1874,18 +2082,6 @@ declare module '@polkadot/api-base/types/errors' { * Attempting to target a stash that still has funds. **/ FundedTarget: AugmentedError; - /** - * Permissioned validator already exists. - **/ - IdentityIsAlreadyPermissioned: AugmentedError; - /** - * Identity has not gone throught CDD. - **/ - IdentityIsMissingCDD: AugmentedError; - /** - * Identity was not found in the permissioned identity pool. - **/ - IdentityNotFound: AugmentedError; /** * Incorrect previous history depth input provided. **/ @@ -1900,10 +2096,6 @@ declare module '@polkadot/api-base/types/errors' { * intention, `chill` first to remove one's role as validator/nominator. **/ InsufficientBond: AugmentedError; - /** - * When the intended number of validators to run is >= 2/3 of `validator_count`. - **/ - IntendedCountIsExceedingConsensusLimit: AugmentedError; /** * Invalid era to reward. **/ @@ -1912,6 +2104,10 @@ declare module '@polkadot/api-base/types/errors' { * Invalid number of nominations. **/ InvalidNumberOfNominations: AugmentedError; + /** + * No nominators exist on this page. + **/ + InvalidPage: AugmentedError; /** * Slash record index out of bounds. **/ @@ -1924,6 +2120,10 @@ declare module '@polkadot/api-base/types/errors' { * Not a controller account. **/ NotController: AugmentedError; + /** + * Not enough funds available to withdraw. + **/ + NotEnoughFunds: AugmentedError; /** * Items are not sorted and unique. **/ @@ -1937,17 +2137,14 @@ declare module '@polkadot/api-base/types/errors' { **/ NoUnlockChunk: AugmentedError; /** - * Validator or nominator stash identity does not exist. - **/ - StashIdentityDoesNotExist: AugmentedError; - /** - * Nominator stash has not gone through CDD. + * Account is restricted from participation in staking. This may happen if the account is + * staking in another way already, such as via pool. **/ - StashIdentityNotCDDed: AugmentedError; + Restricted: AugmentedError; /** - * Validator's stash identity is not permissioned. + * Provided reward destination is not allowed. **/ - StashIdentityNotPermissioned: AugmentedError; + RewardDestinationRestricted: AugmentedError; /** * There are too many nominators in the system. Governance needs to adjust the staking * settings to keep things safe for the runtime. @@ -1958,13 +2155,14 @@ declare module '@polkadot/api-base/types/errors' { **/ TooManyTargets: AugmentedError; /** - * There are too many validator candidates in the system. + * There are too many validator candidates in the system. Governance needs to adjust the + * staking settings to keep things safe for the runtime. **/ TooManyValidators: AugmentedError; /** - * No validator was found for the given key. + * Operation not allowed for virtual stakers. **/ - ValidatorNotFound: AugmentedError; + VirtualStakerNotAllowed: AugmentedError; /** * Generic error **/ @@ -1976,9 +2174,9 @@ declare module '@polkadot/api-base/types/errors' { **/ CannotRemoveStatTypeInUse: AugmentedError; /** - * Transfer not allowed. + * Invalid transfer [`TransferCondition`] not respected. **/ - InvalidTransfer: AugmentedError; + InvalidTransferStatisticsFailure: AugmentedError; /** * The limit of StatTypes allowed for an asset has been reached. **/ @@ -2006,51 +2204,59 @@ declare module '@polkadot/api-base/types/errors' { }; sto: { /** - * Fundraiser has been closed/stopped already. + * The fundraiser has been permanently closed or stopped. **/ FundraiserClosed: AugmentedError; /** - * Interacting with a fundraiser past the end `Moment`. + * Attempting to interact with a fundraiser after its end time has passed. **/ FundraiserExpired: AugmentedError; /** - * Fundraiser not found. + * The specified fundraiser does not exist for the given asset. **/ FundraiserNotFound: AugmentedError; /** - * Fundraiser is either frozen or stopped. + * The fundraiser is not in a live state (either frozen or stopped). **/ FundraiserNotLive: AugmentedError; /** - * Not enough tokens left for sale. + * The fundraiser does not have enough tokens remaining to fulfil the investment. **/ InsufficientTokensRemaining: AugmentedError; /** - * Window (start time, end time) has invalid parameters, e.g start time is after end time. + * The fundraiser time window has invalid parameters (start time after end time). **/ InvalidOfferingWindow: AugmentedError; /** - * An individual price tier was invalid or a set of price tiers was invalid. + * One or more price tiers have invalid parameters (zero total, too many tiers, etc.). **/ InvalidPriceTiers: AugmentedError; /** - * An invalid venue provided. + * The off-chain receipt signature is invalid or could not be verified. + **/ + InvalidSignature: AugmentedError; + /** + * The provided venue is invalid (does not exist, wrong type, or wrong creator). **/ InvalidVenue: AugmentedError; /** - * Investment amount is lower than minimum investment amount. + * The investment amount is below the minimum investment threshold for this fundraiser. **/ InvestmentAmountTooLow: AugmentedError; /** - * Price of the investment exceeded the max price. + * The calculated price per token exceeds the maximum price specified by the investor. **/ MaxPriceExceeded: AugmentedError; /** - * An arithmetic operation overflowed. + * Off-chain funding has not been enabled for this fundraiser. + **/ + OffchainFundingNotAllowed: AugmentedError; + /** + * An arithmetic operation resulted in overflow or underflow. **/ Overflow: AugmentedError; /** - * Sender does not have required permissions. + * Sender does not have required permissions for the requested operation. **/ Unauthorized: AugmentedError; /** @@ -2084,6 +2290,10 @@ declare module '@polkadot/api-base/types/errors' { * and the new runtime. **/ InvalidSpecName: AugmentedError; + /** + * A multi-block migration is ongoing and prevents the current code from being replaced. + **/ + MultiBlockMigrationsOngoing: AugmentedError; /** * Suicide called when the account has non-default composite data. **/ @@ -2092,11 +2302,19 @@ declare module '@polkadot/api-base/types/errors' { * There is a non-zero reference count preventing the account from being purged. **/ NonZeroRefCount: AugmentedError; + /** + * No upgrade authorized. + **/ + NothingAuthorized: AugmentedError; /** * The specification version is not allowed to decrease between the current runtime * and the new runtime. **/ SpecVersionNeedsToIncrease: AugmentedError; + /** + * The submitted code is not authorized. + **/ + Unauthorized: AugmentedError; /** * Generic error **/ @@ -2177,12 +2395,6 @@ declare module '@polkadot/api-base/types/errors' { **/ [key: string]: AugmentedError; }; - testUtils: { - /** - * Generic error - **/ - [key: string]: AugmentedError; - }; treasury: { /** * Proposer's balance is too low. @@ -2303,5 +2515,47 @@ declare module '@polkadot/api-base/types/errors' { **/ [key: string]: AugmentedError; }; + validators: { + /** + * Validator commiission is above maximum. + **/ + CommissionTooHigh: AugmentedError; + /** + * New commission must be different from previous commission. + **/ + CommissionUnchanged: AugmentedError; + /** + * Permissioned validator already exists. + **/ + IdentityIsAlreadyPermissioned: AugmentedError; + /** + * Identity has not gone throught CDD. + **/ + IdentityIsMissingCDD: AugmentedError; + /** + * Identity was not found in the permissioned identity pool. + **/ + IdentityNotFound: AugmentedError; + /** + * When the intended number of validators to run is >= 2/3 of `validator_count`. + **/ + IntendedCountIsExceedingConsensusLimit: AugmentedError; + /** + * Validator or nominator stash identity does not exist. + **/ + StashIdentityDoesNotExist: AugmentedError; + /** + * Validator's stash identity is not permissioned. + **/ + StashIdentityNotPermissioned: AugmentedError; + /** + * No validator was found for the given key. + **/ + ValidatorNotFound: AugmentedError; + /** + * Generic error + **/ + [key: string]: AugmentedError; + }; } // AugmentedErrors } // declare module diff --git a/scripts/cli/src/interfaces/augment-api-events.ts b/scripts/cli/src/interfaces/augment-api-events.ts index a94f0b2450..fff9547b7e 100644 --- a/scripts/cli/src/interfaces/augment-api-events.ts +++ b/scripts/cli/src/interfaces/augment-api-events.ts @@ -9,7 +9,7 @@ import type { ApiTypes, AugmentedEvent } from '@polkadot/api-base/types'; import type { BTreeSet, Bytes, Null, Option, Result, U8aFixed, Vec, bool, u128, u32, u64, u8 } from '@polkadot/types-codec'; import type { ITuple } from '@polkadot/types-codec/types'; import type { AccountId32, H256, Perbill, Permill } from '@polkadot/types/interfaces/runtime'; -import type { FrameSupportDispatchDispatchInfo, FrameSupportTokensMiscBalanceStatus, PalletCorporateActionsBallotBallotMeta, PalletCorporateActionsBallotBallotTimeRange, PalletCorporateActionsBallotBallotVote, PalletCorporateActionsCaId, PalletCorporateActionsCorporateAction, PalletCorporateActionsDistribution, PalletCorporateActionsTargetIdentities, PalletElectionProviderMultiPhaseElectionCompute, PalletElectionProviderMultiPhasePhase, PalletImOnlineSr25519AppSr25519Public, PalletPipsProposalData, PalletPipsProposalState, PalletPipsProposer, PalletPipsSnapshottedPip, PalletStakingExposure, PalletStakingForcing, PalletStakingSlashingSwitch, PalletStakingValidatorPrefs, PalletStoFundraiser, PolymeshCommonUtilitiesCheckpointScheduleCheckpoints, PolymeshCommonUtilitiesMaybeBlock, PolymeshContractsApi, PolymeshContractsChainExtensionExtrinsicId, PolymeshContractsChainVersion, PolymeshPrimitivesAgentAgentGroup, PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesAssetAssetType, PolymeshPrimitivesAssetIdentifier, PolymeshPrimitivesAssetMetadataAssetMetadataKey, PolymeshPrimitivesAssetMetadataAssetMetadataSpec, PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail, PolymeshPrimitivesAuthorizationAuthorizationData, PolymeshPrimitivesComplianceManagerComplianceRequirement, PolymeshPrimitivesConditionTrustedIssuer, PolymeshPrimitivesDocument, PolymeshPrimitivesEventOnly, PolymeshPrimitivesIdentityClaim, PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesMemo, PolymeshPrimitivesNftNfTs, PolymeshPrimitivesPortfolioFundDescription, PolymeshPrimitivesPortfolioPortfolioUpdateReason, PolymeshPrimitivesPosRatio, PolymeshPrimitivesSecondaryKey, PolymeshPrimitivesSecondaryKeyExtrinsicPermissions, PolymeshPrimitivesSecondaryKeyPermissions, PolymeshPrimitivesSettlementLeg, PolymeshPrimitivesSettlementReceiptMetadata, PolymeshPrimitivesSettlementSettlementType, PolymeshPrimitivesSettlementVenueType, PolymeshPrimitivesStatisticsStatType, PolymeshPrimitivesStatisticsStatUpdate, PolymeshPrimitivesTicker, PolymeshPrimitivesTransferComplianceTransferCondition, PolymeshPrimitivesTransferComplianceTransferConditionExemptKey, SpConsensusGrandpaAppPublic, SpNposElectionsElectionScore, SpRuntimeDispatchError } from '@polkadot/types/lookup'; +import type { FrameSupportTokensMiscBalanceStatus, FrameSystemDispatchEventInfo, PalletContractsOrigin, PalletCorporateActionsBallotBallotMeta, PalletCorporateActionsBallotBallotTimeRange, PalletCorporateActionsBallotBallotVote, PalletCorporateActionsCaId, PalletCorporateActionsCorporateAction, PalletCorporateActionsDistribution, PalletCorporateActionsTargetIdentities, PalletElectionProviderMultiPhaseElectionCompute, PalletElectionProviderMultiPhasePhase, PalletImOnlineSr25519AppSr25519Public, PalletPipsProposalData, PalletPipsProposalState, PalletPipsProposer, PalletPipsSnapshottedPip, PalletStakingForcing, PalletStakingRewardDestination, PalletStakingValidatorPrefs, PalletStoFundingAsset, PalletStoFundraiser, PalletValidatorsSlashingSwitch, PolymeshCommonUtilitiesCheckpointScheduleCheckpoints, PolymeshContractsApi, PolymeshContractsChainExtensionExtrinsicId, PolymeshContractsChainVersion, PolymeshPrimitivesAgentAgentGroup, PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesAssetAssetType, PolymeshPrimitivesAssetIdentifier, PolymeshPrimitivesAssetMetadataAssetMetadataKey, PolymeshPrimitivesAssetMetadataAssetMetadataSpec, PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail, PolymeshPrimitivesAuthorizationAuthorizationData, PolymeshPrimitivesComplianceManagerComplianceRequirement, PolymeshPrimitivesConditionTrustedIssuer, PolymeshPrimitivesDocument, PolymeshPrimitivesEventOnly, PolymeshPrimitivesIdentityClaim, PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesMaybeBlock, PolymeshPrimitivesMemo, PolymeshPrimitivesNftNfTs, PolymeshPrimitivesPortfolioFundDescription, PolymeshPrimitivesPortfolioPortfolioUpdateReason, PolymeshPrimitivesPosRatio, PolymeshPrimitivesSecondaryKey, PolymeshPrimitivesSecondaryKeyExtrinsicPermissions, PolymeshPrimitivesSecondaryKeyPermissions, PolymeshPrimitivesSettlementLeg, PolymeshPrimitivesSettlementReceiptMetadata, PolymeshPrimitivesSettlementSettlementType, PolymeshPrimitivesSettlementVenueType, PolymeshPrimitivesStatisticsStatType, PolymeshPrimitivesStatisticsStatUpdate, PolymeshPrimitivesTicker, PolymeshPrimitivesTransferComplianceTransferCondition, PolymeshPrimitivesTransferComplianceTransferConditionExemptKey, SpConsensusGrandpaAppPublic, SpNposElectionsElectionScore, SpRuntimeDispatchError, SpStakingExposure } from '@polkadot/types/lookup'; export type __AugmentedEvent = AugmentedEvent; @@ -100,6 +100,11 @@ declare module '@polkadot/api-base/types/events' { * Parameters: caller DID, AssetId, funding round name. **/ FundingRoundSet: AugmentedEvent; + /** + * Asset Global Metadata Spec has been Updated. + * Parameters: [`AssetMetadataName`] of the metadata, [`AssetMetadataSpec`] of the metadata. + **/ + GlobalMetadataSpecUpdated: AugmentedEvent; /** * Event emitted when any token identifiers are updated. * caller DID, AssetId, a vector of (identifier type, identifier value) @@ -165,6 +170,11 @@ declare module '@polkadot/api-base/types/events' { * caller DID / ticker transferred to DID, ticker, from **/ TickerTransferred: AugmentedEvent; + /** + * An identity has unlinked a ticker from an asset. + * Parameters: [`IdentityId`] of caller, unlinked [`Ticker`], the asset identifier [`AssetId`]. + **/ + TickerUnlinkedFromAsset: AugmentedEvent; /** * Generic event **/ @@ -172,36 +182,99 @@ declare module '@polkadot/api-base/types/events' { }; balances: { /** - * The account and the amount of unlocked balance of that account that was burned. - * (caller Id, caller account, amount) + * A balance was set by root. + **/ + BalanceSet: AugmentedEvent; + /** + * Some amount was burned from an account. + **/ + Burned: AugmentedEvent; + /** + * Some amount was deposited (e.g. for transaction fees). + **/ + Deposit: AugmentedEvent; + /** + * An account was removed whose balance was non-zero but below ExistentialDeposit, + * resulting in an outright loss. + **/ + DustLost: AugmentedEvent; + /** + * An account was created with some free balance. **/ - AccountBalanceBurned: AugmentedEvent; + Endowed: AugmentedEvent; /** - * A balance was set by root (did, who, free, reserved). + * Some balance was frozen. **/ - BalanceSet: AugmentedEvent; + Frozen: AugmentedEvent; /** - * An account was created with some free balance. \[did, account, free_balance] + * Total issuance was increased by `amount`, creating a credit to be balanced. **/ - Endowed: AugmentedEvent, AccountId32, u128]>; + Issued: AugmentedEvent; /** - * Some balance was reserved (moved from free to reserved). \[who, value] + * Some balance was locked. **/ - Reserved: AugmentedEvent; + Locked: AugmentedEvent; + /** + * Some amount was minted into an account. + **/ + Minted: AugmentedEvent; + /** + * Total issuance was decreased by `amount`, creating a debt to be balanced. + **/ + Rescinded: AugmentedEvent; + /** + * Some balance was reserved (moved from free to reserved). + **/ + Reserved: AugmentedEvent; /** * Some balance was moved from the reserve of the first account to the second account. * Final argument indicates the destination balance type. - * \[from, to, balance, destination_status] **/ - ReserveRepatriated: AugmentedEvent; + ReserveRepatriated: AugmentedEvent; /** - * Transfer succeeded (from_did, from, to_did, to, value, memo). + * Some amount was restored into an account. **/ - Transfer: AugmentedEvent, AccountId32, Option, AccountId32, u128, Option]>; + Restored: AugmentedEvent; /** - * Some balance was unreserved (moved from reserved to free). \[who, value] + * Some amount was removed from the account (e.g. for misbehavior). **/ - Unreserved: AugmentedEvent; + Slashed: AugmentedEvent; + /** + * Some amount was suspended from an account (it can be restored later). + **/ + Suspended: AugmentedEvent; + /** + * Some balance was thawed. + **/ + Thawed: AugmentedEvent; + /** + * The `TotalIssuance` was forcefully changed. + **/ + TotalIssuanceForced: AugmentedEvent; + /** + * Transfer succeeded. + **/ + Transfer: AugmentedEvent; + /** + * Transfer with memo succeeded. + **/ + TransferWithMemo: AugmentedEvent], { from: AccountId32, to: AccountId32, amount: u128, memo: Option }>; + /** + * Some balance was unlocked. + **/ + Unlocked: AugmentedEvent; + /** + * Some balance was unreserved (moved from reserved to free). + **/ + Unreserved: AugmentedEvent; + /** + * An account was upgraded. + **/ + Upgraded: AugmentedEvent; + /** + * Some amount was withdrawn from the account (e.g. for transaction fees). + **/ + Withdraw: AugmentedEvent; /** * Generic event **/ @@ -210,6 +283,7 @@ declare module '@polkadot/api-base/types/events' { base: { /** * An unexpected error happened that should be investigated. + * TODO: Unused, remove it. **/ UnexpectedError: AugmentedEvent]>; /** @@ -254,7 +328,8 @@ declare module '@polkadot/api-base/types/events' { **/ ActiveLimitChanged: AugmentedEvent; /** - * Phantom member, never used. + * Phantom member, never used. This can be removed now. FRAME v2 doesn't require this. + * TODO: remove. **/ Dummy: AugmentedEvent; /** @@ -323,7 +398,8 @@ declare module '@polkadot/api-base/types/events' { **/ ActiveLimitChanged: AugmentedEvent; /** - * Phantom member, never used. + * Phantom member, never used. This can be removed now. FRAME v2 doesn't require this. + * TODO: remove. **/ Dummy: AugmentedEvent; /** @@ -417,15 +493,15 @@ declare module '@polkadot/api-base/types/events' { * calls. This is because on failure all storage changes including events are * rolled back. **/ - Called: AugmentedEvent; + Called: AugmentedEvent; /** * A code with the specified hash was removed. **/ - CodeRemoved: AugmentedEvent; + CodeRemoved: AugmentedEvent; /** * Code with the specified hash has been stored. **/ - CodeStored: AugmentedEvent; + CodeStored: AugmentedEvent; /** * A contract's code was updated. **/ @@ -448,6 +524,14 @@ declare module '@polkadot/api-base/types/events' { * Contract deployed by address at the specified address. **/ Instantiated: AugmentedEvent; + /** + * Some funds have been transferred and held as storage deposit. + **/ + StorageDepositTransferredAndHeld: AugmentedEvent; + /** + * Some storage deposit funds have been transferred and released. + **/ + StorageDepositTransferredAndReleased: AugmentedEvent; /** * Contract has been removed. * @@ -576,7 +660,7 @@ declare module '@polkadot/api-base/types/events' { * A solution was stored with the given compute. * * The `origin` indicates the origin of the solution. If `origin` is `Some(AccountId)`, - * the stored solution was submited in the signed phase by a miner with the `AccountId`. + * the stored solution was submitted in the signed phase by a miner with the `AccountId`. * Otherwise, the solution was stored either during the unsigned phase or by * `T::ForceOrigin`. The `bool` is `true` when a previous solution was ejected to make * room for this one. @@ -786,13 +870,17 @@ declare module '@polkadot/api-base/types/events' { /** * At the end of the session, at least one validator was found to be offline. **/ - SomeOffline: AugmentedEvent>], { offline: Vec> }>; + SomeOffline: AugmentedEvent>], { offline: Vec> }>; /** * Generic event **/ [key: string]: AugmentedEvent; }; indices: { + /** + * A deposit to reserve an index has been poked/reconsidered. + **/ + DepositPoked: AugmentedEvent; /** * A account index was assigned. **/ @@ -903,94 +991,188 @@ declare module '@polkadot/api-base/types/events' { pips: { /** * The maximum number of active PIPs was changed. - * (caller DID, old value, new value) + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `u32`: The old active PIP limit. + * - `u32`: The new active PIP limit. **/ ActivePipLimitChanged: AugmentedEvent; /** - * Default enactment period (in blocks) has been changed. - * (caller DID, old period, new period) + * The default enactment period was changed. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `BlockNumber`: The old enactment period. + * - `BlockNumber`: The new enactment period. **/ DefaultEnactmentPeriodChanged: AugmentedEvent; /** * Cancelling the PIP execution failed in the scheduler pallet. + * + * Parameters: + * - `PipId`: The ID of the PIP. **/ ExecutionCancellingFailed: AugmentedEvent; /** - * Execution of a PIP has been scheduled at specific block. + * The execution of a PIP was scheduled. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `PipId`: The ID of the PIP. + * - `BlockNumber`: The block number at which the PIP is scheduled for execution. **/ ExecutionScheduled: AugmentedEvent; /** * Scheduling of the PIP for execution failed in the scheduler pallet. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `PipId`: The ID of the PIP. + * - `BlockNumber`: The block number at which the PIP was scheduled for execution. **/ ExecutionSchedulingFailed: AugmentedEvent; /** * The PIP has been scheduled for expiry. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `PipId`: The ID of the PIP. + * - `BlockNumber`: The block number at which the PIP is scheduled for expiry. **/ ExpiryScheduled: AugmentedEvent; /** * Scheduling of the PIP for expiry failed in the scheduler pallet. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `PipId`: The ID of the PIP. + * - `BlockNumber`: The block number at which the PIP was scheduled for expiry. **/ ExpirySchedulingFailed: AugmentedEvent; /** - * Pruning Historical PIPs is enabled or disabled (caller DID, old value, new value) + * Historical PIPs Pruning has been set. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `bool`: The old value of the pruning setting. + * - `bool`: The new value of the pruning setting. **/ HistoricalPipsPruned: AugmentedEvent; /** - * The maximum times a PIP can be skipped was changed. - * (caller DID, old value, new value) + * The maximum number of times a PIP can be skipped was changed. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `SkippedCount`: The old skip count. + * - `SkippedCount`: The new skip count. **/ MaxPipSkipCountChanged: AugmentedEvent; /** - * Minimum deposit amount modified - * (caller DID, old amount, new amount) + * The minimum deposit amount for proposals was changed. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `Balance`: The old deposit amount. + * - `Balance`: The new deposit amount. **/ MinimumProposalDepositChanged: AugmentedEvent; /** - * Amount of blocks after which a pending PIP expires. - * (caller DID, old expiry, new expiry) + * The expiry time for pending PIPs was changed. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `MaybeBlock`: The old expiry time. + * - `MaybeBlock`: The new expiry time. **/ - PendingPipExpiryChanged: AugmentedEvent; + PendingPipExpiryChanged: AugmentedEvent; /** - * Pip has been closed, bool indicates whether data is pruned + * A PIP was closed. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `PipId`: The ID of the PIP. + * - `bool`: Indicates whether the data was pruned. **/ PipClosed: AugmentedEvent; /** * A PIP in the snapshot queue was skipped. - * (gc_did, pip_id, new_skip_count) + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `PipId`: The ID of the PIP. + * - `SkippedCount`: The new skip count. **/ PipSkipped: AugmentedEvent; /** - * A PIP was made with a `Balance` stake. - * - * # Parameters: + * A PIP was created with a specified `Balance` stake. * - * Caller DID, Proposer, PIP ID, deposit, URL, description, expiry time, proposal data. + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `Proposer`: The proposer of the PIP. + * - `PipId`: The ID of the PIP. + * - `Balance`: The deposit amount. + * - `Option`: The URL for proposal discussion. + * - `Option`: The description of the proposal. + * - `MaybeBlock`: The expiry time of the proposal. + * - `ProposalData`: The data of the proposal. **/ - ProposalCreated: AugmentedEvent, Option, PolymeshCommonUtilitiesMaybeBlock, PalletPipsProposalData]>; + ProposalCreated: AugmentedEvent, Option, PolymeshPrimitivesMaybeBlock, PalletPipsProposalData]>; /** - * Refund proposal - * (id, total amount) + * A proposal was refunded. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `PipId`: The ID of the PIP. + * - `Balance`: The total amount refunded. **/ ProposalRefund: AugmentedEvent; /** - * Triggered each time the state of a proposal is amended + * The state of a proposal was updated. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `PipId`: The ID of the PIP. + * - `ProposalState`: The new state of the proposal. **/ ProposalStateUpdated: AugmentedEvent; /** * The snapshot was cleared. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `SnapshotId`: The ID of the snapshot. **/ SnapshotCleared: AugmentedEvent; /** - * Results (e.g., approved, rejected, and skipped), were enacted for some PIPs. - * (gc_did, snapshot_id_opt, skipped_pips_with_new_count, rejected_pips, approved_pips) + * Results were enacted for some PIPs in the snapshot queue. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `Option`: The ID of the snapshot, if any. + * - `Vec<(PipId, SkippedCount)>`: The list of skipped PIPs with their new skip counts. + * - `Vec`: The list of rejected PIPs. + * - `Vec`: The list of approved PIPs. **/ SnapshotResultsEnacted: AugmentedEvent, Vec>, Vec, Vec]>; /** * A new snapshot was taken. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `SnapshotId`: The ID of the snapshot. + * - `Vec`: The list of PIPs in the snapshot. **/ SnapshotTaken: AugmentedEvent]>; /** - * `AccountId` voted `bool` on the proposal referenced by `PipId` + * An account voted on a proposal. + * + * Parameters: + * - `IdentityId`: The DID of the caller. + * - `T::AccountId`: The account that voted. + * - `PipId`: The ID of the PIP. + * - `bool`: The vote (true for aye, false for nay). + * - `Balance`: The deposit amount of the vote. **/ Voted: AugmentedEvent; /** @@ -1014,7 +1196,7 @@ declare module '@polkadot/api-base/types/events' { * Proposal expiry time has been updated. * Parameters: caller DID, new expiry time (if any). **/ - ExpiresAfterUpdated: AugmentedEvent; + ExpiresAfterUpdated: AugmentedEvent; /** * Final votes on a motion (given hash) * caller DID, ProposalIndex, Proposal hash, yes voters, no voter @@ -1074,6 +1256,14 @@ declare module '@polkadot/api-base/types/events' { [key: string]: AugmentedEvent; }; portfolio: { + /** + * Allow another identity to create portfolios. + * + * # Parameters + * * [`IdentityId`] of the caller. + * * [`IdentityId`] allowed to create portfolios. + **/ + AllowIdentityToCreatePortfolios: AugmentedEvent; /** * Funds have moved between portfolios * @@ -1129,6 +1319,14 @@ declare module '@polkadot/api-base/types/events' { * * [`AssetId`] of the asset that has been exempt from explicit affirmation. **/ PreApprovedPortfolio: AugmentedEvent; + /** + * Revoke another identities permission to create portfolios. + * + * # Parameters + * * [`IdentityId`] of the caller. + * * [`IdentityId`] permissions to create portfolios is revoked. + **/ + RevokeCreatePortfoliosPermission: AugmentedEvent; /** * A portfolio has removed the approval of an asset. * @@ -1218,6 +1416,10 @@ declare module '@polkadot/api-base/types/events' { [key: string]: AugmentedEvent; }; scheduler: { + /** + * Agenda is incomplete from `when`. + **/ + AgendaIncomplete: AugmentedEvent; /** * The call for the provided hash was not found so the task has been aborted. **/ @@ -1238,6 +1440,19 @@ declare module '@polkadot/api-base/types/events' { * The given task can never be executed since it is overweight. **/ PermanentlyOverweight: AugmentedEvent, id: Option], { task: ITuple<[u32, u32]>, id: Option }>; + /** + * Cancel a retry configuration for some task. + **/ + RetryCancelled: AugmentedEvent, id: Option], { task: ITuple<[u32, u32]>, id: Option }>; + /** + * The given task was unable to be retried since the agenda is full at that block or there + * was not enough weight to reschedule it. + **/ + RetryFailed: AugmentedEvent, id: Option], { task: ITuple<[u32, u32]>, id: Option }>; + /** + * Set a retry configuration for some task. + **/ + RetrySet: AugmentedEvent, id: Option, period: u32, retries: u8], { task: ITuple<[u32, u32]>, id: Option, period: u32, retries: u8 }>; /** * Scheduled some task. **/ @@ -1253,6 +1468,14 @@ declare module '@polkadot/api-base/types/events' { * block number as the type might suggest. **/ NewSession: AugmentedEvent; + /** + * Validator has been disabled. + **/ + ValidatorDisabled: AugmentedEvent; + /** + * Validator has been re-enabled. + **/ + ValidatorReenabled: AugmentedEvent; /** * Generic event **/ @@ -1286,9 +1509,13 @@ declare module '@polkadot/api-base/types/events' { **/ InstructionExecuted: AugmentedEvent; /** - * Instruction failed execution (did, instruction_id) + * An instruction has been sucessfully locked for execution + * + * Parameters: + * - `IdentityId`: The [`IdentityId`] of the caller. + * - `InstructionId`: The [`InstructionId`] of the instruction. **/ - InstructionFailed: AugmentedEvent; + InstructionLocked: AugmentedEvent; /** * An instruction with mediators has been created. * Parameters: [`InstructionId`] of the instruction and the [`IdentityId`] of all mediators. @@ -1373,15 +1600,20 @@ declare module '@polkadot/api-base/types/events' { * NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, * it will not be emitted for staking rewards when they are added to stake. **/ - Bonded: AugmentedEvent; + Bonded: AugmentedEvent; /** * An account has stopped participating as either a validator or nominator. **/ Chilled: AugmentedEvent; /** - * Commission cap has been updated. + * Report of a controller batch deprecation. **/ - CommissionCapUpdated: AugmentedEvent; + ControllerBatchDeprecated: AugmentedEvent; + /** + * Staking balance migrated from locks to holds, with any balance that could not be held + * is force withdrawn. + **/ + CurrencyMigrated: AugmentedEvent; /** * The era payout has been set; the first balance is the validator-payout; the second is * the remainder from the maximum amount of reward. @@ -1391,56 +1623,40 @@ declare module '@polkadot/api-base/types/events' { * A new force era mode was set. **/ ForceEra: AugmentedEvent; - /** - * Remove the nominators from the valid nominators when there CDD expired. - **/ - InvalidatedNominators: AugmentedEvent], { governanceCouncillDid: PolymeshPrimitivesIdentityId, governanceCouncillAccount: PolymeshPrimitivesIdentityId, expiredNominators: Vec }>; /** * A nominator has been kicked from a validator. **/ Kicked: AugmentedEvent; - /** - * User has updated their nominations. - **/ - Nominated: AugmentedEvent], { nominatorIdentity: PolymeshPrimitivesIdentityId, stash: AccountId32, targets: Vec }>; /** * An old slashing report from a prior era was discarded because it could * not be processed. **/ OldSlashingReportDiscarded: AugmentedEvent; /** - * The stakers' rewards are getting paid. - **/ - PayoutStarted: AugmentedEvent; - /** - * An identity has issued a candidacy for becoming a validator. - **/ - PermissionedIdentityAdded: AugmentedEvent; - /** - * An identity has been removed from the permissioned identities pool. + * A Page of stakers rewards are getting paid. `next` is `None` if all pages are claimed. **/ - PermissionedIdentityRemoved: AugmentedEvent; + PayoutStarted: AugmentedEvent], { eraIndex: u32, validatorStash: AccountId32, page: u32, next: Option }>; /** - * The nominator has been rewarded by this amount. + * The nominator has been rewarded by this amount to this destination. **/ - Rewarded: AugmentedEvent; - /** - * Reward scheduling interrupted. - **/ - RewardPaymentSchedulingInterrupted: AugmentedEvent; + Rewarded: AugmentedEvent; /** * A staker (validator or nominator) has been slashed by the given amount. **/ Slashed: AugmentedEvent; - /** - * Slashing allowed has been updated. - **/ - SlashingAllowedForChanged: AugmentedEvent; /** * A slash for the given validator, for the given percentage of their stake, at the given * era as been reported. **/ SlashReported: AugmentedEvent; + /** + * Targets size limit reached. + **/ + SnapshotTargetsSizeExceeded: AugmentedEvent; + /** + * Voters size limit reached. + **/ + SnapshotVotersSizeExceeded: AugmentedEvent; /** * A new set of stakers was elected. **/ @@ -1452,7 +1668,7 @@ declare module '@polkadot/api-base/types/events' { /** * An account has unbonded this amount. **/ - Unbonded: AugmentedEvent; + Unbonded: AugmentedEvent; /** * A validator has set their preferences. **/ @@ -1511,35 +1727,47 @@ declare module '@polkadot/api-base/types/events' { }; sto: { /** - * A fundraiser has been stopped. - * (Agent DID, fundraiser id) + * A fundraiser has been permanently closed. + * + * [agent_did, offering_asset, fundraiser_id] **/ - FundraiserClosed: AugmentedEvent; + FundraiserClosed: AugmentedEvent; /** * A new fundraiser has been created. - * (Agent DID, fundraiser id, fundraiser name, fundraiser details) + * + * [agent_did, offering_asset, raising_asset, fundraiser_id, fundraiser_name, fundraiser] **/ - FundraiserCreated: AugmentedEvent; + FundraiserCreated: AugmentedEvent; /** - * A fundraiser has been frozen. - * (Agent DID, fundraiser id) + * A fundraiser has been frozen, preventing new investments. + * + * [agent_did, offering_asset, fundraiser_id] + **/ + FundraiserFrozen: AugmentedEvent; + /** + * Off-chain funding has been enabled for a fundraiser. + * + * [agent_did, offering_asset, fundraiser_id, ticker] **/ - FundraiserFrozen: AugmentedEvent; + FundraiserOffchainFundingEnabled: AugmentedEvent; /** - * A fundraiser has been unfrozen. - * (Agent DID, fundraiser id) + * A fundraiser has been unfrozen, allowing new investments. + * + * [agent_did, offering_asset, fundraiser_id] **/ - FundraiserUnfrozen: AugmentedEvent; + FundraiserUnfrozen: AugmentedEvent; /** - * A fundraiser window has been modified. - * (Agent DID, fundraiser id, old_start, old_end, new_start, new_end) + * A fundraiser's time window has been modified. + * + * [agent_did, offering_asset, fundraiser_id, old_start, old_end, new_start, new_end] **/ - FundraiserWindowModified: AugmentedEvent, u64, Option]>; + FundraiserWindowModified: AugmentedEvent, newStart: u64, newEnd: Option], { agentDid: PolymeshPrimitivesEventOnly, offeringAsset: PolymeshPrimitivesAssetAssetId, fundraiserId: u64, oldStart: u64, oldEnd: Option, newStart: u64, newEnd: Option }>; /** - * An investor invested in the fundraiser. - * (Investor, fundraiser_id, offering token, raise token, offering_token_amount, raise_token_amount) + * An investor successfully invested in the fundraiser. + * + * [investor_did, offering_asset, fundraiser_id, funding_asset, offering_amount, raise_amount] **/ - Invested: AugmentedEvent; + Invested: AugmentedEvent; /** * Generic event **/ @@ -1547,17 +1775,17 @@ declare module '@polkadot/api-base/types/events' { }; sudo: { /** - * The \[sudoer\] just switched identity; the old key is supplied. + * The \[sudoer\] just switched identity; the old key is supplied if one existed. **/ - KeyChanged: AugmentedEvent]>; + KeyChanged: AugmentedEvent], { oldSudoer: Option }>; /** * A sudo just took place. \[result\] **/ - Sudid: AugmentedEvent]>; + Sudid: AugmentedEvent], { sudoResult: Result }>; /** * A sudo just took place. \[result\] **/ - SudoAsDone: AugmentedEvent]>; + SudoAsDone: AugmentedEvent], { sudoResult: Result }>; /** * Generic event **/ @@ -1571,11 +1799,11 @@ declare module '@polkadot/api-base/types/events' { /** * An extrinsic failed. **/ - ExtrinsicFailed: AugmentedEvent; + ExtrinsicFailed: AugmentedEvent; /** * An extrinsic completed successfully. **/ - ExtrinsicSuccess: AugmentedEvent; + ExtrinsicSuccess: AugmentedEvent; /** * An account was reaped. **/ @@ -1584,10 +1812,18 @@ declare module '@polkadot/api-base/types/events' { * A new account was created. **/ NewAccount: AugmentedEvent; + /** + * An invalid authorized upgrade was rejected while trying to apply it. + **/ + RejectedInvalidAuthorizedUpgrade: AugmentedEvent; /** * On on-chain remark happened. **/ Remarked: AugmentedEvent; + /** + * An upgrade was authorized. + **/ + UpgradeAuthorized: AugmentedEvent; /** * Generic event **/ @@ -1609,7 +1845,7 @@ declare module '@polkadot/api-base/types/events' { * Proposal expiry time has been updated. * Parameters: caller DID, new expiry time (if any). **/ - ExpiresAfterUpdated: AugmentedEvent; + ExpiresAfterUpdated: AugmentedEvent; /** * Final votes on a motion (given hash) * caller DID, ProposalIndex, Proposal hash, yes voters, no voter @@ -1658,7 +1894,8 @@ declare module '@polkadot/api-base/types/events' { **/ ActiveLimitChanged: AugmentedEvent; /** - * Phantom member, never used. + * Phantom member, never used. This can be removed now. FRAME v2 doesn't require this. + * TODO: remove. **/ Dummy: AugmentedEvent; /** @@ -1691,23 +1928,6 @@ declare module '@polkadot/api-base/types/events' { **/ [key: string]: AugmentedEvent; }; - testUtils: { - /** - * Shows the `DID` associated to the `AccountId`, and a flag indicates if that DID has a - * valid CDD claim. - * (Target DID, Target Account, a valid CDD claim exists) - **/ - CddStatus: AugmentedEvent, AccountId32, bool]>; - /** - * Emits the `IdentityId` and the `AccountId` of the caller. - * (Caller DID, Caller account) - **/ - DidStatus: AugmentedEvent; - /** - * Generic event - **/ - [key: string]: AugmentedEvent; - }; transactionPayment: { /** * A transaction fee `actual_fee`, of which `tip` was added to the minimum inclusion fee, @@ -1759,7 +1979,7 @@ declare module '@polkadot/api-base/types/events' { * Proposal expiry time has been updated. * Parameters: caller DID, new expiry time (if any). **/ - ExpiresAfterUpdated: AugmentedEvent; + ExpiresAfterUpdated: AugmentedEvent; /** * Final votes on a motion (given hash) * caller DID, ProposalIndex, Proposal hash, yes voters, no voter @@ -1808,7 +2028,8 @@ declare module '@polkadot/api-base/types/events' { **/ ActiveLimitChanged: AugmentedEvent; /** - * Phantom member, never used. + * Phantom member, never used. This can be removed now. FRAME v2 doesn't require this. + * TODO: remove. **/ Dummy: AugmentedEvent; /** @@ -1846,12 +2067,6 @@ declare module '@polkadot/api-base/types/events' { * Batch of dispatches completed fully with no error. **/ BatchCompleted: AugmentedEvent; - /** - * Batch of dispatches completed fully with no error. - * Includes a vector of event counts for each dispatch. - * POLYMESH: event deprecated. - **/ - BatchCompletedOld: AugmentedEvent]>; /** * Batch of dispatches completed but has errors. **/ @@ -1861,20 +2076,6 @@ declare module '@polkadot/api-base/types/events' { * well as the error. **/ BatchInterrupted: AugmentedEvent; - /** - * Batch of dispatches did not complete fully. - * Includes a vector of event counts for each dispatch and - * the index of the first failing dispatch as well as the error. - * POLYMESH: event deprecated. - **/ - BatchInterruptedOld: AugmentedEvent, ITuple<[u32, SpRuntimeDispatchError]>]>; - /** - * Batch of dispatches did not complete fully. - * Includes a vector of event counts for each call and - * a vector of any failed dispatches with their indices and associated error. - * POLYMESH: event deprecated. - **/ - BatchOptimisticFailed: AugmentedEvent, Vec>]>; /** * A call was dispatched. **/ @@ -1897,5 +2098,39 @@ declare module '@polkadot/api-base/types/events' { **/ [key: string]: AugmentedEvent; }; + validators: { + /** + * Commission cap has been updated. + **/ + CommissionCapUpdated: AugmentedEvent; + /** + * Remove the nominators from the valid nominators when there CDD expired. + **/ + InvalidatedNominators: AugmentedEvent], { governanceCouncillDid: PolymeshPrimitivesIdentityId, governanceCouncillAccount: PolymeshPrimitivesIdentityId, expiredNominators: Vec }>; + /** + * User has updated their nominations. + **/ + Nominated: AugmentedEvent], { nominatorIdentity: PolymeshPrimitivesIdentityId, stash: AccountId32, targets: Vec }>; + /** + * An identity has issued a candidacy for becoming a validator. + **/ + PermissionedIdentityAdded: AugmentedEvent; + /** + * An identity has been removed from the permissioned identities pool. + **/ + PermissionedIdentityRemoved: AugmentedEvent; + /** + * Reward scheduling interrupted. + **/ + RewardPaymentSchedulingInterrupted: AugmentedEvent; + /** + * Slashing allowed has been updated. + **/ + SlashingAllowedForChanged: AugmentedEvent; + /** + * Generic event + **/ + [key: string]: AugmentedEvent; + }; } // AugmentedEvents } // declare module diff --git a/scripts/cli/src/interfaces/augment-api-query.ts b/scripts/cli/src/interfaces/augment-api-query.ts index 3cadc7357d..75ac184722 100644 --- a/scripts/cli/src/interfaces/augment-api-query.ts +++ b/scripts/cli/src/interfaces/augment-api-query.ts @@ -6,10 +6,10 @@ import '@polkadot/api-base/types/storage'; import type { ApiTypes, AugmentedQuery, QueryableStorageEntry } from '@polkadot/api-base/types'; -import type { BTreeSet, Bytes, Null, Option, U8aFixed, Vec, WrapperOpaque, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; +import type { BTreeSet, Bytes, Null, Option, Struct, Text, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; import type { AnyNumber, ITuple } from '@polkadot/types-codec/types'; import type { AccountId32, Call, H256, Perbill, Percent, Permill } from '@polkadot/types/interfaces/runtime'; -import type { FrameSupportDispatchPerDispatchClassWeight, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, PalletAssetAssetDetails, PalletAssetTickerRegistration, PalletAssetTickerRegistrationConfig, PalletBalancesBalanceLock, PalletBridgeBridgeTxDetail, PalletCommitteePolymeshVotes, PalletContractsStorageContractInfo, PalletContractsStorageDeletedContract, PalletContractsWasmOwnerInfo, PalletContractsWasmPrefabWasmModule, PalletCorporateActionsBallotBallotMeta, PalletCorporateActionsBallotBallotTimeRange, PalletCorporateActionsBallotBallotVote, PalletCorporateActionsCaId, PalletCorporateActionsCorporateAction, PalletCorporateActionsDistribution, PalletCorporateActionsTargetIdentities, PalletElectionProviderMultiPhasePhase, PalletElectionProviderMultiPhaseReadySolution, PalletElectionProviderMultiPhaseRoundSnapshot, PalletElectionProviderMultiPhaseSignedSignedSubmission, PalletElectionProviderMultiPhaseSolutionOrSnapshotSize, PalletGrandpaStoredPendingChange, PalletGrandpaStoredState, PalletIdentityClaim1stKey, PalletIdentityClaim2ndKey, PalletImOnlineBoundedOpaqueNetworkState, PalletImOnlineSr25519AppSr25519Public, PalletPipsDepositInfo, PalletPipsPip, PalletPipsPipsMetadata, PalletPipsProposalState, PalletPipsSnapshotMetadata, PalletPipsSnapshottedPip, PalletPipsVote, PalletPipsVotingResult, PalletPreimageRequestStatus, PalletRelayerSubsidy, PalletSchedulerScheduled, PalletStakingActiveEraInfo, PalletStakingEraRewardPoints, PalletStakingExposure, PalletStakingForcing, PalletStakingNominations, PalletStakingPermissionedIdentityPrefs, PalletStakingRewardDestination, PalletStakingSlashingSlashingSpans, PalletStakingSlashingSpanRecord, PalletStakingSlashingSwitch, PalletStakingStakingLedger, PalletStakingUnappliedSlash, PalletStakingValidatorPrefs, PalletStoFundraiser, PalletTransactionPaymentReleases, PolymeshCommonUtilitiesCheckpointNextCheckpoints, PolymeshCommonUtilitiesCheckpointScheduleCheckpoints, PolymeshCommonUtilitiesGroupInactiveMember, PolymeshCommonUtilitiesMaybeBlock, PolymeshCommonUtilitiesProtocolFeeProtocolOp, PolymeshContractsApi, PolymeshContractsApiCodeHash, PolymeshContractsChainExtensionExtrinsicId, PolymeshContractsNextUpgrade, PolymeshPrimitivesAgentAgentGroup, PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesAssetIdentifier, PolymeshPrimitivesAssetMetadataAssetMetadataKey, PolymeshPrimitivesAssetMetadataAssetMetadataSpec, PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail, PolymeshPrimitivesAuthorization, PolymeshPrimitivesComplianceManagerAssetCompliance, PolymeshPrimitivesConditionTrustedIssuer, PolymeshPrimitivesDocument, PolymeshPrimitivesIdentityClaim, PolymeshPrimitivesIdentityDidRecord, PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesMemo, PolymeshPrimitivesMultisigProposalState, PolymeshPrimitivesMultisigProposalVoteCount, PolymeshPrimitivesNftNftCollection, PolymeshPrimitivesPosRatio, PolymeshPrimitivesSecondaryKeyExtrinsicPermissions, PolymeshPrimitivesSecondaryKeyKeyRecord, PolymeshPrimitivesSecondaryKeySignatory, PolymeshPrimitivesSettlementAffirmationStatus, PolymeshPrimitivesSettlementInstruction, PolymeshPrimitivesSettlementInstructionStatus, PolymeshPrimitivesSettlementLeg, PolymeshPrimitivesSettlementLegStatus, PolymeshPrimitivesSettlementMediatorAffirmationStatus, PolymeshPrimitivesSettlementVenue, PolymeshPrimitivesStatisticsStat1stKey, PolymeshPrimitivesStatisticsStat2ndKey, PolymeshPrimitivesStatisticsStatType, PolymeshPrimitivesSubsetSubsetRestrictionAssetId, PolymeshPrimitivesSubsetSubsetRestrictionPortfolioId, PolymeshPrimitivesTicker, PolymeshPrimitivesTransferComplianceAssetTransferCompliance, PolymeshPrimitivesTransferComplianceTransferConditionExemptKey, PolymeshRuntimeDevelopRuntimeSessionKeys, SpConsensusBabeAppPublic, SpConsensusBabeBabeEpochConfiguration, SpConsensusBabeDigestsNextConfigDescriptor, SpConsensusBabeDigestsPreDigest, SpCoreCryptoKeyTypeId, SpNposElectionsElectionScore, SpRuntimeDigest, SpStakingOffenceOffenceDetails } from '@polkadot/types/lookup'; +import type { FrameSupportDispatchPerDispatchClassWeight, FrameSupportTokensMiscIdAmount, FrameSystemAccountInfo, FrameSystemCodeUpgradeAuthorization, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, PalletAssetAssetDetails, PalletAssetTickerRegistration, PalletAssetTickerRegistrationConfig, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReserveData, PalletCommitteePolymeshVotes, PalletContractsStorageContractInfo, PalletContractsStorageDeletionQueueManager, PalletContractsWasmCodeInfo, PalletCorporateActionsBallotBallotMeta, PalletCorporateActionsBallotBallotTimeRange, PalletCorporateActionsBallotBallotVote, PalletCorporateActionsCaId, PalletCorporateActionsCorporateAction, PalletCorporateActionsDistribution, PalletCorporateActionsTargetIdentities, PalletElectionProviderMultiPhasePhase, PalletElectionProviderMultiPhaseReadySolution, PalletElectionProviderMultiPhaseRoundSnapshot, PalletElectionProviderMultiPhaseSignedSignedSubmission, PalletElectionProviderMultiPhaseSolutionOrSnapshotSize, PalletGrandpaStoredPendingChange, PalletGrandpaStoredState, PalletIdentityClaim1stKey, PalletIdentityClaim2ndKey, PalletImOnlineSr25519AppSr25519Public, PalletPipsDepositInfo, PalletPipsPip, PalletPipsPipsMetadata, PalletPipsProposalState, PalletPipsSnapshotMetadata, PalletPipsSnapshottedPip, PalletPipsVote, PalletPipsVotingResult, PalletPreimageOldRequestStatus, PalletPreimageRequestStatus, PalletRelayerSubsidy, PalletSchedulerRetryConfig, PalletSchedulerScheduled, PalletStakingActiveEraInfo, PalletStakingEraRewardPoints, PalletStakingForcing, PalletStakingNominations, PalletStakingRewardDestination, PalletStakingSlashingSlashingSpans, PalletStakingSlashingSpanRecord, PalletStakingStakingLedger, PalletStakingUnappliedSlash, PalletStakingValidatorPrefs, PalletStoFundraiser, PalletTransactionPaymentReleases, PalletValidatorsPermissionedIdentityPrefs, PalletValidatorsSlashingSwitch, PolymeshCommonUtilitiesCheckpointNextCheckpoints, PolymeshCommonUtilitiesCheckpointScheduleCheckpoints, PolymeshCommonUtilitiesProtocolFeeProtocolOp, PolymeshContractsApi, PolymeshContractsApiCodeHash, PolymeshContractsChainExtensionExtrinsicId, PolymeshContractsNextUpgrade, PolymeshPrimitivesAgentAgentGroup, PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesAssetIdentifier, PolymeshPrimitivesAssetMetadataAssetMetadataKey, PolymeshPrimitivesAssetMetadataAssetMetadataSpec, PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail, PolymeshPrimitivesAuthorization, PolymeshPrimitivesComplianceManagerAssetCompliance, PolymeshPrimitivesConditionTrustedIssuer, PolymeshPrimitivesDocument, PolymeshPrimitivesGroupInactiveMember, PolymeshPrimitivesIdentityClaim, PolymeshPrimitivesIdentityDidRecord, PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesMaybeBlock, PolymeshPrimitivesMemo, PolymeshPrimitivesMultisigProposalState, PolymeshPrimitivesMultisigProposalVoteCount, PolymeshPrimitivesNftNftCollection, PolymeshPrimitivesPosRatio, PolymeshPrimitivesSecondaryKeyExtrinsicPermissions, PolymeshPrimitivesSecondaryKeyKeyRecord, PolymeshPrimitivesSecondaryKeySignatory, PolymeshPrimitivesSettlementAffirmationStatus, PolymeshPrimitivesSettlementInstruction, PolymeshPrimitivesSettlementInstructionStatus, PolymeshPrimitivesSettlementLeg, PolymeshPrimitivesSettlementLegStatus, PolymeshPrimitivesSettlementMediatorAffirmationStatus, PolymeshPrimitivesSettlementVenue, PolymeshPrimitivesStatisticsStat1stKey, PolymeshPrimitivesStatisticsStat2ndKey, PolymeshPrimitivesStatisticsStatType, PolymeshPrimitivesSubsetSubsetRestrictionAssetId, PolymeshPrimitivesSubsetSubsetRestrictionPortfolioId, PolymeshPrimitivesTicker, PolymeshPrimitivesTransferComplianceAssetTransferCompliance, PolymeshPrimitivesTransferComplianceTransferConditionExemptKey, PolymeshRuntimeDevelopRuntimeRuntimeHoldReason, PolymeshRuntimeDevelopRuntimeSessionKeys, SpAuthorityDiscoveryAppPublic, SpConsensusBabeAppPublic, SpConsensusBabeBabeEpochConfiguration, SpConsensusBabeDigestsNextConfigDescriptor, SpConsensusBabeDigestsPreDigest, SpConsensusGrandpaAppPublic, SpCoreCryptoKeyTypeId, SpNposElectionsElectionScore, SpRuntimeDigest, SpStakingExposure, SpStakingExposurePage, SpStakingOffenceOffenceDetails, SpStakingPagedExposureMetadata, SpWeightsWeightV2Weight } from '@polkadot/types/lookup'; import type { Observable } from '@polkadot/types/types'; export type __AugmentedQuery = AugmentedQuery unknown>; @@ -33,7 +33,7 @@ declare module '@polkadot/api-base/types/storage' { /** * Maps all [`AssetId`] that are mapped to a [`Ticker`]. **/ - assetIDTicker: AugmentedQuery Observable>, [PolymeshPrimitivesAssetAssetId]> & QueryableStorageEntry; + assetIdTicker: AugmentedQuery Observable>, [PolymeshPrimitivesAssetAssetId]> & QueryableStorageEntry; /** * Asset Metadata Global Key -> Name. **/ @@ -109,7 +109,7 @@ declare module '@polkadot/api-base/types/storage' { **/ customTypesInverse: AugmentedQuery Observable>, [Bytes]> & QueryableStorageEntry; /** - * Returns `true` if transfers for the token associated to [`AssetId`] are frozen. Otherwise, returns `false`. + * Returns `true` if transfers for the asset are frozen. Otherwise, returns `false`. **/ frozen: AugmentedQuery Observable, [PolymeshPrimitivesAssetAssetId]> & QueryableStorageEntry; /** @@ -129,7 +129,7 @@ declare module '@polkadot/api-base/types/storage' { **/ preApprovedAsset: AugmentedQuery Observable, [PolymeshPrimitivesIdentityId, PolymeshPrimitivesAssetAssetId]> & QueryableStorageEntry; /** - * All security tokens owned by a user. + * All assets owned by a user. **/ securityTokensOwnedByUser: AugmentedQuery Observable, [PolymeshPrimitivesIdentityId, PolymeshPrimitivesAssetAssetId]> & QueryableStorageEntry; /** @@ -149,7 +149,7 @@ declare module '@polkadot/api-base/types/storage' { **/ tickersOwnedByUser: AugmentedQuery Observable, [PolymeshPrimitivesIdentityId, PolymeshPrimitivesTicker]> & QueryableStorageEntry; /** - * Maps each [`Ticker`] to its registration details ([`TickerRegistration`]). + * Map each [`Ticker`] to its registration details ([`TickerRegistration`]). **/ uniqueTickerRegistration: AugmentedQuery Observable>, [PolymeshPrimitivesTicker]> & QueryableStorageEntry; /** @@ -157,6 +157,20 @@ declare module '@polkadot/api-base/types/storage' { **/ [key: string]: QueryableStorageEntry; }; + authorityDiscovery: { + /** + * Keys of the current authority set. + **/ + keys: AugmentedQuery Observable>, []> & QueryableStorageEntry; + /** + * Keys of the next authority set. + **/ + nextKeys: AugmentedQuery Observable>, []> & QueryableStorageEntry; + /** + * Generic query + **/ + [key: string]: QueryableStorageEntry; + }; authorship: { /** * Author of current block. @@ -282,66 +296,64 @@ declare module '@polkadot/api-base/types/storage' { }; balances: { /** - * Any liquidity locks on some account balances. - * NOTE: Should only be accessed when setting, changing and freeing a lock. - **/ - locks: AugmentedQuery Observable>, [AccountId32]> & QueryableStorageEntry; - /** - * The total units issued in the system. - **/ - totalIssuance: AugmentedQuery Observable, []> & QueryableStorageEntry; - /** - * Generic query - **/ - [key: string]: QueryableStorageEntry; - }; - bridge: { - /** - * The admin key. - **/ - admin: AugmentedQuery Observable>, []> & QueryableStorageEntry; - /** - * The maximum number of bridged POLYX per identity within a set interval of - * blocks. Fields: POLYX amount and the block interval duration. - **/ - bridgeLimit: AugmentedQuery Observable>, []> & QueryableStorageEntry; - /** - * Identities not constrained by the bridge limit. - **/ - bridgeLimitExempted: AugmentedQuery Observable, [PolymeshPrimitivesIdentityId]> & QueryableStorageEntry; - /** - * Details of bridge transactions identified with pairs of the recipient account and the - * bridge transaction nonce. + * The Balances pallet example of storing the balance of an account. + * + * # Example + * + * ```nocompile + * impl pallet_balances::Config for Runtime { + * type AccountStore = StorageMapShim, frame_system::Provider, AccountId, Self::AccountData> + * } + * ``` + * + * You can also store the balance of an account in the `System` pallet. + * + * # Example + * + * ```nocompile + * impl pallet_balances::Config for Runtime { + * type AccountStore = System + * } + * ``` + * + * But this comes with tradeoffs, storing account balances in the system pallet stores + * `frame_system` data alongside the account data contrary to storing account balances in the + * `Balances` pallet, which uses a `StorageMap` to store balances data only. + * NOTE: This is only used in the case that this pallet is used to store balances. **/ - bridgeTxDetails: AugmentedQuery Observable, [AccountId32, u32]> & QueryableStorageEntry; + account: AugmentedQuery Observable, [AccountId32]> & QueryableStorageEntry; /** - * The multisig account of the bridge controller. The genesis signers accept their - * authorizations and are able to get their proposals delivered. The bridge creator - * transfers some POLY to their identity. + * Freeze locks on account balances. **/ - controller: AugmentedQuery Observable>, []> & QueryableStorageEntry; + freezes: AugmentedQuery Observable>, [AccountId32]> & QueryableStorageEntry; /** - * Freeze bridge admins. These accounts can only freeze the bridge. + * Holds on account balances. **/ - freezeAdmins: AugmentedQuery Observable, [AccountId32]> & QueryableStorageEntry; + holds: AugmentedQuery Observable>, [AccountId32]> & QueryableStorageEntry; /** - * Whether or not the bridge operation is frozen. + * The total units of outstanding deactivated balance in the system. **/ - frozen: AugmentedQuery Observable, []> & QueryableStorageEntry; + inactiveIssuance: AugmentedQuery Observable, []> & QueryableStorageEntry; /** - * Amount of POLYX bridged by the identity in last block interval. Fields: the bridged - * amount and the last interval number. + * Any liquidity locks on some account balances. + * NOTE: Should only be accessed when setting, changing and freeing a lock. + * + * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` **/ - polyxBridged: AugmentedQuery Observable>, [PolymeshPrimitivesIdentityId]> & QueryableStorageEntry; + locks: AugmentedQuery Observable>, [AccountId32]> & QueryableStorageEntry; /** - * Storage version. + * Named reserves on some account balances. + * + * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` **/ - storageVersion: AugmentedQuery Observable, []> & QueryableStorageEntry; + reserves: AugmentedQuery Observable>, [AccountId32]> & QueryableStorageEntry; /** - * The bridge transaction timelock period, in blocks, since the acceptance of the - * transaction proposal during which the admin key can freeze the transaction. + * The total units issued in the system. **/ - timelock: AugmentedQuery Observable, []> & QueryableStorageEntry; + totalIssuance: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * Generic query **/ @@ -381,7 +393,7 @@ declare module '@polkadot/api-base/types/storage' { /** * The current "inactive" membership, stored as an ordered Vec. **/ - inactiveMembers: AugmentedQuery Observable>, []> & QueryableStorageEntry; + inactiveMembers: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** * Generic query **/ @@ -483,7 +495,7 @@ declare module '@polkadot/api-base/types/storage' { /** * The current "inactive" membership, stored as an ordered Vec. **/ - inactiveMembers: AugmentedQuery Observable>, []> & QueryableStorageEntry; + inactiveMembers: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** * Generic query **/ @@ -509,9 +521,9 @@ declare module '@polkadot/api-base/types/storage' { }; contracts: { /** - * A mapping between an original code hash and instrumented wasm code, ready for execution. + * A mapping from a contract's code hash to its code info. **/ - codeStorage: AugmentedQuery Observable>, [H256]> & QueryableStorageEntry; + codeInfoOf: AugmentedQuery Observable>, [H256]> & QueryableStorageEntry; /** * The code associated with a given account. * @@ -522,9 +534,19 @@ declare module '@polkadot/api-base/types/storage' { * Evicted contracts that await child trie deletion. * * Child trie deletion is a heavy operation depending on the amount of storage items - * stored in said trie. Therefore this operation is performed lazily in `on_initialize`. + * stored in said trie. Therefore this operation is performed lazily in `on_idle`. + **/ + deletionQueue: AugmentedQuery Observable>, [u32]> & QueryableStorageEntry; + /** + * A pair of monotonic counters used to track the latest contract marked for deletion + * and the latest deleted contract in queue. + **/ + deletionQueueCounter: AugmentedQuery Observable, []> & QueryableStorageEntry; + /** + * A migration can span across multiple blocks. This storage defines a cursor to track the + * progress of the migration, enabling us to resume from the last completed position. **/ - deletionQueue: AugmentedQuery Observable>, []> & QueryableStorageEntry; + migrationInProgress: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** * This is a **monotonic** counter incremented on contract instantiation. * @@ -551,11 +573,7 @@ declare module '@polkadot/api-base/types/storage' { **/ nonce: AugmentedQuery Observable, []> & QueryableStorageEntry; /** - * A mapping between an original code hash and its owner information. - **/ - ownerInfoOf: AugmentedQuery Observable>, [H256]> & QueryableStorageEntry; - /** - * A mapping from an original code hash to the original code, untouched by instrumentation. + * A mapping from a contract's code hash to its code. **/ pristineCode: AugmentedQuery Observable>, [H256]> & QueryableStorageEntry; /** @@ -704,6 +722,7 @@ declare module '@polkadot/api-base/types/storage' { * Desired number of targets to elect for this round. * * Only exists when [`Snapshot`] is present. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. **/ desiredTargets: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** @@ -715,6 +734,8 @@ declare module '@polkadot/api-base/types/storage' { minimumUntrustedScore: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** * Current best solution, signed or unsigned, queued to be returned upon `elect`. + * + * Always sorted by score. **/ queuedSolution: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** @@ -761,12 +782,14 @@ declare module '@polkadot/api-base/types/storage' { * Snapshot data of the round. * * This is created at the beginning of the signed phase and cleared upon calling `elect`. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. **/ snapshot: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** * The metadata of the [`RoundSnapshot`] * * Only exists when [`Snapshot`] is present. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. **/ snapshotMetadata: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** @@ -798,6 +821,9 @@ declare module '@polkadot/api-base/types/storage' { * Maps an `AssetId` to the number of `Full` agents for it. **/ numFullAgents: AugmentedQuery Observable, [PolymeshPrimitivesAssetAssetId]> & QueryableStorageEntry; + /** + * Storage version. + **/ storageVersion: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * Generic query @@ -805,6 +831,10 @@ declare module '@polkadot/api-base/types/storage' { [key: string]: QueryableStorageEntry; }; grandpa: { + /** + * The current list of authorities. + **/ + authorities: AugmentedQuery Observable>>, []> & QueryableStorageEntry; /** * The number of changes (both in terms of keys and underlying economic responsibilities) * in the "set" of Grandpa validators from genesis. @@ -844,6 +874,20 @@ declare module '@polkadot/api-base/types/storage' { **/ [key: string]: QueryableStorageEntry; }; + historical: { + /** + * Mapping from historical session indices to session-data root hash and validator count. + **/ + historicalSessions: AugmentedQuery Observable>>, [u32]> & QueryableStorageEntry; + /** + * The range of historical sessions we store. [first, last) + **/ + storedRange: AugmentedQuery Observable>>, []> & QueryableStorageEntry; + /** + * Generic query + **/ + [key: string]: QueryableStorageEntry; + }; identity: { /** * How many "strong" references to the account key. @@ -881,7 +925,7 @@ declare module '@polkadot/api-base/types/storage' { **/ currentAuthId: AugmentedQuery Observable, []> & QueryableStorageEntry; /** - * It stores the current gas fee payer for the current transaction + * It stores the current gas fee payer for the current transaction. **/ currentPayer: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** @@ -889,7 +933,7 @@ declare module '@polkadot/api-base/types/storage' { **/ customClaimIdSequence: AugmentedQuery Observable, []> & QueryableStorageEntry; /** - * CustomClaimTypeId -> String constant + * CusotmClaimTypeId -> String constant **/ customClaims: AugmentedQuery Observable>, [u32]> & QueryableStorageEntry; /** @@ -978,10 +1022,9 @@ declare module '@polkadot/api-base/types/storage' { **/ keys: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** - * For each session index, we keep a mapping of `SessionIndex` and `AuthIndex` to - * `WrapperOpaque`. + * For each session index, we keep a mapping of `SessionIndex` and `AuthIndex`. **/ - receivedHeartbeats: AugmentedQuery Observable>>, [u32, u32]> & QueryableStorageEntry; + receivedHeartbeats: AugmentedQuery Observable>, [u32, u32]> & QueryableStorageEntry; /** * Generic query **/ @@ -1015,6 +1058,12 @@ declare module '@polkadot/api-base/types/storage' { * Proposal execution reentry guard. **/ executionReentry: AugmentedQuery Observable, []> & QueryableStorageEntry; + /** + * The last proposal id before the multisig changed signers or signatures required. + * + * multisig => Option + **/ + lastInvalidProposal: AugmentedQuery Observable>, [AccountId32]> & QueryableStorageEntry; /** * Nonce to ensure unique MultiSig addresses are generated; starts from 1. **/ @@ -1111,17 +1160,13 @@ declare module '@polkadot/api-base/types/storage' { **/ nftOwner: AugmentedQuery Observable>, [PolymeshPrimitivesAssetAssetId, u64]> & QueryableStorageEntry; /** - * The total number of NFTs in a collection + * The total number of NFTs in a collection. **/ nfTsInCollection: AugmentedQuery Observable, [PolymeshPrimitivesAssetAssetId]> & QueryableStorageEntry; /** * The total number of NFTs per identity. **/ numberOfNFTs: AugmentedQuery Observable, [PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesIdentityId]> & QueryableStorageEntry; - /** - * Storage version. - **/ - storageVersion: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * Generic query **/ @@ -1137,14 +1182,19 @@ declare module '@polkadot/api-base/types/storage' { **/ reports: AugmentedQuery Observable>, [H256]> & QueryableStorageEntry; /** - * Enumerates all reports of a kind along with the time they happened. - * - * All reports are sorted by the time of offence. - * - * Note that the actual type of this mapping is `Vec`, this is because values of - * different types are not supported at the moment so we are doing the manual serialization. + * Generic query + **/ + [key: string]: QueryableStorageEntry; + }; + permissions: { + /** + * The name of the current function (aka extrinsic). **/ - reportsByKindIndex: AugmentedQuery Observable, [U8aFixed]> & QueryableStorageEntry; + currentDispatchableName: AugmentedQuery Observable, []> & QueryableStorageEntry; + /** + * The name of the current pallet (aka module name). + **/ + currentPalletName: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * Generic query **/ @@ -1152,12 +1202,11 @@ declare module '@polkadot/api-base/types/storage' { }; pips: { /** - * Total count of current pending or scheduled PIPs. + * Total count of pending or scheduled PIPs. **/ activePipCount: AugmentedQuery Observable, []> & QueryableStorageEntry; /** - * The maximum allowed number for `ActivePipCount`. - * Once reached, new PIPs cannot be proposed by community members. + * The maximum allowed number for active PIPs. Once reached, new PIPs cannot be proposed by community members. **/ activePipLimit: AugmentedQuery Observable, []> & QueryableStorageEntry; /** @@ -1170,8 +1219,7 @@ declare module '@polkadot/api-base/types/storage' { **/ defaultEnactmentPeriod: AugmentedQuery Observable, []> & QueryableStorageEntry; /** - * Those who have locked a deposit. - * proposal (id, proposer) -> deposit + * All locked [`DepositInfo`] per [`PipId`] for each account. **/ deposits: AugmentedQuery Observable>, [u32, AccountId32]> & QueryableStorageEntry; /** @@ -1192,12 +1240,15 @@ declare module '@polkadot/api-base/types/storage' { **/ minimumProposalDeposit: AugmentedQuery Observable, []> & QueryableStorageEntry; /** - * How many blocks will it take, after a `Pending` PIP expires, - * assuming it has not transitioned to another `ProposalState`? + * Number of blocks it will take, after a `Pending` PIP expires, assuming it has not transitioned to another `ProposalState`. + **/ + pendingPipExpiry: AugmentedQuery Observable, []> & QueryableStorageEntry; + /** + * All PIPs that still require refunds. **/ - pendingPipExpiry: AugmentedQuery Observable, []> & QueryableStorageEntry; + pendingRefunds: AugmentedQuery Observable>, [u32]> & QueryableStorageEntry; /** - * Proposals so far. id can be used to keep track of PIPs off-chain. + * Proposal's identifier. **/ pipIdSequence: AugmentedQuery Observable, []> & QueryableStorageEntry; /** @@ -1206,43 +1257,39 @@ declare module '@polkadot/api-base/types/storage' { **/ pipSkipCount: AugmentedQuery Observable, [u32]> & QueryableStorageEntry; /** - * Maps PIPs to the block at which they will be executed, if any. + * Maps PIPs to the block at which they will be executed. **/ pipToSchedule: AugmentedQuery Observable>, [u32]> & QueryableStorageEntry; /** - * The metadata of the active proposals. + * The [`PipsMetadata`] for each proposal ([`PipId`]). **/ proposalMetadata: AugmentedQuery Observable>, [u32]> & QueryableStorageEntry; /** - * PolymeshVotes on a given proposal, if it is ongoing. - * proposal id -> vote count + * The [`VotingResult`] for each proposal ([`PipId`]). **/ proposalResult: AugmentedQuery Observable, [u32]> & QueryableStorageEntry; /** - * Actual proposal for a given id, if it's current. - * proposal id -> proposal + * The [`Pip`] for each proposal ([`PipId`]). **/ proposals: AugmentedQuery Observable>, [u32]> & QueryableStorageEntry; /** - * Proposal state for a given id. - * proposal id -> proposalState + * The ([`ProposalState`]) of a given PIP ([`PipId`]). **/ proposalStates: AugmentedQuery Observable>, [u32]> & QueryableStorageEntry; /** - * Votes per Proposal and account. Used to avoid double vote issue. - * (proposal id, account) -> Vote + * The Votes ([`Vote`]) for each proposal ([`PipId`]) per account. **/ proposalVotes: AugmentedQuery Observable>, [u32, AccountId32]> & QueryableStorageEntry; /** - * Determines whether historical PIP data is persisted or removed + * Set to `true` if historical PIPs data must be removed. **/ pruneHistoricalPips: AugmentedQuery Observable, []> & QueryableStorageEntry; /** - * Snapshots so far. id can be used to keep track of snapshots off-chain. + * Snaphot's identifier. **/ snapshotIdSequence: AugmentedQuery Observable, []> & QueryableStorageEntry; /** - * The metadata of the snapshot, if there is one. + * The [`SnapshotMetadata`]. **/ snapshotMeta: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** @@ -1253,7 +1300,14 @@ declare module '@polkadot/api-base/types/storage' { * Once a (configurable) threshhold is exceeded, a PIP cannot be skipped again. **/ snapshotQueue: AugmentedQuery Observable>, []> & QueryableStorageEntry; + /** + * Storage version. + **/ storageVersion: AugmentedQuery Observable, []> & QueryableStorageEntry; + /** + * All PIPs that still require votes to be pruned. + **/ + votesToBePruned: AugmentedQuery Observable>, [u32]> & QueryableStorageEntry; /** * Generic query **/ @@ -1263,7 +1317,7 @@ declare module '@polkadot/api-base/types/storage' { /** * Time after which a proposal will expire. **/ - expiresAfter: AugmentedQuery Observable, []> & QueryableStorageEntry; + expiresAfter: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * The current members of the committee. **/ @@ -1281,13 +1335,9 @@ declare module '@polkadot/api-base/types/storage' { **/ proposals: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** - * Release coordinator. + * Release cooridinator. **/ releaseCoordinator: AugmentedQuery Observable>, []> & QueryableStorageEntry; - /** - * Storage version. - **/ - storageVersion: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * Vote threshold for an approval. **/ @@ -1392,7 +1442,11 @@ declare module '@polkadot/api-base/types/storage' { /** * The request status of a given hash. **/ - statusFor: AugmentedQuery Observable>, [H256]> & QueryableStorageEntry; + requestStatusFor: AugmentedQuery Observable>, [H256]> & QueryableStorageEntry; + /** + * The request status of a given hash. + **/ + statusFor: AugmentedQuery Observable>, [H256]> & QueryableStorageEntry; /** * Generic query **/ @@ -1444,6 +1498,9 @@ declare module '@polkadot/api-base/types/storage' { * Items to be executed, indexed by the block number that they should be executed on. **/ agenda: AugmentedQuery Observable>>, [u32]> & QueryableStorageEntry; + /** + * Block number at which the agenda began incomplete execution. + **/ incompleteSince: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** * Lookup from a name to the block number and index of the task. @@ -1452,6 +1509,10 @@ declare module '@polkadot/api-base/types/storage' { * identities. **/ lookup: AugmentedQuery Observable>>, [U8aFixed]> & QueryableStorageEntry; + /** + * Retry configurations for items to be executed, indexed by task address. + **/ + retries: AugmentedQuery | [u32 | AnyNumber | Uint8Array, u32 | AnyNumber | Uint8Array]) => Observable>, [ITuple<[u32, u32]>]> & QueryableStorageEntry]>; /** * Generic query **/ @@ -1469,7 +1530,7 @@ declare module '@polkadot/api-base/types/storage' { * disabled using binary search. It gets cleared when `on_session_ending` returns * a new set of identities. **/ - disabledValidators: AugmentedQuery Observable>, []> & QueryableStorageEntry; + disabledValidators: AugmentedQuery Observable>>, []> & QueryableStorageEntry; /** * The owner of a key. The key is the `KeyTypeId` + the encoded key. **/ @@ -1539,6 +1600,10 @@ declare module '@polkadot/api-base/types/storage' { * Instruction statuses. instruction_id -> InstructionStatus **/ instructionStatuses: AugmentedQuery Observable, [u64]> & QueryableStorageEntry; + /** + * The moment the instruction was moved to the `LockedForExecution` status. + **/ + lockedTimestamp: AugmentedQuery Observable>, [u64]> & QueryableStorageEntry; /** * Tracks the number of signers each venue has. **/ @@ -1561,11 +1626,10 @@ declare module '@polkadot/api-base/types/storage' { **/ userAffirmations: AugmentedQuery Observable, [PolymeshPrimitivesIdentityIdPortfolioId, u64]> & QueryableStorageEntry; /** - * Array of venues created by an identity. Only needed for the UI. IdentityId -> Vec * Venues create by an identity. * Only needed for the UI. * - * identity -> venue_id () + * identity -> venue_id -> () **/ userVenues: AugmentedQuery Observable, [PolymeshPrimitivesIdentityId, u64]> & QueryableStorageEntry; /** @@ -1633,6 +1697,15 @@ declare module '@polkadot/api-base/types/storage' { * (`CountFor*`) in the system compared to the configured max (`Max*Count`). **/ chillThreshold: AugmentedQuery Observable>, []> & QueryableStorageEntry; + /** + * History of claimed paged rewards by era and validator. + * + * This is keyed by era and validator stash which maps to the set of page indexes which have + * been claimed. + * + * It is removed after [`Config::HistoryDepth`] eras. + **/ + claimedRewards: AugmentedQuery Observable>, [u32, AccountId32]> & QueryableStorageEntry; /** * Counter for the related counted storage map **/ @@ -1641,6 +1714,10 @@ declare module '@polkadot/api-base/types/storage' { * Counter for the related counted storage map **/ counterForValidators: AugmentedQuery Observable, []> & QueryableStorageEntry; + /** + * Counter for the related counted storage map + **/ + counterForVirtualStakers: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * The current era index. * @@ -1655,7 +1732,7 @@ declare module '@polkadot/api-base/types/storage' { **/ currentPlannedSession: AugmentedQuery Observable, []> & QueryableStorageEntry; /** - * Rewards for the last `HISTORY_DEPTH` eras. + * Rewards for the last [`Config::HistoryDepth`] eras. * If reward hasn't been set or has been removed then 0 reward is returned. **/ erasRewardPoints: AugmentedQuery Observable, [u32]> & QueryableStorageEntry; @@ -1664,33 +1741,64 @@ declare module '@polkadot/api-base/types/storage' { * * This is keyed first by the era index to allow bulk deletion and then the stash account. * - * Is it removed after `HISTORY_DEPTH` eras. + * Is it removed after [`Config::HistoryDepth`] eras. * If stakers hasn't been set or has been removed then empty exposure is returned. + * + * Note: Deprecated since v14. Use `EraInfo` instead to work with exposures. **/ - erasStakers: AugmentedQuery Observable, [u32, AccountId32]> & QueryableStorageEntry; + erasStakers: AugmentedQuery Observable, [u32, AccountId32]> & QueryableStorageEntry; /** * Clipped Exposure of validator at era. * + * Note: This is deprecated, should be used as read-only and will be removed in the future. + * New `Exposure`s are stored in a paged manner in `ErasStakersPaged` instead. + * * This is similar to [`ErasStakers`] but number of nominators exposed is reduced to the - * `T::MaxNominatorRewardedPerValidator` biggest stakers. + * `T::MaxExposurePageSize` biggest stakers. * (Note: the field `total` and `own` of the exposure remains unchanged). * This is used to limit the i/o cost for the nominator payout. * * This is keyed fist by the era index to allow bulk deletion and then the stash account. * - * Is it removed after `HISTORY_DEPTH` eras. + * It is removed after [`Config::HistoryDepth`] eras. * If stakers hasn't been set or has been removed then empty exposure is returned. + * + * Note: Deprecated since v14. Use `EraInfo` instead to work with exposures. **/ - erasStakersClipped: AugmentedQuery Observable, [u32, AccountId32]> & QueryableStorageEntry; + erasStakersClipped: AugmentedQuery Observable, [u32, AccountId32]> & QueryableStorageEntry; /** - * The session index at which the era start for the last `HISTORY_DEPTH` eras. + * Summary of validator exposure at a given era. + * + * This contains the total stake in support of the validator and their own stake. In addition, + * it can also be used to get the number of nominators backing this validator and the number of + * exposure pages they are divided into. The page count is useful to determine the number of + * pages of rewards that needs to be claimed. + * + * This is keyed first by the era index to allow bulk deletion and then the stash account. + * Should only be accessed through `EraInfo`. + * + * Is it removed after [`Config::HistoryDepth`] eras. + * If stakers hasn't been set or has been removed then empty overview is returned. + **/ + erasStakersOverview: AugmentedQuery Observable>, [u32, AccountId32]> & QueryableStorageEntry; + /** + * Paginated exposure of a validator at given era. + * + * This is keyed first by the era index to allow bulk deletion, then stash account and finally + * the page. Should only be accessed through `EraInfo`. + * + * This is cleared after [`Config::HistoryDepth`] eras. + **/ + erasStakersPaged: AugmentedQuery Observable>, [u32, AccountId32, u32]> & QueryableStorageEntry; + /** + * The session index at which the era start for the last [`Config::HistoryDepth`] eras. * * Note: This tracks the starting session (i.e. session index when era start being active) * for the eras in `[CurrentEra - HISTORY_DEPTH, CurrentEra]`. **/ erasStartSessionIndex: AugmentedQuery Observable>, [u32]> & QueryableStorageEntry; /** - * The total amount staked for the last `HISTORY_DEPTH` eras. + * The total amount staked for the last [`Config::HistoryDepth`] eras. * If total hasn't been set or has been removed then 0 stake is returned. **/ erasTotalStake: AugmentedQuery Observable, [u32]> & QueryableStorageEntry; @@ -1699,11 +1807,11 @@ declare module '@polkadot/api-base/types/storage' { * * This is keyed first by the era index to allow bulk deletion and then the stash account. * - * Is it removed after `HISTORY_DEPTH` eras. + * Is it removed after [`Config::HistoryDepth`] eras. **/ erasValidatorPrefs: AugmentedQuery Observable, [u32, AccountId32]> & QueryableStorageEntry; /** - * The total validator era payout for the last `HISTORY_DEPTH` eras. + * The total validator era payout for the last [`Config::HistoryDepth`] eras. * * Eras that haven't finished yet or has been removed doesn't have reward. **/ @@ -1720,6 +1828,9 @@ declare module '@polkadot/api-base/types/storage' { invulnerables: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** * Map from all (unlocked) "controller" accounts to the info regarding the staking. + * + * Note: All the reads and mutations to this storage *MUST* be done through the methods exposed + * by [`StakingLedger`] to ensure data and lock consistency. **/ ledger: AugmentedQuery Observable>, [AccountId32]> & QueryableStorageEntry; /** @@ -1728,6 +1839,12 @@ declare module '@polkadot/api-base/types/storage' { * When this value is not set, no limits are enforced. **/ maxNominatorsCount: AugmentedQuery Observable>, []> & QueryableStorageEntry; + /** + * Maximum staked rewards, i.e. the percentage of the era inflation that + * is used for stake rewards. + * See [Era payout](./index.html#era-payout). + **/ + maxStakedRewards: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** * The maximum validator count before we stop allowing new validators to join. * @@ -1761,7 +1878,8 @@ declare module '@polkadot/api-base/types/storage' { * they wish to support. * * Note that the keys of this storage map might become non-decodable in case the - * [`Config::MaxNominations`] configuration is decreased. In this rare case, these nominators + * account's [`NominationsQuota::MaxNominations`] configuration is decreased. + * In this rare case, these nominators * are still existent in storage, their key is correct and retrievable (i.e. `contains_key` * indicates that they exist), but their value cannot be decoded. Therefore, the non-decodable * nominators will effectively not-exist, until they re-submit their preferences such that it @@ -1781,33 +1899,12 @@ declare module '@polkadot/api-base/types/storage' { * All slashing events on nominators, mapped by era to the highest slash value of the era. **/ nominatorSlashInEra: AugmentedQuery Observable>, [u32, AccountId32]> & QueryableStorageEntry; - /** - * Indices of validators that have offended in the active era and whether they are currently - * disabled. - * - * This value should be a superset of disabled validators since not all offences lead to the - * validator being disabled (if there was no slash). This is needed to track the percentage of - * validators that have offended in the current era, ensuring a new era is forced if - * `OffendingValidatorsThreshold` is reached. The vec is always kept sorted so that we can find - * whether a given validator has previously offended using binary search. It gets cleared when - * the era ends. - **/ - offendingValidators: AugmentedQuery Observable>>, []> & QueryableStorageEntry; /** * Where the reward payment should be made. Keyed by stash. * * TWOX-NOTE: SAFE since `AccountId` is a secure hash. **/ - payee: AugmentedQuery Observable, [AccountId32]> & QueryableStorageEntry; - /** - * Entities that are allowed to run operator/validator nodes. - **/ - permissionedIdentity: AugmentedQuery Observable>, [PolymeshPrimitivesIdentityId]> & QueryableStorageEntry; - polymeshStorageVersion: AugmentedQuery Observable, []> & QueryableStorageEntry; - /** - * Slashing switch for validators & Nominators. - **/ - slashingAllowedFor: AugmentedQuery Observable, []> & QueryableStorageEntry; + payee: AugmentedQuery Observable>, [AccountId32]> & QueryableStorageEntry; /** * Slashing spans for stash accounts. **/ @@ -1827,10 +1924,6 @@ declare module '@polkadot/api-base/types/storage' { * All unapplied slashes that are queued for later. **/ unappliedSlashes: AugmentedQuery Observable>, [u32]> & QueryableStorageEntry; - /** - * Allows flexibility in commission. Every validator has commission that should be in the range [0, Cap]. - **/ - validatorCommissionCap: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * The ideal number of active validators. **/ @@ -1846,6 +1939,15 @@ declare module '@polkadot/api-base/types/storage' { * and slash value of the era. **/ validatorSlashInEra: AugmentedQuery Observable>>, [u32, AccountId32]> & QueryableStorageEntry; + /** + * Stakers whose funds are managed by other pallets. + * + * This pallet does not apply any locks on them, therefore they are only virtually bonded. They + * are expected to be keyless accounts and hence should not be allowed to mutate their ledger + * directly via this pallet. Instead, these accounts are managed by other pallets and accessed + * via low level apis. We keep track of them to do minimal integrity checks. + **/ + virtualStakers: AugmentedQuery Observable>, [AccountId32]> & QueryableStorageEntry; /** * Generic query **/ @@ -1887,6 +1989,10 @@ declare module '@polkadot/api-base/types/storage' { * (AssetId, fundraiser_id) -> Fundraiser name **/ fundraiserNames: AugmentedQuery Observable>, [PolymeshPrimitivesAssetAssetId, u64]> & QueryableStorageEntry; + /** + * If the fundraiser supports off-chain funding payments using receipts. + **/ + fundraiserOffchainAsset: AugmentedQuery Observable>, [PolymeshPrimitivesAssetAssetId, u64]> & QueryableStorageEntry; /** * All fundraisers that are currently running. * (AssetId, fundraiser_id) -> Fundraiser @@ -1920,6 +2026,10 @@ declare module '@polkadot/api-base/types/storage' { * Total length (in bytes) for all extrinsics put together, for the current block. **/ allExtrinsicsLen: AugmentedQuery Observable>, []> & QueryableStorageEntry; + /** + * `Some` if a code upgrade has been authorized. + **/ + authorizedUpgrade: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** * Map of block numbers to block hashes. **/ @@ -1954,7 +2064,7 @@ declare module '@polkadot/api-base/types/storage' { * allows light-clients to leverage the changes trie storage tracking mechanism and * in case of changes fetch the list of events of interest. * - * The value has the type `(T::BlockNumber, EventIndex)` because if we used only just + * The value has the type `(BlockNumberFor, EventIndex)` because if we used only just * the `EventIndex` then in case if the topic has the same contents on the next block * no notification will be triggered thus the event might be lost. **/ @@ -1971,6 +2081,20 @@ declare module '@polkadot/api-base/types/storage' { * Extrinsics data for the current block (maps an extrinsic's index to its data). **/ extrinsicData: AugmentedQuery Observable, [u32]> & QueryableStorageEntry; + /** + * The weight reclaimed for the extrinsic. + * + * This information is available until the end of the extrinsic execution. + * More precisely this information is removed in `note_applied_extrinsic`. + * + * Logic doing some post dispatch weight reduction must update this storage to avoid duplicate + * reduction. + **/ + extrinsicWeightReclaimed: AugmentedQuery Observable, []> & QueryableStorageEntry; + /** + * Whether all inherents have been applied. + **/ + inherentsApplied: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * Stores the `spec_version` and `spec_name` of when the last runtime upgrade happened. **/ @@ -2001,7 +2125,7 @@ declare module '@polkadot/api-base/types/storage' { /** * Time after which a proposal will expire. **/ - expiresAfter: AugmentedQuery Observable, []> & QueryableStorageEntry; + expiresAfter: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * The current members of the committee. **/ @@ -2019,13 +2143,9 @@ declare module '@polkadot/api-base/types/storage' { **/ proposals: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** - * Release coordinator. + * Release cooridinator. **/ releaseCoordinator: AugmentedQuery Observable>, []> & QueryableStorageEntry; - /** - * Storage version. - **/ - storageVersion: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * Vote threshold for an approval. **/ @@ -2051,13 +2171,7 @@ declare module '@polkadot/api-base/types/storage' { /** * The current "inactive" membership, stored as an ordered Vec. **/ - inactiveMembers: AugmentedQuery Observable>, []> & QueryableStorageEntry; - /** - * Generic query - **/ - [key: string]: QueryableStorageEntry; - }; - testUtils: { + inactiveMembers: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** * Generic query **/ @@ -2065,11 +2179,14 @@ declare module '@polkadot/api-base/types/storage' { }; timestamp: { /** - * Did the timestamp get updated in this block? + * Whether the timestamp has been updated in this block. + * + * This value is updated to `true` upon successful submission of a timestamp by a node. + * It is then checked at the end of each block execution in the `on_finalize` hook. **/ didUpdate: AugmentedQuery Observable, []> & QueryableStorageEntry; /** - * Current time for the current block. + * The current time for the current block. **/ now: AugmentedQuery Observable, []> & QueryableStorageEntry; /** @@ -2089,7 +2206,7 @@ declare module '@polkadot/api-base/types/storage' { /** * Time after which a proposal will expire. **/ - expiresAfter: AugmentedQuery Observable, []> & QueryableStorageEntry; + expiresAfter: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * The current members of the committee. **/ @@ -2107,13 +2224,9 @@ declare module '@polkadot/api-base/types/storage' { **/ proposals: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** - * Release coordinator. + * Release cooridinator. **/ releaseCoordinator: AugmentedQuery Observable>, []> & QueryableStorageEntry; - /** - * Storage version. - **/ - storageVersion: AugmentedQuery Observable, []> & QueryableStorageEntry; /** * Vote threshold for an approval. **/ @@ -2139,7 +2252,7 @@ declare module '@polkadot/api-base/types/storage' { /** * The current "inactive" membership, stored as an ordered Vec. **/ - inactiveMembers: AugmentedQuery Observable>, []> & QueryableStorageEntry; + inactiveMembers: AugmentedQuery Observable>, []> & QueryableStorageEntry; /** * Generic query **/ @@ -2156,5 +2269,23 @@ declare module '@polkadot/api-base/types/storage' { **/ [key: string]: QueryableStorageEntry; }; + validators: { + /** + * Entities that are allowed to run operator/validator nodes. + **/ + permissionedIdentity: AugmentedQuery Observable>, [PolymeshPrimitivesIdentityId]> & QueryableStorageEntry; + /** + * Slashing switch for validators & Nominators. + **/ + slashingAllowedFor: AugmentedQuery Observable, []> & QueryableStorageEntry; + /** + * Allows flexibility in commission. Every validator has commission that should be in the range [0, Cap]. + **/ + validatorCommissionCap: AugmentedQuery Observable, []> & QueryableStorageEntry; + /** + * Generic query + **/ + [key: string]: QueryableStorageEntry; + }; } // AugmentedQueries } // declare module diff --git a/scripts/cli/src/interfaces/augment-api-runtime.ts b/scripts/cli/src/interfaces/augment-api-runtime.ts index ff4f4975c1..77df66b3e0 100644 --- a/scripts/cli/src/interfaces/augment-api-runtime.ts +++ b/scripts/cli/src/interfaces/augment-api-runtime.ts @@ -6,7 +6,7 @@ import '@polkadot/api-base/types/calls'; import type { ApiTypes, AugmentedCall, DecoratedCallBase } from '@polkadot/api-base/types'; -import type { Bytes, Null, Option, Vec, u32 } from '@polkadot/types-codec'; +import type { Bytes, Null, Option, Result, Vec, u32 } from '@polkadot/types-codec'; import type { AnyNumber, IMethod, ITuple } from '@polkadot/types-codec/types'; import type { BabeEquivocationProof, BabeGenesisConfiguration, Epoch, OpaqueKeyOwnershipProof } from '@polkadot/types/interfaces/babe'; import type { CheckInherentsResult, InherentData } from '@polkadot/types/interfaces/blockbuilder'; @@ -14,10 +14,11 @@ import type { BlockHash } from '@polkadot/types/interfaces/chain'; import type { AuthorityId } from '@polkadot/types/interfaces/consensus'; import type { CodeSource, CodeUploadResult, ContractExecResult, ContractInstantiateResult } from '@polkadot/types/interfaces/contracts'; import type { Extrinsic } from '@polkadot/types/interfaces/extrinsics'; +import type { GenesisBuildErr } from '@polkadot/types/interfaces/genesisBuilder'; import type { AuthorityList, GrandpaEquivocationProof, SetId } from '@polkadot/types/interfaces/grandpa'; import type { OpaqueMetadata } from '@polkadot/types/interfaces/metadata'; import type { FeeDetails, RuntimeDispatchInfo } from '@polkadot/types/interfaces/payment'; -import type { AccountId, Balance, Block, Call, Header, Index, KeyTypeId, Slot, WeightV2 } from '@polkadot/types/interfaces/runtime'; +import type { AccountId, Balance, Block, Call, ExtrinsicInclusionMode, Header, Index, KeyTypeId, Slot, WeightV2 } from '@polkadot/types/interfaces/runtime'; import type { RuntimeVersion } from '@polkadot/types/interfaces/state'; import type { ApplyExtrinsicResult } from '@polkadot/types/interfaces/system'; import type { TransactionSource, TransactionValidity } from '@polkadot/types/interfaces/txqueue'; @@ -127,7 +128,7 @@ declare module '@polkadot/api-base/types/calls' { **/ [key: string]: DecoratedCallBase; }; - /** 0xdf6acb689907609b/4 */ + /** 0xdf6acb689907609b/5 */ core: { /** * Execute the given block. @@ -136,7 +137,7 @@ declare module '@polkadot/api-base/types/calls' { /** * Initialize a block with the given header. **/ - initializeBlock: AugmentedCall Observable>; + initializeBlock: AugmentedCall Observable>; /** * Returns the version of the runtime. **/ @@ -146,6 +147,21 @@ declare module '@polkadot/api-base/types/calls' { **/ [key: string]: DecoratedCallBase; }; + /** 0xfbc577b9d747efd6/1 */ + genesisBuilder: { + /** + * Build `RuntimeGenesisConfig` from a JSON blob not using any defaults and store it in the storage. + **/ + buildConfig: AugmentedCall Observable, GenesisBuildErr>>>; + /** + * Creates the default `RuntimeGenesisConfig` and returns it as a JSON blob. + **/ + createDefaultConfig: AugmentedCall Observable>; + /** + * Generic call + **/ + [key: string]: DecoratedCallBase; + }; /** 0xed99c5acb25eedf5/3 */ grandpaApi: { /** @@ -169,12 +185,20 @@ declare module '@polkadot/api-base/types/calls' { **/ [key: string]: DecoratedCallBase; }; - /** 0x37e397fc7c91f5e4/1 */ + /** 0x37e397fc7c91f5e4/2 */ metadata: { /** * Returns the metadata of a runtime **/ metadata: AugmentedCall Observable>; + /** + * Returns the metadata at a given version. + **/ + metadataAtVersion: AugmentedCall Observable>>; + /** + * Returns the supported metadata versions. + **/ + metadataVersions: AugmentedCall Observable>>; /** * Generic call **/ diff --git a/scripts/cli/src/interfaces/augment-api-tx.ts b/scripts/cli/src/interfaces/augment-api-tx.ts index eeffdd3c19..7d521324c1 100644 --- a/scripts/cli/src/interfaces/augment-api-tx.ts +++ b/scripts/cli/src/interfaces/augment-api-tx.ts @@ -9,7 +9,7 @@ import type { ApiTypes, AugmentedSubmittable, SubmittableExtrinsic, SubmittableE import type { BTreeSet, Bytes, Compact, Option, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; import type { AnyNumber, IMethod, ITuple } from '@polkadot/types-codec/types'; import type { AccountId32, Call, H256, MultiAddress, Perbill, Percent, Permill } from '@polkadot/types/interfaces/runtime'; -import type { PalletContractsWasmDeterminism, PalletCorporateActionsBallotBallotMeta, PalletCorporateActionsBallotBallotTimeRange, PalletCorporateActionsBallotBallotVote, PalletCorporateActionsCaId, PalletCorporateActionsCaKind, PalletCorporateActionsInitiateCorporateActionArgs, PalletCorporateActionsRecordDateSpec, PalletCorporateActionsTargetIdentities, PalletElectionProviderMultiPhaseRawSolution, PalletElectionProviderMultiPhaseSolutionOrSnapshotSize, PalletImOnlineHeartbeat, PalletImOnlineSr25519AppSr25519Signature, PalletPipsSnapshotResult, PalletStakingPalletConfigOpPerbill, PalletStakingPalletConfigOpPercent, PalletStakingPalletConfigOpU128, PalletStakingPalletConfigOpU32, PalletStakingRewardDestination, PalletStakingSlashingSwitch, PalletStakingValidatorPrefs, PalletStoPriceTier, PalletUtilityUniqueCall, PolymeshCommonUtilitiesCheckpointScheduleCheckpoints, PolymeshCommonUtilitiesIdentityCreateChildIdentityWithAuth, PolymeshCommonUtilitiesIdentitySecondaryKeyWithAuth, PolymeshCommonUtilitiesMaybeBlock, PolymeshCommonUtilitiesProtocolFeeProtocolOp, PolymeshContractsApi, PolymeshContractsChainExtensionExtrinsicId, PolymeshContractsNextUpgrade, PolymeshPrimitivesAgentAgentGroup, PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesAssetAssetType, PolymeshPrimitivesAssetIdentifier, PolymeshPrimitivesAssetMetadataAssetMetadataKey, PolymeshPrimitivesAssetMetadataAssetMetadataSpec, PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail, PolymeshPrimitivesAssetNonFungibleType, PolymeshPrimitivesAuthorizationAuthorizationData, PolymeshPrimitivesBeneficiary, PolymeshPrimitivesComplianceManagerComplianceRequirement, PolymeshPrimitivesCondition, PolymeshPrimitivesConditionTrustedIssuer, PolymeshPrimitivesDocument, PolymeshPrimitivesIdentityClaimClaim, PolymeshPrimitivesIdentityClaimClaimType, PolymeshPrimitivesIdentityClaimScope, PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesIdentityIdPortfolioKind, PolymeshPrimitivesMemo, PolymeshPrimitivesNftNfTs, PolymeshPrimitivesNftNftCollectionKeys, PolymeshPrimitivesNftNftMetadataAttribute, PolymeshPrimitivesPortfolioFund, PolymeshPrimitivesPosRatio, PolymeshPrimitivesSecondaryKey, PolymeshPrimitivesSecondaryKeyExtrinsicPermissions, PolymeshPrimitivesSecondaryKeyPermissions, PolymeshPrimitivesSecondaryKeySignatory, PolymeshPrimitivesSettlementAffirmationCount, PolymeshPrimitivesSettlementAssetCount, PolymeshPrimitivesSettlementLeg, PolymeshPrimitivesSettlementReceiptDetails, PolymeshPrimitivesSettlementSettlementType, PolymeshPrimitivesSettlementVenueType, PolymeshPrimitivesStatisticsStatType, PolymeshPrimitivesStatisticsStatUpdate, PolymeshPrimitivesTicker, PolymeshPrimitivesTransferComplianceTransferCondition, PolymeshPrimitivesTransferComplianceTransferConditionExemptKey, PolymeshRuntimeDevelopRuntimeOriginCaller, PolymeshRuntimeDevelopRuntimeSessionKeys, SpConsensusBabeDigestsNextConfigDescriptor, SpConsensusGrandpaEquivocationProof, SpConsensusSlotsEquivocationProof, SpNposElectionsElectionScore, SpNposElectionsSupport, SpRuntimeMultiSignature, SpSessionMembershipProof, SpWeightsWeightV2Weight } from '@polkadot/types/lookup'; +import type { PalletBalancesAdjustmentDirection, PalletContractsWasmDeterminism, PalletCorporateActionsBallotBallotMeta, PalletCorporateActionsBallotBallotTimeRange, PalletCorporateActionsBallotBallotVote, PalletCorporateActionsCaId, PalletCorporateActionsCaKind, PalletCorporateActionsInitiateCorporateActionArgs, PalletCorporateActionsRecordDateSpec, PalletCorporateActionsTargetIdentities, PalletElectionProviderMultiPhaseRawSolution, PalletElectionProviderMultiPhaseSolutionOrSnapshotSize, PalletImOnlineHeartbeat, PalletImOnlineSr25519AppSr25519Signature, PalletPipsSnapshotResult, PalletStakingPalletConfigOpPerbill, PalletStakingPalletConfigOpPercent, PalletStakingPalletConfigOpU128, PalletStakingPalletConfigOpU32, PalletStakingRewardDestination, PalletStakingUnlockChunk, PalletStakingValidatorPrefs, PalletStoFundingMethod, PalletStoPriceTier, PalletUtilityUniqueCall, PalletValidatorsSlashingSwitch, PolymeshCommonUtilitiesCheckpointScheduleCheckpoints, PolymeshCommonUtilitiesIdentityCreateChildIdentityWithAuth, PolymeshCommonUtilitiesIdentitySecondaryKeyWithAuth, PolymeshCommonUtilitiesProtocolFeeProtocolOp, PolymeshContractsApi, PolymeshContractsChainExtensionExtrinsicId, PolymeshContractsNextUpgrade, PolymeshPrimitivesAgentAgentGroup, PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesAssetAssetType, PolymeshPrimitivesAssetIdentifier, PolymeshPrimitivesAssetMetadataAssetMetadataKey, PolymeshPrimitivesAssetMetadataAssetMetadataSpec, PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail, PolymeshPrimitivesAssetNonFungibleType, PolymeshPrimitivesAuthorizationAuthorizationData, PolymeshPrimitivesBeneficiary, PolymeshPrimitivesComplianceManagerComplianceRequirement, PolymeshPrimitivesCondition, PolymeshPrimitivesConditionTrustedIssuer, PolymeshPrimitivesDocument, PolymeshPrimitivesIdentityClaimClaim, PolymeshPrimitivesIdentityClaimClaimType, PolymeshPrimitivesIdentityClaimScope, PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesIdentityIdPortfolioKind, PolymeshPrimitivesMaybeBlock, PolymeshPrimitivesMemo, PolymeshPrimitivesNftNfTs, PolymeshPrimitivesNftNftCollectionKeys, PolymeshPrimitivesNftNftMetadataAttribute, PolymeshPrimitivesPortfolioFund, PolymeshPrimitivesPosRatio, PolymeshPrimitivesSecondaryKey, PolymeshPrimitivesSecondaryKeyExtrinsicPermissions, PolymeshPrimitivesSecondaryKeyPermissions, PolymeshPrimitivesSecondaryKeySignatory, PolymeshPrimitivesSettlementAffirmationCount, PolymeshPrimitivesSettlementAssetCount, PolymeshPrimitivesSettlementLeg, PolymeshPrimitivesSettlementReceiptDetails, PolymeshPrimitivesSettlementSettlementType, PolymeshPrimitivesSettlementVenueType, PolymeshPrimitivesStatisticsStatType, PolymeshPrimitivesStatisticsStatUpdate, PolymeshPrimitivesTicker, PolymeshPrimitivesTransferComplianceTransferCondition, PolymeshPrimitivesTransferComplianceTransferConditionExemptKey, PolymeshRuntimeDevelopRuntimeOriginCaller, PolymeshRuntimeDevelopRuntimeSessionKeys, SpConsensusBabeDigestsNextConfigDescriptor, SpConsensusGrandpaEquivocationProof, SpConsensusSlotsEquivocationProof, SpNposElectionsElectionScore, SpNposElectionsSupport, SpRuntimeMultiSignature, SpSessionMembershipProof, SpWeightsWeightV2Weight } from '@polkadot/types/lookup'; export type __AugmentedSubmittable = AugmentedSubmittable<() => unknown>; export type __SubmittableExtrinsic = SubmittableExtrinsic; @@ -19,12 +19,21 @@ declare module '@polkadot/api-base/types/submittable' { interface AugmentedSubmittables { asset: { /** - * This function is used to accept a token ownership transfer. + * Accepts an asset ownership transfer. + * + * Consumes the authorization `auth_id` (see `pallet_identity::consume_auth`). * NB: To reject the transfer, call remove auth function in identity module. * * # Arguments - * * `origin`: it contains the secondary key of the caller (i.e. who signed the transaction to execute this function). - * * `auth_id`: authorization ID of the token ownership transfer authorization. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `auth_id` - Authorization ID of the asset ownership transfer authorization. + * + * # Events + * * `AssetOwnershipTransferred` - When a asset ownership is successfully transferred. + * + * # Errors + * * `TickerRegistrationNotFound` - If the ticker registration is not found. + * * `TickerIsAlreadyLinkedToAnAsset` - If the ticker is already linked to an asset. **/ acceptAssetOwnershipTransfer: AugmentedSubmittable<(authId: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u64]>; /** @@ -34,384 +43,661 @@ declare module '@polkadot/api-base/types/submittable' { * NB: To reject the transfer, call remove auth function in identity module. * * # Arguments - * * `origin`: it contains the secondary key of the caller (i.e. who signed the transaction to execute this function). - * * `auth_id`: authorization ID of ticker transfer authorization. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `auth_id` - Authorization ID of ticker transfer authorization. + * + * # Events + * * `TickerTransferred` - When a ticker is successfully transferred. + * + * # Errors + * * `TickerRegistrationNotFound` - If the ticker registration is not found. + * * `TickerIsAlreadyLinkedToAnAsset` - If the ticker is already linked to an asset. **/ acceptTickerTransfer: AugmentedSubmittable<(authId: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u64]>; /** - * Add documents for a given token. + * Add documents for a given asset. + * + * This function allows the asset issuer or an external agent to add documents to an asset. * * # Arguments - * * `origin`: is a signer that has permissions to act as an agent of `asset_id`. - * * `asset_id`: the [`AssetId`] associated to the token. - * * `docs`: documents to be attached to the token. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the asset. + * * `docs` - Documents to be attached to the asset. * * # Permissions * * Asset + * + * # Events + * * `DocumentAdded` - When a document is successfully added to an asset. + * + * # Errors + * * `CounterOverflow` - If the document ID counter overflows. **/ addDocuments: AugmentedSubmittable<(docs: Vec | (PolymeshPrimitivesDocument | { uri?: any; contentHash?: any; name?: any; docType?: any; filingDate?: any } | string | Uint8Array)[], assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array) => SubmittableExtrinsic, [Vec, PolymeshPrimitivesAssetAssetId]>; /** - * Sets all identities in the `mediators` set as mandatory mediators for any instruction transfering `asset_id`. + * Sets all identities in the `mediators` set as mandatory mediators for any instruction transferring `asset_id`. + * + * This function allows the asset issuer or an external agent to add mandatory mediators for an asset. * * # Arguments - * * `origin`: The secondary key of the sender. - * * `asset_id`: the [`AssetId`] of the asset that will require the mediators. - * * `mediators`: A set of [`IdentityId`] of all the mandatory mediators for the given ticker. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] of the asset that will require the mediators. + * * `mediators` - A set of [`IdentityId`] of all the mandatory mediators for the given ticker. * * # Permissions * * Asset + * + * # Events + * * `AssetMediatorsAdded` - When the mandatory mediators are successfully added. + * + * # Errors + * * `NumberOfAssetMediatorsExceeded` - If the number of mandatory mediators exceeds the maximum allowed limit. **/ addMandatoryMediators: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, mediators: BTreeSet) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, BTreeSet]>; /** - * Forces a transfer of token from `from_portfolio` to the caller's default portfolio. + * Forces a transfer of tokens from `from_portfolio` to the caller's default portfolio. + * + * This function allows the asset issuer or an external agent to force a transfer of tokens from one portfolio to another. * * # Arguments - * * `origin`: a signer that has permissions to act as an agent of `asset_id`. - * * `asset_id`: the [`AssetId`] associated to the token. - * * `value`: the [`Balance`] of tokens that will be transferred. - * * `from_portfolio`: the [`PortfolioId`] that will have its balance reduced. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the asset. + * * `value` - The [`Balance`] of tokens that will be transferred. + * * `from_portfolio` - The [`PortfolioId`] that will have its balance reduced. * * # Permissions * * Asset * * Portfolio + * + * # Events + * * `ControllerTransfer` - When tokens are successfully transferred. + * + * # Errors + * * `UnexpectedNonFungibleToken` - If the asset is a non-fungible token. + * * `InvalidGranularity` - If the amount to transfer does not meet the granularity requirements. + * * `TotalSupplyOverflow` - If the total supply exceeds the maximum allowed limit. **/ controllerTransfer: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, value: u128 | AnyNumber | Uint8Array, fromPortfolio: PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u128, PolymeshPrimitivesIdentityIdPortfolioId]>; /** - * Initializes a new [`AssetDetails`], with the initiating account as its owner. - * The total supply will initially be zero. To mint tokens, use [`Module::issue`]. + * Creates a new asset. + * + * The total supply will initially be zero. To mint tokens, use [`Pallet::issue`]. * * # Arguments - * * `origin`: contains the secondary key of the caller (i.e. who signed the transaction to execute this function). - * * `asset_name`: the [`AssetName`] associated to the security token. - * * `divisible`: sets [`AssetDetails::divisible`], where `true` means the token is divisible. - * * `asset_type`: the [`AssetType`] that represents the security type of the [`AssetDetails`]. - * * `asset_identifiers`: a vector of [`AssetIdentifier`]. - * * `funding_round_name`: the name of the funding round ([`FundingRoundName`]). + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_name` - The [`AssetName`] of the new asset. + * * `divisible` - Sets [`AssetDetails::divisible`], where `true` means the asset is divisible. + * * `asset_type` - The [`AssetType`] of the new asset. + * * `asset_identifiers` - A vector of [`AssetIdentifier`]. + * * `funding_round_name` - The name of the funding round ([`FundingRoundName`]). * - * ## Permissions - * * Portfolio + * # Events + * * `AssetCreated` - When a new asset is successfully created. + * + * # Errors + * * `MaxLengthOfAssetNameExceeded` - If the asset name length exceeds the maximum allowed length. + * * `InvalidCustomAssetTypeId` - If the custom asset type ID is invalid. + * * `InvalidAssetIdentifier` - If any of the asset identifiers are invalid. **/ createAsset: AugmentedSubmittable<(assetName: Bytes | string | Uint8Array, divisible: bool | boolean | Uint8Array, assetType: PolymeshPrimitivesAssetAssetType | { EquityCommon: any } | { EquityPreferred: any } | { Commodity: any } | { FixedIncome: any } | { REIT: any } | { Fund: any } | { RevenueShareAgreement: any } | { StructuredProduct: any } | { Derivative: any } | { Custom: any } | { StableCoin: any } | { NonFungible: any } | string | Uint8Array, assetIdentifiers: Vec | (PolymeshPrimitivesAssetIdentifier | { CUSIP: any } | { CINS: any } | { ISIN: any } | { LEI: any } | { FIGI: any } | string | Uint8Array)[], fundingRoundName: Option | null | Uint8Array | Bytes | string) => SubmittableExtrinsic, [Bytes, bool, PolymeshPrimitivesAssetAssetType, Vec, Option]>; /** - * Initializes a new [`AssetDetails`], with the initiating account as its owner. - * The total supply will initially be zero. To mint tokens, use [`Module::issue`]. - * Note: Utility extrinsic to batch [`Module::create_asset`] and [`Module::register_custom_asset_type`]. + * Creates a new asset with a new custom asset type. + * + * The total supply will initially be zero. To mint tokens, use [`Pallet::issue`]. * * # Arguments - * * `origin`: contains the secondary key of the caller (i.e. who signed the transaction to execute this function). - * * `asset_name`: the [`AssetName`] associated to the security token. - * * `divisible`: sets [`AssetDetails::divisible`], where `true` means the token is divisible. - * * `custom_asset_type`: the custom asset type of the token. - * * `asset_identifiers`: a vector of [`AssetIdentifier`]. - * * `funding_round_name`: the name of the funding round ([`FundingRoundName`]). + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_name` - The [`AssetName`] of the new asset. + * * `divisible` - Sets [`AssetDetails::divisible`], where `true` means the asset is divisible. + * * `custom_asset_type` - The custom asset type of the asset. + * * `asset_identifiers` - A vector of [`AssetIdentifier`]. + * * `funding_round_name` - The name of the funding round ([`FundingRoundName`]). * - * ## Permissions - * * Portfolio + * # Events + * * `AssetCreated` - When a new asset is successfully created. + * * `CustomAssetTypeRegistered` - When a new custom asset type is successfully registered. + * * `CustomAssetTypeAlreadyRegistered` - When the custom asset type is already registered. + * + * # Errors + * * `MaxLengthOfAssetNameExceeded` - If the asset name length exceeds the maximum allowed length. + * * `InvalidCustomAssetTypeId` - If the custom asset type ID is invalid. + * * `InvalidAssetIdentifier` - If any of the asset identifiers are invalid. + * * `TooLong` - If the custom asset type length exceeds the maximum allowed length. **/ createAssetWithCustomType: AugmentedSubmittable<(assetName: Bytes | string | Uint8Array, divisible: bool | boolean | Uint8Array, customAssetType: Bytes | string | Uint8Array, assetIdentifiers: Vec | (PolymeshPrimitivesAssetIdentifier | { CUSIP: any } | { CINS: any } | { ISIN: any } | { LEI: any } | { FIGI: any } | string | Uint8Array)[], fundingRoundName: Option | null | Uint8Array | Bytes | string) => SubmittableExtrinsic, [Bytes, bool, Bytes, Vec, Option]>; /** * Pre-approves the receivement of the asset for all identities. * + * This function allows the root origin to pre-approve the receivement of an asset for all identities. + * * # Arguments - * * `origin`: the secondary key of the sender. - * * `asset_id`: the [`AssetId`] that will be exempt from affirmation. + * * `origin` - The root origin. + * * `asset_id` - The [`AssetId`] that will be exempt from affirmation. * - * # Permissions - * * Root + * # Events + * * `AssetAffirmationExemption` - When the asset is successfully exempted from affirmation. **/ exemptAssetAffirmation: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId]>; /** - * Freezes transfers of a given token. + * Freezes transfers of a given asset. + * + * This function allows the asset issuer or an external agent to freeze transfers of a given asset. * * # Arguments - * * `origin`: the secondary key of the sender. - * * `asset_id`: the [`AssetId`] associated to the token. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The asset to freeze. * * # Permissions * * Asset + * + * # Events + * * `AssetFrozen` - When an asset is successfully frozen. + * + * # Errors + * * `NoSuchAsset` - If the asset does not exist. + * * `AlreadyFrozen` - If the asset is already frozen. **/ freeze: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId]>; /** * Issue (i.e mint) new tokens to the caller, which must be an authorized external agent. * + * This function allows the asset issuer or an external agent to mint new tokens for a given asset. + * * # Arguments * * `origin`: A signer that has permissions to act as an agent of `ticker`. - * * `asset_id`: the [`AssetId`] associated to the token. + * * `asset_id`: the [`AssetId`] associated to the asset. * * `amount`: The amount of tokens that will be issued. * * `portfolio_kind`: The [`PortfolioKind`] of the portfolio that will receive the minted tokens. * * # Permissions * * Asset * * Portfolio + * + * # Events + * * `AssetBalanceUpdated` - When the asset balance is successfully updated. + * + * # Errors + * * `UnexpectedNonFungibleToken` - If the asset is a non-fungible token. + * * `InvalidGranularity` - If the amount to issue does not meet the granularity requirements. + * * `TotalSupplyOverflow` - If the total supply exceeds the maximum allowed limit. **/ issue: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, amount: u128 | AnyNumber | Uint8Array, portfolioKind: PolymeshPrimitivesIdentityIdPortfolioKind | { Default: any } | { User: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u128, PolymeshPrimitivesIdentityIdPortfolioKind]>; /** * Establishes a connection between a ticker and an AssetId. * + * This function allows the asset issuer or an external agent to link a ticker to an asset. + * * # Arguments - * * `origin`: the secondary key of the sender. - * * `ticker`: the [`Ticker`] that will be linked to the given `asset_id`. - * * `asset_id`: the [`AssetId`] that will be connected to `ticker`. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `ticker` - The [`Ticker`] that will be linked to the given `asset_id`. + * * `asset_id` - The [`AssetId`] that will be connected to `ticker`. * * # Permissions * * Asset + * + * # Events + * * `TickerLinkedToAsset` - When the ticker is successfully linked to the asset. + * + * # Errors + * * `TickerNotRegisteredToCaller` - If the ticker is not registered to the caller. + * * `TickerRegistrationExpired` - If the ticker registration has expired. + * * `TickerRegistrationNotFound` - If the ticker registration is not found. + * * `TickerIsAlreadyLinkedToAnAsset` - If the ticker is already linked to an asset. + * * `AssetIsAlreadyLinkedToATicker` - If the asset is already linked to a ticker. **/ linkTickerToAssetId: AugmentedSubmittable<(ticker: PolymeshPrimitivesTicker | string | Uint8Array, assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesTicker, PolymeshPrimitivesAssetAssetId]>; /** - * If the token associated to `asset_id` is indivisible, sets [`AssetDetails::divisible`] to true. + * If the asset associated to `asset_id` is indivisible, sets [`AssetDetails::divisible`] to true. + * + * This function allows the asset issuer or an external agent to make an indivisible asset divisible. * * # Arguments - * * `origin`: is a signer that has permissions to act as an agent of `ticker`. - * * `asset_id`: the [`AssetId`] associated to the token. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the asset. * * # Permissions * * Asset + * + * # Events + * * `DivisibilityChanged` - When the divisibility of an asset is successfully changed. + * + * # Errors + * * `NoSuchAsset` - If the asset does not exist. + * * `UnexpectedNonFungibleToken` - If the asset is a non-fungible token. + * * `AssetAlreadyDivisible` - If the asset is already divisible. **/ makeDivisible: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId]>; /** * Pre-approves the receivement of an asset. * * # Arguments - * * `origin`: the secondary key of the sender. - * * `asset_id`: the [`AssetId`] that will be exempt from affirmation. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] that will be exempt from affirmation. * * # Permissions * * Asset + * + * # Events + * * `PreApprovedAsset` - When the asset is successfully pre-approved for receivement. **/ preApproveAsset: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId]>; /** - * Redeems (i.e burns) existing tokens by reducing the balance of the caller's portfolio and the total supply of the token. + * Redeems (i.e burns) existing tokens by reducing the balance of the caller's portfolio and the total supply of the asset. + * + * This function allows the asset issuer or an external agent to redeem tokens from a given asset. * * # Arguments * * `origin`: is a signer that has permissions to act as an agent of `asset_id`. - * * `asset_id`: the [`AssetId`] associated to the token. + * * `asset_id`: the [`AssetId`] associated to the asset. * * `value`: amount of tokens to redeem. * * `portfolio_kind`: the [`PortfolioKind`] that will have its balance reduced. * * # Permissions * * Asset * * Portfolio + * + * # Events + * * `AssetBalanceUpdated` - When the asset balance is successfully updated. + * + * # Errors + * * `UnexpectedNonFungibleToken` - If the asset is a non-fungible token. + * * `InvalidGranularity` - If the value to redeem does not meet the granularity requirements. + * * `TotalSupplyOverflow` - If the total supply exceeds the maximum allowed limit. **/ redeem: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, value: u128 | AnyNumber | Uint8Array, portfolioKind: PolymeshPrimitivesIdentityIdPortfolioKind | { Default: any } | { User: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u128, PolymeshPrimitivesIdentityIdPortfolioKind]>; /** * Registers and set local asset metadata. * + * This function allows the asset issuer or an external agent to register and set local metadata for an asset. + * * # Arguments - * * `origin`: is a signer that has permissions to act as an agent of `asset_id`. - * * `asset_id`: the [`AssetId`] associated to the token. - * * `name`: the [`AssetMetadataName`]. - * * `spec`: the asset metadata specifications ([`AssetMetadataSpec`]). - * * `value`: the [`AssetMetadataValue`] of the given metadata key. - * * `details`: optional [`AssetMetadataValueDetail`] (expire, lock status). + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the asset. + * * `name` - The [`AssetMetadataName`]. + * * `spec` - The asset metadata specifications ([`AssetMetadataSpec`]). + * * `value` - The [`AssetMetadataValue`] of the given metadata key. + * * `details` - Optional [`AssetMetadataValueDetail`] (expire, lock status). * * # Permissions - * * Agent * * Asset + * + * # Events + * * `RegisterAssetMetadataLocalType` - When the local asset metadata type is successfully registered. + * * `SetAssetMetadataValue` - When the asset metadata value is successfully set. + * + * # Errors + * * `AssetMetadataLocalKeyAlreadyExists` - If the local metadata key already exists. + * * `AssetMetadataValueIsLocked` - If the metadata value is locked. + * * `AssetMetadataValueMaxLengthExceeded` - If the metadata value length exceeds the maximum allowed length. **/ registerAndSetLocalAssetMetadata: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, name: Bytes | string | Uint8Array, spec: PolymeshPrimitivesAssetMetadataAssetMetadataSpec | { url?: any; description?: any; typeDef?: any } | string | Uint8Array, value: Bytes | string | Uint8Array, detail: Option | null | Uint8Array | PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail | { expire?: any; lockStatus?: any } | string) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, Bytes, PolymeshPrimitivesAssetMetadataAssetMetadataSpec, Bytes, Option]>; /** * Registers asset metadata global type. * + * This function allows the root origin to register a global metadata type. + * * # Arguments - * * `origin`: is a signer that has permissions to act as an agent of `asset_id`. - * * `name`: the [`AssetMetadataName`]. - * * `spec`: the asset metadata specifications ([`AssetMetadataSpec`]). + * * `origin` - The root origin. + * * `name` - The [`AssetMetadataName`]. + * * `spec` - The asset metadata specifications ([`AssetMetadataSpec`]). + * + * # Events + * * `RegisterAssetMetadataGlobalType` - When the global asset metadata type is successfully registered. + * + * # Errors + * * `AssetMetadataGlobalKeyAlreadyExists` - If the global metadata key already exists. + * * `AssetMetadataNameMaxLengthExceeded` - If the metadata name length exceeds the maximum allowed length. + * * `AssetMetadataTypeDefMaxLengthExceeded` - If the metadata type definition length exceeds the maximum allowed length. **/ registerAssetMetadataGlobalType: AugmentedSubmittable<(name: Bytes | string | Uint8Array, spec: PolymeshPrimitivesAssetMetadataAssetMetadataSpec | { url?: any; description?: any; typeDef?: any } | string | Uint8Array) => SubmittableExtrinsic, [Bytes, PolymeshPrimitivesAssetMetadataAssetMetadataSpec]>; /** * Registers asset metadata local type. * + * This function allows the asset issuer or an external agent to register a local metadata type for an asset. + * * # Arguments - * * `origin`: is a signer that has permissions to act as an agent of `asset_id`. - * * `asset_id`: the [`AssetId`] associated to the token. - * * `name`: the [`AssetMetadataName`]. - * * `spec`: the asset metadata specifications ([`AssetMetadataSpec`]). + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the asset. + * * `name` - The [`AssetMetadataName`]. + * * `spec` - The asset metadata specifications ([`AssetMetadataSpec`]). * * # Permissions - * * Agent * * Asset + * + * # Events + * * `RegisterAssetMetadataLocalType` - When the local asset metadata type is successfully registered. + * + * # Errors + * * `AssetMetadataLocalKeyAlreadyExists` - If the local metadata key already exists. + * * `AssetMetadataNameMaxLengthExceeded` - If the metadata name length exceeds the maximum allowed length. + * * `AssetMetadataTypeDefMaxLengthExceeded` - If the metadata type definition length exceeds the maximum allowed length. **/ registerAssetMetadataLocalType: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, name: Bytes | string | Uint8Array, spec: PolymeshPrimitivesAssetMetadataAssetMetadataSpec | { url?: any; description?: any; typeDef?: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, Bytes, PolymeshPrimitivesAssetMetadataAssetMetadataSpec]>; /** * Registers a custom asset type. * - * The provided `ty` will be bound to an ID in storage. - * The ID can then be used in `AssetType::Custom`. - * Should the `ty` already exist in storage, no second ID is assigned to it. - * * # Arguments - * * `origin`: who called the extrinsic. - * * `ty`: contains the string representation of the asset type. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `ty` - Contains the string representation of the asset type. + * + * # Events + * * `CustomAssetTypeRegistered` - When a new custom asset type is successfully registered. + * * `CustomAssetTypeAlreadyRegistered` - When the custom asset type is already registered. + * + * # Errors + * * `TooLong` - If the custom asset type length exceeds the maximum allowed length. **/ registerCustomAssetType: AugmentedSubmittable<(ty: Bytes | string | Uint8Array) => SubmittableExtrinsic, [Bytes]>; /** - * Registers a unique ticker or extends validity of an existing ticker. - * NB: Ticker validity does not get carry forward when renewing ticker. + * Registers a unique ticker or extends the validity of an existing ticker. + * + * This function allows the caller to register a new ticker or extend the registration + * of an existing ticker. The ticker validity does not carry forward when renewing. * * # Arguments - * * `origin`: it contains the secondary key of the caller (i.e. who signed the transaction to execute this function). - * * `ticker`: [`Ticker`] to register. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `ticker` - The ticker to register. * - * # Permissions - * * Asset + * # Events + * * `TickerRegistered` - When a ticker is successfully registered. + * + * # Errors + * * `TickerAlreadyRegistered` - If the ticker is already registered. + * * `TickerTooLong` - If the ticker length exceeds the maximum allowed length. + * * `InvalidTickerCharacter` - If the ticker contains invalid characters. **/ registerUniqueTicker: AugmentedSubmittable<(ticker: PolymeshPrimitivesTicker | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesTicker]>; /** * Removes the pre-approval of the asset for all identities. * + * This function allows the root origin to remove the pre-approval of an asset for all identities. + * * # Arguments - * * `origin`: the secondary key of the sender. - * * `asset_id`: the [`AssetId`] that will have its exemption removed. + * * `origin` - The root origin. + * * `asset_id` - The [`AssetId`] that will have its exemption removed. * - * # Permissions - * * Root + * # Events + * * `RemoveAssetAffirmationExemption` - When the asset's affirmation exemption is successfully removed. **/ removeAssetAffirmationExemption: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId]>; /** - * Removes the pre approval of an asset. + * Removes the pre-approval of an asset. * * # Arguments - * * `origin` - the secondary key of the sender. - * * `asset_id`: the [`AssetId`] that will have its exemption removed. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] that will have its exemption removed. * * # Permissions * * Asset + * + * # Events + * * `RemovePreApprovedAsset` - When the asset's pre-approval is successfully removed. **/ removeAssetPreApproval: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId]>; /** - * Remove documents for a given token. + * Remove documents for a given asset. + * + * This function allows the asset issuer or an external agent to remove documents from an asset. * * # Arguments - * * `origin`: is a signer that has permissions to act as an agent of `asset_id`. - * * `asset_id`: the [`AssetId`] associated to the token. - * * `docs_id`: a vector of all [`DocumentId`] that will be removed from the token. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the asset. + * * `docs_id` - A vector of all [`DocumentId`] that will be removed from the asset. * * # Permissions * * Asset + * + * # Events + * * `DocumentRemoved` - When a document is successfully removed from an asset. **/ removeDocuments: AugmentedSubmittable<(docsId: Vec | (u32 | AnyNumber | Uint8Array)[], assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array) => SubmittableExtrinsic, [Vec, PolymeshPrimitivesAssetAssetId]>; /** * Removes the asset metadata key and value of a local key. * + * This function allows the asset issuer or an external agent to remove a local metadata key and its value for an asset. + * * # Arguments - * * `origin`: the secondary key of the sender. - * * `asset_id`: the [`AssetId`] associated to the local metadata key. - * * `local_key`: the [`AssetMetadataLocalKey`] that will be removed. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the local metadata key. + * * `local_key` - The [`AssetMetadataLocalKey`] that will be removed. * * # Permissions * * Asset + * + * # Events + * * `LocalMetadataKeyDeleted` - When the local metadata key is successfully deleted. + * + * # Errors + * * `AssetMetadataKeyIsMissing` - If the local metadata key is missing. + * * `AssetMetadataValueIsLocked` - If the metadata value is locked. + * * `AssetMetadataKeyBelongsToNFTCollection` - If the metadata key belongs to an NFT collection. **/ removeLocalMetadataKey: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, localKey: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u64]>; /** * Removes all identities in the `mediators` set from the mandatory mediators list for the given `asset_id`. * + * This function allows the asset issuer or an external agent to remove mandatory mediators for an asset. + * * # Arguments - * * `origin`: the secondary key of the sender. - * * `asset_id`: the [`AssetId`] of the asset that will have mediators removed. - * * `mediators`: A set of [`IdentityId`] of all the mediators that will be removed from the mandatory mediators list. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] of the asset that will have mediators removed. + * * `mediators` - A set of [`IdentityId`] of all the mediators that will be removed from the mandatory mediators list. * * # Permissions * * Asset + * + * # Events + * * `AssetMediatorsRemoved` - When the mandatory mediators are successfully removed. **/ removeMandatoryMediators: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, mediators: BTreeSet) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, BTreeSet]>; /** * Removes the asset metadata value of a metadata key. * + * This function allows the asset issuer or an external agent to remove a metadata value for an asset. + * * # Arguments - * * `origin`: the secondary key of the sender. - * * `asset_id`: the [`AssetId`] associated to the metadata key. - * * `metadata_key`: the [`AssetMetadataKey`] that will have its value deleted. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the metadata key. + * * `metadata_key` - The [`AssetMetadataKey`] that will have its value deleted. * * # Permissions * * Asset + * + * # Events + * * `MetadataValueDeleted` - When the metadata value is successfully deleted. + * + * # Errors + * * `AssetMetadataKeyIsMissing` - If the metadata key is missing. + * * `AssetMetadataValueIsLocked` - If the metadata value is locked. **/ removeMetadataValue: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, metadataKey: PolymeshPrimitivesAssetMetadataAssetMetadataKey | { Global: any } | { Local: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesAssetMetadataAssetMetadataKey]>; /** - * Updates the [`AssetName`] associated to a security token. + * Updates the [`AssetName`] associated to an asset. + * + * This function allows the asset issuer or an external agent to update the name of an asset. * * # Arguments - * * `origin`: the secondary key of the sender. - * * `asset_id`: the [`AssetId`] associated to the token. - * * `asset_name`: the [`AssetName`] that will be associated to the token. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the asset. + * * `asset_name` - The new [`AssetName`] that will be associated to the asset. * * # Permissions * * Asset + * + * # Events + * * `AssetRenamed` - When an asset is successfully renamed. + * + * # Errors + * * `MaxLengthOfAssetNameExceeded` - If the asset name length exceeds the maximum allowed length. + * * `NoSuchAsset` - If the asset does not exist. **/ renameAsset: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, assetName: Bytes | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, Bytes]>; /** * Set asset metadata value. * + * This function allows the asset issuer or an external agent to set metadata for an asset. + * * # Arguments - * * `origin`: is a signer that has permissions to act as an agent of `asset_id`. - * * `asset_id`: the [`AssetId`] associated to the token. - * * `key`: the [`AssetMetadataKey`] associated to the token. - * * `value`: the [`AssetMetadataValue`] of the given metadata key. - * * `details`: optional [`AssetMetadataValueDetail`] (expire, lock status). + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the asset. + * * `key` - The [`AssetMetadataKey`] associated to the asset. + * * `value` - The [`AssetMetadataValue`] of the given metadata key. + * * `details` - Optional [`AssetMetadataValueDetail`] (expire, lock status). * * # Permissions - * * Agent * * Asset + * + * # Events + * * `SetAssetMetadataValue` - When the asset metadata value is successfully set. + * + * # Errors + * * `AssetMetadataKeyIsMissing` - If the metadata key is missing. + * * `AssetMetadataValueIsLocked` - If the metadata value is locked. + * * `AssetMetadataValueMaxLengthExceeded` - If the metadata value length exceeds the maximum allowed length. **/ setAssetMetadata: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, key: PolymeshPrimitivesAssetMetadataAssetMetadataKey | { Global: any } | { Local: any } | string | Uint8Array, value: Bytes | string | Uint8Array, detail: Option | null | Uint8Array | PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail | { expire?: any; lockStatus?: any } | string) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesAssetMetadataAssetMetadataKey, Bytes, Option]>; /** * Set asset metadata value details (expire, lock status). * + * This function allows the asset issuer or an external agent to set metadata details for an asset. + * * # Arguments - * * `origin`: is a signer that has permissions to act as an agent of `asset_id`. - * * `asset_id`: the [`AssetId`] associated to the token. - * * `key`: the [`AssetMetadataKey`] associated to the token. - * * `details`: the [`AssetMetadataValueDetail`] (expire, lock status) that will be associated to the token. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the asset. + * * `key` - The [`AssetMetadataKey`] associated to the asset. + * * `details` - The [`AssetMetadataValueDetail`] (expire, lock status) that will be associated to the asset. * * # Permissions - * * Agent * * Asset + * + * # Events + * * `SetAssetMetadataValueDetails` - When the asset metadata value details are successfully set. + * + * # Errors + * * `AssetMetadataKeyIsMissing` - If the metadata key is missing. + * * `AssetMetadataValueIsLocked` - If the metadata value is locked. + * * `AssetMetadataValueIsEmpty` - If the metadata value is empty. **/ setAssetMetadataDetails: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, key: PolymeshPrimitivesAssetMetadataAssetMetadataKey | { Global: any } | { Local: any } | string | Uint8Array, detail: PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail | { expire?: any; lockStatus?: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesAssetMetadataAssetMetadataKey, PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail]>; /** * Sets the name of the current funding round. * + * This function allows the asset issuer or an external agent to set the name of the current funding round for an asset. + * * # Arguments - * * `origin`: a signer that has permissions to act as an agent of `asset_id`. - * * `asset_id`: the [`AssetId`] associated to the token. - * * `founding_round_name`: the [`FoundingRoundName`] of the current funding round. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the asset. + * * `funding_round_name` - The [`FundingRoundName`] of the current funding round. * * # Permissions * * Asset + * + * # Events + * * `FundingRoundSet` - When the funding round name is successfully set. + * + * # Errors + * * `FundingRoundNameMaxLengthExceeded` - If the funding round name length exceeds the maximum allowed length. **/ - setFundingRound: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, foundingRoundName: Bytes | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, Bytes]>; + setFundingRound: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, fundingRoundName: Bytes | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, Bytes]>; /** - * Unfreezes transfers of a given token. + * Unfreezes transfers of a given asset. + * + * This function allows the asset issuer or an external agent to unfreeze transfers of a given asset. * * # Arguments - * * `origin`: the secondary key of the sender. - * * `asset_id`: the [`AssetId`] associated to the token. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The asset to unfreeze. * * # Permissions * * Asset + * + * # Events + * * `AssetUnfrozen` - When an asset is successfully unfrozen. + * + * # Errors + * * `NoSuchAsset` - If the asset does not exist. + * * `NotFrozen` - If the asset is not frozen. **/ unfreeze: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId]>; + /** + * Removes the link between a ticker and an asset. + * + * This function allows the asset issuer or an external agent to unlink a ticker from an asset. + * + * # Arguments + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `ticker` - The [`Ticker`] that will be unlinked from the given `asset_id`. + * * `asset_id` - The [`AssetId`] that will be unlinked from `ticker`. + * + * # Permissions + * * Asset + * + * # Events + * * `TickerUnlinkedFromAsset` - When the ticker is successfully unlinked from the asset. + * + * # Errors + * * `TickerNotRegisteredToCaller` - If the ticker is not registered to the caller. + * * `TickerRegistrationNotFound` - If the ticker registration is not found. + * * `TickerIsNotLinkedToTheAsset` - If the ticker is not linked to the asset. + **/ + unlinkTickerFromAssetId: AugmentedSubmittable<(ticker: PolymeshPrimitivesTicker | string | Uint8Array, assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesTicker, PolymeshPrimitivesAssetAssetId]>; /** * Updates the type of an asset. * + * This function allows the asset issuer or an external agent to update the type of an asset. + * * # Arguments - * * `origin`: it contains the secondary key of the sender - * * `asset_id`: the [`AssetId`] associated to the token. - * * `asset_type`: the new [`AssetType`] of the token. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the asset. + * * `asset_type` - The new [`AssetType`] of the asset. * * # Permissions * * Asset + * + * # Events + * * `AssetTypeChanged` - When the asset type is successfully changed. + * + * # Errors + * * `NoSuchAsset` - If the asset does not exist. + * * `InvalidCustomAssetTypeId` - If the custom asset type ID is invalid. + * * `IncompatibleAssetTypeUpdate` - If the new asset type is incompatible with the existing asset type. **/ updateAssetType: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, assetType: PolymeshPrimitivesAssetAssetType | { EquityCommon: any } | { EquityPreferred: any } | { Commodity: any } | { FixedIncome: any } | { REIT: any } | { Fund: any } | { RevenueShareAgreement: any } | { StructuredProduct: any } | { Derivative: any } | { Custom: any } | { StableCoin: any } | { NonFungible: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesAssetAssetType]>; /** - * Updates the asset identifiers associated to the token. + * Updates the global metadata specification. * * # Arguments - * * `origin`: a signer that has permissions to act as an agent of `asset_id`. - * * `asset_id`: the [`AssetId`] associated to the token. - * * `asset_identifiers`: a vector of [`AssetIdentifier`] that will be associated to the token. + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_metadata_name` - The [`AssetMetadataName`] associated with the global metadata. + * * `asset_metadata_spec` - The new [`AssetMetadataSpec`] that will be associated with the global metadata. + * + * # Events + * * `GlobalMetadataSpecUpdated` - When the global metadata specification is successfully updated. + * + * # Errors + * * `BadOrigin` - If the origin is not authorized. + * * `TooLong` - If the metadata url or description length exceeds the maximum allowed length. + * * `AssetMetadataTypeDefMaxLengthExceeded` - If the metadata type definition length exceeds the maximum allowed length. + **/ + updateGlobalMetadataSpec: AugmentedSubmittable<(assetMetadataName: Bytes | string | Uint8Array, assetMetadataSpec: PolymeshPrimitivesAssetMetadataAssetMetadataSpec | { url?: any; description?: any; typeDef?: any } | string | Uint8Array) => SubmittableExtrinsic, [Bytes, PolymeshPrimitivesAssetMetadataAssetMetadataSpec]>; + /** + * Updates the asset identifiers associated to the asset. + * + * This function allows the asset issuer or an external agent to update the asset identifiers for an asset. + * + * # Arguments + * * `origin` - The origin of the call, which can be the primary or secondary key of an identity. + * * `asset_id` - The [`AssetId`] associated to the asset. + * * `asset_identifiers` - A vector of [`AssetIdentifier`] that will be associated to the asset. * * # Permissions * * Asset + * + * # Events + * * `IdentifiersUpdated` - When the asset identifiers are successfully updated. + * + * # Errors + * * `InvalidAssetIdentifier` - If any of the asset identifiers are invalid. **/ updateIdentifiers: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, assetIdentifiers: Vec | (PolymeshPrimitivesAssetIdentifier | { CUSIP: any } | { CINS: any } | { ISIN: any } | { LEI: any } | { FIGI: any } | string | Uint8Array)[]) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, Vec]>; /** @@ -452,68 +738,113 @@ declare module '@polkadot/api-base/types/submittable' { }; balances: { /** - * Burns the given amount of tokens from the caller's free, unlocked balance. + * Burn the specified liquid free balance from the origin account. + * + * If the origin's account ends up below the existential deposit as a result + * of the burn and `keep_alive` is false, the account will be reaped. + * + * Unlike sending funds to a _burn_ address, which merely makes the funds inaccessible, + * this `burn` operation will reduce total issuance by the amount _burned_. **/ - burnAccountBalance: AugmentedSubmittable<(amount: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u128]>; + burn: AugmentedSubmittable<(value: Compact | AnyNumber | Uint8Array, keepAlive: bool | boolean | Uint8Array) => SubmittableExtrinsic, [Compact, bool]>; /** - * Move some POLYX from balance of self to balance of BRR. + * Adjust the total issuance in a saturating way. + * + * Can only be called by root and always needs a positive `delta`. + * + * # Example **/ - depositBlockRewardReserveBalance: AugmentedSubmittable<(value: Compact | AnyNumber | Uint8Array) => SubmittableExtrinsic, [Compact]>; + forceAdjustTotalIssuance: AugmentedSubmittable<(direction: PalletBalancesAdjustmentDirection | 'Increase' | 'Decrease' | number | Uint8Array, delta: Compact | AnyNumber | Uint8Array) => SubmittableExtrinsic, [PalletBalancesAdjustmentDirection, Compact]>; /** - * Exactly as `transfer`, except the origin must be root and the source account may be - * specified. + * Set the regular balance of a given account. * - * # - * - Same as transfer, but additional read and write because the source account is - * not assumed to be in the overlay. - * # + * The dispatch origin for this call is `root`. + **/ + forceSetBalance: AugmentedSubmittable<(who: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, newFree: Compact | AnyNumber | Uint8Array) => SubmittableExtrinsic, [MultiAddress, Compact]>; + /** + * Exactly as `transfer_allow_death`, except the origin must be root and the source account + * may be specified. **/ forceTransfer: AugmentedSubmittable<(source: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, value: Compact | AnyNumber | Uint8Array) => SubmittableExtrinsic, [MultiAddress, MultiAddress, Compact]>; /** - * Set the balances of a given account. + * Unreserve some balance from a user by force. + * + * Can only be called by ROOT. + **/ + forceUnreserve: AugmentedSubmittable<(who: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, amount: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [MultiAddress, u128]>; + /** + * Transfer the entire transferable balance from the caller account. * - * This will alter `FreeBalance` and `ReservedBalance` in storage. it will - * also decrease the total issuance of the system (`TotalIssuance`). + * NOTE: This function only attempts to transfer _transferable_ balances. This means that + * any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be + * transferred by this function. To ensure that this function results in a killed account, + * you might need to prepare the account by removing any reference counters, storage + * deposits, etc... * - * The dispatch origin for this call is `root`. + * The dispatch origin of this call must be Signed. + * + * - `dest`: The recipient of the transfer. + * - `keep_alive`: A boolean to determine if the `transfer_all` operation should send all + * of the funds the account has, causing the sender account to be killed (false), or + * transfer everything except at least the existential deposit, which will guarantee to + * keep the sender account alive (true). + **/ + transferAll: AugmentedSubmittable<(dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, keepAlive: bool | boolean | Uint8Array) => SubmittableExtrinsic, [MultiAddress, bool]>; + /** + * Transfer some liquid free balance to another account. + * + * `transfer_allow_death` will set the `FreeBalance` of the sender and receiver. + * If the sender's account is below the existential deposit as a result + * of the transfer, the account will be reaped. + * + * The dispatch origin for this call must be `Signed` by the transactor. + **/ + transferAllowDeath: AugmentedSubmittable<(dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, value: Compact | AnyNumber | Uint8Array) => SubmittableExtrinsic, [MultiAddress, Compact]>; + /** + * Same as the [`transfer_allow_death`] call, but with a check that the transfer will not + * kill the origin account. + * + * 99% of the time you want [`transfer_allow_death`] instead. + * + * [`transfer_allow_death`]: struct.Pallet.html#method.transfer **/ - setBalance: AugmentedSubmittable<(who: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, newFree: Compact | AnyNumber | Uint8Array, newReserved: Compact | AnyNumber | Uint8Array) => SubmittableExtrinsic, [MultiAddress, Compact, Compact]>; + transferKeepAlive: AugmentedSubmittable<(dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, value: Compact | AnyNumber | Uint8Array) => SubmittableExtrinsic, [MultiAddress, Compact]>; /** * Transfer some liquid free balance to another account. * * `transfer` will set the `FreeBalance` of the sender and receiver. - * It will decrease the total issuance of the system by the `TransferFee`. + * If the sender's account is below the existential deposit as a result + * of the transfer, the account will be reaped. * * The dispatch origin for this call must be `Signed` by the transactor. * - * # - * - Dependent on arguments but not critical, given proper implementations for - * input config types. See related functions below. - * - It contains a limited number of reads and writes internally and no complex computation. + * ## Complexity + * - Dependent on arguments but not critical, given proper implementations for input config + * types. See related functions below. + * - It contains a limited number of reads and writes internally and no complex + * computation. * * Related functions: * * - `ensure_can_withdraw` is always called internally but has a bounded complexity. * - Transferring balances to accounts that did not exist before will cause * `T::OnNewAccount::on_new_account` to be called. - * --------------------------------- - * - Base Weight: 73.64 µs, worst case scenario (account created, account removed) - * - DB Weight: 1 Read and 1 Write to destination account. - * - Origin account is already in memory, so no DB operations for them. - * # + * - Removing enough funds from an account will trigger `T::DustRemoval::on_unbalanced`. + * - `transfer_keep_alive` works the same way as `transfer`, but has an additional check + * that the transfer will not kill the origin account. **/ - transfer: AugmentedSubmittable<(dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, value: Compact | AnyNumber | Uint8Array) => SubmittableExtrinsic, [MultiAddress, Compact]>; + transferWithMemo: AugmentedSubmittable<(dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, value: Compact | AnyNumber | Uint8Array, memo: Option | null | Uint8Array | PolymeshPrimitivesMemo | string) => SubmittableExtrinsic, [MultiAddress, Compact, Option]>; /** - * Transfer the native currency with the help of identifier string - * this functionality can help to differentiate the transfers. + * Upgrade a specified account. * - * # - * - Base Weight: 73.64 µs, worst case scenario (account created, account removed) - * - DB Weight: 1 Read and 1 Write to destination account. - * - Origin account is already in memory, so no DB operations for them. - * # + * - `origin`: Must be `Signed`. + * - `who`: The account to be upgraded. + * + * This will waive the transaction fee if at least all but 10% of the accounts needed to + * be upgraded. (We let some not have to be upgraded just in order to allow for the + * possibility of churn). **/ - transferWithMemo: AugmentedSubmittable<(dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, value: Compact | AnyNumber | Uint8Array, memo: Option | null | Uint8Array | PolymeshPrimitivesMemo | string) => SubmittableExtrinsic, [MultiAddress, Compact, Option]>; + upgradeAccounts: AugmentedSubmittable<(who: Vec | (AccountId32 | string | Uint8Array)[]) => SubmittableExtrinsic, [Vec]>; /** * Generic tx **/ @@ -1072,8 +1403,7 @@ declare module '@polkadot/api-base/types/submittable' { * * Instantiation is executed as follows: * - * - The supplied `code` is instrumented, deployed, and a `code_hash` is created for that - * code. + * - The supplied `code` is deployed, and a `code_hash` is created for that code. * - If the `code_hash` already exists on the chain the underlying `code` will be shared. * - The destination address is computed based on the sender, code_hash and the salt. * - The smart-contract account is created at the computed address. @@ -1085,6 +1415,13 @@ declare module '@polkadot/api-base/types/submittable' { * Deprecated version if [`Self::instantiate_with_code`] for use in an in-storage `Call`. **/ instantiateWithCodeOldWeight: AugmentedSubmittable<(value: Compact | AnyNumber | Uint8Array, gasLimit: Compact | AnyNumber | Uint8Array, storageDepositLimit: Option> | null | Uint8Array | Compact | AnyNumber, code: Bytes | string | Uint8Array, data: Bytes | string | Uint8Array, salt: Bytes | string | Uint8Array) => SubmittableExtrinsic, [Compact, Compact, Option>, Bytes, Bytes, Bytes]>; + /** + * When a migration is in progress, this dispatchable can be used to run migration steps. + * Calls that contribute to advancing the migration have their fees waived, as it's helpful + * for the chain. Note that while the migration is in progress, the pallet will also + * leverage the `on_idle` hooks to run migration steps. + **/ + migrate: AugmentedSubmittable<(weightLimit: SpWeightsWeightV2Weight | { refTime?: any; proofSize?: any } | string | Uint8Array) => SubmittableExtrinsic, [SpWeightsWeightV2Weight]>; /** * Remove the code stored under `code_hash` and refund the deposit to its owner. * @@ -1110,15 +1447,15 @@ declare module '@polkadot/api-base/types/submittable' { * * If the code does not already exist a deposit is reserved from the caller * and unreserved only when [`Self::remove_code`] is called. The size of the reserve - * depends on the instrumented size of the the supplied `code`. + * depends on the size of the supplied `code`. * * If the code already exists in storage it will still return `Ok` and upgrades * the in storage version to the current * [`InstructionWeights::version`](InstructionWeights). * - * - `determinism`: If this is set to any other value but [`Determinism::Deterministic`] - * then the only way to use this code is to delegate call into it from an offchain - * execution. Set to [`Determinism::Deterministic`] if in doubt. + * - `determinism`: If this is set to any other value but [`Determinism::Enforced`] then + * the only way to use this code is to delegate call into it from an offchain execution. + * Set to [`Determinism::Enforced`] if in doubt. * * # Note * @@ -1126,8 +1463,12 @@ declare module '@polkadot/api-base/types/submittable' { * To avoid this situation a constructor could employ access control so that it can * only be instantiated by permissioned entities. The same is true when uploading * through [`Self::instantiate_with_code`]. + * + * Use [`Determinism::Relaxed`] exclusively for non-deterministic code. If the uploaded + * code is deterministic, specifying [`Determinism::Relaxed`] will be disregarded and + * result in higher gas costs. **/ - uploadCode: AugmentedSubmittable<(code: Bytes | string | Uint8Array, storageDepositLimit: Option> | null | Uint8Array | Compact | AnyNumber, determinism: PalletContractsWasmDeterminism | 'Deterministic' | 'AllowIndeterminism' | number | Uint8Array) => SubmittableExtrinsic, [Bytes, Option>, PalletContractsWasmDeterminism]>; + uploadCode: AugmentedSubmittable<(code: Bytes | string | Uint8Array, storageDepositLimit: Option> | null | Uint8Array | Compact | AnyNumber, determinism: PalletContractsWasmDeterminism | 'Enforced' | 'Relaxed' | number | Uint8Array) => SubmittableExtrinsic, [Bytes, Option>, PalletContractsWasmDeterminism]>; /** * Generic tx **/ @@ -1185,6 +1526,7 @@ declare module '@polkadot/api-base/types/submittable' { * * Asset **/ initiateCorporateAction: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, kind: PalletCorporateActionsCaKind | 'PredictableBenefit' | 'UnpredictableBenefit' | 'IssuerNotice' | 'Reorganization' | 'Other' | number | Uint8Array, declDate: u64 | AnyNumber | Uint8Array, recordDate: Option | null | Uint8Array | PalletCorporateActionsRecordDateSpec | { Scheduled: any } | { ExistingSchedule: any } | { Existing: any } | string, details: Bytes | string | Uint8Array, targets: Option | null | Uint8Array | PalletCorporateActionsTargetIdentities | { identities?: any; treatment?: any } | string, defaultWithholdingTax: Option | null | Uint8Array | Permill | AnyNumber, withholdingTax: Option>> | null | Uint8Array | Vec> | ([PolymeshPrimitivesIdentityId | string | Uint8Array, Permill | AnyNumber | Uint8Array])[]) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, PalletCorporateActionsCaKind, u64, Option, Bytes, Option, Option, Option>>]>; + initiateCorporateActionAndBallot: AugmentedSubmittable<(caArgs: PalletCorporateActionsInitiateCorporateActionArgs | { assetId?: any; kind?: any; declDate?: any; recordDate?: any; details?: any; targets?: any; defaultWithholdingTax?: any; withholdingTax?: any } | string | Uint8Array, ballotTimeRange: PalletCorporateActionsBallotBallotTimeRange | { start?: any; end?: any } | string | Uint8Array, ballotMeta: PalletCorporateActionsBallotBallotMeta | { title?: any; motions?: any } | string | Uint8Array, rcv: bool | boolean | Uint8Array) => SubmittableExtrinsic, [PalletCorporateActionsInitiateCorporateActionArgs, PalletCorporateActionsBallotBallotTimeRange, PalletCorporateActionsBallotBallotMeta, bool]>; /** * Utility extrinsic to batch `initiate_corporate_action` and `distribute` **/ @@ -1488,9 +1830,9 @@ declare module '@polkadot/api-base/types/submittable' { * - `auth_id` identifying the authorization to accept. * * # Errors - * - `AuthorizationError::Invalid` if `auth_id` does not exist for the given caller. - * - `AuthorizationError::Expired` if `auth_id` is for an auth that has expired. - * - `AuthorizationError::BadType` if `auth_id` was not for a `BecomeAgent` auth type. + * - `Error::InvalidAuthorization` if `auth_id` does not exist for the given caller. + * - `Error::AuthorizationExpired` if `auth_id` is for an auth that has expired. + * - `Error::BadAuthorizationType` if `auth_id` was not for a `BecomeAgent` auth type. * - `UnauthorizedAgent` if "Alice" is not permissioned to provide the auth. * - `NoSuchAG` if the group referred to a custom that does not exist. * - `AlreadyAnAgent` if the caller is already an agent of the asset. @@ -1782,7 +2124,7 @@ declare module '@polkadot/api-base/types/submittable' { registerCustomClaimType: AugmentedSubmittable<(ty: Bytes | string | Uint8Array) => SubmittableExtrinsic, [Bytes]>; /** * Removes an authorization. - * _auth_issuer_pays determines whether the issuer of the authorisation pays the transaction fee + * `_auth_issuer_pays` determines whether the issuer of the authorisation pays the transaction fee **/ removeAuthorization: AugmentedSubmittable<(target: PolymeshPrimitivesSecondaryKeySignatory | { Identity: any } | { Account: any } | string | Uint8Array, authId: u64 | AnyNumber | Uint8Array, authIssuerPays: bool | boolean | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesSecondaryKeySignatory, u64, bool]>; /** @@ -1853,12 +2195,10 @@ declare module '@polkadot/api-base/types/submittable' { imOnline: { /** * ## Complexity: - * - `O(K + E)` where K is length of `Keys` (heartbeat.validators_len) and E is length of - * `heartbeat.network_state.external_address` + * - `O(K)` where K is length of `Keys` (heartbeat.validators_len) * - `O(K)`: decoding of length `K` - * - `O(E)`: decoding/encoding of length `E` **/ - heartbeat: AugmentedSubmittable<(heartbeat: PalletImOnlineHeartbeat | { blockNumber?: any; networkState?: any; sessionIndex?: any; authorityIndex?: any; validatorsLen?: any } | string | Uint8Array, signature: PalletImOnlineSr25519AppSr25519Signature | string | Uint8Array) => SubmittableExtrinsic, [PalletImOnlineHeartbeat, PalletImOnlineSr25519AppSr25519Signature]>; + heartbeat: AugmentedSubmittable<(heartbeat: PalletImOnlineHeartbeat | { blockNumber?: any; sessionIndex?: any; authorityIndex?: any; validatorsLen?: any } | string | Uint8Array, signature: PalletImOnlineSr25519AppSr25519Signature | string | Uint8Array) => SubmittableExtrinsic, [PalletImOnlineHeartbeat, PalletImOnlineSr25519AppSr25519Signature]>; /** * Generic tx **/ @@ -1926,6 +2266,19 @@ declare module '@polkadot/api-base/types/submittable' { * - `O(1)`. **/ freeze: AugmentedSubmittable<(index: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u32]>; + /** + * Poke the deposit reserved for an index. + * + * The dispatch origin for this call must be _Signed_ and the signing account must have a + * non-frozen account `index`. + * + * The transaction fees is waived if the deposit is changed after poking/reconsideration. + * + * - `index`: the index whose deposit is to be poked/reconsidered. + * + * Emits `DepositPoked` if successful. + **/ + pokeDeposit: AugmentedSubmittable<(index: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u32]>; /** * Assign an index already owned by the sender to another account. The balance reservation * is effectively transferred to the new account. @@ -1985,7 +2338,7 @@ declare module '@polkadot/api-base/types/submittable' { * * If quorum is reached, the proposal will be immediately executed. **/ - approve: AugmentedSubmittable<(multisig: AccountId32 | string | Uint8Array, proposalId: u64 | AnyNumber | Uint8Array, maxWeight: SpWeightsWeightV2Weight | { refTime?: any; proofSize?: any } | string | Uint8Array) => SubmittableExtrinsic, [AccountId32, u64, SpWeightsWeightV2Weight]>; + approve: AugmentedSubmittable<(multisig: AccountId32 | string | Uint8Array, proposalId: u64 | AnyNumber | Uint8Array, maxWeight: Option | null | Uint8Array | SpWeightsWeightV2Weight | { refTime?: any; proofSize?: any } | string) => SubmittableExtrinsic, [AccountId32, u64, Option]>; /** * Approves a multisig join identity proposal. * @@ -2045,6 +2398,10 @@ declare module '@polkadot/api-base/types/submittable' { * If quorum is reached, the proposal will be immediately executed. **/ reject: AugmentedSubmittable<(multisig: AccountId32 | string | Uint8Array, proposalId: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [AccountId32, u64]>; + /** + * Removes the admin identity from the `multisig`. This must be called by the multisig itself. + **/ + removeAdmin: AugmentedSubmittable<() => SubmittableExtrinsic, []>; /** * Removes the admin identity from the `multisig`. This must be called by the admin of the multisig. **/ @@ -2151,7 +2508,7 @@ declare module '@polkadot/api-base/types/submittable' { * * Asset * * Portfolio **/ - redeemNft: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, nftId: u64 | AnyNumber | Uint8Array, portfolioKind: PolymeshPrimitivesIdentityIdPortfolioKind | { Default: any } | { User: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u64, PolymeshPrimitivesIdentityIdPortfolioKind]>; + redeemNft: AugmentedSubmittable<(assetId: PolymeshPrimitivesAssetAssetId | string | Uint8Array, nftId: u64 | AnyNumber | Uint8Array, portfolioKind: PolymeshPrimitivesIdentityIdPortfolioKind | { Default: any } | { User: any } | string | Uint8Array, numberOfKeys: Option | null | Uint8Array | u8 | AnyNumber) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u64, PolymeshPrimitivesIdentityIdPortfolioKind, Option]>; /** * Generic tx **/ @@ -2161,155 +2518,276 @@ declare module '@polkadot/api-base/types/submittable' { /** * Approves the pending committee PIP given by the `id`. * + * This function can only be called by a Governance Committee (GC) voting majority. + * + * # Arguments + * * `origin` - The origin of the call, which must be a GC voting majority. + * * `id` - The proposal ID of the PIP to be approved. + * * # Errors - * * `BadOrigin` unless a GC voting majority executes this function. - * * `NoSuchProposal` if the PIP with `id` doesn't exist. - * * `IncorrectProposalState` if the proposal isn't pending. - * * `NotByCommittee` if the proposal isn't by a committee. + * * `BadOrigin` - If the call is not made by a GC voting majority. + * * `NoSuchProposal` - If the PIP with the given `id` does not exist. + * * `IncorrectProposalState` - If the proposal is not in a pending state. + * * `NotByCommittee` - If the proposal was not made by a committee. + * + * # Notes + * This function schedules the PIP for execution if all checks pass. **/ approveCommitteeProposal: AugmentedSubmittable<(id: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u32]>; /** * Clears the snapshot and emits the event `SnapshotCleared`. * + * This function can only be called by a Governance Committee (GC) member. + * + * # Arguments + * * `origin` - The origin of the call, which must be a GC member. + * + * # Events + * * `SnapshotCleared` - Emitted when the snapshot is successfully cleared, containing the ID of the cleared snapshot. + * * # Errors - * * `NotACommitteeMember` - triggered when a non-GC-member executes the function. + * * `NotACommitteeMember` - If the call is not made by a GC member. **/ clearSnapshot: AugmentedSubmittable<() => SubmittableExtrinsic, []>; /** - * Enacts `results` for the PIPs in the snapshot queue. + * Enacts the results for the PIPs in the snapshot queue. + * * The snapshot will be available for further enactments until it is cleared. * - * The `results` are encoded a list of `(id, result)` where `result` is applied to `id`. + * The `results` parameter is a list of `(id, result)` tuples where `result` is applied to the PIP with the given `id`. * Note that the snapshot priority queue is encoded with the *lowest priority first*. - * so `results = [(id, Approve)]` will approve `SnapshotQueue[SnapshotQueue.len() - 1]`. + * For example, `results = [(id, Approve)]` will approve `SnapshotQueue[SnapshotQueue.len() - 1]`. + * + * # Arguments + * * `origin` - The origin of the call, which must be a GC voting majority. + * * `results` - A vector of tuples where each tuple contains a PIP ID and a `SnapshotResult` (either `Approve`, `Reject`, or `Skip`). + * + * # Events + * * `SnapshotResultsEnacted` - Emitted when the snapshot results are successfully enacted, containing the ID of the snapshot and the actions taken. * * # Errors - * * `BadOrigin` - unless a GC voting majority executes this function. - * * `CannotSkipPip` - a given PIP has already been skipped too many times. - * * `SnapshotResultTooLarge` - on len(results) > len(snapshot_queue). - * * `SnapshotIdMismatch` - if: - * ```text - * ∃ (i ∈ 0..SnapshotQueue.len()). - * results[i].0 ≠ SnapshotQueue[SnapshotQueue.len() - i].id - * ``` - * This is protects against clearing queue while GC is voting. + * * `BadOrigin` - If the call is not made by a GC voting majority. + * * `CannotSkipPip` - If a given PIP has already been skipped too many times. + * * `SnapshotResultTooLarge` - If the length of `results` is greater than the length of the snapshot queue. + * * `SnapshotIdMismatch` - If there is a mismatch between the PIP IDs in `results` and the snapshot queue. + * + * # Notes + * This function will: + * - Update the skip counts for PIPs that are skipped. + * - Reject PIPs that are marked for rejection and refund any bonded funds. + * - Approve PIPs that are marked for approval and schedule them for execution. **/ enactSnapshotResults: AugmentedSubmittable<(results: Vec> | ([u32 | AnyNumber | Uint8Array, PalletPipsSnapshotResult | 'Approve' | 'Reject' | 'Skip' | number | Uint8Array])[]) => SubmittableExtrinsic, [Vec>]>; /** - * Internal dispatchable that handles execution of a PIP. + * Executes a scheduled PIP (Polymesh Improvement Proposal). + * + * # Arguments + * * `origin` - The origin of the call, which must be the root. + * * `id` - The unique identifier of the PIP to be executed. + * + * # Errors + * * `BadOrigin` - If the call is not made by the root origin. + * + * # Notes + * This function will: + * - Remove the PIP from the scheduling queue. + * - Execute the proposal associated with the PIP. **/ executeScheduledPip: AugmentedSubmittable<(id: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u32]>; /** - * Internal dispatchable that handles expiration of a PIP. + * Expires a scheduled PIP (Polymesh Improvement Proposal). + * + * # Arguments + * * `origin` - The origin of the call, which must be the root. + * * `did` - The identity ID of the entity initiating the expiration. + * * `id` - The unique identifier of the PIP to be expired. + * + * # Errors + * * `BadOrigin` - If the call is not made by the root origin. + * + * # Notes + * This function will: + * - Check if the PIP is in a pending state. + * - Unsnapshot the PIP if it was part of a snapshot. + * - Prune the PIP data if it is in an expired state. **/ expireScheduledPip: AugmentedSubmittable<(did: PolymeshPrimitivesIdentityId | string | Uint8Array, id: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesIdentityId, u32]>; /** - * A network member creates a PIP by submitting a dispatchable which - * changes the network in someway. A minimum deposit is required to open a new proposal. + * Proposes a new PIP by submitting a dispatchable which changes the network. * * # Arguments - * * `proposer` is either a signing key or committee. - * Used to understand whether this is a committee proposal and verified against `origin`. - * * `proposal` a dispatchable call - * * `deposit` minimum deposit value, which is ignored if `proposer` is a committee. - * * `url` a link to a website for proposal discussion + * * `origin` - The origin of the call. + * * `proposal` - The dispatchable call. + * * `deposit` - The deposit amount for the proposal. + * * `url` - A link to a website for proposal discussion. + * * `description` - A short description of the proposal. + * + * # Events + * * `ProposalCreated`. + * + * # Errors + * * `IncorrectDeposit` - If the deposit amount is less than the required minimum. + * * `TooManyActivePips` - If the number of active PIPs exceeds the maximum. **/ propose: AugmentedSubmittable<(proposal: Call | IMethod | string | Uint8Array, deposit: u128 | AnyNumber | Uint8Array, url: Option | null | Uint8Array | Bytes | string, description: Option | null | Uint8Array | Bytes | string) => SubmittableExtrinsic, [Call, u128, Option, Option]>; /** - * Prune the PIP given by the `id`, refunding any funds not already refunded. - * The PIP may not be active + * Prunes the PIP given by the `id`. The PIP must not be active. * - * This function is intended for storage garbage collection purposes. + * This function is intended for storage garbage collection purposes and can only be called by a Governance Committee (GC) voting majority. + * + * # Arguments + * * `origin` - The origin of the call, which must be a GC voting majority. + * * `id` - The proposal ID of the PIP to be pruned. * * # Errors - * * `BadOrigin` unless a GC voting majority executes this function. - * * `NoSuchProposal` if the PIP with `id` doesn't exist. - * * `IncorrectProposalState` if the proposal is active. + * * `BadOrigin` - If the call is not made by a GC voting majority. + * * `NoSuchProposal` - If the PIP with the given `id` does not exist. + * * `IncorrectProposalState` - If the proposal is active. + * + * # Notes + * This function will remove the PIP from storage and refund any remaining bonded funds. **/ pruneProposal: AugmentedSubmittable<(id: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u32]>; /** - * Rejects the PIP given by the `id`, refunding any bonded funds, - * assuming it hasn't been cancelled or executed. - * Note that proposals scheduled-for-execution can also be rejected. + * Rejects the PIP given by the `id`. Bonded funds will be refunded, assuming it hasn't + * been cancelled or executed. + * + * This function can only be called by a Governance Committee (GC) voting majority. + * + * # Arguments + * * `origin` - The origin of the call, which must be a GC voting majority. + * * `id` - The proposal ID of the PIP to be rejected. * * # Errors - * * `BadOrigin` unless a GC voting majority executes this function. - * * `NoSuchProposal` if the PIP with `id` doesn't exist. - * * `IncorrectProposalState` if the proposal was cancelled or executed. + * * `BadOrigin` - If the call is not made by a GC voting majority. + * * `NoSuchProposal` - If the PIP with the given `id` does not exist. + * * `IncorrectProposalState` - If the proposal was cancelled or executed. + * + * # Notes + * This function will unschedule the PIP if it was scheduled for execution and will + * unsnapshot the PIP if it was part of a snapshot. It will also handle the rejection + * of the proposal and refund any bonded funds. **/ rejectProposal: AugmentedSubmittable<(id: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u32]>; /** * Updates the execution schedule of the PIP given by `id`. + * This function can only be called by the release coordinator. * * # Arguments - * * `until` defines the future block where the enactment period will finished. - * `None` value means that enactment period is going to finish in the next block. + * * `origin` - The origin of the call, which must be the release coordinator. + * * `id` - The proposal ID of the PIP to be rescheduled. + * * `until` - An optional future block number where the enactment period will finish. + * If `None`, the enactment period will finish in the next block. * * # Errors - * * `RescheduleNotByReleaseCoordinator` unless triggered by release coordinator. - * * `IncorrectProposalState` unless the proposal was in a scheduled state. + * * `RescheduleNotByReleaseCoordinator` - If the call is not made by the release coordinator. + * * `IncorrectProposalState` - If the proposal is not in a scheduled state. + * * `InvalidFutureBlockNumber` - If the provided block number is not a valid future block number. **/ rescheduleExecution: AugmentedSubmittable<(id: u32 | AnyNumber | Uint8Array, until: Option | null | Uint8Array | u32 | AnyNumber) => SubmittableExtrinsic, [u32, Option]>; /** - * Change the maximum number of active PIPs before community members cannot propose anything. - * Can only be called by root. + * Sets the limit on the number of active PIPs. This function can only be called by the root origin. * * # Arguments - * * `limit` of concurrent active PIPs. + * * `origin` - The origin of the call, which must be the root. + * * `limit` - The new limit on the number of active PIPs. + * + * # Events + * * `ActivePipLimitChanged` - Emitted when the active PIP limit is changed, containing the old and new values. + * + * # Errors + * * `BadOrigin` - If the call is not made by the root origin. **/ setActivePipLimit: AugmentedSubmittable<(limit: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u32]>; /** - * Change the default enactment period. - * Can only be called by root. + * Changes the default enactment period. This function can only be called by the root origin. * * # Arguments - * * `duration` the new default enactment period it takes for a scheduled PIP to be executed. + * * `origin` - The origin of the call, which must be the root. + * * `period` - The new default enactment period. + * + * # Events + * * `DefaultEnactmentPeriodChanged` - Emitted when the default enactment period is changed, containing the old and new values. + * + * # Errors + * * `BadOrigin` - If the call is not made by the root origin. **/ setDefaultEnactmentPeriod: AugmentedSubmittable<(duration: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u32]>; /** - * Change the maximum skip count (`max_pip_skip_count`). - * Can only be called by root. + * Sets the maximum number of times a PIP can be skipped. This function can only be called by the root origin. * * # Arguments - * * `max` skips before a PIP cannot be skipped by GC anymore. + * * `origin` - The origin of the call, which must be the root. + * * `max` - The new maximum skip count for PIPs. + * + * # Events + * * `MaxPipSkipCountChanged` - Emitted when the maximum PIP skip count is changed, containing the old and new values. + * + * # Errors + * * `BadOrigin` - If the call is not made by the root origin. **/ setMaxPipSkipCount: AugmentedSubmittable<(max: u8 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u8]>; /** - * Change the minimum proposal deposit amount required to start a proposal. - * Can only be called by root. + * Changes the minimum proposal deposit amount required to start a proposal. This function can only be called by the root origin. * * # Arguments - * * `deposit` the new min deposit required to start a proposal + * * `origin` - The origin of the call, which must be the root. + * * `deposit` - The new minimum deposit required to start a proposal. + * + * # Events + * * `MinimumProposalDepositChanged` - Emitted when the minimum proposal deposit is changed, containing the old and new values. + * + * # Errors + * * `BadOrigin` - If the call is not made by the root origin. **/ setMinProposalDeposit: AugmentedSubmittable<(deposit: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u128]>; /** - * Change the amount of blocks after which a pending PIP is expired. - * If `expiry` is `None` then PIPs never expire. - * Can only be called by root. + * Sets the expiry duration (in blocks) for pending PIPs. This function can only be called by the root origin. * * # Arguments - * * `expiry` the block-time it takes for a still-`Pending` PIP to expire. + * * `origin` - The origin of the call, which must be the root. + * * `expiry` - The new expiry duration for pending PIPs. If `None`, PIPs never expire. + * + * # Events + * * `PendingPipExpiryChanged` - Emitted when the pending PIP expiry duration is changed, containing the old and new values. + * + * # Errors + * * `BadOrigin` - If the call is not made by the root origin. **/ - setPendingPipExpiry: AugmentedSubmittable<(expiry: PolymeshCommonUtilitiesMaybeBlock | { Some: any } | { None: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshCommonUtilitiesMaybeBlock]>; + setPendingPipExpiry: AugmentedSubmittable<(expiry: PolymeshPrimitivesMaybeBlock | { Some: any } | { None: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesMaybeBlock]>; /** - * Change whether completed PIPs are pruned. - * Can only be called by root. + * Sets the pruning setting for historical PIPs. This function can only be called by the root origin. * * # Arguments - * * `prune` specifies whether completed PIPs should be pruned. + * * `origin` - The origin of the call, which must be the root. + * * `prune` - A boolean flag indicating whether completed PIPs should be pruned (`true`) or retained (`false`). + * + * # Events + * * `HistoricalPipsPruned` - Emitted when the pruning setting is changed, containing the old and new values. + * + * # Errors + * * `BadOrigin` - If the call is not made by the root origin. **/ setPruneHistoricalPips: AugmentedSubmittable<(prune: bool | boolean | Uint8Array) => SubmittableExtrinsic, [bool]>; /** - * Takes a new snapshot of the current list of active && pending PIPs. + * Takes a new snapshot of the current list of active and pending PIPs. * The PIPs are then sorted into a priority queue based on each PIP's weight. * + * This function can only be called by a Governance Committee (GC) member. + * + * # Arguments + * * `origin` - The origin of the call, which must be a GC member. + * + * # Events + * * `SnapshotTaken` - Emitted when a snapshot is successfully taken, containing the ID of the snapshot and the queue of PIPs. + * * # Errors - * * `NotACommitteeMember` - triggered when a non-GC-member executes the function. + * * `NotACommitteeMember` - If the call is not made by a GC member. **/ snapshot: AugmentedSubmittable<() => SubmittableExtrinsic, []>; /** - * Vote either in favor (`aye_or_nay` == true) or against a PIP with `id`. - * The "convinction" or strength of the vote is given by `deposit`, which is reserved. + * Casts a vote either in favor or against a PIP with `id`. + * The "conviction" or strength of the vote is given by `deposit`, which is reserved. * * Note that `vote` is *not* additive. * That is, `vote(id, true, 50)` followed by `vote(id, true, 40)` @@ -2317,15 +2795,20 @@ declare module '@polkadot/api-base/types/submittable' { * To add atop of existing votes, you'll need `existing_deposit + addition`. * * # Arguments - * * `id`, proposal id - * * `aye_or_nay`, a bool representing for or against vote - * * `deposit`, the "conviction" with which the vote is made. + * * `origin` - The origin of the call. + * * `id` - The proposal ID to vote on. + * * `aye_or_nay` - A boolean representing a vote in favor (`true`) or against (`false`). + * * `deposit` - The "conviction" or strength of the vote, represented by the amount of deposit. + * + * # Events + * * `Voted` - Emitted when a vote is successfully cast. * * # Errors - * * `NoSuchProposal` if `id` doesn't reference a valid PIP. - * * `NotFromCommunity` if proposal was made by a committee. - * * `IncorrectProposalState` if PIP isn't pending. - * * `InsufficientDeposit` if `origin` cannot reserve `deposit - old_deposit`. + * * `NoSuchProposal` - If the `id` does not reference a valid PIP. + * * `NotFromCommunity` - If the proposal was made by a committee. + * * `IncorrectProposalState` - If the PIP is not in a pending state. + * * `InsufficientDeposit` - If the `origin` cannot reserve the required deposit. + * * `IncorrectDeposit` - If the deposit amount is less than the required minimum. **/ vote: AugmentedSubmittable<(id: u32 | AnyNumber | Uint8Array, ayeOrNay: bool | boolean | Uint8Array, deposit: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u32, bool, u128]>; /** @@ -2340,7 +2823,7 @@ declare module '@polkadot/api-base/types/submittable' { * # Arguments * * `expiry` - The new expiry time. **/ - setExpiresAfter: AugmentedSubmittable<(expiry: PolymeshCommonUtilitiesMaybeBlock | { Some: any } | { None: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshCommonUtilitiesMaybeBlock]>; + setExpiresAfter: AugmentedSubmittable<(expiry: PolymeshPrimitivesMaybeBlock | { Some: any } | { None: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesMaybeBlock]>; /** * Changes the release coordinator. * @@ -2616,6 +3099,12 @@ declare module '@polkadot/api-base/types/submittable' { [key: string]: SubmittableExtrinsicFunction; }; preimage: { + /** + * Ensure that the bulk of pre-images is upgraded. + * + * The caller pays no fee if at least 90% of pre-images were successfully updated. + **/ + ensureUpdated: AugmentedSubmittable<(hashes: Vec | (H256 | string | Uint8Array)[]) => SubmittableExtrinsic, [Vec]>; /** * Register a preimage on-chain. * @@ -2678,9 +3167,9 @@ declare module '@polkadot/api-base/types/submittable' { * - `auth_id` the authorization id to accept a `paying_key`. * * # Errors - * - `AuthorizationError::Invalid` if `auth_id` does not exist for the given caller. - * - `AuthorizationError::Expired` if `auth_id` the authorization has expired. - * - `AuthorizationError::BadType` if `auth_id` was not a `AddRelayerPayingKey` authorization. + * - `Error::InvalidAuthorization` if `auth_id` does not exist for the given caller. + * - `Error::AuthorizationExpired` if `auth_id` the authorization has expired. + * - `Error::BadAuthorizationType` if `auth_id` was not a `AddRelayerPayingKey` authorization. * - `NotAuthorizedForUserKey` if `origin` is not authorized to accept the authorization for the `user_key`. * - `NotAuthorizedForPayingKey` if the authorization was created an identity different from the `paying_key`'s identity. * - `UserKeyCddMissing` if the `user_key` is not attached to a CDD'd identity. @@ -2768,6 +3257,14 @@ declare module '@polkadot/api-base/types/submittable' { * Cancel a named scheduled task. **/ cancelNamed: AugmentedSubmittable<(id: U8aFixed | string | Uint8Array) => SubmittableExtrinsic, [U8aFixed]>; + /** + * Removes the retry configuration of a task. + **/ + cancelRetry: AugmentedSubmittable<(task: ITuple<[u32, u32]> | [u32 | AnyNumber | Uint8Array, u32 | AnyNumber | Uint8Array]) => SubmittableExtrinsic, [ITuple<[u32, u32]>]>; + /** + * Cancel the retry configuration of a named task. + **/ + cancelRetryNamed: AugmentedSubmittable<(id: U8aFixed | string | Uint8Array) => SubmittableExtrinsic, [U8aFixed]>; /** * Anonymously schedule a task. **/ @@ -2784,6 +3281,36 @@ declare module '@polkadot/api-base/types/submittable' { * Schedule a named task after a delay. **/ scheduleNamedAfter: AugmentedSubmittable<(id: U8aFixed | string | Uint8Array, after: u32 | AnyNumber | Uint8Array, maybePeriodic: Option> | null | Uint8Array | ITuple<[u32, u32]> | [u32 | AnyNumber | Uint8Array, u32 | AnyNumber | Uint8Array], priority: u8 | AnyNumber | Uint8Array, call: Call | IMethod | string | Uint8Array) => SubmittableExtrinsic, [U8aFixed, u32, Option>, u8, Call]>; + /** + * Set a retry configuration for a task so that, in case its scheduled run fails, it will + * be retried after `period` blocks, for a total amount of `retries` retries or until it + * succeeds. + * + * Tasks which need to be scheduled for a retry are still subject to weight metering and + * agenda space, same as a regular task. If a periodic task fails, it will be scheduled + * normally while the task is retrying. + * + * Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + * clones of the original task. Their retry configuration will be derived from the + * original task's configuration, but will have a lower value for `remaining` than the + * original `total_retries`. + **/ + setRetry: AugmentedSubmittable<(task: ITuple<[u32, u32]> | [u32 | AnyNumber | Uint8Array, u32 | AnyNumber | Uint8Array], retries: u8 | AnyNumber | Uint8Array, period: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [ITuple<[u32, u32]>, u8, u32]>; + /** + * Set a retry configuration for a named task so that, in case its scheduled run fails, it + * will be retried after `period` blocks, for a total amount of `retries` retries or until + * it succeeds. + * + * Tasks which need to be scheduled for a retry are still subject to weight metering and + * agenda space, same as a regular task. If a periodic task fails, it will be scheduled + * normally while the task is retrying. + * + * Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + * clones of the original task. Their retry configuration will be derived from the + * original task's configuration, but will have a lower value for `remaining` than the + * original `total_retries`. + **/ + setRetryNamed: AugmentedSubmittable<(id: U8aFixed | string | Uint8Array, retries: u8 | AnyNumber | Uint8Array, period: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [U8aFixed, u8, u32]>; /** * Generic tx **/ @@ -2838,7 +3365,7 @@ declare module '@polkadot/api-base/types/submittable' { * # Permissions * * Portfolio **/ - addAndAffirmInstruction: AugmentedSubmittable<(venueId: Option | null | Uint8Array | u64 | AnyNumber, settlementType: PolymeshPrimitivesSettlementSettlementType | { SettleOnAffirmation: any } | { SettleOnBlock: any } | { SettleManual: any } | string | Uint8Array, tradeDate: Option | null | Uint8Array | u64 | AnyNumber, valueDate: Option | null | Uint8Array | u64 | AnyNumber, legs: Vec | (PolymeshPrimitivesSettlementLeg | { Fungible: any } | { NonFungible: any } | { OffChain: any } | string | Uint8Array)[], portfolios: Vec | (PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array)[], instructionMemo: Option | null | Uint8Array | PolymeshPrimitivesMemo | string) => SubmittableExtrinsic, [Option, PolymeshPrimitivesSettlementSettlementType, Option, Option, Vec, Vec, Option]>; + addAndAffirmInstruction: AugmentedSubmittable<(venueId: Option | null | Uint8Array | u64 | AnyNumber, settlementType: PolymeshPrimitivesSettlementSettlementType | { SettleOnAffirmation: any } | { SettleOnBlock: any } | { SettleManual: any } | { SettleAfterLock: any } | string | Uint8Array, tradeDate: Option | null | Uint8Array | u64 | AnyNumber, valueDate: Option | null | Uint8Array | u64 | AnyNumber, legs: Vec | (PolymeshPrimitivesSettlementLeg | { Fungible: any } | { NonFungible: any } | { OffChain: any } | string | Uint8Array)[], portfolios: BTreeSet, instructionMemo: Option | null | Uint8Array | PolymeshPrimitivesMemo | string) => SubmittableExtrinsic, [Option, PolymeshPrimitivesSettlementSettlementType, Option, Option, Vec, BTreeSet, Option]>; /** * Adds and affirms a new instruction with mediators. * @@ -2855,7 +3382,7 @@ declare module '@polkadot/api-base/types/submittable' { * # Permissions * * Portfolio **/ - addAndAffirmWithMediators: AugmentedSubmittable<(venueId: Option | null | Uint8Array | u64 | AnyNumber, settlementType: PolymeshPrimitivesSettlementSettlementType | { SettleOnAffirmation: any } | { SettleOnBlock: any } | { SettleManual: any } | string | Uint8Array, tradeDate: Option | null | Uint8Array | u64 | AnyNumber, valueDate: Option | null | Uint8Array | u64 | AnyNumber, legs: Vec | (PolymeshPrimitivesSettlementLeg | { Fungible: any } | { NonFungible: any } | { OffChain: any } | string | Uint8Array)[], portfolios: Vec | (PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array)[], instructionMemo: Option | null | Uint8Array | PolymeshPrimitivesMemo | string, mediators: BTreeSet) => SubmittableExtrinsic, [Option, PolymeshPrimitivesSettlementSettlementType, Option, Option, Vec, Vec, Option, BTreeSet]>; + addAndAffirmWithMediators: AugmentedSubmittable<(venueId: Option | null | Uint8Array | u64 | AnyNumber, settlementType: PolymeshPrimitivesSettlementSettlementType | { SettleOnAffirmation: any } | { SettleOnBlock: any } | { SettleManual: any } | { SettleAfterLock: any } | string | Uint8Array, tradeDate: Option | null | Uint8Array | u64 | AnyNumber, valueDate: Option | null | Uint8Array | u64 | AnyNumber, legs: Vec | (PolymeshPrimitivesSettlementLeg | { Fungible: any } | { NonFungible: any } | { OffChain: any } | string | Uint8Array)[], portfolios: BTreeSet, instructionMemo: Option | null | Uint8Array | PolymeshPrimitivesMemo | string, mediators: BTreeSet) => SubmittableExtrinsic, [Option, PolymeshPrimitivesSettlementSettlementType, Option, Option, Vec, BTreeSet, Option, BTreeSet]>; /** * Adds a new instruction. * @@ -2867,7 +3394,7 @@ declare module '@polkadot/api-base/types/submittable' { * * `legs`: A vector of all [`Leg`] included in this instruction. * * `memo`: An optional [`Memo`] field for this instruction. **/ - addInstruction: AugmentedSubmittable<(venueId: Option | null | Uint8Array | u64 | AnyNumber, settlementType: PolymeshPrimitivesSettlementSettlementType | { SettleOnAffirmation: any } | { SettleOnBlock: any } | { SettleManual: any } | string | Uint8Array, tradeDate: Option | null | Uint8Array | u64 | AnyNumber, valueDate: Option | null | Uint8Array | u64 | AnyNumber, legs: Vec | (PolymeshPrimitivesSettlementLeg | { Fungible: any } | { NonFungible: any } | { OffChain: any } | string | Uint8Array)[], instructionMemo: Option | null | Uint8Array | PolymeshPrimitivesMemo | string) => SubmittableExtrinsic, [Option, PolymeshPrimitivesSettlementSettlementType, Option, Option, Vec, Option]>; + addInstruction: AugmentedSubmittable<(venueId: Option | null | Uint8Array | u64 | AnyNumber, settlementType: PolymeshPrimitivesSettlementSettlementType | { SettleOnAffirmation: any } | { SettleOnBlock: any } | { SettleManual: any } | { SettleAfterLock: any } | string | Uint8Array, tradeDate: Option | null | Uint8Array | u64 | AnyNumber, valueDate: Option | null | Uint8Array | u64 | AnyNumber, legs: Vec | (PolymeshPrimitivesSettlementLeg | { Fungible: any } | { NonFungible: any } | { OffChain: any } | string | Uint8Array)[], instructionMemo: Option | null | Uint8Array | PolymeshPrimitivesMemo | string) => SubmittableExtrinsic, [Option, PolymeshPrimitivesSettlementSettlementType, Option, Option, Vec, Option]>; /** * Adds a new instruction with mediators. * @@ -2880,7 +3407,7 @@ declare module '@polkadot/api-base/types/submittable' { * * `instruction_memo`: An optional [`Memo`] field for this instruction. * * `mediators`: A set of [`IdentityId`] of all the mandatory mediators for the instruction. **/ - addInstructionWithMediators: AugmentedSubmittable<(venueId: Option | null | Uint8Array | u64 | AnyNumber, settlementType: PolymeshPrimitivesSettlementSettlementType | { SettleOnAffirmation: any } | { SettleOnBlock: any } | { SettleManual: any } | string | Uint8Array, tradeDate: Option | null | Uint8Array | u64 | AnyNumber, valueDate: Option | null | Uint8Array | u64 | AnyNumber, legs: Vec | (PolymeshPrimitivesSettlementLeg | { Fungible: any } | { NonFungible: any } | { OffChain: any } | string | Uint8Array)[], instructionMemo: Option | null | Uint8Array | PolymeshPrimitivesMemo | string, mediators: BTreeSet) => SubmittableExtrinsic, [Option, PolymeshPrimitivesSettlementSettlementType, Option, Option, Vec, Option, BTreeSet]>; + addInstructionWithMediators: AugmentedSubmittable<(venueId: Option | null | Uint8Array | u64 | AnyNumber, settlementType: PolymeshPrimitivesSettlementSettlementType | { SettleOnAffirmation: any } | { SettleOnBlock: any } | { SettleManual: any } | { SettleAfterLock: any } | string | Uint8Array, tradeDate: Option | null | Uint8Array | u64 | AnyNumber, valueDate: Option | null | Uint8Array | u64 | AnyNumber, legs: Vec | (PolymeshPrimitivesSettlementLeg | { Fungible: any } | { NonFungible: any } | { OffChain: any } | string | Uint8Array)[], instructionMemo: Option | null | Uint8Array | PolymeshPrimitivesMemo | string, mediators: BTreeSet) => SubmittableExtrinsic, [Option, PolymeshPrimitivesSettlementSettlementType, Option, Option, Vec, Option, BTreeSet]>; /** * Provide affirmation to an existing instruction. * @@ -2891,7 +3418,7 @@ declare module '@polkadot/api-base/types/submittable' { * # Permissions * * Portfolio **/ - affirmInstruction: AugmentedSubmittable<(id: u64 | AnyNumber | Uint8Array, portfolios: Vec | (PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array)[]) => SubmittableExtrinsic, [u64, Vec]>; + affirmInstruction: AugmentedSubmittable<(id: u64 | AnyNumber | Uint8Array, portfolios: BTreeSet) => SubmittableExtrinsic, [u64, BTreeSet]>; /** * Affirms the instruction as a mediator - should only be called by mediators, otherwise it will fail. * @@ -2914,7 +3441,7 @@ declare module '@polkadot/api-base/types/submittable' { * # Permissions * * Portfolio **/ - affirmInstructionWithCount: AugmentedSubmittable<(id: u64 | AnyNumber | Uint8Array, portfolios: Vec | (PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array)[], numberOfAssets: Option | null | Uint8Array | PolymeshPrimitivesSettlementAffirmationCount | { senderAssetCount?: any; receiverAssetCount?: any; offchainCount?: any } | string) => SubmittableExtrinsic, [u64, Vec, Option]>; + affirmInstructionWithCount: AugmentedSubmittable<(id: u64 | AnyNumber | Uint8Array, portfolios: BTreeSet, numberOfAssets: Option | null | Uint8Array | PolymeshPrimitivesSettlementAffirmationCount | { senderAssetCount?: any; receiverAssetCount?: any; offchainCount?: any } | string) => SubmittableExtrinsic, [u64, BTreeSet, Option]>; /** * Affirms an instruction using receipts for offchain transfers. * @@ -2926,7 +3453,7 @@ declare module '@polkadot/api-base/types/submittable' { * # Permissions * * Portfolio **/ - affirmWithReceipts: AugmentedSubmittable<(id: u64 | AnyNumber | Uint8Array, receiptDetails: Vec | (PolymeshPrimitivesSettlementReceiptDetails | { uid?: any; instructionId?: any; legId?: any; signer?: any; signature?: any; metadata?: any } | string | Uint8Array)[], portfolios: Vec | (PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array)[]) => SubmittableExtrinsic, [u64, Vec, Vec]>; + affirmWithReceipts: AugmentedSubmittable<(id: u64 | AnyNumber | Uint8Array, receiptDetails: Vec | (PolymeshPrimitivesSettlementReceiptDetails | { uid?: any; instructionId?: any; legId?: any; signer?: any; signature?: any; metadata?: any } | string | Uint8Array)[], portfolios: BTreeSet) => SubmittableExtrinsic, [u64, Vec, BTreeSet]>; /** * Affirms an instruction using receipts for offchain transfers. * @@ -2941,7 +3468,7 @@ declare module '@polkadot/api-base/types/submittable' { * # Permissions * * Portfolio **/ - affirmWithReceiptsWithCount: AugmentedSubmittable<(id: u64 | AnyNumber | Uint8Array, receiptDetails: Vec | (PolymeshPrimitivesSettlementReceiptDetails | { uid?: any; instructionId?: any; legId?: any; signer?: any; signature?: any; metadata?: any } | string | Uint8Array)[], portfolios: Vec | (PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array)[], numberOfAssets: Option | null | Uint8Array | PolymeshPrimitivesSettlementAffirmationCount | { senderAssetCount?: any; receiverAssetCount?: any; offchainCount?: any } | string) => SubmittableExtrinsic, [u64, Vec, Vec, Option]>; + affirmWithReceiptsWithCount: AugmentedSubmittable<(id: u64 | AnyNumber | Uint8Array, receiptDetails: Vec | (PolymeshPrimitivesSettlementReceiptDetails | { uid?: any; instructionId?: any; legId?: any; signer?: any; signature?: any; metadata?: any } | string | Uint8Array)[], portfolios: BTreeSet, numberOfAssets: Option | null | Uint8Array | PolymeshPrimitivesSettlementAffirmationCount | { senderAssetCount?: any; receiverAssetCount?: any; offchainCount?: any } | string) => SubmittableExtrinsic, [u64, Vec, BTreeSet, Option]>; /** * Allows additional venues to create instructions involving an asset. * @@ -2990,6 +3517,24 @@ declare module '@polkadot/api-base/types/submittable' { * Root callable extrinsic, used as an internal call to execute a scheduled settlement instruction. **/ executeScheduledInstruction: AugmentedSubmittable<(id: u64 | AnyNumber | Uint8Array, weightLimit: SpWeightsWeightV2Weight | { refTime?: any; proofSize?: any } | string | Uint8Array) => SubmittableExtrinsic, [u64, SpWeightsWeightV2Weight]>; + /** + * Moves the instruction status to `LockedForExecution`. This function must be called by a + * mediator of the instruction and will only suceed if the following conditions are met: + * - All affirmations have been received. + * - Instruction is pending or has failed at least one time. + * - All mediator's affirmations are still valid. + * - All assets are in the allowed venue list. + * - All senders have the right amount of assets being transferred. + * - All senders and receivers are compliant and have valid CDD claims. + * - All assets' statistics are still valid. + * - There are no frozen assets. + * + * # Arguments + * * `origin` - The origin of the call, specifying the caller. + * * `inst_id` - The [`InstructionId`] of the instruction to be locked. + * * `weight_limit` - A maximum [`Weight`] value to be charged for locking the instruction. + **/ + lockInstruction: AugmentedSubmittable<(instId: u64 | AnyNumber | Uint8Array, weightLimit: SpWeightsWeightV2Weight | { refTime?: any; proofSize?: any } | string | Uint8Array) => SubmittableExtrinsic, [u64, SpWeightsWeightV2Weight]>; /** * Rejects an existing instruction. * @@ -3067,7 +3612,7 @@ declare module '@polkadot/api-base/types/submittable' { * # Permissions * * Portfolio **/ - withdrawAffirmation: AugmentedSubmittable<(id: u64 | AnyNumber | Uint8Array, portfolios: Vec | (PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array)[]) => SubmittableExtrinsic, [u64, Vec]>; + withdrawAffirmation: AugmentedSubmittable<(id: u64 | AnyNumber | Uint8Array, portfolios: BTreeSet) => SubmittableExtrinsic, [u64, BTreeSet]>; /** * Removes the mediator's affirmation for the instruction - should only be called by mediators, otherwise it will fail. * @@ -3089,19 +3634,13 @@ declare module '@polkadot/api-base/types/submittable' { * # Permissions * * Portfolio **/ - withdrawAffirmationWithCount: AugmentedSubmittable<(id: u64 | AnyNumber | Uint8Array, portfolios: Vec | (PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array)[], numberOfAssets: Option | null | Uint8Array | PolymeshPrimitivesSettlementAffirmationCount | { senderAssetCount?: any; receiverAssetCount?: any; offchainCount?: any } | string) => SubmittableExtrinsic, [u64, Vec, Option]>; + withdrawAffirmationWithCount: AugmentedSubmittable<(id: u64 | AnyNumber | Uint8Array, portfolios: BTreeSet, numberOfAssets: Option | null | Uint8Array | PolymeshPrimitivesSettlementAffirmationCount | { senderAssetCount?: any; receiverAssetCount?: any; offchainCount?: any } | string) => SubmittableExtrinsic, [u64, BTreeSet, Option]>; /** * Generic tx **/ [key: string]: SubmittableExtrinsicFunction; }; staking: { - /** - * Adds a permissioned identity and sets its preferences. - * - * The dispatch origin must be Root. - **/ - addPermissionedValidator: AugmentedSubmittable<(identity: PolymeshPrimitivesIdentityId | string | Uint8Array, intendedCount: Option | null | Uint8Array | u32 | AnyNumber) => SubmittableExtrinsic, [PolymeshPrimitivesIdentityId, Option]>; /** * Take the origin account as a stash and lock up `value` of its balance. `controller` will * be the account that controls it. @@ -3117,9 +3656,10 @@ declare module '@polkadot/api-base/types/submittable' { * - Three extra DB entries. * * NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned - * unless the `origin` falls below _existential deposit_ and gets removed as dust. + * unless the `origin` falls below _existential deposit_ (or equal to 0) and gets removed + * as dust. **/ - bond: AugmentedSubmittable<(controller: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, value: Compact | AnyNumber | Uint8Array, payee: PalletStakingRewardDestination | { Staked: any } | { Stash: any } | { Controller: any } | { Account: any } | { None: any } | string | Uint8Array) => SubmittableExtrinsic, [MultiAddress, Compact, PalletStakingRewardDestination]>; + bond: AugmentedSubmittable<(value: Compact | AnyNumber | Uint8Array, payee: PalletStakingRewardDestination | { Staked: any } | { Stash: any } | { Controller: any } | { Account: any } | { None: any } | string | Uint8Array) => SubmittableExtrinsic, [Compact, PalletStakingRewardDestination]>; /** * Add some extra amount that have appeared in the stash `free_balance` into the balance up * for staking. @@ -3145,10 +3685,6 @@ declare module '@polkadot/api-base/types/submittable' { * Parameters: era and indices of the slashes for that era to kill. **/ cancelDeferredSlash: AugmentedSubmittable<(era: u32 | AnyNumber | Uint8Array, slashIndices: Vec | (u32 | AnyNumber | Uint8Array)[]) => SubmittableExtrinsic, [u32, Vec]>; - /** - * Switch slashing status on the basis of given `slashing_switch`. Can only be called by root. - **/ - changeSlashingAllowedFor: AugmentedSubmittable<(slashingSwitch: PalletStakingSlashingSwitch | 'Validator' | 'ValidatorAndNominator' | 'None' | number | Uint8Array) => SubmittableExtrinsic, [PalletStakingSlashingSwitch]>; /** * Declare no desire to either validate or nominate. * @@ -3162,10 +3698,6 @@ declare module '@polkadot/api-base/types/submittable' { * - Writes are limited to the `origin` account key. **/ chill: AugmentedSubmittable<() => SubmittableExtrinsic, []>; - /** - * Governance council forcefully chills a validator. Effects will be felt at the beginning of the next era. - **/ - chillFromGovernance: AugmentedSubmittable<(identity: PolymeshPrimitivesIdentityId | string | Uint8Array, stashKeys: Vec | (AccountId32 | string | Uint8Array)[]) => SubmittableExtrinsic, [PolymeshPrimitivesIdentityId, Vec]>; /** * Declare a `controller` to stop participating as either a validator or nominator. * @@ -3194,7 +3726,17 @@ declare module '@polkadot/api-base/types/submittable' { * This can be helpful if bond requirements are updated, and we need to remove old users * who do not satisfy these requirements. **/ - chillOther: AugmentedSubmittable<(controller: AccountId32 | string | Uint8Array) => SubmittableExtrinsic, [AccountId32]>; + chillOther: AugmentedSubmittable<(stash: AccountId32 | string | Uint8Array) => SubmittableExtrinsic, [AccountId32]>; + /** + * Updates a batch of controller accounts to their corresponding stash account if they are + * not the same. Ignores any controller accounts that do not exist, and does not operate if + * the stash and controller are already the same. + * + * Effects will be felt instantly (as soon as this function is completed successfully). + * + * The dispatch origin must be `T::AdminOrigin`. + **/ + deprecateControllerBatch: AugmentedSubmittable<(controllers: Vec | (AccountId32 | string | Uint8Array)[]) => SubmittableExtrinsic, [Vec]>; /** * Force a validator to have at least the minimum commission. This will not affect a * validator who already has a commission greater than or equal to the minimum. Any account @@ -3250,10 +3792,15 @@ declare module '@polkadot/api-base/types/submittable' { * Force a current staker to become completely unstaked, immediately. * * The dispatch origin must be Root. + * + * ## Parameters + * + * - `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + * details. **/ forceUnstake: AugmentedSubmittable<(stash: AccountId32 | string | Uint8Array, numSlashingSpans: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [AccountId32, u32]>; /** - * Increments the ideal number of validators upto maximum of + * Increments the ideal number of validators up to maximum of * `ElectionProviderBase::MaxWinners`. * * The dispatch origin must be Root. @@ -3276,6 +3823,40 @@ declare module '@polkadot/api-base/types/submittable' { * block any further nominations. **/ kick: AugmentedSubmittable<(who: Vec | (MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array)[]) => SubmittableExtrinsic, [Vec]>; + /** + * This function allows governance to manually slash a validator and is a + * **fallback mechanism**. + * + * The dispatch origin must be `T::AdminOrigin`. + * + * ## Parameters + * - `validator_stash` - The stash account of the validator to slash. + * - `era` - The era in which the validator was in the active set. + * - `slash_fraction` - The percentage of the stake to slash, expressed as a Perbill. + * + * ## Behavior + * + * The slash will be applied using the standard slashing mechanics, respecting the + * configured `SlashDeferDuration`. + * + * This means: + * - If the validator was already slashed by a higher percentage for the same era, this + * slash will have no additional effect. + * - If the validator was previously slashed by a lower percentage, only the difference + * will be applied. + * - The slash will be deferred by `SlashDeferDuration` eras before being enacted. + **/ + manualSlash: AugmentedSubmittable<(validatorStash: AccountId32 | string | Uint8Array, era: u32 | AnyNumber | Uint8Array, slashFraction: Perbill | AnyNumber | Uint8Array) => SubmittableExtrinsic, [AccountId32, u32, Perbill]>; + /** + * Removes the legacy Staking locks if they exist. + * + * This removes the legacy lock on the stake with [`Config::OldCurrency`] and creates a + * hold on it if needed. If all stake cannot be held, the best effort is made to hold as + * much as possible. The remaining stake is forced withdrawn from the ledger. + * + * The fee is waived if the migration is successful. + **/ + migrateCurrency: AugmentedSubmittable<(stash: AccountId32 | string | Uint8Array) => SubmittableExtrinsic, [AccountId32]>; /** * Declare the desire to nominate `targets` for the origin controller. * @@ -3290,26 +3871,48 @@ declare module '@polkadot/api-base/types/submittable' { **/ nominate: AugmentedSubmittable<(targets: Vec | (MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array)[]) => SubmittableExtrinsic, [Vec]>; /** - * Pay out all the stakers behind a single validator for a single era. + * Pay out next page of the stakers behind a validator for the given era. * - * - `validator_stash` is the stash account of the validator. Their nominators, up to - * `T::MaxNominatorRewardedPerValidator`, will also receive their rewards. + * - `validator_stash` is the stash account of the validator. * - `era` may be any era between `[current_era - history_depth; current_era]`. * * The origin of this call must be _Signed_. Any account can call this function, even if * it is not one of the stakers. * - * ## Complexity - * - At most O(MaxNominatorRewardedPerValidator). + * The reward payout could be paged in case there are too many nominators backing the + * `validator_stash`. This call will payout unpaid pages in an ascending order. To claim a + * specific page, use `payout_stakers_by_page`.` + * + * If all pages are claimed, it returns an error `InvalidPage`. **/ payoutStakers: AugmentedSubmittable<(validatorStash: AccountId32 | string | Uint8Array, era: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [AccountId32, u32]>; - payoutStakersBySystem: AugmentedSubmittable<(validatorStash: AccountId32 | string | Uint8Array, era: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [AccountId32, u32]>; + /** + * Pay out a page of the stakers behind a validator for the given era and page. + * + * - `validator_stash` is the stash account of the validator. + * - `era` may be any era between `[current_era - history_depth; current_era]`. + * - `page` is the page index of nominators to pay out with value between 0 and + * `num_nominators / T::MaxExposurePageSize`. + * + * The origin of this call must be _Signed_. Any account can call this function, even if + * it is not one of the stakers. + * + * If a validator has more than [`Config::MaxExposurePageSize`] nominators backing + * them, then the list of nominators is paged, with each page being capped at + * [`Config::MaxExposurePageSize`.] If a validator has more than one page of nominators, + * the call needs to be made for each page separately in order for all the nominators + * backing a validator to receive the reward. The nominators are not sorted across pages + * and so it should not be assumed the highest staker would be on the topmost page and vice + * versa. If rewards are not claimed in [`Config::HistoryDepth`] eras, they are lost. + **/ + payoutStakersByPage: AugmentedSubmittable<(validatorStash: AccountId32 | string | Uint8Array, era: u32 | AnyNumber | Uint8Array, page: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [AccountId32, u32, u32]>; /** * Remove all data structures concerning a staker/stash once it is at a state where it can * be considered `dust` in the staking system. The requirements are: * * 1. the `total_balance` of the stash is below existential deposit. * 2. or, the `ledger.total` of the stash is below existential deposit. + * 3. or, existential deposit is zero and either `total_balance` or `ledger.total` is zero. * * The former can happen in cases like a slash; the latter when a fully unbonded account * is still receiving staking rewards in `RewardDestination::Staked`. @@ -3317,6 +3920,11 @@ declare module '@polkadot/api-base/types/submittable' { * It can be called by anyone, as long as `stash` meets the above requirements. * * Refunds the transaction fees upon successful execution. + * + * ## Parameters + * + * - `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + * details. **/ reapStash: AugmentedSubmittable<(stash: AccountId32 | string | Uint8Array, numSlashingSpans: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [AccountId32, u32]>; /** @@ -3330,17 +3938,21 @@ declare module '@polkadot/api-base/types/submittable' { **/ rebond: AugmentedSubmittable<(value: Compact | AnyNumber | Uint8Array) => SubmittableExtrinsic, [Compact]>; /** - * Remove an identity from the pool of (wannabe) validator identities. Effects are known in the next session. + * Restores the state of a ledger which is in an inconsistent state. * - * The dispatch origin must be Root. + * The requirements to restore a ledger are the following: + * * The stash is bonded; or + * * The stash is not bonded but it has a staking lock left behind; or + * * If the stash has an associated ledger and its state is inconsistent; or + * * If the ledger is not corrupted *but* its staking lock is out of sync. * - * # Arguments - * * origin Required origin for removing a potential validator. - * * identity Validator's IdentityId. + * The `maybe_*` input parameters will overwrite the corresponding data and metadata of the + * ledger associated with the stash. If the input parameters are not set, the ledger will + * be reset values from on-chain state. **/ - removePermissionedValidator: AugmentedSubmittable<(identity: PolymeshPrimitivesIdentityId | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesIdentityId]>; + restoreLedger: AugmentedSubmittable<(stash: AccountId32 | string | Uint8Array, maybeController: Option | null | Uint8Array | AccountId32 | string, maybeTotal: Option | null | Uint8Array | u128 | AnyNumber, maybeUnlocking: Option> | null | Uint8Array | Vec | (PalletStakingUnlockChunk | { value?: any; era?: any } | string | Uint8Array)[]) => SubmittableExtrinsic, [AccountId32, Option, Option, Option>]>; /** - * Scale up the ideal number of validators by a factor upto maximum of + * Scale up the ideal number of validators by a factor up to maximum of * `ElectionProviderBase::MaxWinners`. * * The dispatch origin must be Root. @@ -3350,15 +3962,10 @@ declare module '@polkadot/api-base/types/submittable' { **/ scaleValidatorCount: AugmentedSubmittable<(factor: Percent | AnyNumber | Uint8Array) => SubmittableExtrinsic, [Percent]>; /** - * Changes commission rate which applies to all validators. Only Governance - * committee is allowed to change this value. - * - * # Arguments - * * `new_cap` the new commission cap. - **/ - setCommissionCap: AugmentedSubmittable<(newCap: Perbill | AnyNumber | Uint8Array) => SubmittableExtrinsic, [Perbill]>; - /** - * (Re-)set the controller of a stash. + * (Re-)sets the controller of a stash to the stash itself. This function previously + * accepted a `controller` argument to set the controller to an account other than the + * stash itself. This functionality has now been removed, now only setting the controller + * to the stash, if it is not already. * * Effects will be felt instantly (as soon as this function is completed successfully). * @@ -3370,7 +3977,7 @@ declare module '@polkadot/api-base/types/submittable' { * - Contains a limited number of reads. * - Writes are limited to the `origin` account key. **/ - setController: AugmentedSubmittable<(controller: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array) => SubmittableExtrinsic, [MultiAddress]>; + setController: AugmentedSubmittable<() => SubmittableExtrinsic, []>; /** * Set the validators who cannot be slashed (if any). * @@ -3418,7 +4025,7 @@ declare module '@polkadot/api-base/types/submittable' { * NOTE: Existing nominators and validators will not be affected by this update. * to kick people under the new limits, `chill_other` should be called. **/ - setStakingConfigs: AugmentedSubmittable<(minNominatorBond: PalletStakingPalletConfigOpU128 | { Noop: any } | { Set: any } | { Remove: any } | string | Uint8Array, minValidatorBond: PalletStakingPalletConfigOpU128 | { Noop: any } | { Set: any } | { Remove: any } | string | Uint8Array, maxNominatorCount: PalletStakingPalletConfigOpU32 | { Noop: any } | { Set: any } | { Remove: any } | string | Uint8Array, maxValidatorCount: PalletStakingPalletConfigOpU32 | { Noop: any } | { Set: any } | { Remove: any } | string | Uint8Array, chillThreshold: PalletStakingPalletConfigOpPercent | { Noop: any } | { Set: any } | { Remove: any } | string | Uint8Array, minCommission: PalletStakingPalletConfigOpPerbill | { Noop: any } | { Set: any } | { Remove: any } | string | Uint8Array) => SubmittableExtrinsic, [PalletStakingPalletConfigOpU128, PalletStakingPalletConfigOpU128, PalletStakingPalletConfigOpU32, PalletStakingPalletConfigOpU32, PalletStakingPalletConfigOpPercent, PalletStakingPalletConfigOpPerbill]>; + setStakingConfigs: AugmentedSubmittable<(minNominatorBond: PalletStakingPalletConfigOpU128 | { Noop: any } | { Set: any } | { Remove: any } | string | Uint8Array, minValidatorBond: PalletStakingPalletConfigOpU128 | { Noop: any } | { Set: any } | { Remove: any } | string | Uint8Array, maxNominatorCount: PalletStakingPalletConfigOpU32 | { Noop: any } | { Set: any } | { Remove: any } | string | Uint8Array, maxValidatorCount: PalletStakingPalletConfigOpU32 | { Noop: any } | { Set: any } | { Remove: any } | string | Uint8Array, chillThreshold: PalletStakingPalletConfigOpPercent | { Noop: any } | { Set: any } | { Remove: any } | string | Uint8Array, minCommission: PalletStakingPalletConfigOpPerbill | { Noop: any } | { Set: any } | { Remove: any } | string | Uint8Array, maxStakedRewards: PalletStakingPalletConfigOpPercent | { Noop: any } | { Set: any } | { Remove: any } | string | Uint8Array) => SubmittableExtrinsic, [PalletStakingPalletConfigOpU128, PalletStakingPalletConfigOpU128, PalletStakingPalletConfigOpU32, PalletStakingPalletConfigOpU32, PalletStakingPalletConfigOpPercent, PalletStakingPalletConfigOpPerbill, PalletStakingPalletConfigOpPercent]>; /** * Sets the ideal number of validators. * @@ -3431,7 +4038,7 @@ declare module '@polkadot/api-base/types/submittable' { /** * Schedule a portion of the stash to be unlocked ready for transfer out after the bond * period ends. If this leaves an amount actively bonded less than - * T::Currency::minimum_balance(), then it is increased to the full amount. + * [`asset::existential_deposit`], then it is increased to the full amount. * * The dispatch origin for this call must be _Signed_ by the controller, not the stash. * @@ -3451,9 +4058,14 @@ declare module '@polkadot/api-base/types/submittable' { **/ unbond: AugmentedSubmittable<(value: Compact | AnyNumber | Uint8Array) => SubmittableExtrinsic, [Compact]>; /** - * Sets the intended count to `new_intended_count` for the given `identity`. + * Migrates an account's `RewardDestination::Controller` to + * `RewardDestination::Account(controller)`. + * + * Effects will be felt instantly (as soon as this function is completed successfully). + * + * This will waive the transaction fee if the `payee` is successfully migrated. **/ - updatePermissionedValidatorIntendedCount: AugmentedSubmittable<(identity: PolymeshPrimitivesIdentityId | string | Uint8Array, newIntendedCount: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesIdentityId, u32]>; + updatePayee: AugmentedSubmittable<(controller: AccountId32 | string | Uint8Array) => SubmittableExtrinsic, [AccountId32]>; /** * Declare the desire to validate for the origin controller. * @@ -3462,19 +4074,11 @@ declare module '@polkadot/api-base/types/submittable' { * The dispatch origin for this call must be _Signed_ by the controller, not the stash. **/ validate: AugmentedSubmittable<(prefs: PalletStakingValidatorPrefs | { commission?: any; blocked?: any } | string | Uint8Array) => SubmittableExtrinsic, [PalletStakingValidatorPrefs]>; - /** - * Validate the nominators CDD expiry time. - * - * If an account from a given set of address is nominating then check the CDD expiry time - * of it and if it is expired then the account should be unbonded and removed from the - * nominating process. - **/ - validateCddExpiryNominators: AugmentedSubmittable<(targets: Vec | (AccountId32 | string | Uint8Array)[]) => SubmittableExtrinsic, [Vec]>; /** * Remove any unlocked chunks from the `unlocking` queue from our management. * - * This essentially frees up that balance to be used by the stash account to do - * whatever it wants. + * This essentially frees up that balance to be used by the stash account to do whatever + * it wants. * * The dispatch origin for this call must be _Signed_ by the controller. * @@ -3482,6 +4086,15 @@ declare module '@polkadot/api-base/types/submittable' { * * See also [`Call::unbond`]. * + * ## Parameters + * + * - `num_slashing_spans` indicates the number of metadata slashing spans to clear when + * this call results in a complete removal of all the data related to the stash account. + * In this case, the `num_slashing_spans` must be larger or equal to the number of + * slashing spans associated with the stash account in the [`SlashingSpans`] storage type, + * otherwise the call will fail. The call weight is directly proportional to + * `num_slashing_spans`. + * * ## Complexity * O(S) where S is the number of slashing spans to remove * NOTE: Weight annotation is the kill scenario, we refund otherwise. @@ -3571,81 +4184,181 @@ declare module '@polkadot/api-base/types/submittable' { }; sto: { /** - * Create a new fundraiser. + * Create a new fundraiser for a security token offering. * - * * `offering_portfolio` - Portfolio containing the `offering_asset`. - * * `offering_asset` - Asset being offered. - * * `raising_portfolio` - Portfolio containing the `raising_asset`. - * * `raising_asset` - Asset being exchanged for `offering_asset` on investment. - * * `tiers` - Price tiers to charge investors on investment. - * * `venue_id` - Venue to handle settlement. - * * `start` - Fundraiser start time, if `None` the fundraiser will start immediately. - * * `end` - Fundraiser end time, if `None` the fundraiser will never expire. - * * `minimum_investment` - Minimum amount of `raising_asset` that an investor needs to spend to invest in this raise. - * * `fundraiser_name` - Fundraiser name, only used in the UIs. + * This function creates a tiered pricing fundraiser where investors can purchase + * tokens at different price points. The fundraiser uses Polymesh's settlement + * infrastructure to ensure compliant and secure token transfers. * - * # Permissions - * * Asset - * * Portfolio + * # Parameters + * * `offering_portfolio` - Portfolio containing the tokens being offered for sale + * * `offering_asset` - Asset ID of the security token being sold + * * `raising_portfolio` - Portfolio that will receive the raised funds + * * `raising_asset` - Asset ID of the payment token (e.g., POLYX, stablecoin) + * * `tiers` - Vector of price tiers (1-10 tiers), each with total amount and price per unit + * * `venue_id` - STO venue ID for handling settlements (must be owned by caller) + * * `start` - Optional start time; if `None`, fundraiser begins immediately + * * `end` - Optional end time; if `None`, fundraiser runs indefinitely + * * `minimum_investment` - Minimum amount of `raising_asset` required per investment + * * `fundraiser_name` - Human-readable name for UI display (length limited) + * + * # Permissions Required + * * **Asset Agent**: Caller must be an authorized external agent for `offering_asset` + * * **Portfolio Custody**: Caller must have custody of both `offering_portfolio` and `raising_portfolio` + * * **Venue Ownership**: The specified `venue_id` must be an STO venue owned by the caller + * + * # Errors + * * `InvalidVenue` - Venue doesn't exist, wrong type, or not owned by caller + * * `InvalidPriceTiers` - Invalid tier configuration (0 tiers, >10 tiers, zero amounts) + * * `InvalidOfferingWindow` - Start time is after end time + * * `Overflow` - Total offering amount calculation overflowed **/ createFundraiser: AugmentedSubmittable<(offeringPortfolio: PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array, offeringAsset: PolymeshPrimitivesAssetAssetId | string | Uint8Array, raisingPortfolio: PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array, raisingAsset: PolymeshPrimitivesAssetAssetId | string | Uint8Array, tiers: Vec | (PalletStoPriceTier | { total?: any; price?: any } | string | Uint8Array)[], venueId: u64 | AnyNumber | Uint8Array, start: Option | null | Uint8Array | u64 | AnyNumber, end: Option | null | Uint8Array | u64 | AnyNumber, minimumInvestment: u128 | AnyNumber | Uint8Array, fundraiserName: Bytes | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesAssetAssetId, Vec, u64, Option, Option, u128, Bytes]>; /** - * Freeze a fundraiser. + * Enable off-chain funding support for a fundraiser. * - * * `offering_asset` - Asset to freeze. - * * `id` - ID of the fundraiser to freeze. + * This function allows a fundraiser to accept off-chain payments through + * cryptographically signed receipts. Once enabled, investors can use the + * `invest` function with `FundingMethod::OffChain` to provide payment + * receipts instead of on-chain portfolio transfers. * - * # Permissions - * * Asset + * # Parameters + * * `offering_asset` - Asset ID associated with the fundraiser + * * `fundraiser_id` - Unique identifier of the fundraiser to enable off-chain funding for + * * `ticker` - Ticker symbol of the off-chain asset that will be accepted as payment + * + * # Permissions Required + * * **Asset Agent**: Caller must be an authorized external agent for `offering_asset` + * OR be the original creator of the fundraiser + * + * # Errors + * * `FundraiserNotFound` - Specified fundraiser doesn't exist + * * `FundraiserClosed` - Fundraiser has been permanently closed + * * `Unauthorized` - Caller lacks required permissions **/ - freezeFundraiser: AugmentedSubmittable<(offeringAsset: PolymeshPrimitivesAssetAssetId | string | Uint8Array, id: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u64]>; + enableOffchainFunding: AugmentedSubmittable<(offeringAsset: PolymeshPrimitivesAssetAssetId | string | Uint8Array, fundraiserId: u64 | AnyNumber | Uint8Array, ticker: PolymeshPrimitivesTicker | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u64, PolymeshPrimitivesTicker]>; /** - * Invest in a fundraiser. + * Temporarily freeze a fundraiser to prevent new investments. * - * * `investment_portfolio` - Portfolio that `offering_asset` will be deposited in. - * * `funding_portfolio` - Portfolio that will fund the investment. - * * `offering_asset` - Asset to invest in. - * * `id` - ID of the fundraiser to invest in. - * * `purchase_amount` - Amount of `offering_asset` to purchase. - * * `max_price` - Maximum price to pay per unit of `offering_asset`, If `None`there are no constraints on price. - * * `receipt` - Off-chain receipt to use instead of on-chain balance in `funding_portfolio`. + * When a fundraiser is frozen, it cannot accept new investments but remains + * otherwise intact. This is useful for pausing activity while resolving + * issues or during maintenance periods. The fundraiser can be unfrozen + * later to resume normal operations. * - * # Permissions - * * Portfolio + * # Parameters + * * `offering_asset` - Asset ID associated with the fundraiser to freeze + * * `fundraiser_id` - Unique identifier of the fundraiser to freeze + * + * # Permissions Required + * * **Asset Agent**: Caller must be an authorized external agent for `offering_asset` + * + * # Errors + * * `FundraiserNotFound` - Specified fundraiser doesn't exist + * * `FundraiserClosed` - Fundraiser has already been permanently closed + * * `Unauthorized` - Caller lacks required asset agent permissions **/ - invest: AugmentedSubmittable<(investmentPortfolio: PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array, fundingPortfolio: PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array, offeringAsset: PolymeshPrimitivesAssetAssetId | string | Uint8Array, id: u64 | AnyNumber | Uint8Array, purchaseAmount: u128 | AnyNumber | Uint8Array, maxPrice: Option | null | Uint8Array | u128 | AnyNumber, receipt: Option | null | Uint8Array | PolymeshPrimitivesSettlementReceiptDetails | { uid?: any; instructionId?: any; legId?: any; signer?: any; signature?: any; metadata?: any } | string) => SubmittableExtrinsic, [PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesAssetAssetId, u64, u128, Option, Option]>; + freezeFundraiser: AugmentedSubmittable<(offeringAsset: PolymeshPrimitivesAssetAssetId | string | Uint8Array, fundraiserId: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u64]>; /** - * Modify the time window a fundraiser is active + * Invest in a fundraiser using on-chain or off-chain funding. * - * * `offering_asset` - Asset to modify. - * * `id` - ID of the fundraiser to modify. - * * `start` - New start of the fundraiser. - * * `end` - New end of the fundraiser to modify. + * This function allows investors to purchase tokens from an active fundraiser. + * The investment is processed through multiple price tiers in order, starting + * with the lowest-priced tier. The purchase creates a settlement instruction + * that transfers tokens and payment between the appropriate portfolios. * - * # Permissions - * * Asset + * # Parameters + * * `offering_asset` - Asset ID of the security token being purchased + * * `fundraiser_id` - Unique identifier of the fundraiser to invest in + * * `investment_portfolio` - Portfolio where purchased tokens will be deposited + * * `funding` - Payment method: either `OnChain(portfolio_id)` for on-chain assets + * or `OffChain(receipt_details)` for off-chain receipts with signature verification + * * `purchase_amount` - Number of `offering_asset` tokens to purchase + * * `max_price` - Optional maximum price per token; if specified, investment fails + * if the blended price across tiers exceeds this limit + * + * # Permissions Required + * * **Portfolio Custody**: Caller must have custody of `investment_portfolio` + * * **Funding Portfolio**: If using on-chain funding, caller must have custody + * of the funding portfolio specified in the `FundingMethod` + * + * # Errors + * * `FundraiserNotFound` - Specified fundraiser doesn't exist + * * `FundraiserNotLive` - Fundraiser is frozen or closed + * * `FundraiserExpired` - Current time is outside fundraiser's active window + * * `InsufficientTokensRemaining` - Not enough tokens available across all tiers + * * `InvestmentAmountTooLow` - Total cost is below minimum investment threshold + * * `MaxPriceExceeded` - Blended price exceeds investor's maximum price limit + * * `OffchainFundingNotAllowed` - Off-chain funding not enabled for this fundraiser + * * `InvalidSignature` - Off-chain receipt signature verification failed **/ - modifyFundraiserWindow: AugmentedSubmittable<(offeringAsset: PolymeshPrimitivesAssetAssetId | string | Uint8Array, id: u64 | AnyNumber | Uint8Array, start: u64 | AnyNumber | Uint8Array, end: Option | null | Uint8Array | u64 | AnyNumber) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u64, u64, Option]>; + invest: AugmentedSubmittable<(offeringAsset: PolymeshPrimitivesAssetAssetId | string | Uint8Array, fundraiserId: u64 | AnyNumber | Uint8Array, investmentPortfolio: PolymeshPrimitivesIdentityIdPortfolioId | { did?: any; kind?: any } | string | Uint8Array, funding: PalletStoFundingMethod | { OnChain: any } | { OffChain: any } | string | Uint8Array, purchaseAmount: u128 | AnyNumber | Uint8Array, maxPrice: Option | null | Uint8Array | u128 | AnyNumber) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u64, PolymeshPrimitivesIdentityIdPortfolioId, PalletStoFundingMethod, u128, Option]>; /** - * Stop a fundraiser. + * Modify the time window when a fundraiser is active for investments. * - * * `offering_asset` - Asset to stop. - * * `id` - ID of the fundraiser to stop. + * This function allows authorized agents to update the start and end times + * of an active fundraiser. This can be useful for extending fundraising + * periods, adjusting launch timing, or responding to market conditions. + * The fundraiser must not be permanently closed to modify its window. * - * # Permissions - * * Asset + * # Parameters + * * `offering_asset` - Asset ID associated with the fundraiser to modify + * * `fundraiser_id` - Unique identifier of the fundraiser to modify + * * `start` - New start time for the fundraiser (can be in the past or future) + * * `end` - New optional end time; if `None`, the fundraiser runs indefinitely + * + * # Permissions Required + * * **Asset Agent**: Caller must be an authorized external agent for `offering_asset` + * + * # Errors + * * `FundraiserNotFound` - Specified fundraiser doesn't exist + * * `FundraiserClosed` - Fundraiser has been permanently closed + * * `FundraiserExpired` - Fundraiser has already expired (past its original end time) + * * `InvalidOfferingWindow` - New start time is after new end time + * * `Unauthorized` - Caller lacks required asset agent permissions **/ - stop: AugmentedSubmittable<(offeringAsset: PolymeshPrimitivesAssetAssetId | string | Uint8Array, id: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u64]>; + modifyFundraiserWindow: AugmentedSubmittable<(offeringAsset: PolymeshPrimitivesAssetAssetId | string | Uint8Array, fundraiserId: u64 | AnyNumber | Uint8Array, start: u64 | AnyNumber | Uint8Array, end: Option | null | Uint8Array | u64 | AnyNumber) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u64, u64, Option]>; /** - * Unfreeze a fundraiser. + * Permanently stop a fundraiser and unlock remaining tokens. * - * * `offering_asset` - Asset to unfreeze. - * * `id` - ID of the fundraiser to unfreeze. + * This function permanently closes a fundraiser, preventing any further + * investments. Any remaining tokens that haven't been sold are unlocked + * and returned to the offering portfolio. Once stopped, a fundraiser + * cannot be restarted. * - * # Permissions - * * Asset + * # Parameters + * * `offering_asset` - Asset ID associated with the fundraiser to stop + * * `fundraiser_id` - Unique identifier of the fundraiser to stop + * + * # Permissions Required + * * **Asset Agent**: Caller must be an authorized external agent for `offering_asset` + * OR be the original creator of the fundraiser + * + * # Errors + * * `FundraiserNotFound` - Specified fundraiser doesn't exist + * * `FundraiserClosed` - Fundraiser has already been permanently closed + * * `Unauthorized` - Caller lacks required permissions + **/ + stop: AugmentedSubmittable<(offeringAsset: PolymeshPrimitivesAssetAssetId | string | Uint8Array, fundraiserId: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u64]>; + /** + * Resume a frozen fundraiser to allow new investments. + * + * This function unfreezes a previously frozen fundraiser, returning it to + * the Live status where it can accept new investments. The fundraiser + * must not be permanently closed for this operation to succeed. + * + * # Parameters + * * `offering_asset` - Asset ID associated with the fundraiser to unfreeze + * * `fundraiser_id` - Unique identifier of the fundraiser to unfreeze + * + * # Permissions Required + * * **Asset Agent**: Caller must be an authorized external agent for `offering_asset` + * + * # Errors + * * `FundraiserNotFound` - Specified fundraiser doesn't exist + * * `FundraiserClosed` - Fundraiser has been permanently closed and cannot be unfrozen + * * `Unauthorized` - Caller lacks required asset agent permissions **/ - unfreezeFundraiser: AugmentedSubmittable<(offeringAsset: PolymeshPrimitivesAssetAssetId | string | Uint8Array, id: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u64]>; + unfreezeFundraiser: AugmentedSubmittable<(offeringAsset: PolymeshPrimitivesAssetAssetId | string | Uint8Array, fundraiserId: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesAssetAssetId, u64]>; /** * Generic tx **/ @@ -3653,15 +4366,13 @@ declare module '@polkadot/api-base/types/submittable' { }; sudo: { /** - * Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo key. + * Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo + * key. * * The dispatch origin for this call must be _Signed_. * - * # + * ## Complexity * - O(1). - * - Limited storage reads. - * - One DB change. - * # **/ setKey: AugmentedSubmittable<(updated: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array) => SubmittableExtrinsic, [MultiAddress]>; /** @@ -3669,12 +4380,8 @@ declare module '@polkadot/api-base/types/submittable' { * * The dispatch origin for this call must be _Signed_. * - * # + * ## Complexity * - O(1). - * - Limited storage reads. - * - One DB write (event). - * - Weight of derivative `call` execution + 10,000. - * # **/ sudo: AugmentedSubmittable<(call: Call | IMethod | string | Uint8Array) => SubmittableExtrinsic, [Call]>; /** @@ -3683,12 +4390,8 @@ declare module '@polkadot/api-base/types/submittable' { * * The dispatch origin for this call must be _Signed_. * - * # + * ## Complexity * - O(1). - * - Limited storage reads. - * - One DB write (event). - * - Weight of derivative `call` execution + 10,000. - * # **/ sudoAs: AugmentedSubmittable<(who: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, call: Call | IMethod | string | Uint8Array) => SubmittableExtrinsic, [MultiAddress, Call]>; /** @@ -3698,10 +4401,8 @@ declare module '@polkadot/api-base/types/submittable' { * * The dispatch origin for this call must be _Signed_. * - * # + * ## Complexity * - O(1). - * - The weight of this call is defined by the caller. - * # **/ sudoUncheckedWeight: AugmentedSubmittable<(call: Call | IMethod | string | Uint8Array, weight: SpWeightsWeightV2Weight | { refTime?: any; proofSize?: any } | string | Uint8Array) => SubmittableExtrinsic, [Call, SpWeightsWeightV2Weight]>; /** @@ -3710,6 +4411,36 @@ declare module '@polkadot/api-base/types/submittable' { [key: string]: SubmittableExtrinsicFunction; }; system: { + /** + * Provide the preimage (runtime binary) `code` for an upgrade that has been authorized. + * + * If the authorization required a version check, this call will ensure the spec name + * remains unchanged and that the spec version has increased. + * + * Depending on the runtime's `OnSetCode` configuration, this function may directly apply + * the new `code` in the same block or attempt to schedule the upgrade. + * + * All origins are allowed. + **/ + applyAuthorizedUpgrade: AugmentedSubmittable<(code: Bytes | string | Uint8Array) => SubmittableExtrinsic, [Bytes]>; + /** + * Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + * later. + * + * This call requires Root origin. + **/ + authorizeUpgrade: AugmentedSubmittable<(codeHash: H256 | string | Uint8Array) => SubmittableExtrinsic, [H256]>; + /** + * Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + * later. + * + * WARNING: This authorizes an upgrade that will take place without any safety checks, for + * example that the spec name remains the same and that the version number increases. Not + * recommended for normal use. Use `authorize_upgrade` instead. + * + * This call requires Root origin. + **/ + authorizeUpgradeWithoutChecks: AugmentedSubmittable<(codeHash: H256 | string | Uint8Array) => SubmittableExtrinsic, [H256]>; /** * Kill all storage items with a key that starts with the given prefix. * @@ -3724,8 +4455,7 @@ declare module '@polkadot/api-base/types/submittable' { /** * Make some on-chain remark. * - * ## Complexity - * - `O(1)` + * Can be executed by every `origin`. **/ remark: AugmentedSubmittable<(remark: Bytes | string | Uint8Array) => SubmittableExtrinsic, [Bytes]>; /** @@ -3734,16 +4464,13 @@ declare module '@polkadot/api-base/types/submittable' { remarkWithEvent: AugmentedSubmittable<(remark: Bytes | string | Uint8Array) => SubmittableExtrinsic, [Bytes]>; /** * Set the new runtime code. - * - * ## Complexity - * - `O(C + S)` where `C` length of `code` and `S` complexity of `can_set_code` **/ setCode: AugmentedSubmittable<(code: Bytes | string | Uint8Array) => SubmittableExtrinsic, [Bytes]>; /** * Set the new runtime code without doing any checks of the given `code`. * - * ## Complexity - * - `O(C)` where `C` length of `code` + * Note that runtime upgrades will not run if this is called with a not-increasing spec + * version! **/ setCodeWithoutChecks: AugmentedSubmittable<(code: Bytes | string | Uint8Array) => SubmittableExtrinsic, [Bytes]>; /** @@ -3766,7 +4493,7 @@ declare module '@polkadot/api-base/types/submittable' { * # Arguments * * `expiry` - The new expiry time. **/ - setExpiresAfter: AugmentedSubmittable<(expiry: PolymeshCommonUtilitiesMaybeBlock | { Some: any } | { None: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshCommonUtilitiesMaybeBlock]>; + setExpiresAfter: AugmentedSubmittable<(expiry: PolymeshPrimitivesMaybeBlock | { Some: any } | { None: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesMaybeBlock]>; /** * Changes the release coordinator. * @@ -3910,43 +4637,6 @@ declare module '@polkadot/api-base/types/submittable' { **/ [key: string]: SubmittableExtrinsicFunction; }; - testUtils: { - /** - * Emits an event with caller's identity and CDD status. - **/ - getCddOf: AugmentedSubmittable<(of: AccountId32 | string | Uint8Array) => SubmittableExtrinsic, [AccountId32]>; - /** - * Emits an event with caller's identity. - **/ - getMyDid: AugmentedSubmittable<() => SubmittableExtrinsic, []>; - /** - * Registers a new Identity for the `target_account` and issues a CDD claim to it. - * - * # Failure - * - `origin` has to be an active CDD provider. Inactive CDD providers cannot add new - * claims. - * - `target_account` (primary key of the new Identity) can be linked to just one and only - * one identity. - **/ - mockCddRegisterDid: AugmentedSubmittable<(targetAccount: AccountId32 | string | Uint8Array) => SubmittableExtrinsic, [AccountId32]>; - /** - * Generates a new `IdentityID` for the caller, and issues a self-generated CDD claim. - * - * The caller account will be the primary key of that identity. - * For each account of `secondary_keys`, a new `JoinIdentity` authorization is created, so - * each of them will need to accept it before become part of this new `IdentityID`. - * - * # Errors - * - `AlreadyLinked` if the caller account or if any of the given `secondary_keys` has already linked to an `IdentityID` - * - `SecondaryKeysContainPrimaryKey` if `secondary_keys` contains the caller account. - * - `DidAlreadyExists` if auto-generated DID already exists. - **/ - registerDid: AugmentedSubmittable<(secondaryKeys: Vec | (PolymeshPrimitivesSecondaryKey | { key?: any; permissions?: any } | string | Uint8Array)[]) => SubmittableExtrinsic, [Vec]>; - /** - * Generic tx - **/ - [key: string]: SubmittableExtrinsicFunction; - }; timestamp: { /** * Set the current time. @@ -3955,13 +4645,17 @@ declare module '@polkadot/api-base/types/submittable' { * phase, if this call hasn't been invoked by that time. * * The timestamp should be greater than the previous one by the amount specified by - * `MinimumPeriod`. + * [`Config::MinimumPeriod`]. * - * The dispatch origin for this call must be `Inherent`. + * The dispatch origin for this call must be _None_. + * + * This dispatch class is _Mandatory_ to ensure it gets executed in the block. Be aware + * that changing the complexity of this call could result exhausting the resources in a + * block to execute any other calls. * * ## Complexity * - `O(1)` (Note that implementations of `OnTimestampSet` must also be `O(1)`) - * - 1 storage read and 1 storage mutation (codec `O(1)`). (because of `DidUpdate::take` in + * - 1 storage read and 1 storage mutation (codec `O(1)` because of `DidUpdate::take` in * `on_finalize`) * - 1 event handler `on_timestamp_set`. Must be `O(1)`. **/ @@ -3971,6 +4665,13 @@ declare module '@polkadot/api-base/types/submittable' { **/ [key: string]: SubmittableExtrinsicFunction; }; + transactionPayment: { + setDisableFees: AugmentedSubmittable<(value: bool | boolean | Uint8Array) => SubmittableExtrinsic, [bool]>; + /** + * Generic tx + **/ + [key: string]: SubmittableExtrinsicFunction; + }; treasury: { /** * It transfers balances from treasury to each of beneficiaries and the specific amount @@ -4000,7 +4701,7 @@ declare module '@polkadot/api-base/types/submittable' { * # Arguments * * `expiry` - The new expiry time. **/ - setExpiresAfter: AugmentedSubmittable<(expiry: PolymeshCommonUtilitiesMaybeBlock | { Some: any } | { None: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshCommonUtilitiesMaybeBlock]>; + setExpiresAfter: AugmentedSubmittable<(expiry: PolymeshPrimitivesMaybeBlock | { Some: any } | { None: any } | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesMaybeBlock]>; /** * Changes the release coordinator. * @@ -4191,79 +4892,6 @@ declare module '@polkadot/api-base/types/submittable' { * - O(C) where C is the number of calls to be batched. **/ batchAll: AugmentedSubmittable<(calls: Vec | (Call | IMethod | string | Uint8Array)[]) => SubmittableExtrinsic, [Vec]>; - /** - * Dispatch multiple calls from the sender's origin. - * - * This will execute all calls, in order, stopping at the first failure, - * in which case the state changes are rolled back. - * On failure, an event `BatchInterruptedOld(failure_idx, error)` is deposited. - * - * May be called from root or a signed origin. - * - * # Parameters - * - `calls`: The calls to be dispatched from the same origin. - * - * # Weight - * - The sum of the weights of the `calls`. - * - One event. - * - * This will return `Ok` in all circumstances except an unsigned origin. - * To determine the success of the batch, an event is deposited. - * If any call failed, then `BatchInterruptedOld` is deposited. - * If all were successful, then the `BatchCompletedOld` event is deposited. - * - * POLYMESH: deprecated. - **/ - batchAtomic: AugmentedSubmittable<(calls: Vec | (Call | IMethod | string | Uint8Array)[]) => SubmittableExtrinsic, [Vec]>; - /** - * Dispatch multiple calls from the sender's origin. - * - * This will execute until the first one fails and then stop. - * - * May be called from root or a signed origin. - * - * # Parameters - * - `calls`: The calls to be dispatched from the same origin. - * - * # Weight - * - The sum of the weights of the `calls`. - * - One event. - * - * This will return `Ok` in all circumstances except an unsigned origin. To determine the success of the batch, an - * event is deposited. If a call failed and the batch was interrupted, then the - * `BatchInterruptedOld` event is deposited, along with the number of successful calls made - * and the error of the failed call. If all were successful, then the `BatchCompletedOld` - * event is deposited. - * - * POLYMESH: Renamed from `batch` and deprecated. - **/ - batchOld: AugmentedSubmittable<(calls: Vec | (Call | IMethod | string | Uint8Array)[]) => SubmittableExtrinsic, [Vec]>; - /** - * Dispatch multiple calls from the sender's origin. - * - * This will execute all calls, in order, irrespective of failures. - * Any failures will be available in a `BatchOptimisticFailed` event. - * - * May be called from root or a signed origin. - * - * # Parameters - * - `calls`: The calls to be dispatched from the same origin. - * - * - * # Weight - * - The sum of the weights of the `calls`. - * - One event. - * - * This will return `Ok` in all circumstances except an unsigned origin. - * To determine the success of the batch, an event is deposited. - * If any call failed, then `BatchOptimisticFailed` is deposited, - * with a vector of event counts for each call as well as a vector - * of errors. - * If all were successful, then the `BatchCompletedOld` event is deposited. - * - * POLYMESH: deprecated. - **/ - batchOptimistic: AugmentedSubmittable<(calls: Vec | (Call | IMethod | string | Uint8Array)[]) => SubmittableExtrinsic, [Vec]>; /** * Dispatches a function call with a provided origin. * @@ -4272,7 +4900,7 @@ declare module '@polkadot/api-base/types/submittable' { * ## Complexity * - O(1). **/ - dispatchAs: AugmentedSubmittable<(asOrigin: PolymeshRuntimeDevelopRuntimeOriginCaller | { system: any } | { Void: any } | { PolymeshCommittee: any } | { TechnicalCommittee: any } | { UpgradeCommittee: any } | string | Uint8Array, call: Call | IMethod | string | Uint8Array) => SubmittableExtrinsic, [PolymeshRuntimeDevelopRuntimeOriginCaller, Call]>; + dispatchAs: AugmentedSubmittable<(asOrigin: PolymeshRuntimeDevelopRuntimeOriginCaller | { system: any } | { PolymeshCommittee: any } | { TechnicalCommittee: any } | { UpgradeCommittee: any } | string | Uint8Array, call: Call | IMethod | string | Uint8Array) => SubmittableExtrinsic, [PolymeshRuntimeDevelopRuntimeOriginCaller, Call]>; /** * Send a batch of dispatch calls. * Unlike `batch`, it allows errors and won't interrupt. @@ -4319,5 +4947,48 @@ declare module '@polkadot/api-base/types/submittable' { **/ [key: string]: SubmittableExtrinsicFunction; }; + validators: { + /** + * Adds a permissioned identity and sets its preferences. + * + * The dispatch origin must be Root. + **/ + addPermissionedValidator: AugmentedSubmittable<(identity: PolymeshPrimitivesIdentityId | string | Uint8Array, intendedCount: Option | null | Uint8Array | u32 | AnyNumber) => SubmittableExtrinsic, [PolymeshPrimitivesIdentityId, Option]>; + /** + * Switch slashing status on the basis of given `slashing_switch`. Can only be called by root. + **/ + changeSlashingAllowedFor: AugmentedSubmittable<(slashingSwitch: PalletValidatorsSlashingSwitch | 'Validator' | 'ValidatorAndNominator' | 'None' | number | Uint8Array) => SubmittableExtrinsic, [PalletValidatorsSlashingSwitch]>; + /** + * Governance council forcefully chills a validator. Effects will be felt at the beginning of the next era. + **/ + chillFromGovernance: AugmentedSubmittable<(identity: PolymeshPrimitivesIdentityId | string | Uint8Array, stashKeys: Vec | (AccountId32 | string | Uint8Array)[]) => SubmittableExtrinsic, [PolymeshPrimitivesIdentityId, Vec]>; + payoutStakersBySystem: AugmentedSubmittable<(validatorStash: AccountId32 | string | Uint8Array, era: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [AccountId32, u32]>; + /** + * Remove an identity from the pool of (wannabe) validator identities. Effects are known in the next session. + * + * The dispatch origin must be Root. + * + * # Arguments + * * origin Required origin for removing a potential validator. + * * identity Validator's IdentityId. + **/ + removePermissionedValidator: AugmentedSubmittable<(identity: PolymeshPrimitivesIdentityId | string | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesIdentityId]>; + /** + * Changes commission rate which applies to all validators. Only Governance + * committee is allowed to change this value. + * + * # Arguments + * * `new_cap` the new commission cap. + **/ + setCommissionCap: AugmentedSubmittable<(newCap: Perbill | AnyNumber | Uint8Array) => SubmittableExtrinsic, [Perbill]>; + /** + * Sets the intended count to `new_intended_count` for the given `identity`. + **/ + updatePermissionedValidatorIntendedCount: AugmentedSubmittable<(identity: PolymeshPrimitivesIdentityId | string | Uint8Array, newIntendedCount: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [PolymeshPrimitivesIdentityId, u32]>; + /** + * Generic tx + **/ + [key: string]: SubmittableExtrinsicFunction; + }; } // AugmentedSubmittables } // declare module diff --git a/scripts/cli/src/interfaces/augment-types.ts b/scripts/cli/src/interfaces/augment-types.ts index d65c513aad..11759ca2cc 100644 --- a/scripts/cli/src/interfaces/augment-types.ts +++ b/scripts/cli/src/interfaces/augment-types.ts @@ -74,7 +74,7 @@ import type { ClassDetails, ClassId, ClassMetadata, DepositBalance, DepositBalan import type { Multisig, Timepoint } from '@polkadot/types/interfaces/utility'; import type { VestingInfo } from '@polkadot/types/interfaces/vesting'; import type { AssetInstance, AssetInstanceV0, AssetInstanceV1, AssetInstanceV2, BodyId, BodyPart, DoubleEncodedCall, Fungibility, FungibilityV0, FungibilityV1, FungibilityV2, InboundStatus, InstructionV2, InteriorMultiLocation, Junction, JunctionV0, JunctionV1, JunctionV2, Junctions, JunctionsV1, JunctionsV2, MultiAsset, MultiAssetFilter, MultiAssetFilterV1, MultiAssetFilterV2, MultiAssetV0, MultiAssetV1, MultiAssetV2, MultiAssets, MultiAssetsV1, MultiAssetsV2, MultiLocation, MultiLocationV0, MultiLocationV1, MultiLocationV2, NetworkId, OriginKindV0, OriginKindV1, OriginKindV2, OutboundStatus, Outcome, QueryId, QueryStatus, QueueConfigData, Response, ResponseV0, ResponseV1, ResponseV2, ResponseV2Error, ResponseV2Result, VersionMigrationStage, VersionedMultiAsset, VersionedMultiAssets, VersionedMultiLocation, VersionedResponse, VersionedXcm, WeightLimitV2, WildFungibility, WildFungibilityV0, WildFungibilityV1, WildFungibilityV2, WildMultiAsset, WildMultiAssetV1, WildMultiAssetV2, Xcm, XcmAssetId, XcmError, XcmErrorV0, XcmErrorV1, XcmErrorV2, XcmOrder, XcmOrderV0, XcmOrderV1, XcmOrderV2, XcmOrigin, XcmOriginKind, XcmV0, XcmV1, XcmV2, XcmVersion, XcmpMessageFormat } from '@polkadot/types/interfaces/xcm'; -import type { AGId, AffirmationCount, AgentGroup, AssetComplianceResult, AssetCount, AssetDidResult, AssetId, AssetPermissions, Authorization, AuthorizationData, AuthorizationType, CanTransferGranularReturn, CappedFee, CddId, CddStatus, Claim, ClaimType, ComplianceReport, ComplianceRequirementResult, Condition, ConditionReport, ConditionResult, ConditionType, CountryCode, CustomClaimTypeId, DidStatus, ExecuteInstructionInfo, ExtrinsicName, ExtrinsicNames, ExtrinsicPermissions, FungibleLeg, GranularCanTransferResult, IdentityClaim, IdentityId, InstructionId, KeyIdentityData, Leg, Member, NFTId, NFTs, NonFungibleLeg, OffChainLeg, PalletName, PalletPermissions, Percentage, Permissions, PipId, PortfolioId, PortfolioKind, PortfolioNumber, PortfolioPermissions, PortfolioValidityResult, ProtocolOp, RequirementReport, RpcDidRecords, RpcDidRecordsSuccess, Scope, SecondaryKey, Signatory, StatClaim, TargetIdentity, Ticker, TransferCondition, TransferConditionResult, TrustedFor, TrustedIssuer, VoteCount, VoteCountProposalFound } from 'polymesh-types/default'; +import type { AGId, AffirmationCount, AgentGroup, AssetComplianceResult, AssetCount, AssetDidResult, AssetPermissions, Authorization, AuthorizationData, AuthorizationNonce, AuthorizationType, CanTransferGranularReturn, CappedFee, CddId, CddStatus, Claim, ClaimType, ComplianceReport, ComplianceRequirementResult, Condition, ConditionReport, ConditionResult, ConditionType, CountryCode, CustomClaimTypeId, DidStatus, ExecuteInstructionInfo, ExtrinsicName, ExtrinsicNames, ExtrinsicPermissions, FundraiserId, FundraiserReceipt, FungibleLeg, GranularCanTransferResult, IdentityClaim, IdentityId, InstructionId, KeyIdentityData, Leg, LegId, Member, NFTId, NFTs, NonFungibleLeg, OffChainLeg, PalletName, PalletPermissions, Percentage, Permissions, PipId, PolymeshAssetId, PolymeshMoment, PortfolioId, PortfolioKind, PortfolioNumber, PortfolioPermissions, PortfolioValidityResult, ProtocolOp, Receipt, RequirementReport, RpcDidRecords, RpcDidRecordsSuccess, Scope, SecondaryKey, Signatory, StatClaim, TargetIdAuthorization, TargetIdentity, Ticker, TransferCondition, TransferConditionResult, TrustedFor, TrustedIssuer, VoteCount, VoteCountProposalFound } from 'polymesh-types/default'; declare module '@polkadot/types/types/registry' { interface InterfaceTypes { @@ -127,7 +127,6 @@ declare module '@polkadot/types/types/registry' { AssetDetails: AssetDetails; AssetDidResult: AssetDidResult; AssetId: AssetId; - AssetId: AssetId; AssetInstance: AssetInstance; AssetInstanceV0: AssetInstanceV0; AssetInstanceV1: AssetInstanceV1; @@ -152,6 +151,7 @@ declare module '@polkadot/types/types/registry' { AuthorityWeight: AuthorityWeight; Authorization: Authorization; AuthorizationData: AuthorizationData; + AuthorizationNonce: AuthorizationNonce; AuthorizationType: AuthorizationType; AvailabilityBitfield: AvailabilityBitfield; AvailabilityBitfieldRecord: AvailabilityBitfieldRecord; @@ -557,6 +557,8 @@ declare module '@polkadot/types/types/registry' { FunctionMetadataV9: FunctionMetadataV9; FundIndex: FundIndex; FundInfo: FundInfo; + FundraiserId: FundraiserId; + FundraiserReceipt: FundraiserReceipt; Fungibility: Fungibility; FungibilityV0: FungibilityV0; FungibilityV1: FungibilityV1; @@ -685,6 +687,7 @@ declare module '@polkadot/types/types/registry' { LeasePeriodOf: LeasePeriodOf; Leg: Leg; LegacyTransaction: LegacyTransaction; + LegId: LegId; Limits: Limits; LimitsTo264: LimitsTo264; LocalValidationData: LocalValidationData; @@ -888,6 +891,8 @@ declare module '@polkadot/types/types/registry' { PhragmenScore: PhragmenScore; PipId: PipId; Points: Points; + PolymeshAssetId: PolymeshAssetId; + PolymeshMoment: PolymeshMoment; PortableType: PortableType; PortableTypeV14: PortableTypeV14; PortfolioId: PortfolioId; @@ -939,6 +944,7 @@ declare module '@polkadot/types/types/registry' { ReadProof: ReadProof; ReadySolution: ReadySolution; Reasons: Reasons; + Receipt: Receipt; RecoveryConfig: RecoveryConfig; RefCount: RefCount; RefCountTo259: RefCountTo259; @@ -1175,6 +1181,7 @@ declare module '@polkadot/types/types/registry' { SystemInherentData: SystemInherentData; SystemOrigin: SystemOrigin; Tally: Tally; + TargetIdAuthorization: TargetIdAuthorization; TargetIdentity: TargetIdentity; TaskAddress: TaskAddress; TAssetBalance: TAssetBalance; diff --git a/scripts/cli/src/interfaces/default/types.ts b/scripts/cli/src/interfaces/default/types.ts index 8926f4ade3..b39c3de2a4 100644 --- a/scripts/cli/src/interfaces/default/types.ts +++ b/scripts/cli/src/interfaces/default/types.ts @@ -1,16 +1,16 @@ // Auto-generated via `yarn polkadot-types-from-defs`, do not edit /* eslint-disable */ -import type { Bytes, Enum, Option, Struct, Text, U8aFixed, Vec, bool, u32, u64 } from '@polkadot/types-codec'; +import type { BTreeMap, BTreeSet, Bytes, Enum, Option, Struct, Text, U8aFixed, Vec, bool, u128, u32, u64 } from '@polkadot/types-codec'; import type { ITuple } from '@polkadot/types-codec/types'; -import type { AccountId, Balance, Permill, Weight } from '@polkadot/types/interfaces/runtime'; +import type { AccountId, AccountId32, Balance, Permill, Weight } from '@polkadot/types/interfaces/runtime'; import type { DispatchError } from '@polkadot/types/interfaces/system'; /** @name AffirmationCount */ export interface AffirmationCount extends Struct { - readonly sender_asset_count: AssetCount; - readonly receiver_asset_count: AssetCount; - readonly offchain_count: u32; + readonly senderAssetCount: AssetCount; + readonly receiverAssetCount: AssetCount; + readonly offchainCount: u32; } /** @name AgentGroup */ @@ -36,9 +36,9 @@ export interface AssetComplianceResult extends Struct { /** @name AssetCount */ export interface AssetCount extends Struct { - readonly fungible_tokens: u32; - readonly non_fungible_tokens: u32; - readonly off_chain_assets: u32; + readonly fungibleTokens: u32; + readonly nonFungibleTokens: u32; + readonly offChainAssets: u32; } /** @name AssetDidResult */ @@ -50,25 +50,23 @@ export interface AssetDidResult extends Enum { readonly type: 'Ok' | 'Err'; } -/** @name AssetId */ -export interface AssetId extends U8aFixed {} - /** @name AssetPermissions */ export interface AssetPermissions extends Enum { readonly isWhole: boolean; readonly isThese: boolean; - readonly asThese: Vec; + readonly asThese: BTreeSet; readonly isExcept: boolean; - readonly asExcept: Vec; + readonly asExcept: BTreeSet; readonly type: 'Whole' | 'These' | 'Except'; } /** @name Authorization */ export interface Authorization extends Struct { - readonly authorization_data: AuthorizationData; - readonly authorized_by: IdentityId; - readonly expiry: Option; - readonly auth_id: u64; + readonly authorizationData: AuthorizationData; + readonly authorizedBy: IdentityId; + readonly expiry: Option; + readonly authId: u64; + readonly count: u32; } /** @name AuthorizationData */ @@ -81,20 +79,23 @@ export interface AuthorizationData extends Enum { readonly isAddMultiSigSigner: boolean; readonly asAddMultiSigSigner: AccountId; readonly isTransferAssetOwnership: boolean; - readonly asTransferAssetOwnership: AssetId; + readonly asTransferAssetOwnership: PolymeshAssetId; readonly isJoinIdentity: boolean; readonly asJoinIdentity: Permissions; readonly isPortfolioCustody: boolean; readonly asPortfolioCustody: PortfolioId; readonly isBecomeAgent: boolean; - readonly asBecomeAgent: ITuple<[AssetId, AgentGroup]>; + readonly asBecomeAgent: ITuple<[PolymeshAssetId, AgentGroup]>; readonly isAddRelayerPayingKey: boolean; - readonly asAddRelayerPayingKey: ITuple<[AccountId, AccountId, Balance]>; + readonly asAddRelayerPayingKey: ITuple<[AccountId32, AccountId32, u128]>; readonly isRotatePrimaryKeyToSecondary: boolean; readonly asRotatePrimaryKeyToSecondary: Permissions; readonly type: 'AttestPrimaryKeyRotation' | 'RotatePrimaryKey' | 'TransferTicker' | 'AddMultiSigSigner' | 'TransferAssetOwnership' | 'JoinIdentity' | 'PortfolioCustody' | 'BecomeAgent' | 'AddRelayerPayingKey' | 'RotatePrimaryKeyToSecondary'; } +/** @name AuthorizationNonce */ +export interface AuthorizationNonce extends u64 {} + /** @name AuthorizationType */ export interface AuthorizationType extends Enum { readonly isAttestPrimaryKeyRotation: boolean; @@ -177,22 +178,22 @@ export interface ClaimType extends Enum { /** @name ComplianceReport */ export interface ComplianceReport extends Struct { - readonly any_requirement_satistifed: bool; - readonly paused_compliance: bool; + readonly anyRequirementSatisfied: bool; + readonly pausedCompliance: bool; readonly requirements: Vec; } /** @name ComplianceRequirementResult */ export interface ComplianceRequirementResult extends Struct { - readonly sender_conditions: Vec; - readonly receiver_conditions: Vec; + readonly senderConditions: Vec; + readonly receiverConditions: Vec; readonly id: u32; readonly result: bool; } /** @name Condition */ export interface Condition extends Struct { - readonly condition_type: ConditionType; + readonly conditionType: ConditionType; readonly issuers: Vec; } @@ -491,10 +492,10 @@ export interface DidStatus extends Enum { /** @name ExecuteInstructionInfo */ export interface ExecuteInstructionInfo extends Struct { - readonly fungible_tokens: u32; - readonly non_fungible_tokens: u32; - readonly off_chain_assets: u32; - readonly consumed_weight: Weight; + readonly fungibleTokens: u32; + readonly nonFungibleTokens: u32; + readonly offChainAssets: u32; + readonly consumedWeight: Weight; readonly error: Option; } @@ -505,9 +506,9 @@ export interface ExtrinsicName extends Text {} export interface ExtrinsicNames extends Enum { readonly isWhole: boolean; readonly isThese: boolean; - readonly asThese: Vec; + readonly asThese: BTreeSet; readonly isExcept: boolean; - readonly asExcept: Vec; + readonly asExcept: BTreeSet; readonly type: 'Whole' | 'These' | 'Except'; } @@ -515,43 +516,57 @@ export interface ExtrinsicNames extends Enum { export interface ExtrinsicPermissions extends Enum { readonly isWhole: boolean; readonly isThese: boolean; - readonly asThese: Vec>; + readonly asThese: BTreeMap; readonly isExcept: boolean; - readonly asExcept: Vec>; + readonly asExcept: BTreeMap; readonly type: 'Whole' | 'These' | 'Except'; } +/** @name FundraiserId */ +export interface FundraiserId extends u64 {} + +/** @name FundraiserReceipt */ +export interface FundraiserReceipt extends Struct { + readonly uid: u64; + readonly fundraiserId: FundraiserId; + readonly legId: LegId; + readonly senderIdentity: IdentityId; + readonly receiverIdentity: IdentityId; + readonly ticker: Ticker; + readonly amount: Balance; +} + /** @name FungibleLeg */ export interface FungibleLeg extends Struct { readonly sender: PortfolioId; readonly receiver: PortfolioId; - readonly asset_id: AssetId; + readonly assetId: PolymeshAssetId; readonly amount: Balance; } /** @name GranularCanTransferResult */ export interface GranularCanTransferResult extends Struct { - readonly invalid_granularity: bool; - readonly self_transfer: bool; - readonly invalid_receiver_cdd: bool; - readonly invalid_sender_cdd: bool; - readonly receiver_custodian_error: bool; - readonly sender_custodian_error: bool; - readonly sender_insufficient_balance: bool; - readonly portfolio_validity_result: PortfolioValidityResult; - readonly asset_frozen: bool; - readonly transfer_condition_result: Vec; - readonly compliance_result: AssetComplianceResult; + readonly invalidGranularity: bool; + readonly selfTransfer: bool; + readonly invalidReceiverCdd: bool; + readonly invalidSenderCdd: bool; + readonly receiverCustodianError: bool; + readonly senderCustodianError: bool; + readonly senderInsufficientBalance: bool; + readonly portfolioValidityResult: PortfolioValidityResult; + readonly assetFrozen: bool; + readonly transferConditionResult: Vec; + readonly complianceResult: AssetComplianceResult; readonly result: bool; - readonly consumed_weight: Option; + readonly consumedWeight: Option; } /** @name IdentityClaim */ export interface IdentityClaim extends Struct { - readonly claim_issuer: IdentityId; - readonly issuance_date: Moment; - readonly last_update_date: Moment; - readonly expiry: Option; + readonly claimIssuer: IdentityId; + readonly issuanceDate: PolymeshMoment; + readonly lastUpdateDate: PolymeshMoment; + readonly expiry: Option; readonly claim: Claim; } @@ -578,22 +593,22 @@ export interface Leg extends Enum { readonly type: 'Fungible' | 'NonFungible' | 'OffChain'; } +/** @name LegId */ +export interface LegId extends u64 {} + /** @name Member */ export interface Member extends Struct { readonly id: IdentityId; - readonly expiry_at: Option; - readonly inactive_from: Option; + readonly expiryAt: Option; + readonly inactiveFrom: Option; } -/** @name Moment */ -export interface Moment extends u64 {} - /** @name NFTId */ export interface NFTId extends u64 {} /** @name NFTs */ export interface NFTs extends Struct { - readonly asset_id: AssetId; + readonly assetId: PolymeshAssetId; readonly ids: Vec; } @@ -606,9 +621,9 @@ export interface NonFungibleLeg extends Struct { /** @name OffChainLeg */ export interface OffChainLeg extends Struct { - readonly sender_identity: IdentityId; - readonly receiver_identity: IdentityId; - readonly asset_id: AssetId; + readonly senderIdentity: IdentityId; + readonly receiverIdentity: IdentityId; + readonly ticker: Ticker; readonly amount: Balance; } @@ -633,6 +648,12 @@ export interface Permissions extends Struct { /** @name PipId */ export interface PipId extends u32 {} +/** @name PolymeshAssetId */ +export interface PolymeshAssetId extends U8aFixed {} + +/** @name PolymeshMoment */ +export interface PolymeshMoment extends u64 {} + /** @name PortfolioId */ export interface PortfolioId extends Struct { readonly did: IdentityId; @@ -654,18 +675,18 @@ export interface PortfolioNumber extends u64 {} export interface PortfolioPermissions extends Enum { readonly isWhole: boolean; readonly isThese: boolean; - readonly asThese: Vec; + readonly asThese: BTreeSet; readonly isExcept: boolean; - readonly asExcept: Vec; + readonly asExcept: BTreeSet; readonly type: 'Whole' | 'These' | 'Except'; } /** @name PortfolioValidityResult */ export interface PortfolioValidityResult extends Struct { - readonly receiver_is_same_portfolio: bool; - readonly sender_portfolio_does_not_exist: bool; - readonly receiver_portfolio_does_not_exist: bool; - readonly sender_insufficient_balance: bool; + readonly receiverIsSamePortfolio: bool; + readonly senderPortfolioDoesNotExist: bool; + readonly receiverPortfolioDoesNotExist: bool; + readonly senderInsufficientBalance: bool; readonly result: bool; } @@ -690,12 +711,23 @@ export interface ProtocolOp extends Enum { readonly type: 'AssetRegisterTicker' | 'AssetIssue' | 'AssetAddDocuments' | 'AssetCreateAsset' | 'CheckpointCreateSchedule' | 'ComplianceManagerAddComplianceRequirement' | 'IdentityCddRegisterDid' | 'IdentityAddClaim' | 'IdentityAddSecondaryKeysWithAuthorization' | 'PipsPropose' | 'ContractsPutCode' | 'CorporateBallotAttachBallot' | 'CapitalDistributionDistribute' | 'NftCreateCollection' | 'NftMint' | 'IdentityCreateChildIdentity'; } +/** @name Receipt */ +export interface Receipt extends Struct { + readonly uid: u64; + readonly instructionId: InstructionId; + readonly legId: LegId; + readonly senderIdentity: IdentityId; + readonly receiverIdentity: IdentityId; + readonly ticker: Ticker; + readonly amount: Balance; +} + /** @name RequirementReport */ export interface RequirementReport extends Struct { - readonly requirement_satisfied: bool; + readonly requirementSatisfied: bool; readonly id: u32; - readonly sender_conditions: Vec; - readonly receiver_conditions: Vec; + readonly senderConditions: Vec; + readonly receiverConditions: Vec; } /** @name RpcDidRecords */ @@ -709,8 +741,8 @@ export interface RpcDidRecords extends Enum { /** @name RpcDidRecordsSuccess */ export interface RpcDidRecordsSuccess extends Struct { - readonly primary_key: AccountId; - readonly secondary_keys: Vec; + readonly primaryKey: AccountId; + readonly secondaryKeys: Vec; } /** @name Scope */ @@ -718,7 +750,7 @@ export interface Scope extends Enum { readonly isIdentity: boolean; readonly asIdentity: IdentityId; readonly isAsset: boolean; - readonly asAsset: AssetId; + readonly asAsset: PolymeshAssetId; readonly isCustom: boolean; readonly asCustom: Bytes; readonly type: 'Identity' | 'Asset' | 'Custom'; @@ -750,6 +782,13 @@ export interface StatClaim extends Enum { readonly type: 'Accredited' | 'Affiliate' | 'Jurisdiction'; } +/** @name TargetIdAuthorization */ +export interface TargetIdAuthorization extends Struct { + readonly targetId: IdentityId; + readonly nonce: AuthorizationNonce; + readonly expiresAt: PolymeshMoment; +} + /** @name TargetIdentity */ export interface TargetIdentity extends Enum { readonly isExternalAgent: boolean; @@ -791,7 +830,7 @@ export interface TrustedFor extends Enum { /** @name TrustedIssuer */ export interface TrustedIssuer extends Struct { readonly issuer: IdentityId; - readonly trusted_for: TrustedFor; + readonly trustedFor: TrustedFor; } /** @name VoteCount */ diff --git a/scripts/cli/src/interfaces/definitions.ts b/scripts/cli/src/interfaces/definitions.ts index daa063cbc1..86eaa9fa6c 100644 --- a/scripts/cli/src/interfaces/definitions.ts +++ b/scripts/cli/src/interfaces/definitions.ts @@ -1,3 +1,3 @@ export default { -types: {"AssetId":"[u8; 16]","IdentityId":"[u8; 32]","Ticker":"[u8; 12]","CddId":"[u8; 32]","PalletName":"Text","ExtrinsicName":"Text","AssetPermissions":{"_enum":{"Whole":"","These":"Vec","Except":"Vec"}},"PortfolioPermissions":{"_enum":{"Whole":"","These":"Vec","Except":"Vec"}},"ExtrinsicNames":{"_enum":{"Whole":"","These":"Vec","Except":"Vec"}},"PalletPermissions":{"extrinsics":"ExtrinsicNames"},"ExtrinsicPermissions":{"_enum":{"Whole":"","These":"Vec<(PalletName, PalletPermissions)>","Except":"Vec<(PalletName, PalletPermissions)>"}},"Permissions":{"asset":"AssetPermissions","extrinsic":"ExtrinsicPermissions","portfolio":"PortfolioPermissions"},"Signatory":{"_enum":{"Identity":"IdentityId","Account":"AccountId"}},"SecondaryKey":{"key":"AccountId","permissions":"Permissions"},"KeyIdentityData":{"identity":"IdentityId","permissions":"Option"},"CountryCode":{"_enum":["AF","AX","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BV","BR","VG","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","HK","MO","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MK","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","AN","NC","NZ","NI","NE","NG","NU","NF","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SZ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VI","WF","EH","YE","ZM","ZW","BQ","CW","SX"]},"Scope":{"_enum":{"Identity":"IdentityId","Asset":"AssetId","Custom":"Vec"}},"CustomClaimTypeId":"u32","Claim":{"_enum":{"Accredited":"Scope","Affiliate":"Scope","BuyLockup":"Scope","SellLockup":"Scope","CustomerDueDiligence":"CddId","KnowYourCustomer":"Scope","Jurisdiction":"(CountryCode, Scope)","Exempted":"Scope","Blocked":"Scope","Custom":"(CustomClaimTypeId, Option)"}},"ClaimType":{"_enum":{"Accredited":"","Affiliate":"","BuyLockup":"","SellLockup":"","CustomerDueDiligence":"","KnowYourCustomer":"","Jurisdiction":"","Exempted":"","Blocked":"","Custom":"CustomClaimTypeId"}},"IdentityClaim":{"claim_issuer":"IdentityId","issuance_date":"Moment","last_update_date":"Moment","expiry":"Option","claim":"Claim"},"ComplianceRequirementResult":{"sender_conditions":"Vec","receiver_conditions":"Vec","id":"u32","result":"bool"},"ConditionType":{"_enum":{"IsPresent":"Claim","IsAbsent":"Claim","IsAnyOf":"Vec","IsNoneOf":"Vec","IsIdentity":"TargetIdentity"}},"TrustedFor":{"_enum":{"Any":"","Specific":"Vec"}},"TrustedIssuer":{"issuer":"IdentityId","trusted_for":"TrustedFor"},"Condition":{"condition_type":"ConditionType","issuers":"Vec"},"ConditionResult":{"condition":"Condition","result":"bool"},"PipId":"u32","Authorization":{"authorization_data":"AuthorizationData","authorized_by":"IdentityId","expiry":"Option","auth_id":"u64"},"AuthorizationData":{"_enum":{"AttestPrimaryKeyRotation":"IdentityId","RotatePrimaryKey":"","TransferTicker":"Ticker","AddMultiSigSigner":"AccountId","TransferAssetOwnership":"AssetId","JoinIdentity":"Permissions","PortfolioCustody":"PortfolioId","BecomeAgent":"(AssetId, AgentGroup)","AddRelayerPayingKey":"(AccountId, AccountId, Balance)","RotatePrimaryKeyToSecondary":"Permissions"}},"Percentage":"Permill","StatClaim":{"_enum":{"Accredited":"bool","Affiliate":"bool","Jurisdiction":"Option"}},"TransferCondition":{"_enum":{"MaxInvestorCount":"u64","MaxInvestorOwnership":"Percentage","ClaimCount":"(StatClaim, IdentityId, u64, Option)","ClaimOwnership":"(StatClaim, IdentityId, Percentage, Percentage)"}},"AssetComplianceResult":{"paused":"bool","requirements":"Vec","result":"bool"},"ProtocolOp":{"_enum":["AssetRegisterTicker","AssetIssue","AssetAddDocuments","AssetCreateAsset","CheckpointCreateSchedule","ComplianceManagerAddComplianceRequirement","IdentityCddRegisterDid","IdentityAddClaim","IdentityAddSecondaryKeysWithAuthorization","PipsPropose","ContractsPutCode","CorporateBallotAttachBallot","CapitalDistributionDistribute","NFTCreateCollection","NFTMint","IdentityCreateChildIdentity"]},"CddStatus":{"_enum":{"Ok":"IdentityId","Err":"Vec"}},"AssetDidResult":{"_enum":{"Ok":"IdentityId","Err":"Vec"}},"RpcDidRecordsSuccess":{"primary_key":"AccountId","secondary_keys":"Vec"},"RpcDidRecords":{"_enum":{"Success":"RpcDidRecordsSuccess","IdNotFound":"Vec"}},"VoteCountProposalFound":{"ayes":"u64","nays":"u64"},"VoteCount":{"_enum":{"ProposalFound":"VoteCountProposalFound","ProposalNotFound":""}},"CappedFee":"u64","AuthorizationType":{"_enum":{"AttestPrimaryKeyRotation":"","RotatePrimaryKey":"","TransferTicker":"","AddMultiSigSigner":"","TransferAssetOwnership":"","JoinIdentity":"","PortfolioCustody":"","BecomeAgent":"","AddRelayerPayingKey":"","RotatePrimaryKeyToSecondary":""}},"DidStatus":{"_enum":{"Unknown":"","Exists":"","CddVerified":""}},"PortfolioNumber":"u64","PortfolioKind":{"_enum":{"Default":"","User":"PortfolioNumber"}},"PortfolioId":{"did":"IdentityId","kind":"PortfolioKind"},"Moment":"u64","InstructionId":"u64","TargetIdentity":{"_enum":{"ExternalAgent":"","Specific":"IdentityId"}},"CanTransferGranularReturn":{"_enum":{"Ok":"GranularCanTransferResult","Err":"DispatchError"}},"GranularCanTransferResult":{"invalid_granularity":"bool","self_transfer":"bool","invalid_receiver_cdd":"bool","invalid_sender_cdd":"bool","receiver_custodian_error":"bool","sender_custodian_error":"bool","sender_insufficient_balance":"bool","portfolio_validity_result":"PortfolioValidityResult","asset_frozen":"bool","transfer_condition_result":"Vec","compliance_result":"AssetComplianceResult","result":"bool","consumed_weight":"Option"},"PortfolioValidityResult":{"receiver_is_same_portfolio":"bool","sender_portfolio_does_not_exist":"bool","receiver_portfolio_does_not_exist":"bool","sender_insufficient_balance":"bool","result":"bool"},"TransferConditionResult":{"condition":"TransferCondition","result":"bool"},"AGId":"u32","AgentGroup":{"_enum":{"Full":"","Custom":"AGId","ExceptMeta":"","PolymeshV1CAA":"","PolymeshV1PIA":""}},"Member":{"id":"IdentityId","expiry_at":"Option","inactive_from":"Option"},"NFTId":"u64","NFTs":{"asset_id":"AssetId","ids":"Vec"},"FungibleLeg":{"sender":"PortfolioId","receiver":"PortfolioId","asset_id":"AssetId","amount":"Balance"},"NonFungibleLeg":{"sender":"PortfolioId","receiver":"PortfolioId","nfts":"NFTs"},"OffChainLeg":{"sender_identity":"IdentityId","receiver_identity":"IdentityId","asset_id":"AssetId","amount":"Balance"},"Leg":{"_enum":{"Fungible":"FungibleLeg","NonFungible":"NonFungibleLeg","OffChain":"OffChainLeg"}},"ExecuteInstructionInfo":{"fungible_tokens":"u32","non_fungible_tokens":"u32","off_chain_assets":"u32","consumed_weight":"Weight","error":"Option"},"AssetCount":{"fungible_tokens":"u32","non_fungible_tokens":"u32","off_chain_assets":"u32"},"AffirmationCount":{"sender_asset_count":"AssetCount","receiver_asset_count":"AssetCount","offchain_count":"u32"},"ComplianceReport":{"any_requirement_satistifed":"bool","paused_compliance":"bool","requirements":"Vec"},"RequirementReport":{"requirement_satisfied":"bool","id":"u32","sender_conditions":"Vec","receiver_conditions":"Vec"},"ConditionReport":{"satisfied":"bool","condition":"Condition"}} +types: {"PolymeshAssetId":"[u8; 16]","IdentityId":"[u8; 32]","Ticker":"[u8; 12]","CddId":"[u8; 32]","PalletName":"Text","ExtrinsicName":"Text","AuthorizationNonce":"u64","TargetIdAuthorization":{"targetId":"IdentityId","nonce":"AuthorizationNonce","expiresAt":"PolymeshMoment"},"Receipt":{"uid":"u64","instructionId":"InstructionId","legId":"LegId","senderIdentity":"IdentityId","receiverIdentity":"IdentityId","ticker":"Ticker","amount":"Balance"},"FundraiserId":"u64","FundraiserReceipt":{"uid":"u64","fundraiserId":"FundraiserId","legId":"LegId","senderIdentity":"IdentityId","receiverIdentity":"IdentityId","ticker":"Ticker","amount":"Balance"},"AssetPermissions":{"_enum":{"Whole":"","These":"BTreeSet","Except":"BTreeSet"}},"PortfolioPermissions":{"_enum":{"Whole":"","These":"BTreeSet","Except":"BTreeSet"}},"ExtrinsicNames":{"_enum":{"Whole":"","These":"BTreeSet","Except":"BTreeSet"}},"PalletPermissions":{"extrinsics":"ExtrinsicNames"},"ExtrinsicPermissions":{"_enum":{"Whole":"","These":"BTreeMap","Except":"BTreeMap"}},"Permissions":{"asset":"AssetPermissions","extrinsic":"ExtrinsicPermissions","portfolio":"PortfolioPermissions"},"Signatory":{"_enum":{"Identity":"IdentityId","Account":"AccountId"}},"SecondaryKey":{"key":"AccountId","permissions":"Permissions"},"KeyIdentityData":{"identity":"IdentityId","permissions":"Option"},"CountryCode":{"_enum":["AF","AX","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BV","BR","VG","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","HK","MO","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MK","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","AN","NC","NZ","NI","NE","NG","NU","NF","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SZ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VI","WF","EH","YE","ZM","ZW","BQ","CW","SX"]},"Scope":{"_enum":{"Identity":"IdentityId","Asset":"PolymeshAssetId","Custom":"Vec"}},"CustomClaimTypeId":"u32","Claim":{"_enum":{"Accredited":"Scope","Affiliate":"Scope","BuyLockup":"Scope","SellLockup":"Scope","CustomerDueDiligence":"CddId","KnowYourCustomer":"Scope","Jurisdiction":"(CountryCode, Scope)","Exempted":"Scope","Blocked":"Scope","Custom":"(CustomClaimTypeId, Option)"}},"ClaimType":{"_enum":{"Accredited":"","Affiliate":"","BuyLockup":"","SellLockup":"","CustomerDueDiligence":"","KnowYourCustomer":"","Jurisdiction":"","Exempted":"","Blocked":"","Custom":"CustomClaimTypeId"}},"IdentityClaim":{"claimIssuer":"IdentityId","issuanceDate":"PolymeshMoment","lastUpdateDate":"PolymeshMoment","expiry":"Option","claim":"Claim"},"ComplianceRequirementResult":{"senderConditions":"Vec","receiverConditions":"Vec","id":"u32","result":"bool"},"ConditionType":{"_enum":{"IsPresent":"Claim","IsAbsent":"Claim","IsAnyOf":"Vec","IsNoneOf":"Vec","IsIdentity":"TargetIdentity"}},"TrustedFor":{"_enum":{"Any":"","Specific":"Vec"}},"TrustedIssuer":{"issuer":"IdentityId","trustedFor":"TrustedFor"},"Condition":{"conditionType":"ConditionType","issuers":"Vec"},"ConditionResult":{"condition":"Condition","result":"bool"},"PipId":"u32","Authorization":{"authorizationData":"AuthorizationData","authorizedBy":"IdentityId","expiry":"Option","authId":"u64","count":"u32"},"AuthorizationData":{"_enum":{"AttestPrimaryKeyRotation":"IdentityId","RotatePrimaryKey":"","TransferTicker":"Ticker","AddMultiSigSigner":"AccountId","TransferAssetOwnership":"PolymeshAssetId","JoinIdentity":"Permissions","PortfolioCustody":"PortfolioId","BecomeAgent":"(PolymeshAssetId, AgentGroup)","AddRelayerPayingKey":"(AccountId32, AccountId32, u128)","RotatePrimaryKeyToSecondary":"Permissions"}},"Percentage":"Permill","StatClaim":{"_enum":{"Accredited":"bool","Affiliate":"bool","Jurisdiction":"Option"}},"TransferCondition":{"_enum":{"MaxInvestorCount":"u64","MaxInvestorOwnership":"Percentage","ClaimCount":"(StatClaim, IdentityId, u64, Option)","ClaimOwnership":"(StatClaim, IdentityId, Percentage, Percentage)"}},"AssetComplianceResult":{"paused":"bool","requirements":"Vec","result":"bool"},"ProtocolOp":{"_enum":["AssetRegisterTicker","AssetIssue","AssetAddDocuments","AssetCreateAsset","CheckpointCreateSchedule","ComplianceManagerAddComplianceRequirement","IdentityCddRegisterDid","IdentityAddClaim","IdentityAddSecondaryKeysWithAuthorization","PipsPropose","ContractsPutCode","CorporateBallotAttachBallot","CapitalDistributionDistribute","NFTCreateCollection","NFTMint","IdentityCreateChildIdentity"]},"CddStatus":{"_enum":{"Ok":"IdentityId","Err":"Vec"}},"AssetDidResult":{"_enum":{"Ok":"IdentityId","Err":"Vec"}},"RpcDidRecordsSuccess":{"primaryKey":"AccountId","secondaryKeys":"Vec"},"RpcDidRecords":{"_enum":{"Success":"RpcDidRecordsSuccess","IdNotFound":"Vec"}},"VoteCountProposalFound":{"ayes":"u64","nays":"u64"},"VoteCount":{"_enum":{"ProposalFound":"VoteCountProposalFound","ProposalNotFound":""}},"CappedFee":"u64","AuthorizationType":{"_enum":{"AttestPrimaryKeyRotation":"","RotatePrimaryKey":"","TransferTicker":"","AddMultiSigSigner":"","TransferAssetOwnership":"","JoinIdentity":"","PortfolioCustody":"","BecomeAgent":"","AddRelayerPayingKey":"","RotatePrimaryKeyToSecondary":""}},"DidStatus":{"_enum":{"Unknown":"","Exists":"","CddVerified":""}},"PortfolioNumber":"u64","PortfolioKind":{"_enum":{"Default":"","User":"PortfolioNumber"}},"PortfolioId":{"did":"IdentityId","kind":"PortfolioKind"},"PolymeshMoment":"u64","InstructionId":"u64","LegId":"u64","TargetIdentity":{"_enum":{"ExternalAgent":"","Specific":"IdentityId"}},"CanTransferGranularReturn":{"_enum":{"Ok":"GranularCanTransferResult","Err":"DispatchError"}},"GranularCanTransferResult":{"invalidGranularity":"bool","selfTransfer":"bool","invalidReceiverCdd":"bool","invalidSenderCdd":"bool","receiverCustodianError":"bool","senderCustodianError":"bool","senderInsufficientBalance":"bool","portfolioValidityResult":"PortfolioValidityResult","assetFrozen":"bool","transferConditionResult":"Vec","complianceResult":"AssetComplianceResult","result":"bool","consumedWeight":"Option"},"PortfolioValidityResult":{"receiverIsSamePortfolio":"bool","senderPortfolioDoesNotExist":"bool","receiverPortfolioDoesNotExist":"bool","senderInsufficientBalance":"bool","result":"bool"},"TransferConditionResult":{"condition":"TransferCondition","result":"bool"},"AGId":"u32","AgentGroup":{"_enum":{"Full":"","Custom":"AGId","ExceptMeta":"","PolymeshV1CAA":"","PolymeshV1PIA":""}},"Member":{"id":"IdentityId","expiryAt":"Option","inactiveFrom":"Option"},"NFTId":"u64","NFTs":{"assetId":"PolymeshAssetId","ids":"Vec"},"FungibleLeg":{"sender":"PortfolioId","receiver":"PortfolioId","assetId":"PolymeshAssetId","amount":"Balance"},"NonFungibleLeg":{"sender":"PortfolioId","receiver":"PortfolioId","nfts":"NFTs"},"OffChainLeg":{"senderIdentity":"IdentityId","receiverIdentity":"IdentityId","ticker":"Ticker","amount":"Balance"},"Leg":{"_enum":{"Fungible":"FungibleLeg","NonFungible":"NonFungibleLeg","OffChain":"OffChainLeg"}},"ExecuteInstructionInfo":{"fungibleTokens":"u32","nonFungibleTokens":"u32","offChainAssets":"u32","consumedWeight":"Weight","error":"Option"},"AssetCount":{"fungibleTokens":"u32","nonFungibleTokens":"u32","offChainAssets":"u32"},"AffirmationCount":{"senderAssetCount":"AssetCount","receiverAssetCount":"AssetCount","offchainCount":"u32"},"ComplianceReport":{"anyRequirementSatisfied":"bool","pausedCompliance":"bool","requirements":"Vec"},"RequirementReport":{"requirementSatisfied":"bool","id":"u32","senderConditions":"Vec","receiverConditions":"Vec"},"ConditionReport":{"satisfied":"bool","condition":"Condition"}} } \ No newline at end of file diff --git a/scripts/cli/src/interfaces/lookup.ts b/scripts/cli/src/interfaces/lookup.ts index 48375aba2d..51a56b8253 100644 --- a/scripts/cli/src/interfaces/lookup.ts +++ b/scripts/cli/src/interfaces/lookup.ts @@ -5,26 +5,26 @@ export default { /** - * Lookup3: frame_system::AccountInfo + * Lookup3: frame_system::AccountInfo> **/ FrameSystemAccountInfo: { nonce: 'u32', consumers: 'u32', providers: 'u32', sufficients: 'u32', - data: 'PolymeshCommonUtilitiesBalancesAccountData' + data: 'PalletBalancesAccountData' }, /** - * Lookup5: polymesh_common_utilities::traits::balances::AccountData + * Lookup5: pallet_balances::types::AccountData **/ - PolymeshCommonUtilitiesBalancesAccountData: { + PalletBalancesAccountData: { free: 'u128', reserved: 'u128', - miscFrozen: 'u128', - feeFrozen: 'u128' + frozen: 'u128', + flags: 'u128' }, /** - * Lookup7: frame_support::dispatch::PerDispatchClass + * Lookup9: frame_support::dispatch::PerDispatchClass **/ FrameSupportDispatchPerDispatchClassWeight: { normal: 'SpWeightsWeightV2Weight', @@ -32,20 +32,20 @@ export default { mandatory: 'SpWeightsWeightV2Weight' }, /** - * Lookup8: sp_weights::weight_v2::Weight + * Lookup10: sp_weights::weight_v2::Weight **/ SpWeightsWeightV2Weight: { refTime: 'Compact', proofSize: 'Compact' }, /** - * Lookup13: sp_runtime::generic::digest::Digest + * Lookup15: sp_runtime::generic::digest::Digest **/ SpRuntimeDigest: { logs: 'Vec' }, /** - * Lookup15: sp_runtime::generic::digest::DigestItem + * Lookup17: sp_runtime::generic::digest::DigestItem **/ SpRuntimeDigestDigestItem: { _enum: { @@ -61,7 +61,7 @@ export default { } }, /** - * Lookup18: frame_system::EventRecord + * Lookup20: frame_system::EventRecord **/ FrameSystemEventRecord: { phase: 'FrameSystemPhase', @@ -69,16 +69,16 @@ export default { topics: 'Vec' }, /** - * Lookup20: frame_system::pallet::Event + * Lookup22: frame_system::pallet::Event **/ FrameSystemEvent: { _enum: { ExtrinsicSuccess: { - dispatchInfo: 'FrameSupportDispatchDispatchInfo', + dispatchInfo: 'FrameSystemDispatchEventInfo', }, ExtrinsicFailed: { dispatchError: 'SpRuntimeDispatchError', - dispatchInfo: 'FrameSupportDispatchDispatchInfo', + dispatchInfo: 'FrameSystemDispatchEventInfo', }, CodeUpdated: 'Null', NewAccount: { @@ -92,32 +92,40 @@ export default { hash_: 'hash', }, sender: 'AccountId32', - hash_: 'H256' + hash_: 'H256', + }, + UpgradeAuthorized: { + codeHash: 'H256', + checkVersion: 'bool', + }, + RejectedInvalidAuthorizedUpgrade: { + codeHash: 'H256', + error: 'SpRuntimeDispatchError' } } }, /** - * Lookup21: frame_support::dispatch::DispatchInfo + * Lookup23: frame_system::DispatchEventInfo **/ - FrameSupportDispatchDispatchInfo: { + FrameSystemDispatchEventInfo: { weight: 'SpWeightsWeightV2Weight', class: 'FrameSupportDispatchDispatchClass', paysFee: 'FrameSupportDispatchPays' }, /** - * Lookup22: frame_support::dispatch::DispatchClass + * Lookup24: frame_support::dispatch::DispatchClass **/ FrameSupportDispatchDispatchClass: { _enum: ['Normal', 'Operational', 'Mandatory'] }, /** - * Lookup23: frame_support::dispatch::Pays + * Lookup25: frame_support::dispatch::Pays **/ FrameSupportDispatchPays: { _enum: ['Yes', 'No'] }, /** - * Lookup24: sp_runtime::DispatchError + * Lookup26: sp_runtime::DispatchError **/ SpRuntimeDispatchError: { _enum: { @@ -133,36 +141,44 @@ export default { Transactional: 'SpRuntimeTransactionalError', Exhausted: 'Null', Corruption: 'Null', - Unavailable: 'Null' + Unavailable: 'Null', + RootNotAllowed: 'Null', + Trie: 'SpRuntimeProvingTrieTrieError' } }, /** - * Lookup25: sp_runtime::ModuleError + * Lookup27: sp_runtime::ModuleError **/ SpRuntimeModuleError: { index: 'u8', error: '[u8;4]' }, /** - * Lookup26: sp_runtime::TokenError + * Lookup28: sp_runtime::TokenError **/ SpRuntimeTokenError: { - _enum: ['NoFunds', 'WouldDie', 'BelowMinimum', 'CannotCreate', 'UnknownAsset', 'Frozen', 'Unsupported'] + _enum: ['FundsUnavailable', 'OnlyProvider', 'BelowMinimum', 'CannotCreate', 'UnknownAsset', 'Frozen', 'Unsupported', 'CannotCreateHold', 'NotExpendable', 'Blocked'] }, /** - * Lookup27: sp_arithmetic::ArithmeticError + * Lookup29: sp_arithmetic::ArithmeticError **/ SpArithmeticArithmeticError: { _enum: ['Underflow', 'Overflow', 'DivisionByZero'] }, /** - * Lookup28: sp_runtime::TransactionalError + * Lookup30: sp_runtime::TransactionalError **/ SpRuntimeTransactionalError: { _enum: ['LimitReached', 'NoLayer'] }, /** - * Lookup29: pallet_indices::pallet::Event + * Lookup31: sp_runtime::proving_trie::TrieError + **/ + SpRuntimeProvingTrieTrieError: { + _enum: ['InvalidStateRoot', 'IncompleteDatabase', 'ValueAtIncompleteKey', 'DecoderError', 'InvalidHash', 'DuplicateKey', 'ExtraneousNode', 'ExtraneousValue', 'ExtraneousHashReference', 'InvalidChildReference', 'ValueMismatch', 'IncompleteProof', 'RootMismatch', 'DecodeError'] + }, + /** + * Lookup32: pallet_indices::pallet::Event **/ PalletIndicesEvent: { _enum: { @@ -175,42 +191,134 @@ export default { }, IndexFrozen: { index: 'u32', - who: 'AccountId32' + who: 'AccountId32', + }, + DepositPoked: { + who: 'AccountId32', + index: 'u32', + oldDeposit: 'u128', + newDeposit: 'u128' } } }, /** - * Lookup30: polymesh_common_utilities::traits::balances::RawEvent + * Lookup33: pallet_balances::pallet::Event **/ - PolymeshCommonUtilitiesBalancesRawEvent: { + PalletBalancesEvent: { _enum: { - Endowed: '(Option,AccountId32,u128)', - Transfer: '(Option,AccountId32,Option,AccountId32,u128,Option)', - BalanceSet: '(PolymeshPrimitivesIdentityId,AccountId32,u128,u128)', - AccountBalanceBurned: '(PolymeshPrimitivesIdentityId,AccountId32,u128)', - Reserved: '(AccountId32,u128)', - Unreserved: '(AccountId32,u128)', - ReserveRepatriated: '(AccountId32,AccountId32,u128,FrameSupportTokensMiscBalanceStatus)' + Endowed: { + account: 'AccountId32', + freeBalance: 'u128', + }, + DustLost: { + account: 'AccountId32', + amount: 'u128', + }, + Transfer: { + from: 'AccountId32', + to: 'AccountId32', + amount: 'u128', + }, + BalanceSet: { + who: 'AccountId32', + free: 'u128', + }, + Reserved: { + who: 'AccountId32', + amount: 'u128', + }, + Unreserved: { + who: 'AccountId32', + amount: 'u128', + }, + ReserveRepatriated: { + from: 'AccountId32', + to: 'AccountId32', + amount: 'u128', + destinationStatus: 'FrameSupportTokensMiscBalanceStatus', + }, + Deposit: { + who: 'AccountId32', + amount: 'u128', + }, + Withdraw: { + who: 'AccountId32', + amount: 'u128', + }, + Slashed: { + who: 'AccountId32', + amount: 'u128', + }, + Minted: { + who: 'AccountId32', + amount: 'u128', + }, + Burned: { + who: 'AccountId32', + amount: 'u128', + }, + Suspended: { + who: 'AccountId32', + amount: 'u128', + }, + Restored: { + who: 'AccountId32', + amount: 'u128', + }, + Upgraded: { + who: 'AccountId32', + }, + Issued: { + amount: 'u128', + }, + Rescinded: { + amount: 'u128', + }, + Locked: { + who: 'AccountId32', + amount: 'u128', + }, + Unlocked: { + who: 'AccountId32', + amount: 'u128', + }, + Frozen: { + who: 'AccountId32', + amount: 'u128', + }, + Thawed: { + who: 'AccountId32', + amount: 'u128', + }, + TotalIssuanceForced: { + _alias: { + new_: 'new', + }, + old: 'u128', + new_: 'u128', + }, + TransferWithMemo: { + from: 'AccountId32', + to: 'AccountId32', + amount: 'u128', + memo: 'Option' + } } }, /** - * Lookup32: polymesh_primitives::identity_id::IdentityId - **/ - PolymeshPrimitivesIdentityId: '[u8;32]', - /** - * Lookup34: polymesh_primitives::Memo - **/ - PolymeshPrimitivesMemo: '[u8;32]', - /** - * Lookup35: frame_support::traits::tokens::misc::BalanceStatus + * Lookup34: frame_support::traits::tokens::misc::BalanceStatus **/ FrameSupportTokensMiscBalanceStatus: { _enum: ['Free', 'Reserved'] }, /** - * Lookup36: pallet_transaction_payment::RawEvent + * Lookup36: polymesh_primitives::Memo + **/ + PolymeshPrimitivesMemo: '[u8;32]', + /** + * Lookup37: pallet_transaction_payment::pallet::Event **/ - PalletTransactionPaymentRawEvent: { + PalletTransactionPaymentEvent: { _enum: { TransactionFeePaid: { who: 'AccountId32', @@ -220,9 +328,9 @@ export default { } }, /** - * Lookup37: polymesh_common_utilities::traits::identity::RawEvent + * Lookup38: pallet_identity::pallet::Event **/ - PolymeshCommonUtilitiesIdentityRawEvent: { + PalletIdentityEvent: { _enum: { DidCreated: '(PolymeshPrimitivesIdentityId,AccountId32,Vec)', SecondaryKeysAdded: '(PolymeshPrimitivesIdentityId,Vec)', @@ -248,14 +356,18 @@ export default { } }, /** - * Lookup39: polymesh_primitives::secondary_key::SecondaryKey + * Lookup39: polymesh_primitives::identity_id::IdentityId + **/ + PolymeshPrimitivesIdentityId: '[u8;32]', + /** + * Lookup41: polymesh_primitives::secondary_key::SecondaryKey **/ PolymeshPrimitivesSecondaryKey: { key: 'AccountId32', permissions: 'PolymeshPrimitivesSecondaryKeyPermissions' }, /** - * Lookup40: polymesh_primitives::secondary_key::Permissions + * Lookup42: polymesh_primitives::secondary_key::Permissions **/ PolymeshPrimitivesSecondaryKeyPermissions: { asset: 'PolymeshPrimitivesSubsetSubsetRestrictionAssetId', @@ -263,7 +375,7 @@ export default { portfolio: 'PolymeshPrimitivesSubsetSubsetRestrictionPortfolioId' }, /** - * Lookup41: polymesh_primitives::subset::SubsetRestriction + * Lookup43: polymesh_primitives::subset::SubsetRestriction **/ PolymeshPrimitivesSubsetSubsetRestrictionAssetId: { _enum: { @@ -273,11 +385,11 @@ export default { } }, /** - * Lookup42: polymesh_primitives::asset::AssetId + * Lookup44: polymesh_primitives::asset::AssetId **/ PolymeshPrimitivesAssetAssetId: '[u8;16]', /** - * Lookup46: polymesh_primitives::secondary_key::ExtrinsicPermissions + * Lookup48: polymesh_primitives::secondary_key::ExtrinsicPermissions **/ PolymeshPrimitivesSecondaryKeyExtrinsicPermissions: { _enum: { @@ -287,13 +399,13 @@ export default { } }, /** - * Lookup50: polymesh_primitives::secondary_key::PalletPermissions + * Lookup52: polymesh_primitives::secondary_key::PalletPermissions **/ PolymeshPrimitivesSecondaryKeyPalletPermissions: { extrinsics: 'PolymeshPrimitivesSubsetSubsetRestrictionExtrinsicName' }, /** - * Lookup51: polymesh_primitives::subset::SubsetRestriction + * Lookup53: polymesh_primitives::subset::SubsetRestriction **/ PolymeshPrimitivesSubsetSubsetRestrictionExtrinsicName: { _enum: { @@ -303,7 +415,7 @@ export default { } }, /** - * Lookup57: polymesh_primitives::subset::SubsetRestriction + * Lookup59: polymesh_primitives::subset::SubsetRestriction **/ PolymeshPrimitivesSubsetSubsetRestrictionPortfolioId: { _enum: { @@ -313,14 +425,14 @@ export default { } }, /** - * Lookup58: polymesh_primitives::identity_id::PortfolioId + * Lookup60: polymesh_primitives::identity_id::PortfolioId **/ PolymeshPrimitivesIdentityIdPortfolioId: { did: 'PolymeshPrimitivesIdentityId', kind: 'PolymeshPrimitivesIdentityIdPortfolioKind' }, /** - * Lookup59: polymesh_primitives::identity_id::PortfolioKind + * Lookup61: polymesh_primitives::identity_id::PortfolioKind **/ PolymeshPrimitivesIdentityIdPortfolioKind: { _enum: { @@ -329,7 +441,7 @@ export default { } }, /** - * Lookup64: polymesh_primitives::identity_claim::IdentityClaim + * Lookup66: polymesh_primitives::identity_claim::IdentityClaim **/ PolymeshPrimitivesIdentityClaim: { claimIssuer: 'PolymeshPrimitivesIdentityId', @@ -339,7 +451,7 @@ export default { claim: 'PolymeshPrimitivesIdentityClaimClaim' }, /** - * Lookup66: polymesh_primitives::identity_claim::Claim + * Lookup68: polymesh_primitives::identity_claim::Claim **/ PolymeshPrimitivesIdentityClaimClaim: { _enum: { @@ -356,7 +468,7 @@ export default { } }, /** - * Lookup67: polymesh_primitives::identity_claim::Scope + * Lookup69: polymesh_primitives::identity_claim::Scope **/ PolymeshPrimitivesIdentityClaimScope: { _enum: { @@ -366,21 +478,21 @@ export default { } }, /** - * Lookup68: polymesh_primitives::cdd_id::CddId + * Lookup70: polymesh_primitives::cdd_id::CddId **/ PolymeshPrimitivesCddId: '[u8;32]', /** - * Lookup69: polymesh_primitives::jurisdiction::CountryCode + * Lookup71: polymesh_primitives::jurisdiction::CountryCode **/ PolymeshPrimitivesJurisdictionCountryCode: { _enum: ['AF', 'AX', 'AL', 'DZ', 'AS', 'AD', 'AO', 'AI', 'AQ', 'AG', 'AR', 'AM', 'AW', 'AU', 'AT', 'AZ', 'BS', 'BH', 'BD', 'BB', 'BY', 'BE', 'BZ', 'BJ', 'BM', 'BT', 'BO', 'BA', 'BW', 'BV', 'BR', 'VG', 'IO', 'BN', 'BG', 'BF', 'BI', 'KH', 'CM', 'CA', 'CV', 'KY', 'CF', 'TD', 'CL', 'CN', 'HK', 'MO', 'CX', 'CC', 'CO', 'KM', 'CG', 'CD', 'CK', 'CR', 'CI', 'HR', 'CU', 'CY', 'CZ', 'DK', 'DJ', 'DM', 'DO', 'EC', 'EG', 'SV', 'GQ', 'ER', 'EE', 'ET', 'FK', 'FO', 'FJ', 'FI', 'FR', 'GF', 'PF', 'TF', 'GA', 'GM', 'GE', 'DE', 'GH', 'GI', 'GR', 'GL', 'GD', 'GP', 'GU', 'GT', 'GG', 'GN', 'GW', 'GY', 'HT', 'HM', 'VA', 'HN', 'HU', 'IS', 'IN', 'ID', 'IR', 'IQ', 'IE', 'IM', 'IL', 'IT', 'JM', 'JP', 'JE', 'JO', 'KZ', 'KE', 'KI', 'KP', 'KR', 'KW', 'KG', 'LA', 'LV', 'LB', 'LS', 'LR', 'LY', 'LI', 'LT', 'LU', 'MK', 'MG', 'MW', 'MY', 'MV', 'ML', 'MT', 'MH', 'MQ', 'MR', 'MU', 'YT', 'MX', 'FM', 'MD', 'MC', 'MN', 'ME', 'MS', 'MA', 'MZ', 'MM', 'NA', 'NR', 'NP', 'NL', 'AN', 'NC', 'NZ', 'NI', 'NE', 'NG', 'NU', 'NF', 'MP', 'NO', 'OM', 'PK', 'PW', 'PS', 'PA', 'PG', 'PY', 'PE', 'PH', 'PN', 'PL', 'PT', 'PR', 'QA', 'RE', 'RO', 'RU', 'RW', 'BL', 'SH', 'KN', 'LC', 'MF', 'PM', 'VC', 'WS', 'SM', 'ST', 'SA', 'SN', 'RS', 'SC', 'SL', 'SG', 'SK', 'SI', 'SB', 'SO', 'ZA', 'GS', 'SS', 'ES', 'LK', 'SD', 'SR', 'SJ', 'SZ', 'SE', 'CH', 'SY', 'TW', 'TJ', 'TZ', 'TH', 'TL', 'TG', 'TK', 'TO', 'TT', 'TN', 'TR', 'TM', 'TC', 'TV', 'UG', 'UA', 'AE', 'GB', 'US', 'UM', 'UY', 'UZ', 'VU', 'VE', 'VN', 'VI', 'WF', 'EH', 'YE', 'ZM', 'ZW', 'BQ', 'CW', 'SX'] }, /** - * Lookup72: polymesh_primitives::ticker::Ticker + * Lookup74: polymesh_primitives::ticker::Ticker **/ PolymeshPrimitivesTicker: '[u8;12]', /** - * Lookup75: polymesh_primitives::authorization::AuthorizationData + * Lookup78: polymesh_primitives::authorization::AuthorizationData **/ PolymeshPrimitivesAuthorizationAuthorizationData: { _enum: { @@ -397,7 +509,7 @@ export default { } }, /** - * Lookup76: polymesh_primitives::agent::AgentGroup + * Lookup79: polymesh_primitives::agent::AgentGroup **/ PolymeshPrimitivesAgentAgentGroup: { _enum: { @@ -409,9 +521,9 @@ export default { } }, /** - * Lookup79: polymesh_common_utilities::traits::group::RawEvent + * Lookup81: pallet_group::pallet::Event **/ - PolymeshCommonUtilitiesGroupRawEventInstance2: { + PalletGroupEvent: { _enum: { MemberAdded: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', MemberRemoved: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', @@ -423,13 +535,9 @@ export default { } }, /** - * Lookup80: pallet_group::Instance2 - **/ - PalletGroupInstance2: 'Null', - /** - * Lookup82: pallet_committee::RawEvent + * Lookup83: pallet_committee::pallet::Event **/ - PalletCommitteeRawEventInstance1: { + PalletCommitteeEvent: { _enum: { Proposed: '(PolymeshPrimitivesIdentityId,u32,H256)', Voted: '(PolymeshPrimitivesIdentityId,u32,H256,bool,u32,u32,u32)', @@ -439,121 +547,21 @@ export default { Rejected: '(Option,H256,u32,u32,u32)', Executed: '(Option,H256,Result)', ReleaseCoordinatorUpdated: 'Option', - ExpiresAfterUpdated: '(PolymeshPrimitivesIdentityId,PolymeshCommonUtilitiesMaybeBlock)', + ExpiresAfterUpdated: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesMaybeBlock)', VoteThresholdUpdated: '(PolymeshPrimitivesIdentityId,u32,u32)' } }, /** - * Lookup83: pallet_committee::Instance1 - **/ - PalletCommitteeInstance1: 'Null', - /** - * Lookup86: polymesh_common_utilities::MaybeBlock + * Lookup86: polymesh_primitives::MaybeBlock **/ - PolymeshCommonUtilitiesMaybeBlock: { + PolymeshPrimitivesMaybeBlock: { _enum: { Some: 'u32', None: 'Null' } }, /** - * Lookup87: polymesh_common_utilities::traits::group::RawEvent - **/ - PolymeshCommonUtilitiesGroupRawEventInstance1: { - _enum: { - MemberAdded: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', - MemberRemoved: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', - MemberRevoked: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', - MembersSwapped: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', - MembersReset: '(PolymeshPrimitivesIdentityId,Vec)', - ActiveLimitChanged: '(PolymeshPrimitivesIdentityId,u32,u32)', - Dummy: 'Null' - } - }, - /** - * Lookup88: pallet_group::Instance1 - **/ - PalletGroupInstance1: 'Null', - /** - * Lookup89: pallet_committee::RawEvent - **/ - PalletCommitteeRawEventInstance3: { - _enum: { - Proposed: '(PolymeshPrimitivesIdentityId,u32,H256)', - Voted: '(PolymeshPrimitivesIdentityId,u32,H256,bool,u32,u32,u32)', - VoteRetracted: '(PolymeshPrimitivesIdentityId,u32,H256,bool)', - FinalVotes: '(Option,u32,H256,Vec,Vec)', - Approved: '(Option,H256,u32,u32,u32)', - Rejected: '(Option,H256,u32,u32,u32)', - Executed: '(Option,H256,Result)', - ReleaseCoordinatorUpdated: 'Option', - ExpiresAfterUpdated: '(PolymeshPrimitivesIdentityId,PolymeshCommonUtilitiesMaybeBlock)', - VoteThresholdUpdated: '(PolymeshPrimitivesIdentityId,u32,u32)' - } - }, - /** - * Lookup90: pallet_committee::Instance3 - **/ - PalletCommitteeInstance3: 'Null', - /** - * Lookup91: polymesh_common_utilities::traits::group::RawEvent - **/ - PolymeshCommonUtilitiesGroupRawEventInstance3: { - _enum: { - MemberAdded: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', - MemberRemoved: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', - MemberRevoked: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', - MembersSwapped: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', - MembersReset: '(PolymeshPrimitivesIdentityId,Vec)', - ActiveLimitChanged: '(PolymeshPrimitivesIdentityId,u32,u32)', - Dummy: 'Null' - } - }, - /** - * Lookup92: pallet_group::Instance3 - **/ - PalletGroupInstance3: 'Null', - /** - * Lookup93: pallet_committee::RawEvent - **/ - PalletCommitteeRawEventInstance4: { - _enum: { - Proposed: '(PolymeshPrimitivesIdentityId,u32,H256)', - Voted: '(PolymeshPrimitivesIdentityId,u32,H256,bool,u32,u32,u32)', - VoteRetracted: '(PolymeshPrimitivesIdentityId,u32,H256,bool)', - FinalVotes: '(Option,u32,H256,Vec,Vec)', - Approved: '(Option,H256,u32,u32,u32)', - Rejected: '(Option,H256,u32,u32,u32)', - Executed: '(Option,H256,Result)', - ReleaseCoordinatorUpdated: 'Option', - ExpiresAfterUpdated: '(PolymeshPrimitivesIdentityId,PolymeshCommonUtilitiesMaybeBlock)', - VoteThresholdUpdated: '(PolymeshPrimitivesIdentityId,u32,u32)' - } - }, - /** - * Lookup94: pallet_committee::Instance4 - **/ - PalletCommitteeInstance4: 'Null', - /** - * Lookup95: polymesh_common_utilities::traits::group::RawEvent - **/ - PolymeshCommonUtilitiesGroupRawEventInstance4: { - _enum: { - MemberAdded: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', - MemberRemoved: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', - MemberRevoked: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', - MembersSwapped: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', - MembersReset: '(PolymeshPrimitivesIdentityId,Vec)', - ActiveLimitChanged: '(PolymeshPrimitivesIdentityId,u32,u32)', - Dummy: 'Null' - } - }, - /** - * Lookup96: pallet_group::Instance4 - **/ - PalletGroupInstance4: 'Null', - /** - * Lookup97: pallet_multisig::pallet::Event + * Lookup92: pallet_multisig::pallet::Event **/ PalletMultisigEvent: { _enum: { @@ -635,7 +643,51 @@ export default { } }, /** - * Lookup99: pallet_staking::pallet::pallet::Event + * Lookup94: pallet_validators::pallet::Event + **/ + PalletValidatorsEvent: { + _enum: { + Nominated: { + nominatorIdentity: 'PolymeshPrimitivesIdentityId', + stash: 'AccountId32', + targets: 'Vec', + }, + PermissionedIdentityAdded: { + governanceCouncillDid: 'PolymeshPrimitivesIdentityId', + validatorsIdentity: 'PolymeshPrimitivesIdentityId', + }, + PermissionedIdentityRemoved: { + governanceCouncillDid: 'PolymeshPrimitivesIdentityId', + validatorsIdentity: 'PolymeshPrimitivesIdentityId', + }, + InvalidatedNominators: { + governanceCouncillDid: 'PolymeshPrimitivesIdentityId', + governanceCouncillAccount: 'PolymeshPrimitivesIdentityId', + expiredNominators: 'Vec', + }, + SlashingAllowedForChanged: { + slashingSwitch: 'PalletValidatorsSlashingSwitch', + }, + RewardPaymentSchedulingInterrupted: { + accountId: 'AccountId32', + era: 'u32', + error: 'SpRuntimeDispatchError', + }, + CommissionCapUpdated: { + governanceCouncillDid: 'PolymeshPrimitivesIdentityId', + oldCommissionCap: 'Perbill', + newCommissionCap: 'Perbill' + } + } + }, + /** + * Lookup95: pallet_validators::types::SlashingSwitch + **/ + PalletValidatorsSlashingSwitch: { + _enum: ['Validator', 'ValidatorAndNominator', 'None'] + }, + /** + * Lookup97: pallet_staking::pallet::pallet::Event **/ PalletStakingPalletEvent: { _enum: { @@ -645,8 +697,8 @@ export default { remainder: 'u128', }, Rewarded: { - identity: 'PolymeshPrimitivesIdentityId', stash: 'AccountId32', + dest: 'PalletStakingRewardDestination', amount: 'u128', }, Slashed: { @@ -663,12 +715,10 @@ export default { }, StakersElected: 'Null', Bonded: { - identity: 'PolymeshPrimitivesIdentityId', stash: 'AccountId32', amount: 'u128', }, Unbonded: { - identity: 'PolymeshPrimitivesIdentityId', stash: 'AccountId32', amount: 'u128', }, @@ -687,68 +737,64 @@ export default { PayoutStarted: { eraIndex: 'u32', validatorStash: 'AccountId32', + page: 'u32', + next: 'Option', }, ValidatorPrefsSet: { stash: 'AccountId32', prefs: 'PalletStakingValidatorPrefs', }, - ForceEra: { - mode: 'PalletStakingForcing', - }, - Nominated: { - nominatorIdentity: 'PolymeshPrimitivesIdentityId', - stash: 'AccountId32', - targets: 'Vec', - }, - PermissionedIdentityAdded: { - governanceCouncillDid: 'PolymeshPrimitivesIdentityId', - validatorsIdentity: 'PolymeshPrimitivesIdentityId', - }, - PermissionedIdentityRemoved: { - governanceCouncillDid: 'PolymeshPrimitivesIdentityId', - validatorsIdentity: 'PolymeshPrimitivesIdentityId', + SnapshotVotersSizeExceeded: { + _alias: { + size_: 'size', + }, + size_: 'u32', }, - InvalidatedNominators: { - governanceCouncillDid: 'PolymeshPrimitivesIdentityId', - governanceCouncillAccount: 'PolymeshPrimitivesIdentityId', - expiredNominators: 'Vec', + SnapshotTargetsSizeExceeded: { + _alias: { + size_: 'size', + }, + size_: 'u32', }, - SlashingAllowedForChanged: { - slashingSwitch: 'PalletStakingSlashingSwitch', + ForceEra: { + mode: 'PalletStakingForcing', }, - RewardPaymentSchedulingInterrupted: { - accountId: 'AccountId32', - era: 'u32', - error: 'SpRuntimeDispatchError', + ControllerBatchDeprecated: { + failures: 'u32', }, - CommissionCapUpdated: { - governanceCouncillDid: 'PolymeshPrimitivesIdentityId', - oldCommissionCap: 'Perbill', - newCommissionCap: 'Perbill' + CurrencyMigrated: { + stash: 'AccountId32', + forceWithdraw: 'u128' } } }, /** - * Lookup101: pallet_staking::ValidatorPrefs + * Lookup98: pallet_staking::RewardDestination + **/ + PalletStakingRewardDestination: { + _enum: { + Staked: 'Null', + Stash: 'Null', + Controller: 'Null', + Account: 'AccountId32', + None: 'Null' + } + }, + /** + * Lookup100: pallet_staking::ValidatorPrefs **/ PalletStakingValidatorPrefs: { commission: 'Compact', blocked: 'bool' }, /** - * Lookup103: pallet_staking::Forcing + * Lookup102: pallet_staking::Forcing **/ PalletStakingForcing: { _enum: ['NotForcing', 'ForceNew', 'ForceNone', 'ForceAlways'] }, /** - * Lookup104: pallet_staking::types::SlashingSwitch - **/ - PalletStakingSlashingSwitch: { - _enum: ['Validator', 'ValidatorAndNominator', 'None'] - }, - /** - * Lookup105: pallet_offences::pallet::Event + * Lookup103: pallet_offences::pallet::Event **/ PalletOffencesEvent: { _enum: { @@ -759,17 +805,23 @@ export default { } }, /** - * Lookup106: pallet_session::pallet::Event + * Lookup104: pallet_session::pallet::Event **/ PalletSessionEvent: { _enum: { NewSession: { - sessionIndex: 'u32' + sessionIndex: 'u32', + }, + ValidatorDisabled: { + validator: 'AccountId32', + }, + ValidatorReenabled: { + validator: 'AccountId32' } } }, /** - * Lookup107: pallet_grandpa::pallet::Event + * Lookup105: pallet_grandpa::pallet::Event **/ PalletGrandpaEvent: { _enum: { @@ -781,15 +833,11 @@ export default { } }, /** - * Lookup110: sp_consensus_grandpa::app::Public - **/ - SpConsensusGrandpaAppPublic: 'SpCoreEd25519Public', - /** - * Lookup111: sp_core::ed25519::Public + * Lookup108: sp_consensus_grandpa::app::Public **/ - SpCoreEd25519Public: '[u8;32]', + SpConsensusGrandpaAppPublic: '[u8;32]', /** - * Lookup112: pallet_im_online::pallet::Event + * Lookup109: pallet_im_online::pallet::Event **/ PalletImOnlineEvent: { _enum: { @@ -798,47 +846,49 @@ export default { }, AllGood: 'Null', SomeOffline: { - offline: 'Vec<(AccountId32,PalletStakingExposure)>' + offline: 'Vec<(AccountId32,SpStakingExposure)>' } } }, /** - * Lookup113: pallet_im_online::sr25519::app_sr25519::Public - **/ - PalletImOnlineSr25519AppSr25519Public: 'SpCoreSr25519Public', - /** - * Lookup114: sp_core::sr25519::Public + * Lookup110: pallet_im_online::sr25519::app_sr25519::Public **/ - SpCoreSr25519Public: '[u8;32]', + PalletImOnlineSr25519AppSr25519Public: '[u8;32]', /** - * Lookup117: pallet_staking::Exposure + * Lookup113: sp_staking::Exposure **/ - PalletStakingExposure: { + SpStakingExposure: { total: 'Compact', own: 'Compact', - others: 'Vec' + others: 'Vec' }, /** - * Lookup120: pallet_staking::IndividualExposure + * Lookup116: sp_staking::IndividualExposure **/ - PalletStakingIndividualExposure: { + SpStakingIndividualExposure: { who: 'AccountId32', value: 'Compact' }, /** - * Lookup121: pallet_sudo::RawEvent + * Lookup117: pallet_sudo::pallet::Event **/ - PalletSudoRawEvent: { + PalletSudoEvent: { _enum: { - Sudid: 'Result', - KeyChanged: 'Option', - SudoAsDone: 'Result' + Sudid: { + sudoResult: 'Result', + }, + KeyChanged: { + oldSudoer: 'Option', + }, + SudoAsDone: { + sudoResult: 'Result' + } } }, /** - * Lookup122: polymesh_common_utilities::traits::asset::RawEvent + * Lookup118: pallet_asset::pallet::Event **/ - PolymeshCommonUtilitiesAssetRawEvent: { + PalletAssetEvent: { _enum: { AssetCreated: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesAssetAssetId,bool,PolymeshPrimitivesAssetAssetType,PolymeshPrimitivesIdentityId,Bytes,Vec,Option)', IdentifiersUpdated: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesAssetAssetId,Vec)', @@ -869,11 +919,13 @@ export default { RemovePreApprovedAsset: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesAssetAssetId)', AssetMediatorsAdded: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesAssetAssetId,BTreeSet)', AssetMediatorsRemoved: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesAssetAssetId,BTreeSet)', - TickerLinkedToAsset: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesTicker,PolymeshPrimitivesAssetAssetId)' + TickerLinkedToAsset: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesTicker,PolymeshPrimitivesAssetAssetId)', + TickerUnlinkedFromAsset: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesTicker,PolymeshPrimitivesAssetAssetId)', + GlobalMetadataSpecUpdated: '(Bytes,PolymeshPrimitivesAssetMetadataAssetMetadataSpec)' } }, /** - * Lookup123: polymesh_primitives::asset::AssetType + * Lookup119: polymesh_primitives::asset::AssetType **/ PolymeshPrimitivesAssetAssetType: { _enum: { @@ -892,7 +944,7 @@ export default { } }, /** - * Lookup125: polymesh_primitives::asset::NonFungibleType + * Lookup121: polymesh_primitives::asset::NonFungibleType **/ PolymeshPrimitivesAssetNonFungibleType: { _enum: { @@ -903,7 +955,7 @@ export default { } }, /** - * Lookup128: polymesh_primitives::asset_identifier::AssetIdentifier + * Lookup124: polymesh_primitives::asset_identifier::AssetIdentifier **/ PolymeshPrimitivesAssetIdentifier: { _enum: { @@ -915,7 +967,7 @@ export default { } }, /** - * Lookup134: polymesh_primitives::document::Document + * Lookup130: polymesh_primitives::document::Document **/ PolymeshPrimitivesDocument: { uri: 'Bytes', @@ -925,7 +977,7 @@ export default { filingDate: 'Option' }, /** - * Lookup136: polymesh_primitives::document_hash::DocumentHash + * Lookup132: polymesh_primitives::document_hash::DocumentHash **/ PolymeshPrimitivesDocumentHash: { _enum: { @@ -941,14 +993,14 @@ export default { } }, /** - * Lookup147: polymesh_primitives::asset_metadata::AssetMetadataValueDetail + * Lookup143: polymesh_primitives::asset_metadata::AssetMetadataValueDetail **/ PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail: { expire: 'Option', lockStatus: 'PolymeshPrimitivesAssetMetadataAssetMetadataLockStatus' }, /** - * Lookup148: polymesh_primitives::asset_metadata::AssetMetadataLockStatus + * Lookup144: polymesh_primitives::asset_metadata::AssetMetadataLockStatus **/ PolymeshPrimitivesAssetMetadataAssetMetadataLockStatus: { _enum: { @@ -958,7 +1010,7 @@ export default { } }, /** - * Lookup151: polymesh_primitives::asset_metadata::AssetMetadataSpec + * Lookup147: polymesh_primitives::asset_metadata::AssetMetadataSpec **/ PolymeshPrimitivesAssetMetadataAssetMetadataSpec: { url: 'Option', @@ -966,7 +1018,7 @@ export default { typeDef: 'Option' }, /** - * Lookup158: polymesh_primitives::asset_metadata::AssetMetadataKey + * Lookup154: polymesh_primitives::asset_metadata::AssetMetadataKey **/ PolymeshPrimitivesAssetMetadataAssetMetadataKey: { _enum: { @@ -975,7 +1027,7 @@ export default { } }, /** - * Lookup160: polymesh_primitives::portfolio::PortfolioUpdateReason + * Lookup156: polymesh_primitives::portfolio::PortfolioUpdateReason **/ PolymeshPrimitivesPortfolioPortfolioUpdateReason: { _enum: { @@ -991,9 +1043,9 @@ export default { } }, /** - * Lookup164: pallet_corporate_actions::distribution::Event + * Lookup160: pallet_corporate_actions::distribution::pallet::Event **/ - PalletCorporateActionsDistributionEvent: { + PalletCorporateActionsDistributionPalletEvent: { _enum: { Created: '(PolymeshPrimitivesEventOnly,PalletCorporateActionsCaId,PalletCorporateActionsDistribution)', BenefitClaimed: '(PolymeshPrimitivesEventOnly,PolymeshPrimitivesEventOnly,PalletCorporateActionsCaId,PalletCorporateActionsDistribution,u128,Permill)', @@ -1002,18 +1054,18 @@ export default { } }, /** - * Lookup165: polymesh_primitives::event_only::EventOnly + * Lookup161: polymesh_primitives::event_only::EventOnly **/ PolymeshPrimitivesEventOnly: 'PolymeshPrimitivesIdentityId', /** - * Lookup166: pallet_corporate_actions::CAId + * Lookup162: pallet_corporate_actions::CAId **/ PalletCorporateActionsCaId: { assetId: 'PolymeshPrimitivesAssetAssetId', localId: 'u32' }, /** - * Lookup168: pallet_corporate_actions::distribution::Distribution + * Lookup164: pallet_corporate_actions::distribution::Distribution **/ PalletCorporateActionsDistribution: { from: 'PolymeshPrimitivesIdentityIdPortfolioId', @@ -1026,9 +1078,9 @@ export default { expiresAt: 'Option' }, /** - * Lookup170: polymesh_common_utilities::traits::checkpoint::Event + * Lookup166: pallet_asset::checkpoint::pallet::Event **/ - PolymeshCommonUtilitiesCheckpointEvent: { + PalletAssetCheckpointPalletEvent: { _enum: { CheckpointCreated: '(Option,PolymeshPrimitivesAssetAssetId,u64,u128,u64)', MaximumSchedulesComplexityChanged: '(PolymeshPrimitivesIdentityId,u64)', @@ -1037,15 +1089,15 @@ export default { } }, /** - * Lookup173: polymesh_common_utilities::traits::checkpoint::ScheduleCheckpoints + * Lookup169: polymesh_common_utilities::traits::checkpoint::ScheduleCheckpoints **/ PolymeshCommonUtilitiesCheckpointScheduleCheckpoints: { pending: 'BTreeSet' }, /** - * Lookup176: polymesh_common_utilities::traits::compliance_manager::Event + * Lookup172: pallet_compliance_manager::pallet::Event **/ - PolymeshCommonUtilitiesComplianceManagerEvent: { + PalletComplianceManagerEvent: { _enum: { ComplianceRequirementCreated: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesAssetAssetId,PolymeshPrimitivesComplianceManagerComplianceRequirement)', ComplianceRequirementRemoved: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesAssetAssetId,u32)', @@ -1059,7 +1111,7 @@ export default { } }, /** - * Lookup177: polymesh_primitives::compliance_manager::ComplianceRequirement + * Lookup173: polymesh_primitives::compliance_manager::ComplianceRequirement **/ PolymeshPrimitivesComplianceManagerComplianceRequirement: { senderConditions: 'Vec', @@ -1067,14 +1119,14 @@ export default { id: 'u32' }, /** - * Lookup179: polymesh_primitives::condition::Condition + * Lookup175: polymesh_primitives::condition::Condition **/ PolymeshPrimitivesCondition: { conditionType: 'PolymeshPrimitivesConditionConditionType', issuers: 'Vec' }, /** - * Lookup180: polymesh_primitives::condition::ConditionType + * Lookup176: polymesh_primitives::condition::ConditionType **/ PolymeshPrimitivesConditionConditionType: { _enum: { @@ -1086,7 +1138,7 @@ export default { } }, /** - * Lookup182: polymesh_primitives::condition::TargetIdentity + * Lookup178: polymesh_primitives::condition::TargetIdentity **/ PolymeshPrimitivesConditionTargetIdentity: { _enum: { @@ -1095,14 +1147,14 @@ export default { } }, /** - * Lookup184: polymesh_primitives::condition::TrustedIssuer + * Lookup180: polymesh_primitives::condition::TrustedIssuer **/ PolymeshPrimitivesConditionTrustedIssuer: { issuer: 'PolymeshPrimitivesIdentityId', trustedFor: 'PolymeshPrimitivesConditionTrustedFor' }, /** - * Lookup185: polymesh_primitives::condition::TrustedFor + * Lookup181: polymesh_primitives::condition::TrustedFor **/ PolymeshPrimitivesConditionTrustedFor: { _enum: { @@ -1111,7 +1163,7 @@ export default { } }, /** - * Lookup187: polymesh_primitives::identity_claim::ClaimType + * Lookup183: polymesh_primitives::identity_claim::ClaimType **/ PolymeshPrimitivesIdentityClaimClaimType: { _enum: { @@ -1128,7 +1180,7 @@ export default { } }, /** - * Lookup189: pallet_corporate_actions::Event + * Lookup185: pallet_corporate_actions::pallet::Event **/ PalletCorporateActionsEvent: { _enum: { @@ -1143,20 +1195,20 @@ export default { } }, /** - * Lookup190: pallet_corporate_actions::TargetIdentities + * Lookup186: pallet_corporate_actions::TargetIdentities **/ PalletCorporateActionsTargetIdentities: { identities: 'Vec', treatment: 'PalletCorporateActionsTargetTreatment' }, /** - * Lookup191: pallet_corporate_actions::TargetTreatment + * Lookup187: pallet_corporate_actions::TargetTreatment **/ PalletCorporateActionsTargetTreatment: { _enum: ['Include', 'Exclude'] }, /** - * Lookup193: pallet_corporate_actions::CorporateAction + * Lookup189: pallet_corporate_actions::CorporateAction **/ PalletCorporateActionsCorporateAction: { kind: 'PalletCorporateActionsCaKind', @@ -1167,20 +1219,20 @@ export default { withholdingTax: 'Vec<(PolymeshPrimitivesIdentityId,Permill)>' }, /** - * Lookup194: pallet_corporate_actions::CAKind + * Lookup190: pallet_corporate_actions::CAKind **/ PalletCorporateActionsCaKind: { _enum: ['PredictableBenefit', 'UnpredictableBenefit', 'IssuerNotice', 'Reorganization', 'Other'] }, /** - * Lookup196: pallet_corporate_actions::RecordDate + * Lookup192: pallet_corporate_actions::RecordDate **/ PalletCorporateActionsRecordDate: { date: 'u64', checkpoint: 'PalletCorporateActionsCaCheckpoint' }, /** - * Lookup197: pallet_corporate_actions::CACheckpoint + * Lookup193: pallet_corporate_actions::CACheckpoint **/ PalletCorporateActionsCaCheckpoint: { _enum: { @@ -1189,9 +1241,9 @@ export default { } }, /** - * Lookup202: pallet_corporate_actions::ballot::Event + * Lookup198: pallet_corporate_actions::ballot::pallet::Event **/ - PalletCorporateActionsBallotEvent: { + PalletCorporateActionsBallotPalletEvent: { _enum: { Created: '(PolymeshPrimitivesIdentityId,PalletCorporateActionsCaId,PalletCorporateActionsBallotBallotTimeRange,PalletCorporateActionsBallotBallotMeta,bool)', VoteCast: '(PolymeshPrimitivesIdentityId,PalletCorporateActionsCaId,Vec)', @@ -1202,21 +1254,21 @@ export default { } }, /** - * Lookup203: pallet_corporate_actions::ballot::BallotTimeRange + * Lookup199: pallet_corporate_actions::ballot::BallotTimeRange **/ PalletCorporateActionsBallotBallotTimeRange: { start: 'u64', end: 'u64' }, /** - * Lookup204: pallet_corporate_actions::ballot::BallotMeta + * Lookup200: pallet_corporate_actions::ballot::BallotMeta **/ PalletCorporateActionsBallotBallotMeta: { title: 'Bytes', motions: 'Vec' }, /** - * Lookup207: pallet_corporate_actions::ballot::Motion + * Lookup203: pallet_corporate_actions::ballot::Motion **/ PalletCorporateActionsBallotMotion: { title: 'Bytes', @@ -1224,26 +1276,26 @@ export default { choices: 'Vec' }, /** - * Lookup213: pallet_corporate_actions::ballot::BallotVote + * Lookup209: pallet_corporate_actions::ballot::BallotVote **/ PalletCorporateActionsBallotBallotVote: { power: 'u128', fallback: 'Option' }, /** - * Lookup216: pallet_pips::RawEvent + * Lookup212: pallet_pips::pallet::Event **/ - PalletPipsRawEvent: { + PalletPipsEvent: { _enum: { HistoricalPipsPruned: '(PolymeshPrimitivesIdentityId,bool,bool)', - ProposalCreated: '(PolymeshPrimitivesIdentityId,PalletPipsProposer,u32,u128,Option,Option,PolymeshCommonUtilitiesMaybeBlock,PalletPipsProposalData)', + ProposalCreated: '(PolymeshPrimitivesIdentityId,PalletPipsProposer,u32,u128,Option,Option,PolymeshPrimitivesMaybeBlock,PalletPipsProposalData)', ProposalStateUpdated: '(PolymeshPrimitivesIdentityId,u32,PalletPipsProposalState)', Voted: '(PolymeshPrimitivesIdentityId,AccountId32,u32,bool,u128)', PipClosed: '(PolymeshPrimitivesIdentityId,u32,bool)', ExecutionScheduled: '(PolymeshPrimitivesIdentityId,u32,u32)', DefaultEnactmentPeriodChanged: '(PolymeshPrimitivesIdentityId,u32,u32)', MinimumProposalDepositChanged: '(PolymeshPrimitivesIdentityId,u128,u128)', - PendingPipExpiryChanged: '(PolymeshPrimitivesIdentityId,PolymeshCommonUtilitiesMaybeBlock,PolymeshCommonUtilitiesMaybeBlock)', + PendingPipExpiryChanged: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesMaybeBlock,PolymeshPrimitivesMaybeBlock)', MaxPipSkipCountChanged: '(PolymeshPrimitivesIdentityId,u8,u8)', ActivePipLimitChanged: '(PolymeshPrimitivesIdentityId,u32,u32)', ProposalRefund: '(PolymeshPrimitivesIdentityId,u32,u128)', @@ -1258,7 +1310,7 @@ export default { } }, /** - * Lookup217: pallet_pips::Proposer + * Lookup213: pallet_pips::types::Proposer **/ PalletPipsProposer: { _enum: { @@ -1267,13 +1319,13 @@ export default { } }, /** - * Lookup218: pallet_pips::Committee + * Lookup214: pallet_pips::types::Committee **/ PalletPipsCommittee: { _enum: ['Technical', 'Upgrade'] }, /** - * Lookup222: pallet_pips::ProposalData + * Lookup218: pallet_pips::types::ProposalData **/ PalletPipsProposalData: { _enum: { @@ -1282,22 +1334,22 @@ export default { } }, /** - * Lookup223: pallet_pips::ProposalState + * Lookup219: pallet_pips::types::ProposalState **/ PalletPipsProposalState: { _enum: ['Pending', 'Rejected', 'Scheduled', 'Failed', 'Executed', 'Expired'] }, /** - * Lookup226: pallet_pips::SnapshottedPip + * Lookup222: pallet_pips::types::SnapshottedPip **/ PalletPipsSnapshottedPip: { id: 'u32', weight: '(bool,u128)' }, /** - * Lookup232: polymesh_common_utilities::traits::portfolio::Event + * Lookup228: pallet_portfolio::pallet::Event **/ - PolymeshCommonUtilitiesPortfolioEvent: { + PalletPortfolioEvent: { _enum: { PortfolioCreated: '(PolymeshPrimitivesIdentityId,u64,Bytes)', PortfolioDeleted: '(PolymeshPrimitivesIdentityId,u64)', @@ -1306,11 +1358,13 @@ export default { PortfolioCustodianChanged: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityIdPortfolioId,PolymeshPrimitivesIdentityId)', FundsMovedBetweenPortfolios: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityIdPortfolioId,PolymeshPrimitivesIdentityIdPortfolioId,PolymeshPrimitivesPortfolioFundDescription,Option)', PreApprovedPortfolio: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityIdPortfolioId,PolymeshPrimitivesAssetAssetId)', - RevokePreApprovedPortfolio: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityIdPortfolioId,PolymeshPrimitivesAssetAssetId)' + RevokePreApprovedPortfolio: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityIdPortfolioId,PolymeshPrimitivesAssetAssetId)', + AllowIdentityToCreatePortfolios: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)', + RevokeCreatePortfoliosPermission: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId)' } }, /** - * Lookup236: polymesh_primitives::portfolio::FundDescription + * Lookup232: polymesh_primitives::portfolio::FundDescription **/ PolymeshPrimitivesPortfolioFundDescription: { _enum: { @@ -1322,16 +1376,16 @@ export default { } }, /** - * Lookup237: polymesh_primitives::nft::NFTs + * Lookup233: polymesh_primitives::nft::NFTs **/ PolymeshPrimitivesNftNfTs: { assetId: 'PolymeshPrimitivesAssetAssetId', ids: 'Vec' }, /** - * Lookup240: pallet_protocol_fee::RawEvent + * Lookup236: pallet_protocol_fee::pallet::Event **/ - PalletProtocolFeeRawEvent: { + PalletProtocolFeeEvent: { _enum: { FeeSet: '(PolymeshPrimitivesIdentityId,u128)', CoefficientSet: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesPosRatio)', @@ -1339,11 +1393,11 @@ export default { } }, /** - * Lookup241: polymesh_primitives::PosRatio + * Lookup237: polymesh_primitives::PosRatio **/ PolymeshPrimitivesPosRatio: '(u32,u32)', /** - * Lookup242: pallet_scheduler::pallet::Event + * Lookup238: pallet_scheduler::pallet::Event **/ PalletSchedulerEvent: { _enum: { @@ -1360,6 +1414,16 @@ export default { id: 'Option<[u8;32]>', result: 'Result', }, + RetrySet: { + task: '(u32,u32)', + id: 'Option<[u8;32]>', + period: 'u32', + retries: 'u8', + }, + RetryCancelled: { + task: '(u32,u32)', + id: 'Option<[u8;32]>', + }, CallUnavailable: { task: '(u32,u32)', id: 'Option<[u8;32]>', @@ -1368,16 +1432,23 @@ export default { task: '(u32,u32)', id: 'Option<[u8;32]>', }, + RetryFailed: { + task: '(u32,u32)', + id: 'Option<[u8;32]>', + }, PermanentlyOverweight: { task: '(u32,u32)', - id: 'Option<[u8;32]>' + id: 'Option<[u8;32]>', + }, + AgendaIncomplete: { + when: 'u32' } } }, /** - * Lookup245: polymesh_common_utilities::traits::settlement::RawEvent + * Lookup241: pallet_settlement::pallet::Event **/ - PolymeshCommonUtilitiesSettlementRawEvent: { + PalletSettlementEvent: { _enum: { VenueCreated: '(PolymeshPrimitivesIdentityId,u64,Bytes,PolymeshPrimitivesSettlementVenueType)', VenueDetailsUpdated: '(PolymeshPrimitivesIdentityId,u64,Bytes)', @@ -1390,7 +1461,6 @@ export default { VenuesAllowed: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesAssetAssetId,Vec)', VenuesBlocked: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesAssetAssetId,Vec)', LegFailedExecution: '(PolymeshPrimitivesIdentityId,u64,u64)', - InstructionFailed: '(PolymeshPrimitivesIdentityId,u64)', InstructionExecuted: '(PolymeshPrimitivesIdentityId,u64)', VenueUnauthorized: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesAssetAssetId,u64)', SchedulingFailed: '(u64,SpRuntimeDispatchError)', @@ -1402,31 +1472,33 @@ export default { InstructionAutomaticallyAffirmed: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityIdPortfolioId,u64)', MediatorAffirmationReceived: '(PolymeshPrimitivesIdentityId,u64,Option)', MediatorAffirmationWithdrawn: '(PolymeshPrimitivesIdentityId,u64)', - InstructionMediators: '(u64,BTreeSet)' + InstructionMediators: '(u64,BTreeSet)', + InstructionLocked: '(PolymeshPrimitivesIdentityId,u64)' } }, /** - * Lookup248: polymesh_primitives::settlement::VenueType + * Lookup244: polymesh_primitives::settlement::VenueType **/ PolymeshPrimitivesSettlementVenueType: { _enum: ['Other', 'Distribution', 'Sto', 'Exchange'] }, /** - * Lookup251: polymesh_primitives::settlement::ReceiptMetadata + * Lookup247: polymesh_primitives::settlement::ReceiptMetadata **/ PolymeshPrimitivesSettlementReceiptMetadata: '[u8;32]', /** - * Lookup254: polymesh_primitives::settlement::SettlementType + * Lookup250: polymesh_primitives::settlement::SettlementType **/ PolymeshPrimitivesSettlementSettlementType: { _enum: { SettleOnAffirmation: 'Null', SettleOnBlock: 'u32', - SettleManual: 'u32' + SettleManual: 'u32', + SettleAfterLock: 'Null' } }, /** - * Lookup256: polymesh_primitives::settlement::Leg + * Lookup252: polymesh_primitives::settlement::Leg **/ PolymeshPrimitivesSettlementLeg: { _enum: { @@ -1450,9 +1522,9 @@ export default { } }, /** - * Lookup257: polymesh_common_utilities::traits::statistics::Event + * Lookup253: pallet_statistics::pallet::Event **/ - PolymeshCommonUtilitiesStatisticsEvent: { + PalletStatisticsEvent: { _enum: { StatTypesAdded: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesAssetAssetId,Vec)', StatTypesRemoved: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesAssetAssetId,Vec)', @@ -1463,27 +1535,27 @@ export default { } }, /** - * Lookup259: polymesh_primitives::statistics::StatType + * Lookup255: polymesh_primitives::statistics::StatType **/ PolymeshPrimitivesStatisticsStatType: { operationType: 'PolymeshPrimitivesStatisticsStatOpType', claimIssuer: 'Option<(PolymeshPrimitivesIdentityClaimClaimType,PolymeshPrimitivesIdentityId)>' }, /** - * Lookup260: polymesh_primitives::statistics::StatOpType + * Lookup256: polymesh_primitives::statistics::StatOpType **/ PolymeshPrimitivesStatisticsStatOpType: { _enum: ['Count', 'Balance'] }, /** - * Lookup264: polymesh_primitives::statistics::StatUpdate + * Lookup260: polymesh_primitives::statistics::StatUpdate **/ PolymeshPrimitivesStatisticsStatUpdate: { key2: 'PolymeshPrimitivesStatisticsStat2ndKey', value: 'Option' }, /** - * Lookup265: polymesh_primitives::statistics::Stat2ndKey + * Lookup261: polymesh_primitives::statistics::Stat2ndKey **/ PolymeshPrimitivesStatisticsStat2ndKey: { _enum: { @@ -1492,7 +1564,7 @@ export default { } }, /** - * Lookup266: polymesh_primitives::statistics::StatClaim + * Lookup262: polymesh_primitives::statistics::StatClaim **/ PolymeshPrimitivesStatisticsStatClaim: { _enum: { @@ -1502,7 +1574,7 @@ export default { } }, /** - * Lookup270: polymesh_primitives::transfer_compliance::TransferCondition + * Lookup266: polymesh_primitives::transfer_compliance::TransferCondition **/ PolymeshPrimitivesTransferComplianceTransferCondition: { _enum: { @@ -1513,7 +1585,7 @@ export default { } }, /** - * Lookup271: polymesh_primitives::transfer_compliance::TransferConditionExemptKey + * Lookup267: polymesh_primitives::transfer_compliance::TransferConditionExemptKey **/ PolymeshPrimitivesTransferComplianceTransferConditionExemptKey: { assetId: 'PolymeshPrimitivesAssetAssetId', @@ -1521,20 +1593,60 @@ export default { claimType: 'Option' }, /** - * Lookup273: pallet_sto::RawEvent + * Lookup269: pallet_sto::pallet::Event **/ - PalletStoRawEvent: { + PalletStoEvent: { _enum: { - FundraiserCreated: '(PolymeshPrimitivesIdentityId,u64,Bytes,PalletStoFundraiser)', - Invested: '(PolymeshPrimitivesIdentityId,u64,PolymeshPrimitivesAssetAssetId,PolymeshPrimitivesAssetAssetId,u128,u128)', - FundraiserFrozen: '(PolymeshPrimitivesIdentityId,u64)', - FundraiserUnfrozen: '(PolymeshPrimitivesIdentityId,u64)', - FundraiserWindowModified: '(PolymeshPrimitivesEventOnly,u64,u64,Option,u64,Option)', - FundraiserClosed: '(PolymeshPrimitivesIdentityId,u64)' + FundraiserCreated: { + agentDid: 'PolymeshPrimitivesIdentityId', + offeringAsset: 'PolymeshPrimitivesAssetAssetId', + raisingAsset: 'PolymeshPrimitivesAssetAssetId', + fundraiserId: 'u64', + fundraiserName: 'Bytes', + fundraiser: 'PalletStoFundraiser', + }, + Invested: { + investorDid: 'PolymeshPrimitivesIdentityId', + offeringAsset: 'PolymeshPrimitivesAssetAssetId', + fundraiserId: 'u64', + fundingAsset: 'PalletStoFundingAsset', + offeringAmount: 'u128', + raiseAmount: 'u128', + }, + FundraiserFrozen: { + agentDid: 'PolymeshPrimitivesIdentityId', + offeringAsset: 'PolymeshPrimitivesAssetAssetId', + fundraiserId: 'u64', + }, + FundraiserUnfrozen: { + agentDid: 'PolymeshPrimitivesIdentityId', + offeringAsset: 'PolymeshPrimitivesAssetAssetId', + fundraiserId: 'u64', + }, + FundraiserWindowModified: { + agentDid: 'PolymeshPrimitivesEventOnly', + offeringAsset: 'PolymeshPrimitivesAssetAssetId', + fundraiserId: 'u64', + oldStart: 'u64', + oldEnd: 'Option', + newStart: 'u64', + newEnd: 'Option', + }, + FundraiserClosed: { + agentDid: 'PolymeshPrimitivesIdentityId', + offeringAsset: 'PolymeshPrimitivesAssetAssetId', + fundraiserId: 'u64', + }, + FundraiserOffchainFundingEnabled: { + agentDid: 'PolymeshPrimitivesIdentityId', + offeringAsset: 'PolymeshPrimitivesAssetAssetId', + fundraiserId: 'u64', + ticker: 'PolymeshPrimitivesTicker' + } } }, /** - * Lookup276: pallet_sto::Fundraiser + * Lookup272: pallet_sto::Fundraiser **/ PalletStoFundraiser: { creator: 'PolymeshPrimitivesIdentityId', @@ -1550,7 +1662,7 @@ export default { minimumInvestment: 'u128' }, /** - * Lookup278: pallet_sto::FundraiserTier + * Lookup274: pallet_sto::FundraiserTier **/ PalletStoFundraiserTier: { total: 'u128', @@ -1558,15 +1670,24 @@ export default { remaining: 'u128' }, /** - * Lookup279: pallet_sto::FundraiserStatus + * Lookup275: pallet_sto::FundraiserStatus **/ PalletStoFundraiserStatus: { _enum: ['Live', 'Frozen', 'Closed', 'ClosedEarly'] }, /** - * Lookup280: pallet_treasury::RawEvent + * Lookup276: pallet_sto::FundingAsset + **/ + PalletStoFundingAsset: { + _enum: { + OnChain: 'PolymeshPrimitivesAssetAssetId', + OffChain: 'PolymeshPrimitivesTicker' + } + }, + /** + * Lookup277: pallet_treasury::pallet::Event **/ - PalletTreasuryRawEvent: { + PalletTreasuryEvent: { _enum: { TreasuryDisbursement: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId,AccountId32,u128)', TreasuryDisbursementFailed: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesIdentityId,AccountId32,u128)', @@ -1574,7 +1695,7 @@ export default { } }, /** - * Lookup281: pallet_utility::pallet::Event + * Lookup278: pallet_utility::pallet::Event **/ PalletUtilityEvent: { _enum: { @@ -1594,25 +1715,22 @@ export default { RelayedTx: { callerDid: 'PolymeshPrimitivesIdentityId', target: 'AccountId32', - result: 'Result', - }, - BatchInterruptedOld: '(Vec,(u32,SpRuntimeDispatchError))', - BatchOptimisticFailed: '(Vec,Vec<(u32,SpRuntimeDispatchError)>)', - BatchCompletedOld: 'Vec' + result: 'Result' + } } }, /** - * Lookup285: polymesh_common_utilities::traits::base::Event + * Lookup279: pallet_base::pallet::Event **/ - PolymeshCommonUtilitiesBaseEvent: { + PalletBaseEvent: { _enum: { UnexpectedError: 'Option' } }, /** - * Lookup287: polymesh_common_utilities::traits::external_agents::Event + * Lookup281: pallet_external_agents::pallet::Event **/ - PolymeshCommonUtilitiesExternalAgentsEvent: { + PalletExternalAgentsEvent: { _enum: { GroupCreated: '(PolymeshPrimitivesEventOnly,PolymeshPrimitivesAssetAssetId,u32,PolymeshPrimitivesSecondaryKeyExtrinsicPermissions)', GroupPermissionsUpdated: '(PolymeshPrimitivesEventOnly,PolymeshPrimitivesAssetAssetId,u32,PolymeshPrimitivesSecondaryKeyExtrinsicPermissions)', @@ -1622,9 +1740,9 @@ export default { } }, /** - * Lookup288: polymesh_common_utilities::traits::relayer::RawEvent + * Lookup282: pallet_relayer::pallet::Event **/ - PolymeshCommonUtilitiesRelayerRawEvent: { + PalletRelayerEvent: { _enum: { AuthorizedPayingKey: '(PolymeshPrimitivesEventOnly,AccountId32,AccountId32,u128,u64)', AcceptedPayingKey: '(PolymeshPrimitivesEventOnly,AccountId32,AccountId32)', @@ -1633,7 +1751,7 @@ export default { } }, /** - * Lookup289: pallet_contracts::pallet::Event + * Lookup283: pallet_contracts::pallet::Event **/ PalletContractsEvent: { _enum: { @@ -1647,6 +1765,8 @@ export default { }, CodeStored: { codeHash: 'H256', + depositHeld: 'u128', + uploader: 'AccountId32', }, ContractEmitted: { contract: 'AccountId32', @@ -1654,6 +1774,8 @@ export default { }, CodeRemoved: { codeHash: 'H256', + depositReleased: 'u128', + remover: 'AccountId32', }, ContractCodeUpdated: { contract: 'AccountId32', @@ -1661,44 +1783,67 @@ export default { oldCodeHash: 'H256', }, Called: { - caller: 'AccountId32', + caller: 'PalletContractsOrigin', contract: 'AccountId32', }, DelegateCalled: { contract: 'AccountId32', - codeHash: 'H256' + codeHash: 'H256', + }, + StorageDepositTransferredAndHeld: { + from: 'AccountId32', + to: 'AccountId32', + amount: 'u128', + }, + StorageDepositTransferredAndReleased: { + from: 'AccountId32', + to: 'AccountId32', + amount: 'u128' } } }, /** - * Lookup290: polymesh_contracts::RawEvent + * Lookup284: pallet_contracts::Origin **/ - PolymeshContractsRawEvent: { + PalletContractsOrigin: { + _enum: { + Root: 'Null', + Signed: 'AccountId32' + } + }, + /** + * Lookup285: polymesh_runtime_develop::runtime::Runtime + **/ + PolymeshRuntimeDevelopRuntime: 'Null', + /** + * Lookup286: polymesh_contracts::pallet::Event + **/ + PolymeshContractsEvent: { _enum: { ApiHashUpdated: '(PolymeshContractsApi,PolymeshContractsChainVersion,H256)', SCRuntimeCall: '(AccountId32,PolymeshContractsChainExtensionExtrinsicId)' } }, /** - * Lookup291: polymesh_contracts::Api + * Lookup287: polymesh_contracts::Api **/ PolymeshContractsApi: { desc: '[u8;4]', major: 'u32' }, /** - * Lookup292: polymesh_contracts::ChainVersion + * Lookup288: polymesh_contracts::ChainVersion **/ PolymeshContractsChainVersion: { specVersion: 'u32', txVersion: 'u32' }, /** - * Lookup293: polymesh_contracts::chain_extension::ExtrinsicId + * Lookup289: polymesh_contracts::chain_extension::ExtrinsicId **/ PolymeshContractsChainExtensionExtrinsicId: '(u8,u8)', /** - * Lookup294: pallet_preimage::pallet::Event + * Lookup290: pallet_preimage::pallet::Event **/ PalletPreimageEvent: { _enum: { @@ -1723,16 +1868,16 @@ export default { } }, /** - * Lookup295: polymesh_common_utilities::traits::nft::Event + * Lookup291: pallet_nft::pallet::Event **/ - PolymeshCommonUtilitiesNftEvent: { + PalletNftEvent: { _enum: { NftCollectionCreated: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesAssetAssetId,u64)', NFTPortfolioUpdated: '(PolymeshPrimitivesIdentityId,PolymeshPrimitivesNftNfTs,Option,Option,PolymeshPrimitivesPortfolioPortfolioUpdateReason)' } }, /** - * Lookup297: pallet_election_provider_multi_phase::pallet::Event + * Lookup293: pallet_election_provider_multi_phase::pallet::Event **/ PalletElectionProviderMultiPhaseEvent: { _enum: { @@ -1762,13 +1907,13 @@ export default { } }, /** - * Lookup298: pallet_election_provider_multi_phase::ElectionCompute + * Lookup294: pallet_election_provider_multi_phase::ElectionCompute **/ PalletElectionProviderMultiPhaseElectionCompute: { _enum: ['OnChain', 'Signed', 'Unsigned', 'Fallback', 'Emergency'] }, /** - * Lookup299: sp_npos_elections::ElectionScore + * Lookup295: sp_npos_elections::ElectionScore **/ SpNposElectionsElectionScore: { minimalStake: 'u128', @@ -1776,7 +1921,7 @@ export default { sumStakeSquared: 'u128' }, /** - * Lookup300: pallet_election_provider_multi_phase::Phase + * Lookup296: pallet_election_provider_multi_phase::Phase **/ PalletElectionProviderMultiPhasePhase: { _enum: { @@ -1787,16 +1932,7 @@ export default { } }, /** - * Lookup302: pallet_test_utils::RawEvent - **/ - PalletTestUtilsRawEvent: { - _enum: { - DidStatus: '(PolymeshPrimitivesIdentityId,AccountId32)', - CddStatus: '(Option,AccountId32,bool)' - } - }, - /** - * Lookup303: frame_system::Phase + * Lookup298: frame_system::Phase **/ FrameSystemPhase: { _enum: { @@ -1806,14 +1942,21 @@ export default { } }, /** - * Lookup306: frame_system::LastRuntimeUpgradeInfo + * Lookup301: frame_system::LastRuntimeUpgradeInfo **/ FrameSystemLastRuntimeUpgradeInfo: { specVersion: 'Compact', specName: 'Text' }, /** - * Lookup308: frame_system::pallet::Call + * Lookup304: frame_system::CodeUpgradeAuthorization + **/ + FrameSystemCodeUpgradeAuthorization: { + codeHash: 'H256', + checkVersion: 'bool' + }, + /** + * Lookup305: frame_system::pallet::Call **/ FrameSystemCall: { _enum: { @@ -1843,12 +1986,22 @@ export default { subkeys: 'u32', }, remark_with_event: { - remark: 'Bytes' + remark: 'Bytes', + }, + __Unused8: 'Null', + authorize_upgrade: { + codeHash: 'H256', + }, + authorize_upgrade_without_checks: { + codeHash: 'H256', + }, + apply_authorized_upgrade: { + code: 'Bytes' } } }, /** - * Lookup312: frame_system::limits::BlockWeights + * Lookup309: frame_system::limits::BlockWeights **/ FrameSystemLimitsBlockWeights: { baseBlock: 'SpWeightsWeightV2Weight', @@ -1856,7 +2009,7 @@ export default { perClass: 'FrameSupportDispatchPerDispatchClassWeightsPerClass' }, /** - * Lookup313: frame_support::dispatch::PerDispatchClass + * Lookup310: frame_support::dispatch::PerDispatchClass **/ FrameSupportDispatchPerDispatchClassWeightsPerClass: { normal: 'FrameSystemLimitsWeightsPerClass', @@ -1864,7 +2017,7 @@ export default { mandatory: 'FrameSystemLimitsWeightsPerClass' }, /** - * Lookup314: frame_system::limits::WeightsPerClass + * Lookup311: frame_system::limits::WeightsPerClass **/ FrameSystemLimitsWeightsPerClass: { baseExtrinsic: 'SpWeightsWeightV2Weight', @@ -1873,13 +2026,13 @@ export default { reserved: 'Option' }, /** - * Lookup316: frame_system::limits::BlockLength + * Lookup313: frame_system::limits::BlockLength **/ FrameSystemLimitsBlockLength: { max: 'FrameSupportDispatchPerDispatchClassU32' }, /** - * Lookup317: frame_support::dispatch::PerDispatchClass + * Lookup314: frame_support::dispatch::PerDispatchClass **/ FrameSupportDispatchPerDispatchClassU32: { normal: 'u32', @@ -1887,14 +2040,14 @@ export default { mandatory: 'u32' }, /** - * Lookup318: sp_weights::RuntimeDbWeight + * Lookup315: sp_weights::RuntimeDbWeight **/ SpWeightsRuntimeDbWeight: { read: 'u64', write: 'u64' }, /** - * Lookup319: sp_version::RuntimeVersion + * Lookup316: sp_version::RuntimeVersion **/ SpVersionRuntimeVersion: { specName: 'Text', @@ -1904,20 +2057,20 @@ export default { implVersion: 'u32', apis: 'Vec<([u8;8],u32)>', transactionVersion: 'u32', - stateVersion: 'u8' + systemVersion: 'u8' }, /** - * Lookup324: frame_system::pallet::Error + * Lookup321: frame_system::pallet::Error **/ FrameSystemError: { - _enum: ['InvalidSpecName', 'SpecVersionNeedsToIncrease', 'FailedToExtractRuntimeVersion', 'NonDefaultComposite', 'NonZeroRefCount', 'CallFiltered'] + _enum: ['InvalidSpecName', 'SpecVersionNeedsToIncrease', 'FailedToExtractRuntimeVersion', 'NonDefaultComposite', 'NonZeroRefCount', 'CallFiltered', 'MultiBlockMigrationsOngoing', 'NothingAuthorized', 'Unauthorized'] }, /** - * Lookup327: sp_consensus_babe::app::Public + * Lookup324: sp_consensus_babe::app::Public **/ - SpConsensusBabeAppPublic: 'SpCoreSr25519Public', + SpConsensusBabeAppPublic: '[u8;32]', /** - * Lookup330: sp_consensus_babe::digests::NextConfigDescriptor + * Lookup327: sp_consensus_babe::digests::NextConfigDescriptor **/ SpConsensusBabeDigestsNextConfigDescriptor: { _enum: { @@ -1929,13 +2082,13 @@ export default { } }, /** - * Lookup332: sp_consensus_babe::AllowedSlots + * Lookup329: sp_consensus_babe::AllowedSlots **/ SpConsensusBabeAllowedSlots: { _enum: ['PrimarySlots', 'PrimaryAndSecondaryPlainSlots', 'PrimaryAndSecondaryVRFSlots'] }, /** - * Lookup336: sp_consensus_babe::digests::PreDigest + * Lookup333: sp_consensus_babe::digests::PreDigest **/ SpConsensusBabeDigestsPreDigest: { _enum: { @@ -1946,39 +2099,44 @@ export default { } }, /** - * Lookup337: sp_consensus_babe::digests::PrimaryPreDigest + * Lookup334: sp_consensus_babe::digests::PrimaryPreDigest **/ SpConsensusBabeDigestsPrimaryPreDigest: { authorityIndex: 'u32', slot: 'u64', - vrfOutput: '[u8;32]', - vrfProof: '[u8;64]' + vrfSignature: 'SpCoreSr25519VrfVrfSignature' }, /** - * Lookup338: sp_consensus_babe::digests::SecondaryPlainPreDigest + * Lookup335: sp_core::sr25519::vrf::VrfSignature + **/ + SpCoreSr25519VrfVrfSignature: { + preOutput: '[u8;32]', + proof: '[u8;64]' + }, + /** + * Lookup336: sp_consensus_babe::digests::SecondaryPlainPreDigest **/ SpConsensusBabeDigestsSecondaryPlainPreDigest: { authorityIndex: 'u32', slot: 'u64' }, /** - * Lookup339: sp_consensus_babe::digests::SecondaryVRFPreDigest + * Lookup337: sp_consensus_babe::digests::SecondaryVRFPreDigest **/ SpConsensusBabeDigestsSecondaryVRFPreDigest: { authorityIndex: 'u32', slot: 'u64', - vrfOutput: '[u8;32]', - vrfProof: '[u8;64]' + vrfSignature: 'SpCoreSr25519VrfVrfSignature' }, /** - * Lookup340: sp_consensus_babe::BabeEpochConfiguration + * Lookup338: sp_consensus_babe::BabeEpochConfiguration **/ SpConsensusBabeBabeEpochConfiguration: { c: '(u64,u64)', allowedSlots: 'SpConsensusBabeAllowedSlots' }, /** - * Lookup344: pallet_babe::pallet::Call + * Lookup342: pallet_babe::pallet::Call **/ PalletBabeCall: { _enum: { @@ -1996,7 +2154,7 @@ export default { } }, /** - * Lookup345: sp_consensus_slots::EquivocationProof, sp_consensus_babe::app::Public> + * Lookup343: sp_consensus_slots::EquivocationProof, sp_consensus_babe::app::Public> **/ SpConsensusSlotsEquivocationProof: { offender: 'SpConsensusBabeAppPublic', @@ -2005,7 +2163,7 @@ export default { secondHeader: 'SpRuntimeHeader' }, /** - * Lookup346: sp_runtime::generic::header::Header + * Lookup344: sp_runtime::generic::header::Header **/ SpRuntimeHeader: { parentHash: 'H256', @@ -2015,11 +2173,7 @@ export default { digest: 'SpRuntimeDigest' }, /** - * Lookup347: sp_runtime::traits::BlakeTwo256 - **/ - SpRuntimeBlakeTwo256: 'Null', - /** - * Lookup348: sp_session::MembershipProof + * Lookup345: sp_session::MembershipProof **/ SpSessionMembershipProof: { session: 'u32', @@ -2027,13 +2181,13 @@ export default { validatorCount: 'u32' }, /** - * Lookup349: pallet_babe::pallet::Error + * Lookup346: pallet_babe::pallet::Error **/ PalletBabeError: { _enum: ['InvalidEquivocationProof', 'InvalidKeyOwnershipProof', 'DuplicateOffenceReport', 'InvalidConfiguration'] }, /** - * Lookup350: pallet_timestamp::pallet::Call + * Lookup347: pallet_timestamp::pallet::Call **/ PalletTimestampCall: { _enum: { @@ -2043,7 +2197,7 @@ export default { } }, /** - * Lookup352: pallet_indices::pallet::Call + * Lookup349: pallet_indices::pallet::Call **/ PalletIndicesCall: { _enum: { @@ -2069,105 +2223,250 @@ export default { freeze: 'bool', }, freeze: { + index: 'u32', + }, + poke_deposit: { index: 'u32' } } }, /** - * Lookup354: pallet_indices::pallet::Error + * Lookup351: pallet_indices::pallet::Error **/ PalletIndicesError: { _enum: ['NotAssigned', 'NotOwner', 'InUse', 'NotTransfer', 'Permanent'] }, /** - * Lookup356: pallet_balances::BalanceLock + * Lookup353: pallet_balances::types::BalanceLock **/ PalletBalancesBalanceLock: { id: '[u8;8]', amount: 'u128', - reasons: 'PolymeshCommonUtilitiesBalancesReasons' + reasons: 'PalletBalancesReasons' }, /** - * Lookup357: polymesh_common_utilities::traits::balances::Reasons + * Lookup354: pallet_balances::types::Reasons **/ - PolymeshCommonUtilitiesBalancesReasons: { + PalletBalancesReasons: { _enum: ['Fee', 'Misc', 'All'] }, /** - * Lookup358: pallet_balances::Call + * Lookup357: pallet_balances::types::ReserveData + **/ + PalletBalancesReserveData: { + id: '[u8;8]', + amount: 'u128' + }, + /** + * Lookup361: polymesh_runtime_develop::runtime::RuntimeHoldReason + **/ + PolymeshRuntimeDevelopRuntimeRuntimeHoldReason: { + _enum: { + __Unused0: 'Null', + __Unused1: 'Null', + __Unused2: 'Null', + __Unused3: 'Null', + __Unused4: 'Null', + __Unused5: 'Null', + __Unused6: 'Null', + __Unused7: 'Null', + __Unused8: 'Null', + __Unused9: 'Null', + __Unused10: 'Null', + __Unused11: 'Null', + __Unused12: 'Null', + __Unused13: 'Null', + __Unused14: 'Null', + __Unused15: 'Null', + __Unused16: 'Null', + Staking: 'PalletStakingPalletHoldReason', + __Unused18: 'Null', + __Unused19: 'Null', + __Unused20: 'Null', + __Unused21: 'Null', + __Unused22: 'Null', + __Unused23: 'Null', + __Unused24: 'Null', + __Unused25: 'Null', + __Unused26: 'Null', + __Unused27: 'Null', + __Unused28: 'Null', + __Unused29: 'Null', + __Unused30: 'Null', + __Unused31: 'Null', + __Unused32: 'Null', + __Unused33: 'Null', + __Unused34: 'Null', + __Unused35: 'Null', + __Unused36: 'Null', + __Unused37: 'Null', + __Unused38: 'Null', + __Unused39: 'Null', + __Unused40: 'Null', + __Unused41: 'Null', + __Unused42: 'Null', + __Unused43: 'Null', + __Unused44: 'Null', + __Unused45: 'Null', + Contracts: 'PalletContractsHoldReason', + __Unused47: 'Null', + Preimage: 'PalletPreimageHoldReason' + } + }, + /** + * Lookup362: pallet_staking::pallet::pallet::HoldReason + **/ + PalletStakingPalletHoldReason: { + _enum: ['Staking'] + }, + /** + * Lookup363: pallet_contracts::pallet::HoldReason + **/ + PalletContractsHoldReason: { + _enum: ['CodeUploadDepositReserve', 'StorageDepositReserve'] + }, + /** + * Lookup364: pallet_preimage::pallet::HoldReason + **/ + PalletPreimageHoldReason: { + _enum: ['Preimage'] + }, + /** + * Lookup367: frame_support::traits::tokens::misc::IdAmount + **/ + FrameSupportTokensMiscIdAmount: { + id: '[u8;8]', + amount: 'u128' + }, + /** + * Lookup369: pallet_balances::pallet::Call **/ PalletBalancesCall: { _enum: { - transfer: { + transfer_allow_death: { + dest: 'MultiAddress', + value: 'Compact', + }, + __Unused1: 'Null', + force_transfer: { + source: 'MultiAddress', dest: 'MultiAddress', value: 'Compact', }, - transfer_with_memo: { + transfer_keep_alive: { dest: 'MultiAddress', value: 'Compact', - memo: 'Option', }, - deposit_block_reward_reserve_balance: { - value: 'Compact', + transfer_all: { + dest: 'MultiAddress', + keepAlive: 'bool', + }, + force_unreserve: { + who: 'MultiAddress', + amount: 'u128', }, - set_balance: { + upgrade_accounts: { + who: 'Vec', + }, + __Unused7: 'Null', + force_set_balance: { who: 'MultiAddress', newFree: 'Compact', - newReserved: 'Compact', }, - force_transfer: { - source: 'MultiAddress', - dest: 'MultiAddress', + force_adjust_total_issuance: { + direction: 'PalletBalancesAdjustmentDirection', + delta: 'Compact', + }, + burn: { value: 'Compact', + keepAlive: 'bool', }, - burn_account_balance: { - amount: 'u128' + __Unused11: 'Null', + __Unused12: 'Null', + __Unused13: 'Null', + __Unused14: 'Null', + __Unused15: 'Null', + __Unused16: 'Null', + __Unused17: 'Null', + __Unused18: 'Null', + __Unused19: 'Null', + __Unused20: 'Null', + __Unused21: 'Null', + __Unused22: 'Null', + __Unused23: 'Null', + __Unused24: 'Null', + __Unused25: 'Null', + __Unused26: 'Null', + __Unused27: 'Null', + __Unused28: 'Null', + __Unused29: 'Null', + __Unused30: 'Null', + __Unused31: 'Null', + __Unused32: 'Null', + __Unused33: 'Null', + __Unused34: 'Null', + __Unused35: 'Null', + __Unused36: 'Null', + __Unused37: 'Null', + __Unused38: 'Null', + __Unused39: 'Null', + transfer_with_memo: { + dest: 'MultiAddress', + value: 'Compact', + memo: 'Option' } } }, /** - * Lookup359: pallet_balances::Error + * Lookup370: pallet_balances::types::AdjustmentDirection + **/ + PalletBalancesAdjustmentDirection: { + _enum: ['Increase', 'Decrease'] + }, + /** + * Lookup371: pallet_balances::pallet::Error **/ PalletBalancesError: { - _enum: ['LiquidityRestrictions', 'Overflow', 'InsufficientBalance', 'ExistentialDeposit', 'ReceiverCddMissing'] + _enum: ['VestingBalance', 'LiquidityRestrictions', 'InsufficientBalance', 'ExistentialDeposit', 'Expendability', 'ExistingVestingSchedule', 'DeadAccount', 'TooManyReserves', 'TooManyHolds', 'TooManyFreezes', 'IssuanceDeactivated', 'DeltaZero', 'LockIdentifierNotFound', 'Overflow', 'MaxLocksExceeded'] }, /** - * Lookup361: pallet_transaction_payment::Releases + * Lookup373: pallet_transaction_payment::Releases **/ PalletTransactionPaymentReleases: { _enum: ['V1Ancient', 'V2'] }, /** - * Lookup363: sp_weights::WeightToFeeCoefficient + * Lookup374: pallet_transaction_payment::pallet::Call **/ - SpWeightsWeightToFeeCoefficient: { - coeffInteger: 'u128', - coeffFrac: 'Perbill', - negative: 'bool', - degree: 'u8' + PalletTransactionPaymentCall: { + _enum: { + set_disable_fees: { + value: 'bool' + } + } }, /** - * Lookup364: polymesh_primitives::identity::DidRecord + * Lookup375: polymesh_primitives::identity::DidRecord **/ PolymeshPrimitivesIdentityDidRecord: { primaryKey: 'Option' }, /** - * Lookup366: pallet_identity::types::Claim1stKey + * Lookup377: pallet_identity::types::Claim1stKey **/ PalletIdentityClaim1stKey: { target: 'PolymeshPrimitivesIdentityId', claimType: 'PolymeshPrimitivesIdentityClaimClaimType' }, /** - * Lookup367: pallet_identity::types::Claim2ndKey + * Lookup378: pallet_identity::types::Claim2ndKey **/ PalletIdentityClaim2ndKey: { issuer: 'PolymeshPrimitivesIdentityId', scope: 'Option' }, /** - * Lookup368: polymesh_primitives::secondary_key::KeyRecord + * Lookup379: polymesh_primitives::secondary_key::KeyRecord **/ PolymeshPrimitivesSecondaryKeyKeyRecord: { _enum: { @@ -2177,7 +2476,7 @@ export default { } }, /** - * Lookup371: polymesh_primitives::secondary_key::Signatory + * Lookup382: polymesh_primitives::secondary_key::Signatory **/ PolymeshPrimitivesSecondaryKeySignatory: { _enum: { @@ -2186,7 +2485,7 @@ export default { } }, /** - * Lookup372: polymesh_primitives::authorization::Authorization + * Lookup383: polymesh_primitives::authorization::Authorization **/ PolymeshPrimitivesAuthorization: { authorizationData: 'PolymeshPrimitivesAuthorizationAuthorizationData', @@ -2196,7 +2495,7 @@ export default { count: 'u32' }, /** - * Lookup376: pallet_identity::Call + * Lookup387: pallet_identity::pallet::Call **/ PalletIdentityCall: { _enum: { @@ -2288,35 +2587,35 @@ export default { } }, /** - * Lookup378: polymesh_common_utilities::traits::identity::SecondaryKeyWithAuth + * Lookup389: polymesh_common_utilities::traits::identity::SecondaryKeyWithAuth **/ PolymeshCommonUtilitiesIdentitySecondaryKeyWithAuth: { secondaryKey: 'PolymeshPrimitivesSecondaryKey', authSignature: 'H512' }, /** - * Lookup381: polymesh_common_utilities::traits::identity::CreateChildIdentityWithAuth + * Lookup392: polymesh_common_utilities::traits::identity::CreateChildIdentityWithAuth **/ PolymeshCommonUtilitiesIdentityCreateChildIdentityWithAuth: { key: 'AccountId32', authSignature: 'H512' }, /** - * Lookup382: pallet_identity::Error + * Lookup393: pallet_identity::pallet::Error **/ PalletIdentityError: { - _enum: ['AlreadyLinked', 'MissingIdentity', 'Unauthorized', 'InvalidAccountKey', 'UnAuthorizedCddProvider', 'InvalidAuthorizationFromOwner', 'InvalidAuthorizationFromCddProvider', 'NotCddProviderAttestation', 'AuthorizationsNotForSameDids', 'DidMustAlreadyExist', 'AuthorizationExpired', 'TargetHasNoCdd', 'AuthorizationHasBeenRevoked', 'InvalidAuthorizationSignature', 'KeyNotAllowed', 'NotPrimaryKey', 'DidDoesNotExist', 'DidAlreadyExists', 'SecondaryKeysContainPrimaryKey', 'FailedToChargeFee', 'NotASigner', 'CannotDecodeSignerAccountId', 'MultiSigHasBalance', 'AccountKeyIsBeingUsed', 'CustomScopeTooLong', 'CustomClaimTypeAlreadyExists', 'CustomClaimTypeDoesNotExist', 'ClaimDoesNotExist', 'IsChildIdentity', 'NoParentIdentity', 'NotParentOrChildIdentity', 'DuplicateKey', 'ExceptNotAllowedForExtrinsics', 'ExceededNumberOfGivenAuths'] + _enum: ['AlreadyLinked', 'MissingIdentity', 'Unauthorized', 'InvalidAccountKey', 'UnAuthorizedCddProvider', 'InvalidAuthorizationFromOwner', 'InvalidAuthorizationFromCddProvider', 'NotCddProviderAttestation', 'AuthorizationsNotForSameDids', 'DidMustAlreadyExist', 'AuthorizationExpired', 'TargetHasNoCdd', 'AuthorizationHasBeenRevoked', 'InvalidAuthorizationSignature', 'KeyNotAllowed', 'NotPrimaryKey', 'DidDoesNotExist', 'DidAlreadyExists', 'SecondaryKeysContainPrimaryKey', 'FailedToChargeFee', 'NotASigner', 'CannotDecodeSignerAccountId', 'AccountKeyIsBeingUsed', 'CustomScopeTooLong', 'CustomClaimTypeAlreadyExists', 'CustomClaimTypeDoesNotExist', 'ClaimDoesNotExist', 'IsChildIdentity', 'NoParentIdentity', 'NotParentOrChildIdentity', 'DuplicateKey', 'ExceptNotAllowedForExtrinsics', 'ExceededNumberOfGivenAuths', 'BadAuthorizationType', 'InvalidAuthorization', 'UnauthorizedCallerFrozenDid', 'UnauthorizedCallerDidMissingCdd', 'UnauthorizedCallerMissingPermissions'] }, /** - * Lookup384: polymesh_common_utilities::traits::group::InactiveMember + * Lookup395: polymesh_primitives::traits::group::InactiveMember **/ - PolymeshCommonUtilitiesGroupInactiveMember: { + PolymeshPrimitivesGroupInactiveMember: { id: 'PolymeshPrimitivesIdentityId', deactivatedAt: 'u64', expiry: 'Option' }, /** - * Lookup385: pallet_group::Call + * Lookup396: pallet_group::pallet::Call **/ PalletGroupCall: { _enum: { @@ -2345,13 +2644,13 @@ export default { } }, /** - * Lookup386: pallet_group::Error + * Lookup397: pallet_group::pallet::Error **/ PalletGroupError: { _enum: ['OnlyPrimaryKeyAllowed', 'DuplicateMember', 'NoSuchMember', 'LastMemberCannotQuit', 'ActiveMembersLimitExceeded', 'ActiveMembersLimitOverflow'] }, /** - * Lookup388: pallet_committee::Call + * Lookup399: pallet_committee::pallet::Call **/ PalletCommitteeCall: { _enum: { @@ -2363,7 +2662,7 @@ export default { id: 'PolymeshPrimitivesIdentityId', }, set_expires_after: { - expiry: 'PolymeshCommonUtilitiesMaybeBlock', + expiry: 'PolymeshPrimitivesMaybeBlock', }, vote_or_propose: { approve: 'bool', @@ -2377,7 +2676,7 @@ export default { } }, /** - * Lookup394: pallet_multisig::pallet::Call + * Lookup405: pallet_multisig::pallet::Call **/ PalletMultisigCall: { _enum: { @@ -2394,7 +2693,7 @@ export default { approve: { multisig: 'AccountId32', proposalId: 'u64', - maxWeight: 'SpWeightsWeightV2Weight', + maxWeight: 'Option', }, reject: { multisig: 'AccountId32', @@ -2439,17 +2738,49 @@ export default { authId: 'u64', }, join_identity: { - authId: 'u64' + authId: 'u64', + }, + remove_admin: 'Null' + } + }, + /** + * Lookup407: pallet_validators::pallet::Call + **/ + PalletValidatorsCall: { + _enum: { + add_permissioned_validator: { + identity: 'PolymeshPrimitivesIdentityId', + intendedCount: 'Option', + }, + remove_permissioned_validator: { + identity: 'PolymeshPrimitivesIdentityId', + }, + payout_stakers_by_system: { + validatorStash: 'AccountId32', + era: 'u32', + }, + change_slashing_allowed_for: { + slashingSwitch: 'PalletValidatorsSlashingSwitch', + }, + update_permissioned_validator_intended_count: { + identity: 'PolymeshPrimitivesIdentityId', + newIntendedCount: 'u32', + }, + chill_from_governance: { + identity: 'PolymeshPrimitivesIdentityId', + stashKeys: 'Vec', + }, + set_commission_cap: { + newCap: 'Perbill' } } }, /** - * Lookup396: pallet_staking::pallet::pallet::Call + * Lookup408: pallet_staking::pallet::pallet::Call **/ PalletStakingPalletCall: { _enum: { bond: { - controller: 'MultiAddress', value: 'Compact', payee: 'PalletStakingRewardDestination', }, @@ -2472,9 +2803,7 @@ export default { set_payee: { payee: 'PalletStakingRewardDestination', }, - set_controller: { - controller: 'MultiAddress', - }, + set_controller: 'Null', set_validator_count: { _alias: { new_: 'new', @@ -2522,9 +2851,10 @@ export default { maxValidatorCount: 'PalletStakingPalletConfigOpU32', chillThreshold: 'PalletStakingPalletConfigOpPercent', minCommission: 'PalletStakingPalletConfigOpPerbill', + maxStakedRewards: 'PalletStakingPalletConfigOpPercent', }, chill_other: { - controller: 'AccountId32', + stash: 'AccountId32', }, force_apply_min_commission: { validatorStash: 'AccountId32', @@ -2535,50 +2865,37 @@ export default { }, new_: 'Perbill', }, - add_permissioned_validator: { - identity: 'PolymeshPrimitivesIdentityId', - intendedCount: 'Option', - }, - remove_permissioned_validator: { - identity: 'PolymeshPrimitivesIdentityId', - }, - validate_cdd_expiry_nominators: { - targets: 'Vec', - }, - payout_stakers_by_system: { + payout_stakers_by_page: { validatorStash: 'AccountId32', era: 'u32', + page: 'u32', }, - change_slashing_allowed_for: { - slashingSwitch: 'PalletStakingSlashingSwitch', + update_payee: { + controller: 'AccountId32', }, - update_permissioned_validator_intended_count: { - identity: 'PolymeshPrimitivesIdentityId', - newIntendedCount: 'u32', + deprecate_controller_batch: { + controllers: 'Vec', }, - chill_from_governance: { - identity: 'PolymeshPrimitivesIdentityId', - stashKeys: 'Vec', + restore_ledger: { + stash: 'AccountId32', + maybeController: 'Option', + maybeTotal: 'Option', + maybeUnlocking: 'Option>', }, - set_commission_cap: { - newCap: 'Perbill' + migrate_currency: { + stash: 'AccountId32', + }, + __Unused31: 'Null', + __Unused32: 'Null', + manual_slash: { + validatorStash: 'AccountId32', + era: 'u32', + slashFraction: 'Perbill' } } }, /** - * Lookup397: pallet_staking::RewardDestination - **/ - PalletStakingRewardDestination: { - _enum: { - Staked: 'Null', - Stash: 'Null', - Controller: 'Null', - Account: 'AccountId32', - None: 'Null' - } - }, - /** - * Lookup400: pallet_staking::pallet::pallet::ConfigOp + * Lookup412: pallet_staking::pallet::pallet::ConfigOp **/ PalletStakingPalletConfigOpU128: { _enum: { @@ -2588,7 +2905,7 @@ export default { } }, /** - * Lookup401: pallet_staking::pallet::pallet::ConfigOp + * Lookup413: pallet_staking::pallet::pallet::ConfigOp **/ PalletStakingPalletConfigOpU32: { _enum: { @@ -2598,7 +2915,7 @@ export default { } }, /** - * Lookup402: pallet_staking::pallet::pallet::ConfigOp + * Lookup414: pallet_staking::pallet::pallet::ConfigOp **/ PalletStakingPalletConfigOpPercent: { _enum: { @@ -2608,7 +2925,7 @@ export default { } }, /** - * Lookup403: pallet_staking::pallet::pallet::ConfigOp + * Lookup415: pallet_staking::pallet::pallet::ConfigOp **/ PalletStakingPalletConfigOpPerbill: { _enum: { @@ -2618,7 +2935,14 @@ export default { } }, /** - * Lookup405: pallet_session::pallet::Call + * Lookup419: pallet_staking::UnlockChunk + **/ + PalletStakingUnlockChunk: { + value: 'Compact', + era: 'Compact' + }, + /** + * Lookup421: pallet_session::pallet::Call **/ PalletSessionCall: { _enum: { @@ -2633,7 +2957,7 @@ export default { } }, /** - * Lookup406: polymesh_runtime_develop::runtime::SessionKeys + * Lookup422: polymesh_runtime_develop::runtime::SessionKeys **/ PolymeshRuntimeDevelopRuntimeSessionKeys: { grandpa: 'SpConsensusGrandpaAppPublic', @@ -2642,11 +2966,11 @@ export default { authorityDiscovery: 'SpAuthorityDiscoveryAppPublic' }, /** - * Lookup407: sp_authority_discovery::app::Public + * Lookup423: sp_authority_discovery::app::Public **/ - SpAuthorityDiscoveryAppPublic: 'SpCoreSr25519Public', + SpAuthorityDiscoveryAppPublic: '[u8;32]', /** - * Lookup408: pallet_grandpa::pallet::Call + * Lookup424: pallet_grandpa::pallet::Call **/ PalletGrandpaCall: { _enum: { @@ -2665,14 +2989,14 @@ export default { } }, /** - * Lookup409: sp_consensus_grandpa::EquivocationProof + * Lookup425: sp_consensus_grandpa::EquivocationProof **/ SpConsensusGrandpaEquivocationProof: { setId: 'u64', equivocation: 'SpConsensusGrandpaEquivocation' }, /** - * Lookup410: sp_consensus_grandpa::Equivocation + * Lookup426: sp_consensus_grandpa::Equivocation **/ SpConsensusGrandpaEquivocation: { _enum: { @@ -2681,7 +3005,7 @@ export default { } }, /** - * Lookup411: finality_grandpa::Equivocation, sp_consensus_grandpa::app::Signature> + * Lookup427: finality_grandpa::Equivocation, sp_consensus_grandpa::app::Signature> **/ FinalityGrandpaEquivocationPrevote: { roundNumber: 'u64', @@ -2690,22 +3014,18 @@ export default { second: '(FinalityGrandpaPrevote,SpConsensusGrandpaAppSignature)' }, /** - * Lookup412: finality_grandpa::Prevote + * Lookup428: finality_grandpa::Prevote **/ FinalityGrandpaPrevote: { targetHash: 'H256', targetNumber: 'u32' }, /** - * Lookup413: sp_consensus_grandpa::app::Signature - **/ - SpConsensusGrandpaAppSignature: 'SpCoreEd25519Signature', - /** - * Lookup414: sp_core::ed25519::Signature + * Lookup429: sp_consensus_grandpa::app::Signature **/ - SpCoreEd25519Signature: '[u8;64]', + SpConsensusGrandpaAppSignature: '[u8;64]', /** - * Lookup416: finality_grandpa::Equivocation, sp_consensus_grandpa::app::Signature> + * Lookup431: finality_grandpa::Equivocation, sp_consensus_grandpa::app::Signature> **/ FinalityGrandpaEquivocationPrecommit: { roundNumber: 'u64', @@ -2714,14 +3034,14 @@ export default { second: '(FinalityGrandpaPrecommit,SpConsensusGrandpaAppSignature)' }, /** - * Lookup417: finality_grandpa::Precommit + * Lookup432: finality_grandpa::Precommit **/ FinalityGrandpaPrecommit: { targetHash: 'H256', targetNumber: 'u32' }, /** - * Lookup419: pallet_im_online::pallet::Call + * Lookup434: pallet_im_online::pallet::Call **/ PalletImOnlineCall: { _enum: { @@ -2732,32 +3052,20 @@ export default { } }, /** - * Lookup420: pallet_im_online::Heartbeat + * Lookup435: pallet_im_online::Heartbeat **/ PalletImOnlineHeartbeat: { blockNumber: 'u32', - networkState: 'SpCoreOffchainOpaqueNetworkState', sessionIndex: 'u32', authorityIndex: 'u32', validatorsLen: 'u32' }, /** - * Lookup421: sp_core::offchain::OpaqueNetworkState - **/ - SpCoreOffchainOpaqueNetworkState: { - peerId: 'OpaquePeerId', - externalAddresses: 'Vec' - }, - /** - * Lookup425: pallet_im_online::sr25519::app_sr25519::Signature - **/ - PalletImOnlineSr25519AppSr25519Signature: 'SpCoreSr25519Signature', - /** - * Lookup426: sp_core::sr25519::Signature + * Lookup436: pallet_im_online::sr25519::app_sr25519::Signature **/ - SpCoreSr25519Signature: '[u8;64]', + PalletImOnlineSr25519AppSr25519Signature: '[u8;64]', /** - * Lookup427: pallet_sudo::Call + * Lookup437: pallet_sudo::pallet::Call **/ PalletSudoCall: { _enum: { @@ -2781,7 +3089,7 @@ export default { } }, /** - * Lookup428: pallet_asset::Call + * Lookup438: pallet_asset::pallet::Call **/ PalletAssetCall: { _enum: { @@ -2834,7 +3142,7 @@ export default { }, set_funding_round: { assetId: 'PolymeshPrimitivesAssetAssetId', - foundingRoundName: 'Bytes', + fundingRoundName: 'Bytes', }, update_identifiers: { assetId: 'PolymeshPrimitivesAssetAssetId', @@ -2916,14 +3224,22 @@ export default { }, link_ticker_to_asset_id: { ticker: 'PolymeshPrimitivesTicker', - assetId: 'PolymeshPrimitivesAssetAssetId' + assetId: 'PolymeshPrimitivesAssetAssetId', + }, + unlink_ticker_from_asset_id: { + ticker: 'PolymeshPrimitivesTicker', + assetId: 'PolymeshPrimitivesAssetAssetId', + }, + update_global_metadata_spec: { + assetMetadataName: 'Bytes', + assetMetadataSpec: 'PolymeshPrimitivesAssetMetadataAssetMetadataSpec' } } }, /** - * Lookup431: pallet_corporate_actions::distribution::Call + * Lookup441: pallet_corporate_actions::distribution::pallet::Call **/ - PalletCorporateActionsDistributionCall: { + PalletCorporateActionsDistributionPalletCall: { _enum: { distribute: { caId: 'PalletCorporateActionsCaId', @@ -2950,9 +3266,9 @@ export default { } }, /** - * Lookup433: pallet_asset::checkpoint::Call + * Lookup443: pallet_asset::checkpoint::pallet::Call **/ - PalletAssetCheckpointCall: { + PalletAssetCheckpointPalletCall: { _enum: { create_checkpoint: { assetId: 'PolymeshPrimitivesAssetAssetId', @@ -2971,7 +3287,7 @@ export default { } }, /** - * Lookup434: pallet_compliance_manager::Call + * Lookup444: pallet_compliance_manager::pallet::Call **/ PalletComplianceManagerCall: { _enum: { @@ -3012,7 +3328,7 @@ export default { } }, /** - * Lookup435: pallet_corporate_actions::Call + * Lookup445: pallet_corporate_actions::pallet::Call **/ PalletCorporateActionsCall: { _enum: { @@ -3060,12 +3376,18 @@ export default { perShare: 'u128', amount: 'u128', paymentAt: 'u64', - expiresAt: 'Option' + expiresAt: 'Option', + }, + initiate_corporate_action_and_ballot: { + caArgs: 'PalletCorporateActionsInitiateCorporateActionArgs', + ballotTimeRange: 'PalletCorporateActionsBallotBallotTimeRange', + ballotMeta: 'PalletCorporateActionsBallotBallotMeta', + rcv: 'bool' } } }, /** - * Lookup437: pallet_corporate_actions::RecordDateSpec + * Lookup447: pallet_corporate_actions::RecordDateSpec **/ PalletCorporateActionsRecordDateSpec: { _enum: { @@ -3075,7 +3397,7 @@ export default { } }, /** - * Lookup440: pallet_corporate_actions::InitiateCorporateActionArgs + * Lookup450: pallet_corporate_actions::InitiateCorporateActionArgs **/ PalletCorporateActionsInitiateCorporateActionArgs: { assetId: 'PolymeshPrimitivesAssetAssetId', @@ -3088,9 +3410,9 @@ export default { withholdingTax: 'Option>' }, /** - * Lookup441: pallet_corporate_actions::ballot::Call + * Lookup451: pallet_corporate_actions::ballot::pallet::Call **/ - PalletCorporateActionsBallotCall: { + PalletCorporateActionsBallotPalletCall: { _enum: { attach_ballot: { caId: 'PalletCorporateActionsCaId', @@ -3120,7 +3442,7 @@ export default { } }, /** - * Lookup442: pallet_pips::Call + * Lookup452: pallet_pips::pallet::Call **/ PalletPipsCall: { _enum: { @@ -3134,7 +3456,7 @@ export default { duration: 'u32', }, set_pending_pip_expiry: { - expiry: 'PolymeshCommonUtilitiesMaybeBlock', + expiry: 'PolymeshPrimitivesMaybeBlock', }, set_max_pip_skip_count: { max: 'u8', @@ -3181,13 +3503,13 @@ export default { } }, /** - * Lookup445: pallet_pips::SnapshotResult + * Lookup455: pallet_pips::types::SnapshotResult **/ PalletPipsSnapshotResult: { _enum: ['Approve', 'Reject', 'Skip'] }, /** - * Lookup446: pallet_portfolio::Call + * Lookup456: pallet_portfolio::pallet::Call **/ PalletPortfolioCall: { _enum: { @@ -3233,14 +3555,14 @@ export default { } }, /** - * Lookup448: polymesh_primitives::portfolio::Fund + * Lookup458: polymesh_primitives::portfolio::Fund **/ PolymeshPrimitivesPortfolioFund: { description: 'PolymeshPrimitivesPortfolioFundDescription', memo: 'Option' }, /** - * Lookup449: pallet_protocol_fee::Call + * Lookup459: pallet_protocol_fee::pallet::Call **/ PalletProtocolFeeCall: { _enum: { @@ -3254,13 +3576,13 @@ export default { } }, /** - * Lookup450: polymesh_common_utilities::protocol_fee::ProtocolOp + * Lookup460: polymesh_common_utilities::protocol_fee::ProtocolOp **/ PolymeshCommonUtilitiesProtocolFeeProtocolOp: { _enum: ['AssetRegisterTicker', 'AssetIssue', 'AssetAddDocuments', 'AssetCreateAsset', 'CheckpointCreateSchedule', 'ComplianceManagerAddComplianceRequirement', 'IdentityCddRegisterDid', 'IdentityAddClaim', 'IdentityAddSecondaryKeysWithAuthorization', 'PipsPropose', 'ContractsPutCode', 'CorporateBallotAttachBallot', 'CapitalDistributionDistribute', 'NFTCreateCollection', 'NFTMint', 'IdentityCreateChildIdentity'] }, /** - * Lookup451: pallet_scheduler::pallet::Call + * Lookup461: pallet_scheduler::pallet::Call **/ PalletSchedulerCall: { _enum: { @@ -3295,12 +3617,28 @@ export default { after: 'u32', maybePeriodic: 'Option<(u32,u32)>', priority: 'u8', - call: 'Call' + call: 'Call', + }, + set_retry: { + task: '(u32,u32)', + retries: 'u8', + period: 'u32', + }, + set_retry_named: { + id: '[u8;32]', + retries: 'u8', + period: 'u32', + }, + cancel_retry: { + task: '(u32,u32)', + }, + cancel_retry_named: { + id: '[u8;32]' } } }, /** - * Lookup453: pallet_settlement::Call + * Lookup463: pallet_settlement::pallet::Call **/ PalletSettlementCall: { _enum: { @@ -3320,7 +3658,7 @@ export default { affirm_with_receipts: { id: 'u64', receiptDetails: 'Vec', - portfolios: 'Vec', + portfolios: 'BTreeSet', }, set_venue_filtering: { assetId: 'PolymeshPrimitivesAssetAssetId', @@ -3361,16 +3699,16 @@ export default { tradeDate: 'Option', valueDate: 'Option', legs: 'Vec', - portfolios: 'Vec', + portfolios: 'BTreeSet', instructionMemo: 'Option', }, affirm_instruction: { id: 'u64', - portfolios: 'Vec', + portfolios: 'BTreeSet', }, withdraw_affirmation: { id: 'u64', - portfolios: 'Vec', + portfolios: 'BTreeSet', }, reject_instruction: { id: 'u64', @@ -3383,12 +3721,12 @@ export default { affirm_with_receipts_with_count: { id: 'u64', receiptDetails: 'Vec', - portfolios: 'Vec', + portfolios: 'BTreeSet', numberOfAssets: 'Option', }, affirm_instruction_with_count: { id: 'u64', - portfolios: 'Vec', + portfolios: 'BTreeSet', numberOfAssets: 'Option', }, reject_instruction_with_count: { @@ -3398,7 +3736,7 @@ export default { }, withdraw_affirmation_with_count: { id: 'u64', - portfolios: 'Vec', + portfolios: 'BTreeSet', numberOfAssets: 'Option', }, add_instruction_with_mediators: { @@ -3416,7 +3754,7 @@ export default { tradeDate: 'Option', valueDate: 'Option', legs: 'Vec', - portfolios: 'Vec', + portfolios: 'BTreeSet', instructionMemo: 'Option', mediators: 'BTreeSet', }, @@ -3429,12 +3767,16 @@ export default { }, reject_instruction_as_mediator: { instructionId: 'u64', - numberOfAssets: 'Option' + numberOfAssets: 'Option', + }, + lock_instruction: { + instId: 'u64', + weightLimit: 'SpWeightsWeightV2Weight' } } }, /** - * Lookup455: polymesh_primitives::settlement::ReceiptDetails + * Lookup465: polymesh_primitives::settlement::ReceiptDetails **/ PolymeshPrimitivesSettlementReceiptDetails: { uid: 'u64', @@ -3445,21 +3787,17 @@ export default { metadata: 'Option' }, /** - * Lookup456: sp_runtime::MultiSignature + * Lookup466: sp_runtime::MultiSignature **/ SpRuntimeMultiSignature: { _enum: { - Ed25519: 'SpCoreEd25519Signature', - Sr25519: 'SpCoreSr25519Signature', - Ecdsa: 'SpCoreEcdsaSignature' + Ed25519: '[u8;64]', + Sr25519: '[u8;64]', + Ecdsa: '[u8;65]' } }, /** - * Lookup457: sp_core::ecdsa::Signature - **/ - SpCoreEcdsaSignature: '[u8;65]', - /** - * Lookup460: polymesh_primitives::settlement::AffirmationCount + * Lookup470: polymesh_primitives::settlement::AffirmationCount **/ PolymeshPrimitivesSettlementAffirmationCount: { senderAssetCount: 'PolymeshPrimitivesSettlementAssetCount', @@ -3467,7 +3805,7 @@ export default { offchainCount: 'u32' }, /** - * Lookup461: polymesh_primitives::settlement::AssetCount + * Lookup471: polymesh_primitives::settlement::AssetCount **/ PolymeshPrimitivesSettlementAssetCount: { fungible: 'u32', @@ -3475,7 +3813,7 @@ export default { offChain: 'u32' }, /** - * Lookup464: pallet_statistics::Call + * Lookup474: pallet_statistics::pallet::Call **/ PalletStatisticsCall: { _enum: { @@ -3500,7 +3838,7 @@ export default { } }, /** - * Lookup468: pallet_sto::Call + * Lookup478: pallet_sto::pallet::Call **/ PalletStoCall: { _enum: { @@ -3517,43 +3855,65 @@ export default { fundraiserName: 'Bytes', }, invest: { - investmentPortfolio: 'PolymeshPrimitivesIdentityIdPortfolioId', - fundingPortfolio: 'PolymeshPrimitivesIdentityIdPortfolioId', offeringAsset: 'PolymeshPrimitivesAssetAssetId', - id: 'u64', + fundraiserId: 'u64', + investmentPortfolio: 'PolymeshPrimitivesIdentityIdPortfolioId', + funding: 'PalletStoFundingMethod', purchaseAmount: 'u128', maxPrice: 'Option', - receipt: 'Option', }, freeze_fundraiser: { offeringAsset: 'PolymeshPrimitivesAssetAssetId', - id: 'u64', + fundraiserId: 'u64', }, unfreeze_fundraiser: { offeringAsset: 'PolymeshPrimitivesAssetAssetId', - id: 'u64', + fundraiserId: 'u64', }, modify_fundraiser_window: { offeringAsset: 'PolymeshPrimitivesAssetAssetId', - id: 'u64', + fundraiserId: 'u64', start: 'u64', end: 'Option', }, stop: { offeringAsset: 'PolymeshPrimitivesAssetAssetId', - id: 'u64' + fundraiserId: 'u64', + }, + enable_offchain_funding: { + offeringAsset: 'PolymeshPrimitivesAssetAssetId', + fundraiserId: 'u64', + ticker: 'PolymeshPrimitivesTicker' } } }, /** - * Lookup470: pallet_sto::PriceTier + * Lookup480: pallet_sto::PriceTier **/ PalletStoPriceTier: { total: 'u128', price: 'u128' }, /** - * Lookup472: pallet_treasury::Call + * Lookup481: pallet_sto::FundingMethod + **/ + PalletStoFundingMethod: { + _enum: { + OnChain: 'PolymeshPrimitivesIdentityIdPortfolioId', + OffChain: 'PolymeshPrimitivesStoFundraiserReceiptDetails' + } + }, + /** + * Lookup482: polymesh_primitives::sto::FundraiserReceiptDetails + **/ + PolymeshPrimitivesStoFundraiserReceiptDetails: { + uid: 'u64', + signer: 'AccountId32', + signature: 'SpRuntimeMultiSignature', + metadata: 'Option' + }, + /** + * Lookup483: pallet_treasury::pallet::Call **/ PalletTreasuryCall: { _enum: { @@ -3566,14 +3926,14 @@ export default { } }, /** - * Lookup474: polymesh_primitives::Beneficiary + * Lookup485: polymesh_primitives::Beneficiary **/ PolymeshPrimitivesBeneficiary: { id: 'PolymeshPrimitivesIdentityId', amount: 'u128' }, /** - * Lookup475: pallet_utility::pallet::Call + * Lookup486: pallet_utility::pallet::Call **/ PalletUtilityCall: { _enum: { @@ -3599,15 +3959,9 @@ export default { call: 'Call', weight: 'SpWeightsWeightV2Weight', }, - batch_old: { - calls: 'Vec', - }, - batch_atomic: { - calls: 'Vec', - }, - batch_optimistic: { - calls: 'Vec', - }, + __Unused6: 'Null', + __Unused7: 'Null', + __Unused8: 'Null', as_derivative: { index: 'u16', call: 'Call' @@ -3615,14 +3969,14 @@ export default { } }, /** - * Lookup477: pallet_utility::UniqueCall + * Lookup488: pallet_utility::UniqueCall **/ PalletUtilityUniqueCall: { nonce: 'u64', call: 'Call' }, /** - * Lookup478: polymesh_runtime_develop::runtime::OriginCaller + * Lookup489: polymesh_runtime_develop::runtime::OriginCaller **/ PolymeshRuntimeDevelopRuntimeOriginCaller: { _enum: { @@ -3630,20 +3984,20 @@ export default { __Unused1: 'Null', __Unused2: 'Null', __Unused3: 'Null', - Void: 'SpCoreVoid', + __Unused4: 'Null', __Unused5: 'Null', __Unused6: 'Null', __Unused7: 'Null', __Unused8: 'Null', - PolymeshCommittee: 'PalletCommitteeRawOriginInstance1', + PolymeshCommittee: 'PalletCommitteeRawOrigin', __Unused10: 'Null', - TechnicalCommittee: 'PalletCommitteeRawOriginInstance3', + TechnicalCommittee: 'PalletCommitteeRawOrigin', __Unused12: 'Null', - UpgradeCommittee: 'PalletCommitteeRawOriginInstance4' + UpgradeCommittee: 'PalletCommitteeRawOrigin' } }, /** - * Lookup479: frame_support::dispatch::RawOrigin + * Lookup490: frame_support::dispatch::RawOrigin **/ FrameSupportDispatchRawOrigin: { _enum: { @@ -3653,33 +4007,17 @@ export default { } }, /** - * Lookup480: pallet_committee::RawOrigin - **/ - PalletCommitteeRawOriginInstance1: { - _enum: ['Endorsed'] - }, - /** - * Lookup481: pallet_committee::RawOrigin + * Lookup491: pallet_committee::pallet::RawOrigin **/ - PalletCommitteeRawOriginInstance3: { + PalletCommitteeRawOrigin: { _enum: ['Endorsed'] }, /** - * Lookup482: pallet_committee::RawOrigin - **/ - PalletCommitteeRawOriginInstance4: { - _enum: ['Endorsed'] - }, - /** - * Lookup483: sp_core::Void - **/ - SpCoreVoid: 'Null', - /** - * Lookup484: pallet_base::Call + * Lookup494: pallet_base::pallet::Call **/ PalletBaseCall: 'Null', /** - * Lookup485: pallet_external_agents::Call + * Lookup495: pallet_external_agents::pallet::Call **/ PalletExternalAgentsCall: { _enum: { @@ -3721,7 +4059,7 @@ export default { } }, /** - * Lookup486: pallet_relayer::Call + * Lookup496: pallet_relayer::pallet::Call **/ PalletRelayerCall: { _enum: { @@ -3751,7 +4089,7 @@ export default { } }, /** - * Lookup487: pallet_contracts::pallet::Call + * Lookup497: pallet_contracts::pallet::Call **/ PalletContractsCall: { _enum: { @@ -3811,18 +4149,21 @@ export default { storageDepositLimit: 'Option>', codeHash: 'H256', data: 'Bytes', - salt: 'Bytes' + salt: 'Bytes', + }, + migrate: { + weightLimit: 'SpWeightsWeightV2Weight' } } }, /** - * Lookup491: pallet_contracts::wasm::Determinism + * Lookup499: pallet_contracts::wasm::Determinism **/ PalletContractsWasmDeterminism: { - _enum: ['Deterministic', 'AllowIndeterminism'] + _enum: ['Enforced', 'Relaxed'] }, /** - * Lookup492: polymesh_contracts::Call + * Lookup500: polymesh_contracts::pallet::Call **/ PolymeshContractsCall: { _enum: { @@ -3870,14 +4211,14 @@ export default { } }, /** - * Lookup495: polymesh_contracts::NextUpgrade + * Lookup503: polymesh_contracts::NextUpgrade **/ PolymeshContractsNextUpgrade: { chainVersion: 'PolymeshContractsChainVersion', apiHash: 'PolymeshContractsApiCodeHash' }, /** - * Lookup496: polymesh_contracts::ApiCodeHash + * Lookup504: polymesh_contracts::ApiCodeHash **/ PolymeshContractsApiCodeHash: { _alias: { @@ -3886,7 +4227,7 @@ export default { hash_: 'H256' }, /** - * Lookup497: pallet_preimage::pallet::Call + * Lookup505: pallet_preimage::pallet::Call **/ PalletPreimageCall: { _enum: { @@ -3909,12 +4250,15 @@ export default { _alias: { hash_: 'hash', }, - hash_: 'H256' + hash_: 'H256', + }, + ensure_updated: { + hashes: 'Vec' } } }, /** - * Lookup498: pallet_nft::Call + * Lookup506: pallet_nft::pallet::Call **/ PalletNftCall: { _enum: { @@ -3932,6 +4276,7 @@ export default { assetId: 'PolymeshPrimitivesAssetAssetId', nftId: 'u64', portfolioKind: 'PolymeshPrimitivesIdentityIdPortfolioKind', + numberOfKeys: 'Option', }, controller_transfer: { nfts: 'PolymeshPrimitivesNftNfTs', @@ -3941,18 +4286,18 @@ export default { } }, /** - * Lookup501: polymesh_primitives::nft::NFTCollectionKeys + * Lookup509: polymesh_primitives::nft::NFTCollectionKeys **/ PolymeshPrimitivesNftNftCollectionKeys: 'Vec', /** - * Lookup504: polymesh_primitives::nft::NFTMetadataAttribute + * Lookup512: polymesh_primitives::nft::NFTMetadataAttribute **/ PolymeshPrimitivesNftNftMetadataAttribute: { key: 'PolymeshPrimitivesAssetMetadataAssetMetadataKey', value: 'Bytes' }, /** - * Lookup505: pallet_election_provider_multi_phase::pallet::Call + * Lookup514: pallet_election_provider_multi_phase::pallet::Call **/ PalletElectionProviderMultiPhaseCall: { _enum: { @@ -3976,7 +4321,7 @@ export default { } }, /** - * Lookup506: pallet_election_provider_multi_phase::RawSolution + * Lookup515: pallet_election_provider_multi_phase::RawSolution **/ PalletElectionProviderMultiPhaseRawSolution: { solution: 'PolymeshRuntimeCommonNposSolution16', @@ -3984,7 +4329,7 @@ export default { round: 'u32' }, /** - * Lookup507: polymesh_runtime_common::NposSolution16 + * Lookup516: polymesh_runtime_common::NposSolution16 **/ PolymeshRuntimeCommonNposSolution16: { votes1: 'Vec<(Compact,Compact)>', @@ -4005,60 +4350,43 @@ export default { votes16: 'Vec<(Compact,[(Compact,Compact);15],Compact)>' }, /** - * Lookup558: pallet_election_provider_multi_phase::SolutionOrSnapshotSize + * Lookup567: pallet_election_provider_multi_phase::SolutionOrSnapshotSize **/ PalletElectionProviderMultiPhaseSolutionOrSnapshotSize: { voters: 'Compact', targets: 'Compact' }, /** - * Lookup562: sp_npos_elections::Support + * Lookup571: sp_npos_elections::Support **/ SpNposElectionsSupport: { total: 'u128', voters: 'Vec<(AccountId32,u128)>' }, /** - * Lookup565: pallet_test_utils::Call - **/ - PalletTestUtilsCall: { - _enum: { - register_did: { - secondaryKeys: 'Vec', - }, - mock_cdd_register_did: { - targetAccount: 'AccountId32', - }, - get_my_did: 'Null', - get_cdd_of: { - of: 'AccountId32' - } - } - }, - /** - * Lookup566: pallet_committee::PolymeshVotes + * Lookup574: pallet_committee::pallet::PolymeshVotes **/ PalletCommitteePolymeshVotes: { index: 'u32', ayes: 'Vec', nays: 'Vec', - expiry: 'PolymeshCommonUtilitiesMaybeBlock' + expiry: 'PolymeshPrimitivesMaybeBlock' }, /** - * Lookup568: pallet_committee::Error + * Lookup575: pallet_committee::pallet::Error **/ PalletCommitteeError: { _enum: ['DuplicateVote', 'NotAMember', 'NoSuchProposal', 'ProposalExpired', 'DuplicateProposal', 'MismatchedVotingIndex', 'InvalidProportion', 'FirstVoteReject', 'ProposalsLimitReached'] }, /** - * Lookup577: polymesh_primitives::multisig::ProposalVoteCount + * Lookup584: polymesh_primitives::multisig::ProposalVoteCount **/ PolymeshPrimitivesMultisigProposalVoteCount: { approvals: 'u64', rejections: 'u64' }, /** - * Lookup578: polymesh_primitives::multisig::ProposalState + * Lookup585: polymesh_primitives::multisig::ProposalState **/ PolymeshPrimitivesMultisigProposalState: { _enum: { @@ -4071,51 +4399,36 @@ export default { } }, /** - * Lookup580: pallet_multisig::pallet::Error + * Lookup587: pallet_multisig::pallet::Error **/ PalletMultisigError: { - _enum: ['ProposalMissing', 'DecodingError', 'RequiredSignersIsZero', 'NotASigner', 'NoSuchMultisig', 'NotEnoughSigners', 'NonceOverflow', 'AlreadyVoted', 'AlreadyASigner', 'IdentityNotAdmin', 'IdentityNotPayer', 'ChangeNotAllowed', 'SignerAlreadyLinkedToMultisig', 'SignerAlreadyLinkedToIdentity', 'NestingNotAllowed', 'ProposalAlreadyRejected', 'ProposalExpired', 'ProposalAlreadyExecuted', 'MaxWeightTooLow', 'MultisigMissingIdentity', 'TooManySigners', 'NoPayingDid'] + _enum: ['ProposalMissing', 'DecodingError', 'RequiredSignersIsZero', 'NotASigner', 'NoSuchMultisig', 'NotEnoughSigners', 'NonceOverflow', 'AlreadyVoted', 'AlreadyASigner', 'IdentityNotAdmin', 'IdentityNotPayer', 'ChangeNotAllowed', 'SignerAlreadyLinkedToMultisig', 'SignerAlreadyLinkedToIdentity', 'NestingNotAllowed', 'ProposalAlreadyRejected', 'ProposalExpired', 'ProposalAlreadyExecuted', 'MaxWeightTooLow', 'MultisigMissingIdentity', 'TooManySigners', 'NoPayingDid', 'InvalidExpiryDate', 'InvalidatedProposal', 'AdminNotFound', 'BadAuthorizationType'] }, /** - * Lookup582: pallet_bridge::BridgeTxDetail + * Lookup588: pallet_validators::types::PermissionedIdentityPrefs **/ - PalletBridgeBridgeTxDetail: { - amount: 'u128', - status: 'PalletBridgeBridgeTxStatus', - executionBlock: 'u32', - txHash: 'H256' + PalletValidatorsPermissionedIdentityPrefs: { + intendedCount: 'u32', + runningCount: 'u32' }, /** - * Lookup583: pallet_bridge::BridgeTxStatus + * Lookup589: pallet_validators::pallet::Error **/ - PalletBridgeBridgeTxStatus: { - _enum: { - Absent: 'Null', - Pending: 'u8', - Frozen: 'Null', - Timelocked: 'Null', - Handled: 'Null' - } + PalletValidatorsError: { + _enum: ['StashIdentityDoesNotExist', 'StashIdentityNotPermissioned', 'IdentityIsAlreadyPermissioned', 'IdentityIsMissingCDD', 'IntendedCountIsExceedingConsensusLimit', 'IdentityNotFound', 'ValidatorNotFound', 'CommissionTooHigh', 'CommissionUnchanged'] }, /** - * Lookup586: pallet_staking::StakingLedger + * Lookup590: pallet_staking::StakingLedger **/ PalletStakingStakingLedger: { stash: 'AccountId32', total: 'Compact', active: 'Compact', unlocking: 'Vec', - claimedRewards: 'Vec' - }, - /** - * Lookup588: pallet_staking::UnlockChunk - **/ - PalletStakingUnlockChunk: { - value: 'Compact', - era: 'Compact' + legacyClaimedRewards: 'Vec' }, /** - * Lookup591: pallet_staking::Nominations + * Lookup592: pallet_staking::Nominations **/ PalletStakingNominations: { targets: 'Vec', @@ -4123,21 +4436,37 @@ export default { suppressed: 'bool' }, /** - * Lookup593: pallet_staking::ActiveEraInfo + * Lookup594: pallet_staking::ActiveEraInfo **/ PalletStakingActiveEraInfo: { index: 'u32', start: 'Option' }, /** - * Lookup595: pallet_staking::EraRewardPoints + * Lookup596: sp_staking::PagedExposureMetadata + **/ + SpStakingPagedExposureMetadata: { + total: 'Compact', + own: 'Compact', + nominatorCount: 'u32', + pageCount: 'u32' + }, + /** + * Lookup598: sp_staking::ExposurePage + **/ + SpStakingExposurePage: { + pageTotal: 'Compact', + others: 'Vec' + }, + /** + * Lookup599: pallet_staking::EraRewardPoints **/ PalletStakingEraRewardPoints: { total: 'u32', individual: 'BTreeMap' }, /** - * Lookup599: pallet_staking::UnappliedSlash + * Lookup604: pallet_staking::UnappliedSlash **/ PalletStakingUnappliedSlash: { validator: 'AccountId32', @@ -4147,7 +4476,7 @@ export default { payout: 'u128' }, /** - * Lookup601: pallet_staking::slashing::SlashingSpans + * Lookup606: pallet_staking::slashing::SlashingSpans **/ PalletStakingSlashingSlashingSpans: { spanIndex: 'u32', @@ -4156,44 +4485,37 @@ export default { prior: 'Vec' }, /** - * Lookup602: pallet_staking::slashing::SpanRecord + * Lookup607: pallet_staking::slashing::SpanRecord **/ PalletStakingSlashingSpanRecord: { slashed: 'u128', paidOut: 'u128' }, /** - * Lookup605: pallet_staking::types::PermissionedIdentityPrefs - **/ - PalletStakingPermissionedIdentityPrefs: { - intendedCount: 'u32', - runningCount: 'u32' - }, - /** - * Lookup607: pallet_staking::pallet::pallet::Error + * Lookup608: pallet_staking::pallet::pallet::Error **/ PalletStakingPalletError: { - _enum: ['NotController', 'NotStash', 'AlreadyBonded', 'AlreadyPaired', 'EmptyTargets', 'DuplicateIndex', 'InvalidSlashIndex', 'InsufficientBond', 'NoMoreChunks', 'NoUnlockChunk', 'FundedTarget', 'InvalidEraToReward', 'InvalidNumberOfNominations', 'NotSortedAndUnique', 'AlreadyClaimed', 'IncorrectHistoryDepth', 'IncorrectSlashingSpans', 'BadState', 'TooManyTargets', 'BadTarget', 'CannotChillOther', 'TooManyNominators', 'TooManyValidators', 'CommissionTooLow', 'BoundNotMet', 'StashIdentityDoesNotExist', 'StashIdentityNotPermissioned', 'StashIdentityNotCDDed', 'IdentityIsAlreadyPermissioned', 'IdentityIsMissingCDD', 'IntendedCountIsExceedingConsensusLimit', 'IdentityNotFound', 'ValidatorNotFound', 'CommissionTooHigh', 'CommissionUnchanged'] + _enum: ['NotController', 'NotStash', 'AlreadyBonded', 'AlreadyPaired', 'EmptyTargets', 'DuplicateIndex', 'InvalidSlashIndex', 'InsufficientBond', 'NoMoreChunks', 'NoUnlockChunk', 'FundedTarget', 'InvalidEraToReward', 'InvalidNumberOfNominations', 'NotSortedAndUnique', 'AlreadyClaimed', 'InvalidPage', 'IncorrectHistoryDepth', 'IncorrectSlashingSpans', 'BadState', 'TooManyTargets', 'BadTarget', 'CannotChillOther', 'TooManyNominators', 'TooManyValidators', 'CommissionTooLow', 'BoundNotMet', 'ControllerDeprecated', 'CannotRestoreLedger', 'RewardDestinationRestricted', 'NotEnoughFunds', 'VirtualStakerNotAllowed', 'CannotReapStash', 'AlreadyMigrated', 'Restricted'] }, /** - * Lookup608: sp_staking::offence::OffenceDetails + * Lookup609: sp_staking::offence::OffenceDetails **/ SpStakingOffenceOffenceDetails: { - offender: '(AccountId32,PalletStakingExposure)', + offender: '(AccountId32,SpStakingExposure)', reporters: 'Vec' }, /** - * Lookup613: sp_core::crypto::KeyTypeId + * Lookup617: sp_core::crypto::KeyTypeId **/ SpCoreCryptoKeyTypeId: '[u8;4]', /** - * Lookup614: pallet_session::pallet::Error + * Lookup618: pallet_session::pallet::Error **/ PalletSessionError: { _enum: ['InvalidProof', 'NoAssociatedValidatorId', 'DuplicatedKey', 'NoKeys', 'NoAccount'] }, /** - * Lookup615: pallet_grandpa::StoredState + * Lookup621: pallet_grandpa::StoredState **/ PalletGrandpaStoredState: { _enum: { @@ -4210,7 +4532,7 @@ export default { } }, /** - * Lookup616: pallet_grandpa::StoredPendingChange + * Lookup622: pallet_grandpa::StoredPendingChange **/ PalletGrandpaStoredPendingChange: { scheduledAt: 'u32', @@ -4219,46 +4541,39 @@ export default { forced: 'Option' }, /** - * Lookup618: pallet_grandpa::pallet::Error + * Lookup624: pallet_grandpa::pallet::Error **/ PalletGrandpaError: { _enum: ['PauseFailed', 'ResumeFailed', 'ChangePending', 'TooSoon', 'InvalidKeyOwnershipProof', 'InvalidEquivocationProof', 'DuplicateOffenceReport'] }, /** - * Lookup622: pallet_im_online::BoundedOpaqueNetworkState - **/ - PalletImOnlineBoundedOpaqueNetworkState: { - peerId: 'Bytes', - externalAddresses: 'Vec' - }, - /** - * Lookup626: pallet_im_online::pallet::Error + * Lookup628: pallet_im_online::pallet::Error **/ PalletImOnlineError: { _enum: ['InvalidKey', 'DuplicatedHeartbeat'] }, /** - * Lookup628: pallet_sudo::Error + * Lookup630: pallet_sudo::pallet::Error **/ PalletSudoError: { _enum: ['RequireSudo'] }, /** - * Lookup629: pallet_asset::types::TickerRegistration + * Lookup631: pallet_asset::types::TickerRegistration **/ PalletAssetTickerRegistration: { owner: 'PolymeshPrimitivesIdentityId', expiry: 'Option' }, /** - * Lookup630: pallet_asset::types::TickerRegistrationConfig + * Lookup632: pallet_asset::types::TickerRegistrationConfig **/ PalletAssetTickerRegistrationConfig: { maxTickerLength: 'u8', registrationLength: 'Option' }, /** - * Lookup631: pallet_asset::types::AssetDetails + * Lookup633: pallet_asset::types::AssetDetails **/ PalletAssetAssetDetails: { totalSupply: 'u128', @@ -4267,19 +4582,19 @@ export default { assetType: 'PolymeshPrimitivesAssetAssetType' }, /** - * Lookup641: pallet_asset::error::Error + * Lookup643: pallet_asset::pallet::Error **/ PalletAssetError: { - _enum: ['Unauthorized', 'AssetAlreadyCreated', 'TickerTooLong', 'TickerNotAlphanumeric', 'TickerAlreadyRegistered', 'TotalSupplyAboveLimit', 'NoSuchAsset', 'AlreadyFrozen', 'NotAnOwner', 'BalanceOverflow', 'TotalSupplyOverflow', 'InvalidGranularity', 'NotFrozen', 'InvalidTransfer', 'InsufficientBalance', 'AssetAlreadyDivisible', 'InvalidEthereumSignature', 'TickerRegistrationExpired', 'SenderSameAsReceiver', 'NoSuchDoc', 'MaxLengthOfAssetNameExceeded', 'FundingRoundNameMaxLengthExceeded', 'InvalidAssetIdentifier', 'InvestorUniquenessClaimNotAllowed', 'InvalidCustomAssetTypeId', 'AssetMetadataNameMaxLengthExceeded', 'AssetMetadataValueMaxLengthExceeded', 'AssetMetadataTypeDefMaxLengthExceeded', 'AssetMetadataKeyIsMissing', 'AssetMetadataValueIsLocked', 'AssetMetadataLocalKeyAlreadyExists', 'AssetMetadataGlobalKeyAlreadyExists', 'TickerFirstByteNotValid', 'UnexpectedNonFungibleToken', 'IncompatibleAssetTypeUpdate', 'AssetMetadataKeyBelongsToNFTCollection', 'AssetMetadataValueIsEmpty', 'NumberOfAssetMediatorsExceeded', 'InvalidTickerCharacter', 'InvalidTransferFrozenAsset', 'InvalidTransferComplianceFailure', 'InvalidTransferInvalidReceiverCDD', 'InvalidTransferInvalidSenderCDD', 'TickerRegistrationNotFound', 'TickerIsAlreadyLinkedToAnAsset', 'AssetIdGenerationError', 'TickerNotRegisteredToCaller'] + _enum: ['Unauthorized', 'AssetAlreadyCreated', 'TickerTooLong', 'TickerNotAlphanumeric', 'TickerAlreadyRegistered', 'TotalSupplyAboveLimit', 'NoSuchAsset', 'AlreadyFrozen', 'NotAnOwner', 'BalanceOverflow', 'TotalSupplyOverflow', 'InvalidGranularity', 'NotFrozen', 'InvalidTransfer', 'InsufficientBalance', 'AssetAlreadyDivisible', 'InvalidEthereumSignature', 'TickerRegistrationExpired', 'SenderSameAsReceiver', 'NoSuchDoc', 'MaxLengthOfAssetNameExceeded', 'FundingRoundNameMaxLengthExceeded', 'InvalidAssetIdentifier', 'InvestorUniquenessClaimNotAllowed', 'InvalidCustomAssetTypeId', 'AssetMetadataNameMaxLengthExceeded', 'AssetMetadataValueMaxLengthExceeded', 'AssetMetadataTypeDefMaxLengthExceeded', 'AssetMetadataKeyIsMissing', 'AssetMetadataValueIsLocked', 'AssetMetadataLocalKeyAlreadyExists', 'AssetMetadataGlobalKeyAlreadyExists', 'TickerFirstByteNotValid', 'UnexpectedNonFungibleToken', 'IncompatibleAssetTypeUpdate', 'AssetMetadataKeyBelongsToNFTCollection', 'AssetMetadataValueIsEmpty', 'NumberOfAssetMediatorsExceeded', 'InvalidTickerCharacter', 'InvalidTransferFrozenAsset', 'InvalidTransferComplianceFailure', 'InvalidTransferInvalidReceiverCDD', 'InvalidTransferInvalidSenderCDD', 'TickerRegistrationNotFound', 'TickerIsAlreadyLinkedToAnAsset', 'AssetIdGenerationError', 'TickerNotRegisteredToCaller', 'AssetIsAlreadyLinkedToATicker', 'TickerIsNotLinkedToTheAsset', 'BadAuthorizationType'] }, /** - * Lookup644: pallet_corporate_actions::distribution::Error + * Lookup646: pallet_corporate_actions::distribution::pallet::Error **/ - PalletCorporateActionsDistributionError: { + PalletCorporateActionsDistributionPalletError: { _enum: ['CANotBenefit', 'AlreadyExists', 'ExpiryBeforePayment', 'HolderAlreadyPaid', 'NoSuchDistribution', 'CannotClaimBeforeStart', 'CannotClaimAfterExpiry', 'BalancePerShareProductOverflowed', 'NotDistributionCreator', 'AlreadyReclaimed', 'NotExpired', 'DistributionStarted', 'InsufficientRemainingAmount', 'DistributionAmountIsZero', 'DistributionPerShareIsZero'] }, /** - * Lookup648: polymesh_common_utilities::traits::checkpoint::NextCheckpoints + * Lookup650: polymesh_common_utilities::traits::checkpoint::NextCheckpoints **/ PolymeshCommonUtilitiesCheckpointNextCheckpoints: { nextAt: 'u64', @@ -4287,44 +4602,44 @@ export default { schedules: 'BTreeMap' }, /** - * Lookup654: pallet_asset::checkpoint::Error + * Lookup656: pallet_asset::checkpoint::pallet::Error **/ - PalletAssetCheckpointError: { + PalletAssetCheckpointPalletError: { _enum: ['NoSuchSchedule', 'ScheduleNotRemovable', 'SchedulesOverMaxComplexity', 'ScheduleIsEmpty', 'ScheduleFinished', 'ScheduleHasExpiredCheckpoints'] }, /** - * Lookup655: polymesh_primitives::compliance_manager::AssetCompliance + * Lookup657: polymesh_primitives::compliance_manager::AssetCompliance **/ PolymeshPrimitivesComplianceManagerAssetCompliance: { paused: 'bool', requirements: 'Vec' }, /** - * Lookup657: pallet_compliance_manager::Error + * Lookup659: pallet_compliance_manager::pallet::Error **/ PalletComplianceManagerError: { _enum: ['Unauthorized', 'DidNotExist', 'InvalidComplianceRequirementId', 'IncorrectOperationOnTrustedIssuer', 'DuplicateComplianceRequirements', 'ComplianceRequirementTooComplex', 'WeightLimitExceeded'] }, /** - * Lookup660: pallet_corporate_actions::Error + * Lookup662: pallet_corporate_actions::pallet::Error **/ PalletCorporateActionsError: { _enum: ['DetailsTooLong', 'DuplicateDidTax', 'TooManyDidTaxes', 'TooManyTargetIds', 'NoSuchCheckpointId', 'NoSuchCA', 'NoRecordDate', 'RecordDateAfterStart', 'DeclDateAfterRecordDate', 'DeclDateInFuture', 'NotTargetedByCA'] }, /** - * Lookup664: pallet_corporate_actions::ballot::Error + * Lookup666: pallet_corporate_actions::ballot::pallet::Error **/ - PalletCorporateActionsBallotError: { + PalletCorporateActionsBallotPalletError: { _enum: ['CANotNotice', 'AlreadyExists', 'NoSuchBallot', 'StartAfterEnd', 'NowAfterEnd', 'NumberOfChoicesOverflow', 'VotingAlreadyStarted', 'VotingNotStarted', 'VotingAlreadyEnded', 'WrongVoteCount', 'InsufficientVotes', 'NoSuchRCVFallback', 'RCVSelfCycle', 'RCVNotAllowed'] }, /** - * Lookup665: pallet_permissions::Error + * Lookup667: pallet_permissions::pallet::Error **/ PalletPermissionsError: { _enum: ['UnauthorizedCaller'] }, /** - * Lookup666: pallet_pips::PipsMetadata + * Lookup668: pallet_pips::types::PipsMetadata **/ PalletPipsPipsMetadata: { id: 'u32', @@ -4332,17 +4647,17 @@ export default { description: 'Option', createdAt: 'u32', transactionVersion: 'u32', - expiry: 'PolymeshCommonUtilitiesMaybeBlock' + expiry: 'PolymeshPrimitivesMaybeBlock' }, /** - * Lookup668: pallet_pips::DepositInfo + * Lookup670: pallet_pips::types::DepositInfo **/ PalletPipsDepositInfo: { owner: 'AccountId32', amount: 'u128' }, /** - * Lookup669: pallet_pips::Pip + * Lookup671: pallet_pips::types::Pip **/ PalletPipsPip: { id: 'u32', @@ -4350,7 +4665,7 @@ export default { proposer: 'PalletPipsProposer' }, /** - * Lookup670: pallet_pips::VotingResult + * Lookup672: pallet_pips::types::VotingResult **/ PalletPipsVotingResult: { ayesCount: 'u32', @@ -4359,11 +4674,11 @@ export default { naysStake: 'u128' }, /** - * Lookup671: pallet_pips::Vote + * Lookup673: pallet_pips::types::Vote **/ PalletPipsVote: '(bool,u128)', /** - * Lookup672: pallet_pips::SnapshotMetadata + * Lookup674: pallet_pips::types::SnapshotMetadata **/ PalletPipsSnapshotMetadata: { createdAt: 'u32', @@ -4371,25 +4686,25 @@ export default { id: 'u32' }, /** - * Lookup674: pallet_pips::Error + * Lookup676: pallet_pips::pallet::Error **/ PalletPipsError: { - _enum: ['RescheduleNotByReleaseCoordinator', 'NotFromCommunity', 'NotByCommittee', 'TooManyActivePips', 'IncorrectDeposit', 'InsufficientDeposit', 'NoSuchProposal', 'NotACommitteeMember', 'InvalidFutureBlockNumber', 'NumberOfVotesExceeded', 'StakeAmountOfVotesExceeded', 'MissingCurrentIdentity', 'IncorrectProposalState', 'CannotSkipPip', 'SnapshotResultTooLarge', 'SnapshotIdMismatch', 'ScheduledProposalDoesntExist', 'ProposalNotInScheduledState'] + _enum: ['RescheduleNotByReleaseCoordinator', 'NotFromCommunity', 'NotByCommittee', 'TooManyActivePips', 'IncorrectDeposit', 'InsufficientDeposit', 'NoSuchProposal', 'NotACommitteeMember', 'InvalidFutureBlockNumber', 'NumberOfVotesExceeded', 'StakeAmountOfVotesExceeded', 'MissingCurrentIdentity', 'IncorrectProposalState', 'CannotSkipPip', 'SnapshotResultTooLarge', 'SnapshotIdMismatch', 'ScheduledProposalDoesntExist', 'ProposalNotInScheduledState', 'InvalidPipId', 'InvalidTaskName'] }, /** - * Lookup682: pallet_portfolio::Error + * Lookup684: pallet_portfolio::pallet::Error **/ PalletPortfolioError: { - _enum: ['PortfolioDoesNotExist', 'InsufficientPortfolioBalance', 'DestinationIsSamePortfolio', 'PortfolioNameAlreadyInUse', 'SecondaryKeyNotAuthorizedForPortfolio', 'UnauthorizedCustodian', 'InsufficientTokensLocked', 'PortfolioNotEmpty', 'DifferentIdentityPortfolios', 'NoDuplicateAssetsAllowed', 'NFTNotFoundInPortfolio', 'NFTAlreadyLocked', 'NFTNotLocked', 'InvalidTransferNFTNotOwned', 'InvalidTransferNFTIsLocked', 'EmptyTransfer', 'MissingOwnersPermission', 'InvalidTransferSenderIdMatchesReceiverId'] + _enum: ['PortfolioDoesNotExist', 'InsufficientPortfolioBalance', 'DestinationIsSamePortfolio', 'PortfolioNameAlreadyInUse', 'SecondaryKeyNotAuthorizedForPortfolio', 'UnauthorizedCustodian', 'InsufficientTokensLocked', 'PortfolioNotEmpty', 'DifferentIdentityPortfolios', 'NoDuplicateAssetsAllowed', 'NFTNotFoundInPortfolio', 'NFTAlreadyLocked', 'NFTNotLocked', 'InvalidTransferNFTNotOwned', 'InvalidTransferNFTIsLocked', 'EmptyTransfer', 'MissingOwnersPermission', 'InvalidTransferSenderIdMatchesReceiverId', 'SelfAdditionNotAllowed', 'BadAuthorizationType', 'DefaultPortfoliosCannotHaveCustodians'] }, /** - * Lookup683: pallet_protocol_fee::Error + * Lookup685: pallet_protocol_fee::pallet::Error **/ PalletProtocolFeeError: { _enum: ['InsufficientAccountBalance', 'UnHandledImbalances', 'InsufficientSubsidyBalance'] }, /** - * Lookup686: pallet_scheduler::Scheduled, BlockNumber, polymesh_runtime_develop::runtime::OriginCaller, sp_core::crypto::AccountId32> + * Lookup688: pallet_scheduler::Scheduled, BlockNumber, polymesh_runtime_develop::runtime::OriginCaller, sp_core::crypto::AccountId32> **/ PalletSchedulerScheduled: { maybeId: 'Option<[u8;32]>', @@ -4399,7 +4714,7 @@ export default { origin: 'PolymeshRuntimeDevelopRuntimeOriginCaller' }, /** - * Lookup687: frame_support::traits::preimages::Bounded + * Lookup689: frame_support::traits::preimages::Bounded **/ FrameSupportPreimagesBounded: { _enum: { @@ -4420,20 +4735,32 @@ export default { } }, /** - * Lookup690: pallet_scheduler::pallet::Error + * Lookup690: sp_runtime::traits::BlakeTwo256 + **/ + SpRuntimeBlakeTwo256: 'Null', + /** + * Lookup693: pallet_scheduler::RetryConfig + **/ + PalletSchedulerRetryConfig: { + totalRetries: 'u8', + remaining: 'u8', + period: 'u32' + }, + /** + * Lookup694: pallet_scheduler::pallet::Error **/ PalletSchedulerError: { _enum: ['FailedToSchedule', 'NotFound', 'TargetBlockNumberInPast', 'RescheduleNoChange', 'Named'] }, /** - * Lookup691: polymesh_primitives::settlement::Venue + * Lookup695: polymesh_primitives::settlement::Venue **/ PolymeshPrimitivesSettlementVenue: { creator: 'PolymeshPrimitivesIdentityId', venueType: 'PolymeshPrimitivesSettlementVenueType' }, /** - * Lookup695: polymesh_primitives::settlement::Instruction + * Lookup699: polymesh_primitives::settlement::Instruction **/ PolymeshPrimitivesSettlementInstruction: { instructionId: 'u64', @@ -4444,7 +4771,7 @@ export default { valueDate: 'Option' }, /** - * Lookup697: polymesh_primitives::settlement::LegStatus + * Lookup701: polymesh_primitives::settlement::LegStatus **/ PolymeshPrimitivesSettlementLegStatus: { _enum: { @@ -4454,13 +4781,13 @@ export default { } }, /** - * Lookup699: polymesh_primitives::settlement::AffirmationStatus + * Lookup703: polymesh_primitives::settlement::AffirmationStatus **/ PolymeshPrimitivesSettlementAffirmationStatus: { _enum: ['Unknown', 'Pending', 'Affirmed'] }, /** - * Lookup702: polymesh_primitives::settlement::InstructionStatus + * Lookup706: polymesh_primitives::settlement::InstructionStatus **/ PolymeshPrimitivesSettlementInstructionStatus: { _enum: { @@ -4468,11 +4795,12 @@ export default { Pending: 'Null', Failed: 'Null', Success: 'u32', - Rejected: 'u32' + Rejected: 'u32', + LockedForExecution: 'Null' } }, /** - * Lookup704: polymesh_primitives::settlement::MediatorAffirmationStatus + * Lookup708: polymesh_primitives::settlement::MediatorAffirmationStatus **/ PolymeshPrimitivesSettlementMediatorAffirmationStatus: { _enum: { @@ -4484,278 +4812,183 @@ export default { } }, /** - * Lookup706: pallet_settlement::Error + * Lookup710: pallet_settlement::pallet::Error **/ PalletSettlementError: { - _enum: ['InvalidVenue', 'Unauthorized', 'InstructionNotAffirmed', 'UnauthorizedSigner', 'ReceiptAlreadyClaimed', 'UnauthorizedVenue', 'InstructionDatesInvalid', 'InstructionSettleBlockPassed', 'InvalidSignature', 'SameSenderReceiver', 'SettleOnPastBlock', 'UnexpectedAffirmationStatus', 'FailedToSchedule', 'UnknownInstruction', 'SignerAlreadyExists', 'SignerDoesNotExist', 'ZeroAmount', 'InstructionSettleBlockNotReached', 'CallerIsNotAParty', 'MaxNumberOfNFTsExceeded', 'NumberOfTransferredNFTsUnderestimated', 'ReceiptForInvalidLegType', 'WeightLimitExceeded', 'MaxNumberOfFungibleAssetsExceeded', 'MaxNumberOfOffChainAssetsExceeded', 'NumberOfFungibleTransfersUnderestimated', 'UnexpectedOFFChainAsset', 'OffChainAssetCantBeLocked', 'NumberOfOffChainTransfersUnderestimated', 'LegNotFound', 'InputWeightIsLessThanMinimum', 'MaxNumberOfReceiptsExceeded', 'NotAllAffirmationsHaveBeenReceived', 'InvalidInstructionStatusForExecution', 'FailedToReleaseLockOrTransferAssets', 'DuplicateReceiptUid', 'ReceiptInstructionIdMissmatch', 'MultipleReceiptsForOneLeg', 'UnexpectedLegStatus', 'NumberOfVenueSignersExceeded', 'CallerIsNotAMediator', 'InvalidExpiryDate', 'MediatorAffirmationExpired'] + _enum: ['InvalidVenue', 'Unauthorized', 'InstructionNotAffirmed', 'UnauthorizedSigner', 'ReceiptAlreadyClaimed', 'UnauthorizedVenue', 'InstructionDatesInvalid', 'InstructionSettleBlockPassed', 'InvalidSignature', 'SameSenderReceiver', 'SettleOnPastBlock', 'UnexpectedAffirmationStatus', 'FailedToSchedule', 'UnknownInstruction', 'SignerAlreadyExists', 'SignerDoesNotExist', 'ZeroAmount', 'InstructionSettleBlockNotReached', 'CallerIsNotAParty', 'MaxNumberOfNFTsExceeded', 'NumberOfTransferredNFTsUnderestimated', 'ReceiptForInvalidLegType', 'WeightLimitExceeded', 'MaxNumberOfFungibleAssetsExceeded', 'MaxNumberOfOffChainAssetsExceeded', 'NumberOfFungibleTransfersUnderestimated', 'UnexpectedOFFChainAsset', 'OffChainAssetCantBeLocked', 'NumberOfOffChainTransfersUnderestimated', 'LegNotFound', 'InputWeightIsLessThanMinimum', 'MaxNumberOfReceiptsExceeded', 'NotAllAffirmationsHaveBeenReceived', 'InvalidInstructionStatusForExecution', 'FailedToReleaseLockOrTransferAssets', 'DuplicateReceiptUid', 'ReceiptInstructionIdMissmatch', 'MultipleReceiptsForOneLeg', 'UnexpectedLegStatus', 'NumberOfVenueSignersExceeded', 'CallerIsNotAMediator', 'InvalidExpiryDate', 'MediatorAffirmationExpired', 'OffChainAssetsMustHaveAVenue', 'UnexpectedSettlementType', 'InvalidInstructionStatusForRejection', 'LockTimestampNotFound', 'ExceededMaximumLockingPeriod', 'FailedAssetTransferringConditions', 'InvalidInstructionStatusForWithdrawal', 'InvalidTaskName'] }, /** - * Lookup709: polymesh_primitives::statistics::Stat1stKey + * Lookup713: polymesh_primitives::statistics::Stat1stKey **/ PolymeshPrimitivesStatisticsStat1stKey: { assetId: 'PolymeshPrimitivesAssetAssetId', statType: 'PolymeshPrimitivesStatisticsStatType' }, /** - * Lookup710: polymesh_primitives::transfer_compliance::AssetTransferCompliance + * Lookup714: polymesh_primitives::transfer_compliance::AssetTransferCompliance **/ PolymeshPrimitivesTransferComplianceAssetTransferCompliance: { paused: 'bool', requirements: 'BTreeSet' }, /** - * Lookup714: pallet_statistics::Error + * Lookup718: pallet_statistics::pallet::Error **/ PalletStatisticsError: { - _enum: ['InvalidTransfer', 'StatTypeMissing', 'StatTypeNeededByTransferCondition', 'CannotRemoveStatTypeInUse', 'StatTypeLimitReached', 'TransferConditionLimitReached', 'WeightLimitExceeded'] + _enum: ['InvalidTransferStatisticsFailure', 'StatTypeMissing', 'StatTypeNeededByTransferCondition', 'CannotRemoveStatTypeInUse', 'StatTypeLimitReached', 'TransferConditionLimitReached', 'WeightLimitExceeded'] }, /** - * Lookup717: pallet_sto::Error + * Lookup721: pallet_sto::pallet::Error **/ PalletStoError: { - _enum: ['Unauthorized', 'Overflow', 'InsufficientTokensRemaining', 'FundraiserNotFound', 'FundraiserNotLive', 'FundraiserClosed', 'FundraiserExpired', 'InvalidVenue', 'InvalidPriceTiers', 'InvalidOfferingWindow', 'MaxPriceExceeded', 'InvestmentAmountTooLow'] + _enum: ['Unauthorized', 'Overflow', 'InsufficientTokensRemaining', 'FundraiserNotFound', 'FundraiserNotLive', 'FundraiserClosed', 'FundraiserExpired', 'InvalidVenue', 'InvalidPriceTiers', 'InvalidOfferingWindow', 'MaxPriceExceeded', 'InvestmentAmountTooLow', 'InvalidSignature', 'OffchainFundingNotAllowed'] }, /** - * Lookup718: pallet_treasury::Error + * Lookup722: pallet_treasury::pallet::Error **/ PalletTreasuryError: { _enum: ['InsufficientBalance', 'InvalidIdentity'] }, /** - * Lookup719: pallet_utility::pallet::Error + * Lookup723: pallet_utility::pallet::Error **/ PalletUtilityError: { _enum: ['TooManyCalls', 'InvalidSignature', 'TargetCddMissing', 'InvalidNonce', 'UnableToDeriveAccountId'] }, /** - * Lookup720: pallet_base::Error + * Lookup724: pallet_base::pallet::Error **/ PalletBaseError: { _enum: ['TooLong', 'CounterOverflow'] }, /** - * Lookup723: pallet_external_agents::Error + * Lookup727: pallet_external_agents::pallet::Error **/ PalletExternalAgentsError: { - _enum: ['NoSuchAG', 'UnauthorizedAgent', 'AlreadyAnAgent', 'NotAnAgent', 'RemovingLastFullAgent', 'SecondaryKeyNotAuthorizedForAsset'] + _enum: ['NoSuchAG', 'UnauthorizedAgent', 'AlreadyAnAgent', 'NotAnAgent', 'RemovingLastFullAgent', 'SecondaryKeyNotAuthorizedForAsset', 'BadAuthorizationType'] }, /** - * Lookup724: pallet_relayer::Subsidy + * Lookup728: pallet_relayer::pallet::Subsidy **/ PalletRelayerSubsidy: { payingKey: 'AccountId32', remaining: 'u128' }, /** - * Lookup725: pallet_relayer::Error + * Lookup729: pallet_relayer::pallet::Error **/ PalletRelayerError: { - _enum: ['UserKeyCddMissing', 'PayingKeyCddMissing', 'NoPayingKey', 'NotPayingKey', 'NotAuthorizedForPayingKey', 'NotAuthorizedForUserKey', 'Overflow'] - }, - /** - * Lookup727: pallet_contracts::wasm::PrefabWasmModule - **/ - PalletContractsWasmPrefabWasmModule: { - instructionWeightsVersion: 'Compact', - initial: 'Compact', - maximum: 'Compact', - code: 'Bytes', - determinism: 'PalletContractsWasmDeterminism' + _enum: ['UserKeyCddMissing', 'PayingKeyCddMissing', 'NoPayingKey', 'NotPayingKey', 'NotAuthorizedForPayingKey', 'NotAuthorizedForUserKey', 'Overflow', 'BadAuthorizationType'] }, /** - * Lookup729: pallet_contracts::wasm::OwnerInfo + * Lookup731: pallet_contracts::wasm::CodeInfo **/ - PalletContractsWasmOwnerInfo: { + PalletContractsWasmCodeInfo: { owner: 'AccountId32', deposit: 'Compact', - refcount: 'Compact' + refcount: 'Compact', + determinism: 'PalletContractsWasmDeterminism', + codeLen: 'u32' }, /** - * Lookup730: pallet_contracts::storage::ContractInfo + * Lookup732: pallet_contracts::storage::ContractInfo **/ PalletContractsStorageContractInfo: { trieId: 'Bytes', - depositAccount: 'AccountId32', codeHash: 'H256', storageBytes: 'u32', storageItems: 'u32', storageByteDeposit: 'u128', storageItemDeposit: 'u128', - storageBaseDeposit: 'u128' + storageBaseDeposit: 'u128', + delegateDependencies: 'BTreeMap' }, /** - * Lookup733: pallet_contracts::storage::DeletedContract + * Lookup737: pallet_contracts::storage::DeletionQueueManager **/ - PalletContractsStorageDeletedContract: { - trieId: 'Bytes' + PalletContractsStorageDeletionQueueManager: { + insertCounter: 'u32', + deleteCounter: 'u32' }, /** - * Lookup735: pallet_contracts::schedule::Schedule + * Lookup739: pallet_contracts::schedule::Schedule **/ PalletContractsSchedule: { limits: 'PalletContractsScheduleLimits', - instructionWeights: 'PalletContractsScheduleInstructionWeights', - hostFnWeights: 'PalletContractsScheduleHostFnWeights' + instructionWeights: 'PalletContractsScheduleInstructionWeights' }, /** - * Lookup736: pallet_contracts::schedule::Limits + * Lookup740: pallet_contracts::schedule::Limits **/ PalletContractsScheduleLimits: { eventTopics: 'u32', - globals: 'u32', - locals: 'u32', - parameters: 'u32', memoryPages: 'u32', - tableSize: 'u32', - brTableSize: 'u32', subjectLen: 'u32', - payloadLen: 'u32' + payloadLen: 'u32', + runtimeMemory: 'u32', + validatorRuntimeMemory: 'u32', + eventRefTime: 'u64' }, /** - * Lookup737: pallet_contracts::schedule::InstructionWeights + * Lookup741: pallet_contracts::schedule::InstructionWeights **/ PalletContractsScheduleInstructionWeights: { + base: 'u32' + }, + /** + * Lookup742: pallet_contracts::Environment + **/ + PalletContractsEnvironment: { _alias: { - r_if: 'r#if' - }, - version: 'u32', - fallback: 'u32', - i64const: 'u32', - i64load: 'u32', - i64store: 'u32', - select: 'u32', - r_if: 'u32', - br: 'u32', - brIf: 'u32', - brTable: 'u32', - brTablePerEntry: 'u32', - call: 'u32', - callIndirect: 'u32', - callIndirectPerParam: 'u32', - callPerLocal: 'u32', - localGet: 'u32', - localSet: 'u32', - localTee: 'u32', - globalGet: 'u32', - globalSet: 'u32', - memoryCurrent: 'u32', - memoryGrow: 'u32', - i64clz: 'u32', - i64ctz: 'u32', - i64popcnt: 'u32', - i64eqz: 'u32', - i64extendsi32: 'u32', - i64extendui32: 'u32', - i32wrapi64: 'u32', - i64eq: 'u32', - i64ne: 'u32', - i64lts: 'u32', - i64ltu: 'u32', - i64gts: 'u32', - i64gtu: 'u32', - i64les: 'u32', - i64leu: 'u32', - i64ges: 'u32', - i64geu: 'u32', - i64add: 'u32', - i64sub: 'u32', - i64mul: 'u32', - i64divs: 'u32', - i64divu: 'u32', - i64rems: 'u32', - i64remu: 'u32', - i64and: 'u32', - i64or: 'u32', - i64xor: 'u32', - i64shl: 'u32', - i64shrs: 'u32', - i64shru: 'u32', - i64rotl: 'u32', - i64rotr: 'u32' - }, - /** - * Lookup738: pallet_contracts::schedule::HostFnWeights - **/ - PalletContractsScheduleHostFnWeights: { - _alias: { - r_return: 'r#return' + hash_: 'hash' }, - caller: 'SpWeightsWeightV2Weight', - isContract: 'SpWeightsWeightV2Weight', - codeHash: 'SpWeightsWeightV2Weight', - ownCodeHash: 'SpWeightsWeightV2Weight', - callerIsOrigin: 'SpWeightsWeightV2Weight', - address: 'SpWeightsWeightV2Weight', - gasLeft: 'SpWeightsWeightV2Weight', - balance: 'SpWeightsWeightV2Weight', - valueTransferred: 'SpWeightsWeightV2Weight', - minimumBalance: 'SpWeightsWeightV2Weight', - blockNumber: 'SpWeightsWeightV2Weight', - now: 'SpWeightsWeightV2Weight', - weightToFee: 'SpWeightsWeightV2Weight', - gas: 'SpWeightsWeightV2Weight', - input: 'SpWeightsWeightV2Weight', - inputPerByte: 'SpWeightsWeightV2Weight', - r_return: 'SpWeightsWeightV2Weight', - returnPerByte: 'SpWeightsWeightV2Weight', - terminate: 'SpWeightsWeightV2Weight', - random: 'SpWeightsWeightV2Weight', - depositEvent: 'SpWeightsWeightV2Weight', - depositEventPerTopic: 'SpWeightsWeightV2Weight', - depositEventPerByte: 'SpWeightsWeightV2Weight', - debugMessage: 'SpWeightsWeightV2Weight', - debugMessagePerByte: 'SpWeightsWeightV2Weight', - setStorage: 'SpWeightsWeightV2Weight', - setStoragePerNewByte: 'SpWeightsWeightV2Weight', - setStoragePerOldByte: 'SpWeightsWeightV2Weight', - setCodeHash: 'SpWeightsWeightV2Weight', - clearStorage: 'SpWeightsWeightV2Weight', - clearStoragePerByte: 'SpWeightsWeightV2Weight', - containsStorage: 'SpWeightsWeightV2Weight', - containsStoragePerByte: 'SpWeightsWeightV2Weight', - getStorage: 'SpWeightsWeightV2Weight', - getStoragePerByte: 'SpWeightsWeightV2Weight', - takeStorage: 'SpWeightsWeightV2Weight', - takeStoragePerByte: 'SpWeightsWeightV2Weight', - transfer: 'SpWeightsWeightV2Weight', - call: 'SpWeightsWeightV2Weight', - delegateCall: 'SpWeightsWeightV2Weight', - callTransferSurcharge: 'SpWeightsWeightV2Weight', - callPerClonedByte: 'SpWeightsWeightV2Weight', - instantiate: 'SpWeightsWeightV2Weight', - instantiateTransferSurcharge: 'SpWeightsWeightV2Weight', - instantiatePerInputByte: 'SpWeightsWeightV2Weight', - instantiatePerSaltByte: 'SpWeightsWeightV2Weight', - hashSha2256: 'SpWeightsWeightV2Weight', - hashSha2256PerByte: 'SpWeightsWeightV2Weight', - hashKeccak256: 'SpWeightsWeightV2Weight', - hashKeccak256PerByte: 'SpWeightsWeightV2Weight', - hashBlake2256: 'SpWeightsWeightV2Weight', - hashBlake2256PerByte: 'SpWeightsWeightV2Weight', - hashBlake2128: 'SpWeightsWeightV2Weight', - hashBlake2128PerByte: 'SpWeightsWeightV2Weight', - ecdsaRecover: 'SpWeightsWeightV2Weight', - ecdsaToEthAddress: 'SpWeightsWeightV2Weight', - reentranceCount: 'SpWeightsWeightV2Weight', - accountReentranceCount: 'SpWeightsWeightV2Weight', - instantiationNonce: 'SpWeightsWeightV2Weight' - }, - /** - * Lookup739: pallet_contracts::pallet::Error + accountId: 'PalletContractsEnvironmentTypeAccountId32', + balance: 'PalletContractsEnvironmentTypeU128', + hash_: 'PalletContractsEnvironmentTypeH256', + hasher: 'PalletContractsEnvironmentTypeBlakeTwo256', + timestamp: 'PalletContractsEnvironmentTypeU64', + blockNumber: 'PalletContractsEnvironmentTypeU32' + }, + /** + * Lookup743: pallet_contracts::EnvironmentType + **/ + PalletContractsEnvironmentTypeAccountId32: 'Null', + /** + * Lookup744: pallet_contracts::EnvironmentType + **/ + PalletContractsEnvironmentTypeU128: 'Null', + /** + * Lookup745: pallet_contracts::EnvironmentType + **/ + PalletContractsEnvironmentTypeH256: 'Null', + /** + * Lookup746: pallet_contracts::EnvironmentType + **/ + PalletContractsEnvironmentTypeBlakeTwo256: 'Null', + /** + * Lookup747: pallet_contracts::EnvironmentType + **/ + PalletContractsEnvironmentTypeU64: 'Null', + /** + * Lookup748: pallet_contracts::EnvironmentType + **/ + PalletContractsEnvironmentTypeU32: 'Null', + /** + * Lookup750: pallet_contracts::pallet::Error **/ PalletContractsError: { - _enum: ['InvalidScheduleVersion', 'InvalidCallFlags', 'OutOfGas', 'OutputBufferTooSmall', 'TransferFailed', 'MaxCallDepthReached', 'ContractNotFound', 'CodeTooLarge', 'CodeNotFound', 'OutOfBounds', 'DecodingFailed', 'ContractTrapped', 'ValueTooLarge', 'TerminatedWhileReentrant', 'InputForwarded', 'RandomSubjectTooLong', 'TooManyTopics', 'NoChainExtension', 'DeletionQueueFull', 'DuplicateContract', 'TerminatedInConstructor', 'ReentranceDenied', 'StorageDepositNotEnoughFunds', 'StorageDepositLimitExhausted', 'CodeInUse', 'ContractReverted', 'CodeRejected', 'Indeterministic'] + _enum: ['InvalidSchedule', 'InvalidCallFlags', 'OutOfGas', 'OutputBufferTooSmall', 'TransferFailed', 'MaxCallDepthReached', 'ContractNotFound', 'CodeTooLarge', 'CodeNotFound', 'CodeInfoNotFound', 'OutOfBounds', 'DecodingFailed', 'ContractTrapped', 'ValueTooLarge', 'TerminatedWhileReentrant', 'InputForwarded', 'RandomSubjectTooLong', 'TooManyTopics', 'NoChainExtension', 'XCMDecodeFailed', 'DuplicateContract', 'TerminatedInConstructor', 'ReentranceDenied', 'StateChangeDenied', 'StorageDepositNotEnoughFunds', 'StorageDepositLimitExhausted', 'CodeInUse', 'ContractReverted', 'CodeRejected', 'Indeterministic', 'MigrationInProgress', 'NoMigrationPerformed', 'MaxDelegateDependenciesReached', 'DelegateDependencyNotFound', 'DelegateDependencyAlreadyExists', 'CannotAddSelfAsDelegateDependency', 'OutOfTransientStorage'] }, /** - * Lookup741: polymesh_contracts::Error + * Lookup752: polymesh_contracts::pallet::Error **/ PolymeshContractsError: { _enum: ['InvalidFuncId', 'InvalidRuntimeCall', 'ReadStorageFailed', 'DataLeftAfterDecoding', 'InLenTooLarge', 'OutLenTooLarge', 'InstantiatorWithNoIdentity', 'RuntimeCallDenied', 'CallerNotAPrimaryKey', 'MissingKeyPermissions', 'InvalidChainVersion', 'NoUpgradesSupported'] }, /** - * Lookup742: pallet_preimage::RequestStatus + * Lookup753: pallet_preimage::OldRequestStatus **/ - PalletPreimageRequestStatus: { + PalletPreimageOldRequestStatus: { _enum: { Unrequested: { deposit: '(AccountId32,u128)', @@ -4769,26 +5002,42 @@ export default { } }, /** - * Lookup746: pallet_preimage::pallet::Error + * Lookup755: pallet_preimage::RequestStatus> + **/ + PalletPreimageRequestStatus: { + _enum: { + Unrequested: { + ticket: '(AccountId32,u128)', + len: 'u32', + }, + Requested: { + maybeTicket: 'Option<(AccountId32,u128)>', + count: 'u32', + maybeLen: 'Option' + } + } + }, + /** + * Lookup760: pallet_preimage::pallet::Error **/ PalletPreimageError: { - _enum: ['TooBig', 'AlreadyNoted', 'NotAuthorized', 'NotNoted', 'Requested', 'NotRequested'] + _enum: ['TooBig', 'AlreadyNoted', 'NotAuthorized', 'NotNoted', 'Requested', 'NotRequested', 'TooMany', 'TooFew'] }, /** - * Lookup747: polymesh_primitives::nft::NFTCollection + * Lookup761: polymesh_primitives::nft::NFTCollection **/ PolymeshPrimitivesNftNftCollection: { id: 'u64', assetId: 'PolymeshPrimitivesAssetAssetId' }, /** - * Lookup752: pallet_nft::Error + * Lookup765: pallet_nft::pallet::Error **/ PalletNftError: { - _enum: ['BalanceOverflow', 'BalanceUnderflow', 'CollectionAlredyRegistered', 'CollectionNotFound', 'DuplicateMetadataKey', 'DuplicatedNFTId', 'InvalidAssetType', 'InvalidMetadataAttribute', 'InvalidNFTTransferCollectionNotFound', 'InvalidNFTTransferSamePortfolio', 'InvalidNFTTransferNFTNotOwned', 'InvalidNFTTransferCountOverflow', 'InvalidNFTTransferComplianceFailure', 'InvalidNFTTransferFrozenAsset', 'InvalidNFTTransferInsufficientCount', 'MaxNumberOfKeysExceeded', 'MaxNumberOfNFTsPerLegExceeded', 'NFTNotFound', 'UnregisteredMetadataKey', 'ZeroCount', 'SupplyOverflow', 'SupplyUnderflow', 'InvalidNFTTransferNFTIsLocked', 'InvalidNFTTransferSenderIdMatchesReceiverId', 'InvalidNFTTransferInvalidReceiverCDD', 'InvalidNFTTransferInvalidSenderCDD', 'InvalidAssetId'] + _enum: ['BalanceOverflow', 'BalanceUnderflow', 'CollectionAlredyRegistered', 'CollectionNotFound', 'DuplicateMetadataKey', 'DuplicatedNFTId', 'InvalidAssetType', 'InvalidMetadataAttribute', 'InvalidNFTTransferCollectionNotFound', 'InvalidNFTTransferSamePortfolio', 'InvalidNFTTransferNFTNotOwned', 'InvalidNFTTransferCountOverflow', 'InvalidNFTTransferComplianceFailure', 'InvalidNFTTransferFrozenAsset', 'InvalidNFTTransferInsufficientCount', 'MaxNumberOfKeysExceeded', 'MaxNumberOfNFTsPerLegExceeded', 'NFTNotFound', 'UnregisteredMetadataKey', 'ZeroCount', 'SupplyOverflow', 'SupplyUnderflow', 'InvalidNFTTransferNFTIsLocked', 'InvalidNFTTransferSenderIdMatchesReceiverId', 'InvalidNFTTransferInvalidReceiverCDD', 'InvalidNFTTransferInvalidSenderCDD', 'InvalidAssetId', 'NFTIsLocked', 'NumberOfKeysIsLessThanExpected'] }, /** - * Lookup753: pallet_election_provider_multi_phase::ReadySolution + * Lookup766: pallet_election_provider_multi_phase::ReadySolution **/ PalletElectionProviderMultiPhaseReadySolution: { supports: 'Vec<(AccountId32,SpNposElectionsSupport)>', @@ -4796,14 +5045,14 @@ export default { compute: 'PalletElectionProviderMultiPhaseElectionCompute' }, /** - * Lookup755: pallet_election_provider_multi_phase::RoundSnapshot + * Lookup768: pallet_election_provider_multi_phase::RoundSnapshot **/ PalletElectionProviderMultiPhaseRoundSnapshot: { voters: 'Vec<(AccountId32,u64,Vec)>', targets: 'Vec' }, /** - * Lookup761: pallet_election_provider_multi_phase::signed::SignedSubmission + * Lookup774: pallet_election_provider_multi_phase::signed::SignedSubmission **/ PalletElectionProviderMultiPhaseSignedSignedSubmission: { who: 'AccountId32', @@ -4812,49 +5061,37 @@ export default { callFee: 'u128' }, /** - * Lookup762: pallet_election_provider_multi_phase::pallet::Error + * Lookup775: pallet_election_provider_multi_phase::pallet::Error **/ PalletElectionProviderMultiPhaseError: { - _enum: ['PreDispatchEarlySubmission', 'PreDispatchWrongWinnerCount', 'PreDispatchWeakSubmission', 'SignedQueueFull', 'SignedCannotPayDeposit', 'SignedInvalidWitness', 'SignedTooMuchWeight', 'OcwCallWrongEra', 'MissingSnapshotMetadata', 'InvalidSubmissionIndex', 'CallNotAllowed', 'FallbackFailed', 'BoundNotMet', 'TooManyWinners'] + _enum: ['PreDispatchEarlySubmission', 'PreDispatchWrongWinnerCount', 'PreDispatchWeakSubmission', 'SignedQueueFull', 'SignedCannotPayDeposit', 'SignedInvalidWitness', 'SignedTooMuchWeight', 'OcwCallWrongEra', 'MissingSnapshotMetadata', 'InvalidSubmissionIndex', 'CallNotAllowed', 'FallbackFailed', 'BoundNotMet', 'TooManyWinners', 'PreDispatchDifferentRound'] }, /** - * Lookup763: pallet_test_utils::Error - **/ - PalletTestUtilsError: 'Null', - /** - * Lookup766: frame_system::extensions::check_spec_version::CheckSpecVersion + * Lookup778: frame_system::extensions::check_spec_version::CheckSpecVersion **/ FrameSystemExtensionsCheckSpecVersion: 'Null', /** - * Lookup767: frame_system::extensions::check_tx_version::CheckTxVersion + * Lookup779: frame_system::extensions::check_tx_version::CheckTxVersion **/ FrameSystemExtensionsCheckTxVersion: 'Null', /** - * Lookup768: frame_system::extensions::check_genesis::CheckGenesis + * Lookup780: frame_system::extensions::check_genesis::CheckGenesis **/ FrameSystemExtensionsCheckGenesis: 'Null', /** - * Lookup771: frame_system::extensions::check_nonce::CheckNonce + * Lookup783: frame_system::extensions::check_nonce::CheckNonce **/ FrameSystemExtensionsCheckNonce: 'Compact', /** - * Lookup772: polymesh_extensions::check_weight::CheckWeight - **/ - PolymeshExtensionsCheckWeight: 'FrameSystemExtensionsCheckWeight', - /** - * Lookup773: frame_system::extensions::check_weight::CheckWeight + * Lookup784: frame_system::extensions::check_weight::CheckWeight **/ FrameSystemExtensionsCheckWeight: 'Null', /** - * Lookup774: pallet_transaction_payment::ChargeTransactionPayment + * Lookup785: pallet_transaction_payment::ChargeTransactionPayment **/ PalletTransactionPaymentChargeTransactionPayment: 'Compact', /** - * Lookup775: pallet_permissions::StoreCallMetadata - **/ - PalletPermissionsStoreCallMetadata: 'Null', - /** - * Lookup776: polymesh_runtime_develop::runtime::Runtime + * Lookup786: pallet_permissions::StoreCallMetadata **/ - PolymeshRuntimeDevelopRuntime: 'Null' + PalletPermissionsStoreCallMetadata: 'Null' }; diff --git a/scripts/cli/src/interfaces/registry.ts b/scripts/cli/src/interfaces/registry.ts index e697becd93..eb3812f9ed 100644 --- a/scripts/cli/src/interfaces/registry.ts +++ b/scripts/cli/src/interfaces/registry.ts @@ -5,7 +5,7 @@ // this is required to allow for ambient/previous definitions import '@polkadot/types/types/registry'; -import type { FinalityGrandpaEquivocationPrecommit, FinalityGrandpaEquivocationPrevote, FinalityGrandpaPrecommit, FinalityGrandpaPrevote, FrameSupportDispatchDispatchClass, FrameSupportDispatchDispatchInfo, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportDispatchRawOrigin, FrameSupportPreimagesBounded, FrameSupportTokensMiscBalanceStatus, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, PalletAssetAssetDetails, PalletAssetCall, PalletAssetCheckpointCall, PalletAssetCheckpointError, PalletAssetError, PalletAssetTickerRegistration, PalletAssetTickerRegistrationConfig, PalletBabeCall, PalletBabeError, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBaseCall, PalletBaseError, PalletBridgeBridgeTxDetail, PalletBridgeBridgeTxStatus, PalletCommitteeCall, PalletCommitteeError, PalletCommitteeInstance1, PalletCommitteeInstance3, PalletCommitteeInstance4, PalletCommitteePolymeshVotes, PalletCommitteeRawEventInstance1, PalletCommitteeRawEventInstance3, PalletCommitteeRawEventInstance4, PalletCommitteeRawOriginInstance1, PalletCommitteeRawOriginInstance3, PalletCommitteeRawOriginInstance4, PalletComplianceManagerCall, PalletComplianceManagerError, PalletContractsCall, PalletContractsError, PalletContractsEvent, PalletContractsSchedule, PalletContractsScheduleHostFnWeights, PalletContractsScheduleInstructionWeights, PalletContractsScheduleLimits, PalletContractsStorageContractInfo, PalletContractsStorageDeletedContract, PalletContractsWasmDeterminism, PalletContractsWasmOwnerInfo, PalletContractsWasmPrefabWasmModule, PalletCorporateActionsBallotBallotMeta, PalletCorporateActionsBallotBallotTimeRange, PalletCorporateActionsBallotBallotVote, PalletCorporateActionsBallotCall, PalletCorporateActionsBallotError, PalletCorporateActionsBallotEvent, PalletCorporateActionsBallotMotion, PalletCorporateActionsCaCheckpoint, PalletCorporateActionsCaId, PalletCorporateActionsCaKind, PalletCorporateActionsCall, PalletCorporateActionsCorporateAction, PalletCorporateActionsDistribution, PalletCorporateActionsDistributionCall, PalletCorporateActionsDistributionError, PalletCorporateActionsDistributionEvent, PalletCorporateActionsError, PalletCorporateActionsEvent, PalletCorporateActionsInitiateCorporateActionArgs, PalletCorporateActionsRecordDate, PalletCorporateActionsRecordDateSpec, PalletCorporateActionsTargetIdentities, PalletCorporateActionsTargetTreatment, PalletElectionProviderMultiPhaseCall, PalletElectionProviderMultiPhaseElectionCompute, PalletElectionProviderMultiPhaseError, PalletElectionProviderMultiPhaseEvent, PalletElectionProviderMultiPhasePhase, PalletElectionProviderMultiPhaseRawSolution, PalletElectionProviderMultiPhaseReadySolution, PalletElectionProviderMultiPhaseRoundSnapshot, PalletElectionProviderMultiPhaseSignedSignedSubmission, PalletElectionProviderMultiPhaseSolutionOrSnapshotSize, PalletExternalAgentsCall, PalletExternalAgentsError, PalletGrandpaCall, PalletGrandpaError, PalletGrandpaEvent, PalletGrandpaStoredPendingChange, PalletGrandpaStoredState, PalletGroupCall, PalletGroupError, PalletGroupInstance1, PalletGroupInstance2, PalletGroupInstance3, PalletGroupInstance4, PalletIdentityCall, PalletIdentityClaim1stKey, PalletIdentityClaim2ndKey, PalletIdentityError, PalletImOnlineBoundedOpaqueNetworkState, PalletImOnlineCall, PalletImOnlineError, PalletImOnlineEvent, PalletImOnlineHeartbeat, PalletImOnlineSr25519AppSr25519Public, PalletImOnlineSr25519AppSr25519Signature, PalletIndicesCall, PalletIndicesError, PalletIndicesEvent, PalletMultisigCall, PalletMultisigError, PalletMultisigEvent, PalletNftCall, PalletNftError, PalletOffencesEvent, PalletPermissionsError, PalletPermissionsStoreCallMetadata, PalletPipsCall, PalletPipsCommittee, PalletPipsDepositInfo, PalletPipsError, PalletPipsPip, PalletPipsPipsMetadata, PalletPipsProposalData, PalletPipsProposalState, PalletPipsProposer, PalletPipsRawEvent, PalletPipsSnapshotMetadata, PalletPipsSnapshotResult, PalletPipsSnapshottedPip, PalletPipsVote, PalletPipsVotingResult, PalletPortfolioCall, PalletPortfolioError, PalletPreimageCall, PalletPreimageError, PalletPreimageEvent, PalletPreimageRequestStatus, PalletProtocolFeeCall, PalletProtocolFeeError, PalletProtocolFeeRawEvent, PalletRelayerCall, PalletRelayerError, PalletRelayerSubsidy, PalletSchedulerCall, PalletSchedulerError, PalletSchedulerEvent, PalletSchedulerScheduled, PalletSessionCall, PalletSessionError, PalletSessionEvent, PalletSettlementCall, PalletSettlementError, PalletStakingActiveEraInfo, PalletStakingEraRewardPoints, PalletStakingExposure, PalletStakingForcing, PalletStakingIndividualExposure, PalletStakingNominations, PalletStakingPalletCall, PalletStakingPalletConfigOpPerbill, PalletStakingPalletConfigOpPercent, PalletStakingPalletConfigOpU128, PalletStakingPalletConfigOpU32, PalletStakingPalletError, PalletStakingPalletEvent, PalletStakingPermissionedIdentityPrefs, PalletStakingRewardDestination, PalletStakingSlashingSlashingSpans, PalletStakingSlashingSpanRecord, PalletStakingSlashingSwitch, PalletStakingStakingLedger, PalletStakingUnappliedSlash, PalletStakingUnlockChunk, PalletStakingValidatorPrefs, PalletStatisticsCall, PalletStatisticsError, PalletStoCall, PalletStoError, PalletStoFundraiser, PalletStoFundraiserStatus, PalletStoFundraiserTier, PalletStoPriceTier, PalletStoRawEvent, PalletSudoCall, PalletSudoError, PalletSudoRawEvent, PalletTestUtilsCall, PalletTestUtilsError, PalletTestUtilsRawEvent, PalletTimestampCall, PalletTransactionPaymentChargeTransactionPayment, PalletTransactionPaymentRawEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryRawEvent, PalletUtilityCall, PalletUtilityError, PalletUtilityEvent, PalletUtilityUniqueCall, PolymeshCommonUtilitiesAssetRawEvent, PolymeshCommonUtilitiesBalancesAccountData, PolymeshCommonUtilitiesBalancesRawEvent, PolymeshCommonUtilitiesBalancesReasons, PolymeshCommonUtilitiesBaseEvent, PolymeshCommonUtilitiesCheckpointEvent, PolymeshCommonUtilitiesCheckpointNextCheckpoints, PolymeshCommonUtilitiesCheckpointScheduleCheckpoints, PolymeshCommonUtilitiesComplianceManagerEvent, PolymeshCommonUtilitiesExternalAgentsEvent, PolymeshCommonUtilitiesGroupInactiveMember, PolymeshCommonUtilitiesGroupRawEventInstance1, PolymeshCommonUtilitiesGroupRawEventInstance2, PolymeshCommonUtilitiesGroupRawEventInstance3, PolymeshCommonUtilitiesGroupRawEventInstance4, PolymeshCommonUtilitiesIdentityCreateChildIdentityWithAuth, PolymeshCommonUtilitiesIdentityRawEvent, PolymeshCommonUtilitiesIdentitySecondaryKeyWithAuth, PolymeshCommonUtilitiesMaybeBlock, PolymeshCommonUtilitiesNftEvent, PolymeshCommonUtilitiesPortfolioEvent, PolymeshCommonUtilitiesProtocolFeeProtocolOp, PolymeshCommonUtilitiesRelayerRawEvent, PolymeshCommonUtilitiesSettlementRawEvent, PolymeshCommonUtilitiesStatisticsEvent, PolymeshContractsApi, PolymeshContractsApiCodeHash, PolymeshContractsCall, PolymeshContractsChainExtensionExtrinsicId, PolymeshContractsChainVersion, PolymeshContractsError, PolymeshContractsNextUpgrade, PolymeshContractsRawEvent, PolymeshExtensionsCheckWeight, PolymeshPrimitivesAgentAgentGroup, PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesAssetAssetType, PolymeshPrimitivesAssetIdentifier, PolymeshPrimitivesAssetMetadataAssetMetadataKey, PolymeshPrimitivesAssetMetadataAssetMetadataLockStatus, PolymeshPrimitivesAssetMetadataAssetMetadataSpec, PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail, PolymeshPrimitivesAssetNonFungibleType, PolymeshPrimitivesAuthorization, PolymeshPrimitivesAuthorizationAuthorizationData, PolymeshPrimitivesBeneficiary, PolymeshPrimitivesCddId, PolymeshPrimitivesComplianceManagerAssetCompliance, PolymeshPrimitivesComplianceManagerComplianceRequirement, PolymeshPrimitivesCondition, PolymeshPrimitivesConditionConditionType, PolymeshPrimitivesConditionTargetIdentity, PolymeshPrimitivesConditionTrustedFor, PolymeshPrimitivesConditionTrustedIssuer, PolymeshPrimitivesDocument, PolymeshPrimitivesDocumentHash, PolymeshPrimitivesEventOnly, PolymeshPrimitivesIdentityClaim, PolymeshPrimitivesIdentityClaimClaim, PolymeshPrimitivesIdentityClaimClaimType, PolymeshPrimitivesIdentityClaimScope, PolymeshPrimitivesIdentityDidRecord, PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesIdentityIdPortfolioKind, PolymeshPrimitivesJurisdictionCountryCode, PolymeshPrimitivesMemo, PolymeshPrimitivesMultisigProposalState, PolymeshPrimitivesMultisigProposalVoteCount, PolymeshPrimitivesNftNfTs, PolymeshPrimitivesNftNftCollection, PolymeshPrimitivesNftNftCollectionKeys, PolymeshPrimitivesNftNftMetadataAttribute, PolymeshPrimitivesPortfolioFund, PolymeshPrimitivesPortfolioFundDescription, PolymeshPrimitivesPortfolioPortfolioUpdateReason, PolymeshPrimitivesPosRatio, PolymeshPrimitivesSecondaryKey, PolymeshPrimitivesSecondaryKeyExtrinsicPermissions, PolymeshPrimitivesSecondaryKeyKeyRecord, PolymeshPrimitivesSecondaryKeyPalletPermissions, PolymeshPrimitivesSecondaryKeyPermissions, PolymeshPrimitivesSecondaryKeySignatory, PolymeshPrimitivesSettlementAffirmationCount, PolymeshPrimitivesSettlementAffirmationStatus, PolymeshPrimitivesSettlementAssetCount, PolymeshPrimitivesSettlementInstruction, PolymeshPrimitivesSettlementInstructionStatus, PolymeshPrimitivesSettlementLeg, PolymeshPrimitivesSettlementLegStatus, PolymeshPrimitivesSettlementMediatorAffirmationStatus, PolymeshPrimitivesSettlementReceiptDetails, PolymeshPrimitivesSettlementReceiptMetadata, PolymeshPrimitivesSettlementSettlementType, PolymeshPrimitivesSettlementVenue, PolymeshPrimitivesSettlementVenueType, PolymeshPrimitivesStatisticsStat1stKey, PolymeshPrimitivesStatisticsStat2ndKey, PolymeshPrimitivesStatisticsStatClaim, PolymeshPrimitivesStatisticsStatOpType, PolymeshPrimitivesStatisticsStatType, PolymeshPrimitivesStatisticsStatUpdate, PolymeshPrimitivesSubsetSubsetRestrictionAssetId, PolymeshPrimitivesSubsetSubsetRestrictionExtrinsicName, PolymeshPrimitivesSubsetSubsetRestrictionPortfolioId, PolymeshPrimitivesTicker, PolymeshPrimitivesTransferComplianceAssetTransferCompliance, PolymeshPrimitivesTransferComplianceTransferCondition, PolymeshPrimitivesTransferComplianceTransferConditionExemptKey, PolymeshRuntimeCommonNposSolution16, PolymeshRuntimeDevelopRuntime, PolymeshRuntimeDevelopRuntimeOriginCaller, PolymeshRuntimeDevelopRuntimeSessionKeys, SpArithmeticArithmeticError, SpAuthorityDiscoveryAppPublic, SpConsensusBabeAllowedSlots, SpConsensusBabeAppPublic, SpConsensusBabeBabeEpochConfiguration, SpConsensusBabeDigestsNextConfigDescriptor, SpConsensusBabeDigestsPreDigest, SpConsensusBabeDigestsPrimaryPreDigest, SpConsensusBabeDigestsSecondaryPlainPreDigest, SpConsensusBabeDigestsSecondaryVRFPreDigest, SpConsensusGrandpaAppPublic, SpConsensusGrandpaAppSignature, SpConsensusGrandpaEquivocation, SpConsensusGrandpaEquivocationProof, SpConsensusSlotsEquivocationProof, SpCoreCryptoKeyTypeId, SpCoreEcdsaSignature, SpCoreEd25519Public, SpCoreEd25519Signature, SpCoreOffchainOpaqueNetworkState, SpCoreSr25519Public, SpCoreSr25519Signature, SpCoreVoid, SpNposElectionsElectionScore, SpNposElectionsSupport, SpRuntimeBlakeTwo256, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeHeader, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpSessionMembershipProof, SpStakingOffenceOffenceDetails, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightToFeeCoefficient, SpWeightsWeightV2Weight } from '@polkadot/types/lookup'; +import type { FinalityGrandpaEquivocationPrecommit, FinalityGrandpaEquivocationPrevote, FinalityGrandpaPrecommit, FinalityGrandpaPrevote, FrameSupportDispatchDispatchClass, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportDispatchRawOrigin, FrameSupportPreimagesBounded, FrameSupportTokensMiscBalanceStatus, FrameSupportTokensMiscIdAmount, FrameSystemAccountInfo, FrameSystemCall, FrameSystemCodeUpgradeAuthorization, FrameSystemDispatchEventInfo, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, PalletAssetAssetDetails, PalletAssetCall, PalletAssetCheckpointPalletCall, PalletAssetCheckpointPalletError, PalletAssetCheckpointPalletEvent, PalletAssetError, PalletAssetEvent, PalletAssetTickerRegistration, PalletAssetTickerRegistrationConfig, PalletBabeCall, PalletBabeError, PalletBalancesAccountData, PalletBalancesAdjustmentDirection, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReserveData, PalletBaseCall, PalletBaseError, PalletBaseEvent, PalletCommitteeCall, PalletCommitteeError, PalletCommitteeEvent, PalletCommitteePolymeshVotes, PalletCommitteeRawOrigin, PalletComplianceManagerCall, PalletComplianceManagerError, PalletComplianceManagerEvent, PalletContractsCall, PalletContractsEnvironment, PalletContractsEnvironmentTypeAccountId32, PalletContractsEnvironmentTypeBlakeTwo256, PalletContractsEnvironmentTypeH256, PalletContractsEnvironmentTypeU128, PalletContractsEnvironmentTypeU32, PalletContractsEnvironmentTypeU64, PalletContractsError, PalletContractsEvent, PalletContractsHoldReason, PalletContractsOrigin, PalletContractsSchedule, PalletContractsScheduleInstructionWeights, PalletContractsScheduleLimits, PalletContractsStorageContractInfo, PalletContractsStorageDeletionQueueManager, PalletContractsWasmCodeInfo, PalletContractsWasmDeterminism, PalletCorporateActionsBallotBallotMeta, PalletCorporateActionsBallotBallotTimeRange, PalletCorporateActionsBallotBallotVote, PalletCorporateActionsBallotMotion, PalletCorporateActionsBallotPalletCall, PalletCorporateActionsBallotPalletError, PalletCorporateActionsBallotPalletEvent, PalletCorporateActionsCaCheckpoint, PalletCorporateActionsCaId, PalletCorporateActionsCaKind, PalletCorporateActionsCall, PalletCorporateActionsCorporateAction, PalletCorporateActionsDistribution, PalletCorporateActionsDistributionPalletCall, PalletCorporateActionsDistributionPalletError, PalletCorporateActionsDistributionPalletEvent, PalletCorporateActionsError, PalletCorporateActionsEvent, PalletCorporateActionsInitiateCorporateActionArgs, PalletCorporateActionsRecordDate, PalletCorporateActionsRecordDateSpec, PalletCorporateActionsTargetIdentities, PalletCorporateActionsTargetTreatment, PalletElectionProviderMultiPhaseCall, PalletElectionProviderMultiPhaseElectionCompute, PalletElectionProviderMultiPhaseError, PalletElectionProviderMultiPhaseEvent, PalletElectionProviderMultiPhasePhase, PalletElectionProviderMultiPhaseRawSolution, PalletElectionProviderMultiPhaseReadySolution, PalletElectionProviderMultiPhaseRoundSnapshot, PalletElectionProviderMultiPhaseSignedSignedSubmission, PalletElectionProviderMultiPhaseSolutionOrSnapshotSize, PalletExternalAgentsCall, PalletExternalAgentsError, PalletExternalAgentsEvent, PalletGrandpaCall, PalletGrandpaError, PalletGrandpaEvent, PalletGrandpaStoredPendingChange, PalletGrandpaStoredState, PalletGroupCall, PalletGroupError, PalletGroupEvent, PalletIdentityCall, PalletIdentityClaim1stKey, PalletIdentityClaim2ndKey, PalletIdentityError, PalletIdentityEvent, PalletImOnlineCall, PalletImOnlineError, PalletImOnlineEvent, PalletImOnlineHeartbeat, PalletImOnlineSr25519AppSr25519Public, PalletImOnlineSr25519AppSr25519Signature, PalletIndicesCall, PalletIndicesError, PalletIndicesEvent, PalletMultisigCall, PalletMultisigError, PalletMultisigEvent, PalletNftCall, PalletNftError, PalletNftEvent, PalletOffencesEvent, PalletPermissionsError, PalletPermissionsStoreCallMetadata, PalletPipsCall, PalletPipsCommittee, PalletPipsDepositInfo, PalletPipsError, PalletPipsEvent, PalletPipsPip, PalletPipsPipsMetadata, PalletPipsProposalData, PalletPipsProposalState, PalletPipsProposer, PalletPipsSnapshotMetadata, PalletPipsSnapshotResult, PalletPipsSnapshottedPip, PalletPipsVote, PalletPipsVotingResult, PalletPortfolioCall, PalletPortfolioError, PalletPortfolioEvent, PalletPreimageCall, PalletPreimageError, PalletPreimageEvent, PalletPreimageHoldReason, PalletPreimageOldRequestStatus, PalletPreimageRequestStatus, PalletProtocolFeeCall, PalletProtocolFeeError, PalletProtocolFeeEvent, PalletRelayerCall, PalletRelayerError, PalletRelayerEvent, PalletRelayerSubsidy, PalletSchedulerCall, PalletSchedulerError, PalletSchedulerEvent, PalletSchedulerRetryConfig, PalletSchedulerScheduled, PalletSessionCall, PalletSessionError, PalletSessionEvent, PalletSettlementCall, PalletSettlementError, PalletSettlementEvent, PalletStakingActiveEraInfo, PalletStakingEraRewardPoints, PalletStakingForcing, PalletStakingNominations, PalletStakingPalletCall, PalletStakingPalletConfigOpPerbill, PalletStakingPalletConfigOpPercent, PalletStakingPalletConfigOpU128, PalletStakingPalletConfigOpU32, PalletStakingPalletError, PalletStakingPalletEvent, PalletStakingPalletHoldReason, PalletStakingRewardDestination, PalletStakingSlashingSlashingSpans, PalletStakingSlashingSpanRecord, PalletStakingStakingLedger, PalletStakingUnappliedSlash, PalletStakingUnlockChunk, PalletStakingValidatorPrefs, PalletStatisticsCall, PalletStatisticsError, PalletStatisticsEvent, PalletStoCall, PalletStoError, PalletStoEvent, PalletStoFundingAsset, PalletStoFundingMethod, PalletStoFundraiser, PalletStoFundraiserStatus, PalletStoFundraiserTier, PalletStoPriceTier, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTimestampCall, PalletTransactionPaymentCall, PalletTransactionPaymentChargeTransactionPayment, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletUtilityCall, PalletUtilityError, PalletUtilityEvent, PalletUtilityUniqueCall, PalletValidatorsCall, PalletValidatorsError, PalletValidatorsEvent, PalletValidatorsPermissionedIdentityPrefs, PalletValidatorsSlashingSwitch, PolymeshCommonUtilitiesCheckpointNextCheckpoints, PolymeshCommonUtilitiesCheckpointScheduleCheckpoints, PolymeshCommonUtilitiesIdentityCreateChildIdentityWithAuth, PolymeshCommonUtilitiesIdentitySecondaryKeyWithAuth, PolymeshCommonUtilitiesProtocolFeeProtocolOp, PolymeshContractsApi, PolymeshContractsApiCodeHash, PolymeshContractsCall, PolymeshContractsChainExtensionExtrinsicId, PolymeshContractsChainVersion, PolymeshContractsError, PolymeshContractsEvent, PolymeshContractsNextUpgrade, PolymeshPrimitivesAgentAgentGroup, PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesAssetAssetType, PolymeshPrimitivesAssetIdentifier, PolymeshPrimitivesAssetMetadataAssetMetadataKey, PolymeshPrimitivesAssetMetadataAssetMetadataLockStatus, PolymeshPrimitivesAssetMetadataAssetMetadataSpec, PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail, PolymeshPrimitivesAssetNonFungibleType, PolymeshPrimitivesAuthorization, PolymeshPrimitivesAuthorizationAuthorizationData, PolymeshPrimitivesBeneficiary, PolymeshPrimitivesCddId, PolymeshPrimitivesComplianceManagerAssetCompliance, PolymeshPrimitivesComplianceManagerComplianceRequirement, PolymeshPrimitivesCondition, PolymeshPrimitivesConditionConditionType, PolymeshPrimitivesConditionTargetIdentity, PolymeshPrimitivesConditionTrustedFor, PolymeshPrimitivesConditionTrustedIssuer, PolymeshPrimitivesDocument, PolymeshPrimitivesDocumentHash, PolymeshPrimitivesEventOnly, PolymeshPrimitivesGroupInactiveMember, PolymeshPrimitivesIdentityClaim, PolymeshPrimitivesIdentityClaimClaim, PolymeshPrimitivesIdentityClaimClaimType, PolymeshPrimitivesIdentityClaimScope, PolymeshPrimitivesIdentityDidRecord, PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesIdentityIdPortfolioKind, PolymeshPrimitivesJurisdictionCountryCode, PolymeshPrimitivesMaybeBlock, PolymeshPrimitivesMemo, PolymeshPrimitivesMultisigProposalState, PolymeshPrimitivesMultisigProposalVoteCount, PolymeshPrimitivesNftNfTs, PolymeshPrimitivesNftNftCollection, PolymeshPrimitivesNftNftCollectionKeys, PolymeshPrimitivesNftNftMetadataAttribute, PolymeshPrimitivesPortfolioFund, PolymeshPrimitivesPortfolioFundDescription, PolymeshPrimitivesPortfolioPortfolioUpdateReason, PolymeshPrimitivesPosRatio, PolymeshPrimitivesSecondaryKey, PolymeshPrimitivesSecondaryKeyExtrinsicPermissions, PolymeshPrimitivesSecondaryKeyKeyRecord, PolymeshPrimitivesSecondaryKeyPalletPermissions, PolymeshPrimitivesSecondaryKeyPermissions, PolymeshPrimitivesSecondaryKeySignatory, PolymeshPrimitivesSettlementAffirmationCount, PolymeshPrimitivesSettlementAffirmationStatus, PolymeshPrimitivesSettlementAssetCount, PolymeshPrimitivesSettlementInstruction, PolymeshPrimitivesSettlementInstructionStatus, PolymeshPrimitivesSettlementLeg, PolymeshPrimitivesSettlementLegStatus, PolymeshPrimitivesSettlementMediatorAffirmationStatus, PolymeshPrimitivesSettlementReceiptDetails, PolymeshPrimitivesSettlementReceiptMetadata, PolymeshPrimitivesSettlementSettlementType, PolymeshPrimitivesSettlementVenue, PolymeshPrimitivesSettlementVenueType, PolymeshPrimitivesStatisticsStat1stKey, PolymeshPrimitivesStatisticsStat2ndKey, PolymeshPrimitivesStatisticsStatClaim, PolymeshPrimitivesStatisticsStatOpType, PolymeshPrimitivesStatisticsStatType, PolymeshPrimitivesStatisticsStatUpdate, PolymeshPrimitivesStoFundraiserReceiptDetails, PolymeshPrimitivesSubsetSubsetRestrictionAssetId, PolymeshPrimitivesSubsetSubsetRestrictionExtrinsicName, PolymeshPrimitivesSubsetSubsetRestrictionPortfolioId, PolymeshPrimitivesTicker, PolymeshPrimitivesTransferComplianceAssetTransferCompliance, PolymeshPrimitivesTransferComplianceTransferCondition, PolymeshPrimitivesTransferComplianceTransferConditionExemptKey, PolymeshRuntimeCommonNposSolution16, PolymeshRuntimeDevelopRuntime, PolymeshRuntimeDevelopRuntimeOriginCaller, PolymeshRuntimeDevelopRuntimeRuntimeHoldReason, PolymeshRuntimeDevelopRuntimeSessionKeys, SpArithmeticArithmeticError, SpAuthorityDiscoveryAppPublic, SpConsensusBabeAllowedSlots, SpConsensusBabeAppPublic, SpConsensusBabeBabeEpochConfiguration, SpConsensusBabeDigestsNextConfigDescriptor, SpConsensusBabeDigestsPreDigest, SpConsensusBabeDigestsPrimaryPreDigest, SpConsensusBabeDigestsSecondaryPlainPreDigest, SpConsensusBabeDigestsSecondaryVRFPreDigest, SpConsensusGrandpaAppPublic, SpConsensusGrandpaAppSignature, SpConsensusGrandpaEquivocation, SpConsensusGrandpaEquivocationProof, SpConsensusSlotsEquivocationProof, SpCoreCryptoKeyTypeId, SpCoreSr25519VrfVrfSignature, SpNposElectionsElectionScore, SpNposElectionsSupport, SpRuntimeBlakeTwo256, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeHeader, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeProvingTrieTrieError, SpRuntimeTokenError, SpRuntimeTransactionalError, SpSessionMembershipProof, SpStakingExposure, SpStakingExposurePage, SpStakingIndividualExposure, SpStakingOffenceOffenceDetails, SpStakingPagedExposureMetadata, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight } from '@polkadot/types/lookup'; declare module '@polkadot/types/types/registry' { interface InterfaceTypes { @@ -14,7 +14,6 @@ declare module '@polkadot/types/types/registry' { FinalityGrandpaPrecommit: FinalityGrandpaPrecommit; FinalityGrandpaPrevote: FinalityGrandpaPrevote; FrameSupportDispatchDispatchClass: FrameSupportDispatchDispatchClass; - FrameSupportDispatchDispatchInfo: FrameSupportDispatchDispatchInfo; FrameSupportDispatchPays: FrameSupportDispatchPays; FrameSupportDispatchPerDispatchClassU32: FrameSupportDispatchPerDispatchClassU32; FrameSupportDispatchPerDispatchClassWeight: FrameSupportDispatchPerDispatchClassWeight; @@ -22,8 +21,11 @@ declare module '@polkadot/types/types/registry' { FrameSupportDispatchRawOrigin: FrameSupportDispatchRawOrigin; FrameSupportPreimagesBounded: FrameSupportPreimagesBounded; FrameSupportTokensMiscBalanceStatus: FrameSupportTokensMiscBalanceStatus; + FrameSupportTokensMiscIdAmount: FrameSupportTokensMiscIdAmount; FrameSystemAccountInfo: FrameSystemAccountInfo; FrameSystemCall: FrameSystemCall; + FrameSystemCodeUpgradeAuthorization: FrameSystemCodeUpgradeAuthorization; + FrameSystemDispatchEventInfo: FrameSystemDispatchEventInfo; FrameSystemError: FrameSystemError; FrameSystemEvent: FrameSystemEvent; FrameSystemEventRecord: FrameSystemEventRecord; @@ -39,62 +41,69 @@ declare module '@polkadot/types/types/registry' { FrameSystemPhase: FrameSystemPhase; PalletAssetAssetDetails: PalletAssetAssetDetails; PalletAssetCall: PalletAssetCall; - PalletAssetCheckpointCall: PalletAssetCheckpointCall; - PalletAssetCheckpointError: PalletAssetCheckpointError; + PalletAssetCheckpointPalletCall: PalletAssetCheckpointPalletCall; + PalletAssetCheckpointPalletError: PalletAssetCheckpointPalletError; + PalletAssetCheckpointPalletEvent: PalletAssetCheckpointPalletEvent; PalletAssetError: PalletAssetError; + PalletAssetEvent: PalletAssetEvent; PalletAssetTickerRegistration: PalletAssetTickerRegistration; PalletAssetTickerRegistrationConfig: PalletAssetTickerRegistrationConfig; PalletBabeCall: PalletBabeCall; PalletBabeError: PalletBabeError; + PalletBalancesAccountData: PalletBalancesAccountData; + PalletBalancesAdjustmentDirection: PalletBalancesAdjustmentDirection; PalletBalancesBalanceLock: PalletBalancesBalanceLock; PalletBalancesCall: PalletBalancesCall; PalletBalancesError: PalletBalancesError; + PalletBalancesEvent: PalletBalancesEvent; + PalletBalancesReasons: PalletBalancesReasons; + PalletBalancesReserveData: PalletBalancesReserveData; PalletBaseCall: PalletBaseCall; PalletBaseError: PalletBaseError; - PalletBridgeBridgeTxDetail: PalletBridgeBridgeTxDetail; - PalletBridgeBridgeTxStatus: PalletBridgeBridgeTxStatus; + PalletBaseEvent: PalletBaseEvent; PalletCommitteeCall: PalletCommitteeCall; PalletCommitteeError: PalletCommitteeError; - PalletCommitteeInstance1: PalletCommitteeInstance1; - PalletCommitteeInstance3: PalletCommitteeInstance3; - PalletCommitteeInstance4: PalletCommitteeInstance4; + PalletCommitteeEvent: PalletCommitteeEvent; PalletCommitteePolymeshVotes: PalletCommitteePolymeshVotes; - PalletCommitteeRawEventInstance1: PalletCommitteeRawEventInstance1; - PalletCommitteeRawEventInstance3: PalletCommitteeRawEventInstance3; - PalletCommitteeRawEventInstance4: PalletCommitteeRawEventInstance4; - PalletCommitteeRawOriginInstance1: PalletCommitteeRawOriginInstance1; - PalletCommitteeRawOriginInstance3: PalletCommitteeRawOriginInstance3; - PalletCommitteeRawOriginInstance4: PalletCommitteeRawOriginInstance4; + PalletCommitteeRawOrigin: PalletCommitteeRawOrigin; PalletComplianceManagerCall: PalletComplianceManagerCall; PalletComplianceManagerError: PalletComplianceManagerError; + PalletComplianceManagerEvent: PalletComplianceManagerEvent; PalletContractsCall: PalletContractsCall; + PalletContractsEnvironment: PalletContractsEnvironment; + PalletContractsEnvironmentTypeAccountId32: PalletContractsEnvironmentTypeAccountId32; + PalletContractsEnvironmentTypeBlakeTwo256: PalletContractsEnvironmentTypeBlakeTwo256; + PalletContractsEnvironmentTypeH256: PalletContractsEnvironmentTypeH256; + PalletContractsEnvironmentTypeU128: PalletContractsEnvironmentTypeU128; + PalletContractsEnvironmentTypeU32: PalletContractsEnvironmentTypeU32; + PalletContractsEnvironmentTypeU64: PalletContractsEnvironmentTypeU64; PalletContractsError: PalletContractsError; PalletContractsEvent: PalletContractsEvent; + PalletContractsHoldReason: PalletContractsHoldReason; + PalletContractsOrigin: PalletContractsOrigin; PalletContractsSchedule: PalletContractsSchedule; - PalletContractsScheduleHostFnWeights: PalletContractsScheduleHostFnWeights; PalletContractsScheduleInstructionWeights: PalletContractsScheduleInstructionWeights; PalletContractsScheduleLimits: PalletContractsScheduleLimits; PalletContractsStorageContractInfo: PalletContractsStorageContractInfo; - PalletContractsStorageDeletedContract: PalletContractsStorageDeletedContract; + PalletContractsStorageDeletionQueueManager: PalletContractsStorageDeletionQueueManager; + PalletContractsWasmCodeInfo: PalletContractsWasmCodeInfo; PalletContractsWasmDeterminism: PalletContractsWasmDeterminism; - PalletContractsWasmOwnerInfo: PalletContractsWasmOwnerInfo; - PalletContractsWasmPrefabWasmModule: PalletContractsWasmPrefabWasmModule; PalletCorporateActionsBallotBallotMeta: PalletCorporateActionsBallotBallotMeta; PalletCorporateActionsBallotBallotTimeRange: PalletCorporateActionsBallotBallotTimeRange; PalletCorporateActionsBallotBallotVote: PalletCorporateActionsBallotBallotVote; - PalletCorporateActionsBallotCall: PalletCorporateActionsBallotCall; - PalletCorporateActionsBallotError: PalletCorporateActionsBallotError; - PalletCorporateActionsBallotEvent: PalletCorporateActionsBallotEvent; PalletCorporateActionsBallotMotion: PalletCorporateActionsBallotMotion; + PalletCorporateActionsBallotPalletCall: PalletCorporateActionsBallotPalletCall; + PalletCorporateActionsBallotPalletError: PalletCorporateActionsBallotPalletError; + PalletCorporateActionsBallotPalletEvent: PalletCorporateActionsBallotPalletEvent; PalletCorporateActionsCaCheckpoint: PalletCorporateActionsCaCheckpoint; PalletCorporateActionsCaId: PalletCorporateActionsCaId; PalletCorporateActionsCaKind: PalletCorporateActionsCaKind; PalletCorporateActionsCall: PalletCorporateActionsCall; PalletCorporateActionsCorporateAction: PalletCorporateActionsCorporateAction; PalletCorporateActionsDistribution: PalletCorporateActionsDistribution; - PalletCorporateActionsDistributionCall: PalletCorporateActionsDistributionCall; - PalletCorporateActionsDistributionError: PalletCorporateActionsDistributionError; - PalletCorporateActionsDistributionEvent: PalletCorporateActionsDistributionEvent; + PalletCorporateActionsDistributionPalletCall: PalletCorporateActionsDistributionPalletCall; + PalletCorporateActionsDistributionPalletError: PalletCorporateActionsDistributionPalletError; + PalletCorporateActionsDistributionPalletEvent: PalletCorporateActionsDistributionPalletEvent; PalletCorporateActionsError: PalletCorporateActionsError; PalletCorporateActionsEvent: PalletCorporateActionsEvent; PalletCorporateActionsInitiateCorporateActionArgs: PalletCorporateActionsInitiateCorporateActionArgs; @@ -114,6 +123,7 @@ declare module '@polkadot/types/types/registry' { PalletElectionProviderMultiPhaseSolutionOrSnapshotSize: PalletElectionProviderMultiPhaseSolutionOrSnapshotSize; PalletExternalAgentsCall: PalletExternalAgentsCall; PalletExternalAgentsError: PalletExternalAgentsError; + PalletExternalAgentsEvent: PalletExternalAgentsEvent; PalletGrandpaCall: PalletGrandpaCall; PalletGrandpaError: PalletGrandpaError; PalletGrandpaEvent: PalletGrandpaEvent; @@ -121,15 +131,12 @@ declare module '@polkadot/types/types/registry' { PalletGrandpaStoredState: PalletGrandpaStoredState; PalletGroupCall: PalletGroupCall; PalletGroupError: PalletGroupError; - PalletGroupInstance1: PalletGroupInstance1; - PalletGroupInstance2: PalletGroupInstance2; - PalletGroupInstance3: PalletGroupInstance3; - PalletGroupInstance4: PalletGroupInstance4; + PalletGroupEvent: PalletGroupEvent; PalletIdentityCall: PalletIdentityCall; PalletIdentityClaim1stKey: PalletIdentityClaim1stKey; PalletIdentityClaim2ndKey: PalletIdentityClaim2ndKey; PalletIdentityError: PalletIdentityError; - PalletImOnlineBoundedOpaqueNetworkState: PalletImOnlineBoundedOpaqueNetworkState; + PalletIdentityEvent: PalletIdentityEvent; PalletImOnlineCall: PalletImOnlineCall; PalletImOnlineError: PalletImOnlineError; PalletImOnlineEvent: PalletImOnlineEvent; @@ -144,6 +151,7 @@ declare module '@polkadot/types/types/registry' { PalletMultisigEvent: PalletMultisigEvent; PalletNftCall: PalletNftCall; PalletNftError: PalletNftError; + PalletNftEvent: PalletNftEvent; PalletOffencesEvent: PalletOffencesEvent; PalletPermissionsError: PalletPermissionsError; PalletPermissionsStoreCallMetadata: PalletPermissionsStoreCallMetadata; @@ -151,12 +159,12 @@ declare module '@polkadot/types/types/registry' { PalletPipsCommittee: PalletPipsCommittee; PalletPipsDepositInfo: PalletPipsDepositInfo; PalletPipsError: PalletPipsError; + PalletPipsEvent: PalletPipsEvent; PalletPipsPip: PalletPipsPip; PalletPipsPipsMetadata: PalletPipsPipsMetadata; PalletPipsProposalData: PalletPipsProposalData; PalletPipsProposalState: PalletPipsProposalState; PalletPipsProposer: PalletPipsProposer; - PalletPipsRawEvent: PalletPipsRawEvent; PalletPipsSnapshotMetadata: PalletPipsSnapshotMetadata; PalletPipsSnapshotResult: PalletPipsSnapshotResult; PalletPipsSnapshottedPip: PalletPipsSnapshottedPip; @@ -164,30 +172,34 @@ declare module '@polkadot/types/types/registry' { PalletPipsVotingResult: PalletPipsVotingResult; PalletPortfolioCall: PalletPortfolioCall; PalletPortfolioError: PalletPortfolioError; + PalletPortfolioEvent: PalletPortfolioEvent; PalletPreimageCall: PalletPreimageCall; PalletPreimageError: PalletPreimageError; PalletPreimageEvent: PalletPreimageEvent; + PalletPreimageHoldReason: PalletPreimageHoldReason; + PalletPreimageOldRequestStatus: PalletPreimageOldRequestStatus; PalletPreimageRequestStatus: PalletPreimageRequestStatus; PalletProtocolFeeCall: PalletProtocolFeeCall; PalletProtocolFeeError: PalletProtocolFeeError; - PalletProtocolFeeRawEvent: PalletProtocolFeeRawEvent; + PalletProtocolFeeEvent: PalletProtocolFeeEvent; PalletRelayerCall: PalletRelayerCall; PalletRelayerError: PalletRelayerError; + PalletRelayerEvent: PalletRelayerEvent; PalletRelayerSubsidy: PalletRelayerSubsidy; PalletSchedulerCall: PalletSchedulerCall; PalletSchedulerError: PalletSchedulerError; PalletSchedulerEvent: PalletSchedulerEvent; + PalletSchedulerRetryConfig: PalletSchedulerRetryConfig; PalletSchedulerScheduled: PalletSchedulerScheduled; PalletSessionCall: PalletSessionCall; PalletSessionError: PalletSessionError; PalletSessionEvent: PalletSessionEvent; PalletSettlementCall: PalletSettlementCall; PalletSettlementError: PalletSettlementError; + PalletSettlementEvent: PalletSettlementEvent; PalletStakingActiveEraInfo: PalletStakingActiveEraInfo; PalletStakingEraRewardPoints: PalletStakingEraRewardPoints; - PalletStakingExposure: PalletStakingExposure; PalletStakingForcing: PalletStakingForcing; - PalletStakingIndividualExposure: PalletStakingIndividualExposure; PalletStakingNominations: PalletStakingNominations; PalletStakingPalletCall: PalletStakingPalletCall; PalletStakingPalletConfigOpPerbill: PalletStakingPalletConfigOpPerbill; @@ -196,75 +208,59 @@ declare module '@polkadot/types/types/registry' { PalletStakingPalletConfigOpU32: PalletStakingPalletConfigOpU32; PalletStakingPalletError: PalletStakingPalletError; PalletStakingPalletEvent: PalletStakingPalletEvent; - PalletStakingPermissionedIdentityPrefs: PalletStakingPermissionedIdentityPrefs; + PalletStakingPalletHoldReason: PalletStakingPalletHoldReason; PalletStakingRewardDestination: PalletStakingRewardDestination; PalletStakingSlashingSlashingSpans: PalletStakingSlashingSlashingSpans; PalletStakingSlashingSpanRecord: PalletStakingSlashingSpanRecord; - PalletStakingSlashingSwitch: PalletStakingSlashingSwitch; PalletStakingStakingLedger: PalletStakingStakingLedger; PalletStakingUnappliedSlash: PalletStakingUnappliedSlash; PalletStakingUnlockChunk: PalletStakingUnlockChunk; PalletStakingValidatorPrefs: PalletStakingValidatorPrefs; PalletStatisticsCall: PalletStatisticsCall; PalletStatisticsError: PalletStatisticsError; + PalletStatisticsEvent: PalletStatisticsEvent; PalletStoCall: PalletStoCall; PalletStoError: PalletStoError; + PalletStoEvent: PalletStoEvent; + PalletStoFundingAsset: PalletStoFundingAsset; + PalletStoFundingMethod: PalletStoFundingMethod; PalletStoFundraiser: PalletStoFundraiser; PalletStoFundraiserStatus: PalletStoFundraiserStatus; PalletStoFundraiserTier: PalletStoFundraiserTier; PalletStoPriceTier: PalletStoPriceTier; - PalletStoRawEvent: PalletStoRawEvent; PalletSudoCall: PalletSudoCall; PalletSudoError: PalletSudoError; - PalletSudoRawEvent: PalletSudoRawEvent; - PalletTestUtilsCall: PalletTestUtilsCall; - PalletTestUtilsError: PalletTestUtilsError; - PalletTestUtilsRawEvent: PalletTestUtilsRawEvent; + PalletSudoEvent: PalletSudoEvent; PalletTimestampCall: PalletTimestampCall; + PalletTransactionPaymentCall: PalletTransactionPaymentCall; PalletTransactionPaymentChargeTransactionPayment: PalletTransactionPaymentChargeTransactionPayment; - PalletTransactionPaymentRawEvent: PalletTransactionPaymentRawEvent; + PalletTransactionPaymentEvent: PalletTransactionPaymentEvent; PalletTransactionPaymentReleases: PalletTransactionPaymentReleases; PalletTreasuryCall: PalletTreasuryCall; PalletTreasuryError: PalletTreasuryError; - PalletTreasuryRawEvent: PalletTreasuryRawEvent; + PalletTreasuryEvent: PalletTreasuryEvent; PalletUtilityCall: PalletUtilityCall; PalletUtilityError: PalletUtilityError; PalletUtilityEvent: PalletUtilityEvent; PalletUtilityUniqueCall: PalletUtilityUniqueCall; - PolymeshCommonUtilitiesAssetRawEvent: PolymeshCommonUtilitiesAssetRawEvent; - PolymeshCommonUtilitiesBalancesAccountData: PolymeshCommonUtilitiesBalancesAccountData; - PolymeshCommonUtilitiesBalancesRawEvent: PolymeshCommonUtilitiesBalancesRawEvent; - PolymeshCommonUtilitiesBalancesReasons: PolymeshCommonUtilitiesBalancesReasons; - PolymeshCommonUtilitiesBaseEvent: PolymeshCommonUtilitiesBaseEvent; - PolymeshCommonUtilitiesCheckpointEvent: PolymeshCommonUtilitiesCheckpointEvent; + PalletValidatorsCall: PalletValidatorsCall; + PalletValidatorsError: PalletValidatorsError; + PalletValidatorsEvent: PalletValidatorsEvent; + PalletValidatorsPermissionedIdentityPrefs: PalletValidatorsPermissionedIdentityPrefs; + PalletValidatorsSlashingSwitch: PalletValidatorsSlashingSwitch; PolymeshCommonUtilitiesCheckpointNextCheckpoints: PolymeshCommonUtilitiesCheckpointNextCheckpoints; PolymeshCommonUtilitiesCheckpointScheduleCheckpoints: PolymeshCommonUtilitiesCheckpointScheduleCheckpoints; - PolymeshCommonUtilitiesComplianceManagerEvent: PolymeshCommonUtilitiesComplianceManagerEvent; - PolymeshCommonUtilitiesExternalAgentsEvent: PolymeshCommonUtilitiesExternalAgentsEvent; - PolymeshCommonUtilitiesGroupInactiveMember: PolymeshCommonUtilitiesGroupInactiveMember; - PolymeshCommonUtilitiesGroupRawEventInstance1: PolymeshCommonUtilitiesGroupRawEventInstance1; - PolymeshCommonUtilitiesGroupRawEventInstance2: PolymeshCommonUtilitiesGroupRawEventInstance2; - PolymeshCommonUtilitiesGroupRawEventInstance3: PolymeshCommonUtilitiesGroupRawEventInstance3; - PolymeshCommonUtilitiesGroupRawEventInstance4: PolymeshCommonUtilitiesGroupRawEventInstance4; PolymeshCommonUtilitiesIdentityCreateChildIdentityWithAuth: PolymeshCommonUtilitiesIdentityCreateChildIdentityWithAuth; - PolymeshCommonUtilitiesIdentityRawEvent: PolymeshCommonUtilitiesIdentityRawEvent; PolymeshCommonUtilitiesIdentitySecondaryKeyWithAuth: PolymeshCommonUtilitiesIdentitySecondaryKeyWithAuth; - PolymeshCommonUtilitiesMaybeBlock: PolymeshCommonUtilitiesMaybeBlock; - PolymeshCommonUtilitiesNftEvent: PolymeshCommonUtilitiesNftEvent; - PolymeshCommonUtilitiesPortfolioEvent: PolymeshCommonUtilitiesPortfolioEvent; PolymeshCommonUtilitiesProtocolFeeProtocolOp: PolymeshCommonUtilitiesProtocolFeeProtocolOp; - PolymeshCommonUtilitiesRelayerRawEvent: PolymeshCommonUtilitiesRelayerRawEvent; - PolymeshCommonUtilitiesSettlementRawEvent: PolymeshCommonUtilitiesSettlementRawEvent; - PolymeshCommonUtilitiesStatisticsEvent: PolymeshCommonUtilitiesStatisticsEvent; PolymeshContractsApi: PolymeshContractsApi; PolymeshContractsApiCodeHash: PolymeshContractsApiCodeHash; PolymeshContractsCall: PolymeshContractsCall; PolymeshContractsChainExtensionExtrinsicId: PolymeshContractsChainExtensionExtrinsicId; PolymeshContractsChainVersion: PolymeshContractsChainVersion; PolymeshContractsError: PolymeshContractsError; + PolymeshContractsEvent: PolymeshContractsEvent; PolymeshContractsNextUpgrade: PolymeshContractsNextUpgrade; - PolymeshContractsRawEvent: PolymeshContractsRawEvent; - PolymeshExtensionsCheckWeight: PolymeshExtensionsCheckWeight; PolymeshPrimitivesAgentAgentGroup: PolymeshPrimitivesAgentAgentGroup; PolymeshPrimitivesAssetAssetId: PolymeshPrimitivesAssetAssetId; PolymeshPrimitivesAssetAssetType: PolymeshPrimitivesAssetAssetType; @@ -288,6 +284,7 @@ declare module '@polkadot/types/types/registry' { PolymeshPrimitivesDocument: PolymeshPrimitivesDocument; PolymeshPrimitivesDocumentHash: PolymeshPrimitivesDocumentHash; PolymeshPrimitivesEventOnly: PolymeshPrimitivesEventOnly; + PolymeshPrimitivesGroupInactiveMember: PolymeshPrimitivesGroupInactiveMember; PolymeshPrimitivesIdentityClaim: PolymeshPrimitivesIdentityClaim; PolymeshPrimitivesIdentityClaimClaim: PolymeshPrimitivesIdentityClaimClaim; PolymeshPrimitivesIdentityClaimClaimType: PolymeshPrimitivesIdentityClaimClaimType; @@ -297,6 +294,7 @@ declare module '@polkadot/types/types/registry' { PolymeshPrimitivesIdentityIdPortfolioId: PolymeshPrimitivesIdentityIdPortfolioId; PolymeshPrimitivesIdentityIdPortfolioKind: PolymeshPrimitivesIdentityIdPortfolioKind; PolymeshPrimitivesJurisdictionCountryCode: PolymeshPrimitivesJurisdictionCountryCode; + PolymeshPrimitivesMaybeBlock: PolymeshPrimitivesMaybeBlock; PolymeshPrimitivesMemo: PolymeshPrimitivesMemo; PolymeshPrimitivesMultisigProposalState: PolymeshPrimitivesMultisigProposalState; PolymeshPrimitivesMultisigProposalVoteCount: PolymeshPrimitivesMultisigProposalVoteCount; @@ -333,6 +331,7 @@ declare module '@polkadot/types/types/registry' { PolymeshPrimitivesStatisticsStatOpType: PolymeshPrimitivesStatisticsStatOpType; PolymeshPrimitivesStatisticsStatType: PolymeshPrimitivesStatisticsStatType; PolymeshPrimitivesStatisticsStatUpdate: PolymeshPrimitivesStatisticsStatUpdate; + PolymeshPrimitivesStoFundraiserReceiptDetails: PolymeshPrimitivesStoFundraiserReceiptDetails; PolymeshPrimitivesSubsetSubsetRestrictionAssetId: PolymeshPrimitivesSubsetSubsetRestrictionAssetId; PolymeshPrimitivesSubsetSubsetRestrictionExtrinsicName: PolymeshPrimitivesSubsetSubsetRestrictionExtrinsicName; PolymeshPrimitivesSubsetSubsetRestrictionPortfolioId: PolymeshPrimitivesSubsetSubsetRestrictionPortfolioId; @@ -343,6 +342,7 @@ declare module '@polkadot/types/types/registry' { PolymeshRuntimeCommonNposSolution16: PolymeshRuntimeCommonNposSolution16; PolymeshRuntimeDevelopRuntime: PolymeshRuntimeDevelopRuntime; PolymeshRuntimeDevelopRuntimeOriginCaller: PolymeshRuntimeDevelopRuntimeOriginCaller; + PolymeshRuntimeDevelopRuntimeRuntimeHoldReason: PolymeshRuntimeDevelopRuntimeRuntimeHoldReason; PolymeshRuntimeDevelopRuntimeSessionKeys: PolymeshRuntimeDevelopRuntimeSessionKeys; SpArithmeticArithmeticError: SpArithmeticArithmeticError; SpAuthorityDiscoveryAppPublic: SpAuthorityDiscoveryAppPublic; @@ -360,13 +360,7 @@ declare module '@polkadot/types/types/registry' { SpConsensusGrandpaEquivocationProof: SpConsensusGrandpaEquivocationProof; SpConsensusSlotsEquivocationProof: SpConsensusSlotsEquivocationProof; SpCoreCryptoKeyTypeId: SpCoreCryptoKeyTypeId; - SpCoreEcdsaSignature: SpCoreEcdsaSignature; - SpCoreEd25519Public: SpCoreEd25519Public; - SpCoreEd25519Signature: SpCoreEd25519Signature; - SpCoreOffchainOpaqueNetworkState: SpCoreOffchainOpaqueNetworkState; - SpCoreSr25519Public: SpCoreSr25519Public; - SpCoreSr25519Signature: SpCoreSr25519Signature; - SpCoreVoid: SpCoreVoid; + SpCoreSr25519VrfVrfSignature: SpCoreSr25519VrfVrfSignature; SpNposElectionsElectionScore: SpNposElectionsElectionScore; SpNposElectionsSupport: SpNposElectionsSupport; SpRuntimeBlakeTwo256: SpRuntimeBlakeTwo256; @@ -376,13 +370,17 @@ declare module '@polkadot/types/types/registry' { SpRuntimeHeader: SpRuntimeHeader; SpRuntimeModuleError: SpRuntimeModuleError; SpRuntimeMultiSignature: SpRuntimeMultiSignature; + SpRuntimeProvingTrieTrieError: SpRuntimeProvingTrieTrieError; SpRuntimeTokenError: SpRuntimeTokenError; SpRuntimeTransactionalError: SpRuntimeTransactionalError; SpSessionMembershipProof: SpSessionMembershipProof; + SpStakingExposure: SpStakingExposure; + SpStakingExposurePage: SpStakingExposurePage; + SpStakingIndividualExposure: SpStakingIndividualExposure; SpStakingOffenceOffenceDetails: SpStakingOffenceOffenceDetails; + SpStakingPagedExposureMetadata: SpStakingPagedExposureMetadata; SpVersionRuntimeVersion: SpVersionRuntimeVersion; SpWeightsRuntimeDbWeight: SpWeightsRuntimeDbWeight; - SpWeightsWeightToFeeCoefficient: SpWeightsWeightToFeeCoefficient; SpWeightsWeightV2Weight: SpWeightsWeightV2Weight; } // InterfaceTypes } // declare module diff --git a/scripts/cli/src/interfaces/types-lookup.ts b/scripts/cli/src/interfaces/types-lookup.ts index 761463c8cf..d9343b742a 100644 --- a/scripts/cli/src/interfaces/types-lookup.ts +++ b/scripts/cli/src/interfaces/types-lookup.ts @@ -7,7 +7,6 @@ import '@polkadot/types/lookup'; import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; import type { ITuple } from '@polkadot/types-codec/types'; -import type { OpaqueMultiaddr, OpaquePeerId } from '@polkadot/types/interfaces/imOnline'; import type { AccountId32, Call, H256, H512, MultiAddress, PerU16, Perbill, Percent, Permill } from '@polkadot/types/interfaces/runtime'; import type { Event } from '@polkadot/types/interfaces/system'; @@ -18,36 +17,36 @@ declare module '@polkadot/types/lookup' { readonly consumers: u32; readonly providers: u32; readonly sufficients: u32; - readonly data: PolymeshCommonUtilitiesBalancesAccountData; + readonly data: PalletBalancesAccountData; } - /** @name PolymeshCommonUtilitiesBalancesAccountData (5) */ - interface PolymeshCommonUtilitiesBalancesAccountData extends Struct { + /** @name PalletBalancesAccountData (5) */ + interface PalletBalancesAccountData extends Struct { readonly free: u128; readonly reserved: u128; - readonly miscFrozen: u128; - readonly feeFrozen: u128; + readonly frozen: u128; + readonly flags: u128; } - /** @name FrameSupportDispatchPerDispatchClassWeight (7) */ + /** @name FrameSupportDispatchPerDispatchClassWeight (9) */ interface FrameSupportDispatchPerDispatchClassWeight extends Struct { readonly normal: SpWeightsWeightV2Weight; readonly operational: SpWeightsWeightV2Weight; readonly mandatory: SpWeightsWeightV2Weight; } - /** @name SpWeightsWeightV2Weight (8) */ + /** @name SpWeightsWeightV2Weight (10) */ interface SpWeightsWeightV2Weight extends Struct { readonly refTime: Compact; readonly proofSize: Compact; } - /** @name SpRuntimeDigest (13) */ + /** @name SpRuntimeDigest (15) */ interface SpRuntimeDigest extends Struct { readonly logs: Vec; } - /** @name SpRuntimeDigestDigestItem (15) */ + /** @name SpRuntimeDigestDigestItem (17) */ interface SpRuntimeDigestDigestItem extends Enum { readonly isOther: boolean; readonly asOther: Bytes; @@ -61,23 +60,23 @@ declare module '@polkadot/types/lookup' { readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated'; } - /** @name FrameSystemEventRecord (18) */ + /** @name FrameSystemEventRecord (20) */ interface FrameSystemEventRecord extends Struct { readonly phase: FrameSystemPhase; readonly event: Event; readonly topics: Vec; } - /** @name FrameSystemEvent (20) */ + /** @name FrameSystemEvent (22) */ interface FrameSystemEvent extends Enum { readonly isExtrinsicSuccess: boolean; readonly asExtrinsicSuccess: { - readonly dispatchInfo: FrameSupportDispatchDispatchInfo; + readonly dispatchInfo: FrameSystemDispatchEventInfo; } & Struct; readonly isExtrinsicFailed: boolean; readonly asExtrinsicFailed: { readonly dispatchError: SpRuntimeDispatchError; - readonly dispatchInfo: FrameSupportDispatchDispatchInfo; + readonly dispatchInfo: FrameSystemDispatchEventInfo; } & Struct; readonly isCodeUpdated: boolean; readonly isNewAccount: boolean; @@ -93,17 +92,27 @@ declare module '@polkadot/types/lookup' { readonly sender: AccountId32; readonly hash_: H256; } & Struct; - readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked'; + readonly isUpgradeAuthorized: boolean; + readonly asUpgradeAuthorized: { + readonly codeHash: H256; + readonly checkVersion: bool; + } & Struct; + readonly isRejectedInvalidAuthorizedUpgrade: boolean; + readonly asRejectedInvalidAuthorizedUpgrade: { + readonly codeHash: H256; + readonly error: SpRuntimeDispatchError; + } & Struct; + readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked' | 'UpgradeAuthorized' | 'RejectedInvalidAuthorizedUpgrade'; } - /** @name FrameSupportDispatchDispatchInfo (21) */ - interface FrameSupportDispatchDispatchInfo extends Struct { + /** @name FrameSystemDispatchEventInfo (23) */ + interface FrameSystemDispatchEventInfo extends Struct { readonly weight: SpWeightsWeightV2Weight; readonly class: FrameSupportDispatchDispatchClass; readonly paysFee: FrameSupportDispatchPays; } - /** @name FrameSupportDispatchDispatchClass (22) */ + /** @name FrameSupportDispatchDispatchClass (24) */ interface FrameSupportDispatchDispatchClass extends Enum { readonly isNormal: boolean; readonly isOperational: boolean; @@ -111,14 +120,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'Normal' | 'Operational' | 'Mandatory'; } - /** @name FrameSupportDispatchPays (23) */ + /** @name FrameSupportDispatchPays (25) */ interface FrameSupportDispatchPays extends Enum { readonly isYes: boolean; readonly isNo: boolean; readonly type: 'Yes' | 'No'; } - /** @name SpRuntimeDispatchError (24) */ + /** @name SpRuntimeDispatchError (26) */ interface SpRuntimeDispatchError extends Enum { readonly isOther: boolean; readonly isCannotLookup: boolean; @@ -137,28 +146,34 @@ declare module '@polkadot/types/lookup' { readonly isExhausted: boolean; readonly isCorruption: boolean; readonly isUnavailable: boolean; - readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional' | 'Exhausted' | 'Corruption' | 'Unavailable'; + readonly isRootNotAllowed: boolean; + readonly isTrie: boolean; + readonly asTrie: SpRuntimeProvingTrieTrieError; + readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional' | 'Exhausted' | 'Corruption' | 'Unavailable' | 'RootNotAllowed' | 'Trie'; } - /** @name SpRuntimeModuleError (25) */ + /** @name SpRuntimeModuleError (27) */ interface SpRuntimeModuleError extends Struct { readonly index: u8; readonly error: U8aFixed; } - /** @name SpRuntimeTokenError (26) */ + /** @name SpRuntimeTokenError (28) */ interface SpRuntimeTokenError extends Enum { - readonly isNoFunds: boolean; - readonly isWouldDie: boolean; + readonly isFundsUnavailable: boolean; + readonly isOnlyProvider: boolean; readonly isBelowMinimum: boolean; readonly isCannotCreate: boolean; readonly isUnknownAsset: boolean; readonly isFrozen: boolean; readonly isUnsupported: boolean; - readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported'; + readonly isCannotCreateHold: boolean; + readonly isNotExpendable: boolean; + readonly isBlocked: boolean; + readonly type: 'FundsUnavailable' | 'OnlyProvider' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported' | 'CannotCreateHold' | 'NotExpendable' | 'Blocked'; } - /** @name SpArithmeticArithmeticError (27) */ + /** @name SpArithmeticArithmeticError (29) */ interface SpArithmeticArithmeticError extends Enum { readonly isUnderflow: boolean; readonly isOverflow: boolean; @@ -166,14 +181,33 @@ declare module '@polkadot/types/lookup' { readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero'; } - /** @name SpRuntimeTransactionalError (28) */ + /** @name SpRuntimeTransactionalError (30) */ interface SpRuntimeTransactionalError extends Enum { readonly isLimitReached: boolean; readonly isNoLayer: boolean; readonly type: 'LimitReached' | 'NoLayer'; } - /** @name PalletIndicesEvent (29) */ + /** @name SpRuntimeProvingTrieTrieError (31) */ + interface SpRuntimeProvingTrieTrieError extends Enum { + readonly isInvalidStateRoot: boolean; + readonly isIncompleteDatabase: boolean; + readonly isValueAtIncompleteKey: boolean; + readonly isDecoderError: boolean; + readonly isInvalidHash: boolean; + readonly isDuplicateKey: boolean; + readonly isExtraneousNode: boolean; + readonly isExtraneousValue: boolean; + readonly isExtraneousHashReference: boolean; + readonly isInvalidChildReference: boolean; + readonly isValueMismatch: boolean; + readonly isIncompleteProof: boolean; + readonly isRootMismatch: boolean; + readonly isDecodeError: boolean; + readonly type: 'InvalidStateRoot' | 'IncompleteDatabase' | 'ValueAtIncompleteKey' | 'DecoderError' | 'InvalidHash' | 'DuplicateKey' | 'ExtraneousNode' | 'ExtraneousValue' | 'ExtraneousHashReference' | 'InvalidChildReference' | 'ValueMismatch' | 'IncompleteProof' | 'RootMismatch' | 'DecodeError'; + } + + /** @name PalletIndicesEvent (32) */ interface PalletIndicesEvent extends Enum { readonly isIndexAssigned: boolean; readonly asIndexAssigned: { @@ -189,43 +223,150 @@ declare module '@polkadot/types/lookup' { readonly index: u32; readonly who: AccountId32; } & Struct; - readonly type: 'IndexAssigned' | 'IndexFreed' | 'IndexFrozen'; + readonly isDepositPoked: boolean; + readonly asDepositPoked: { + readonly who: AccountId32; + readonly index: u32; + readonly oldDeposit: u128; + readonly newDeposit: u128; + } & Struct; + readonly type: 'IndexAssigned' | 'IndexFreed' | 'IndexFrozen' | 'DepositPoked'; } - /** @name PolymeshCommonUtilitiesBalancesRawEvent (30) */ - interface PolymeshCommonUtilitiesBalancesRawEvent extends Enum { + /** @name PalletBalancesEvent (33) */ + interface PalletBalancesEvent extends Enum { readonly isEndowed: boolean; - readonly asEndowed: ITuple<[Option, AccountId32, u128]>; + readonly asEndowed: { + readonly account: AccountId32; + readonly freeBalance: u128; + } & Struct; + readonly isDustLost: boolean; + readonly asDustLost: { + readonly account: AccountId32; + readonly amount: u128; + } & Struct; readonly isTransfer: boolean; - readonly asTransfer: ITuple<[Option, AccountId32, Option, AccountId32, u128, Option]>; + readonly asTransfer: { + readonly from: AccountId32; + readonly to: AccountId32; + readonly amount: u128; + } & Struct; readonly isBalanceSet: boolean; - readonly asBalanceSet: ITuple<[PolymeshPrimitivesIdentityId, AccountId32, u128, u128]>; - readonly isAccountBalanceBurned: boolean; - readonly asAccountBalanceBurned: ITuple<[PolymeshPrimitivesIdentityId, AccountId32, u128]>; + readonly asBalanceSet: { + readonly who: AccountId32; + readonly free: u128; + } & Struct; readonly isReserved: boolean; - readonly asReserved: ITuple<[AccountId32, u128]>; + readonly asReserved: { + readonly who: AccountId32; + readonly amount: u128; + } & Struct; readonly isUnreserved: boolean; - readonly asUnreserved: ITuple<[AccountId32, u128]>; + readonly asUnreserved: { + readonly who: AccountId32; + readonly amount: u128; + } & Struct; readonly isReserveRepatriated: boolean; - readonly asReserveRepatriated: ITuple<[AccountId32, AccountId32, u128, FrameSupportTokensMiscBalanceStatus]>; - readonly type: 'Endowed' | 'Transfer' | 'BalanceSet' | 'AccountBalanceBurned' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated'; + readonly asReserveRepatriated: { + readonly from: AccountId32; + readonly to: AccountId32; + readonly amount: u128; + readonly destinationStatus: FrameSupportTokensMiscBalanceStatus; + } & Struct; + readonly isDeposit: boolean; + readonly asDeposit: { + readonly who: AccountId32; + readonly amount: u128; + } & Struct; + readonly isWithdraw: boolean; + readonly asWithdraw: { + readonly who: AccountId32; + readonly amount: u128; + } & Struct; + readonly isSlashed: boolean; + readonly asSlashed: { + readonly who: AccountId32; + readonly amount: u128; + } & Struct; + readonly isMinted: boolean; + readonly asMinted: { + readonly who: AccountId32; + readonly amount: u128; + } & Struct; + readonly isBurned: boolean; + readonly asBurned: { + readonly who: AccountId32; + readonly amount: u128; + } & Struct; + readonly isSuspended: boolean; + readonly asSuspended: { + readonly who: AccountId32; + readonly amount: u128; + } & Struct; + readonly isRestored: boolean; + readonly asRestored: { + readonly who: AccountId32; + readonly amount: u128; + } & Struct; + readonly isUpgraded: boolean; + readonly asUpgraded: { + readonly who: AccountId32; + } & Struct; + readonly isIssued: boolean; + readonly asIssued: { + readonly amount: u128; + } & Struct; + readonly isRescinded: boolean; + readonly asRescinded: { + readonly amount: u128; + } & Struct; + readonly isLocked: boolean; + readonly asLocked: { + readonly who: AccountId32; + readonly amount: u128; + } & Struct; + readonly isUnlocked: boolean; + readonly asUnlocked: { + readonly who: AccountId32; + readonly amount: u128; + } & Struct; + readonly isFrozen: boolean; + readonly asFrozen: { + readonly who: AccountId32; + readonly amount: u128; + } & Struct; + readonly isThawed: boolean; + readonly asThawed: { + readonly who: AccountId32; + readonly amount: u128; + } & Struct; + readonly isTotalIssuanceForced: boolean; + readonly asTotalIssuanceForced: { + readonly old: u128; + readonly new_: u128; + } & Struct; + readonly isTransferWithMemo: boolean; + readonly asTransferWithMemo: { + readonly from: AccountId32; + readonly to: AccountId32; + readonly amount: u128; + readonly memo: Option; + } & Struct; + readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'BalanceSet' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'Deposit' | 'Withdraw' | 'Slashed' | 'Minted' | 'Burned' | 'Suspended' | 'Restored' | 'Upgraded' | 'Issued' | 'Rescinded' | 'Locked' | 'Unlocked' | 'Frozen' | 'Thawed' | 'TotalIssuanceForced' | 'TransferWithMemo'; } - /** @name PolymeshPrimitivesIdentityId (32) */ - interface PolymeshPrimitivesIdentityId extends U8aFixed {} - - /** @name PolymeshPrimitivesMemo (34) */ - interface PolymeshPrimitivesMemo extends U8aFixed {} - - /** @name FrameSupportTokensMiscBalanceStatus (35) */ + /** @name FrameSupportTokensMiscBalanceStatus (34) */ interface FrameSupportTokensMiscBalanceStatus extends Enum { readonly isFree: boolean; readonly isReserved: boolean; readonly type: 'Free' | 'Reserved'; } - /** @name PalletTransactionPaymentRawEvent (36) */ - interface PalletTransactionPaymentRawEvent extends Enum { + /** @name PolymeshPrimitivesMemo (36) */ + interface PolymeshPrimitivesMemo extends U8aFixed {} + + /** @name PalletTransactionPaymentEvent (37) */ + interface PalletTransactionPaymentEvent extends Enum { readonly isTransactionFeePaid: boolean; readonly asTransactionFeePaid: { readonly who: AccountId32; @@ -235,8 +376,8 @@ declare module '@polkadot/types/lookup' { readonly type: 'TransactionFeePaid'; } - /** @name PolymeshCommonUtilitiesIdentityRawEvent (37) */ - interface PolymeshCommonUtilitiesIdentityRawEvent extends Enum { + /** @name PalletIdentityEvent (38) */ + interface PalletIdentityEvent extends Enum { readonly isDidCreated: boolean; readonly asDidCreated: ITuple<[PolymeshPrimitivesIdentityId, AccountId32, Vec]>; readonly isSecondaryKeysAdded: boolean; @@ -282,20 +423,23 @@ declare module '@polkadot/types/lookup' { readonly type: 'DidCreated' | 'SecondaryKeysAdded' | 'SecondaryKeysRemoved' | 'SecondaryKeyLeftIdentity' | 'SecondaryKeyPermissionsUpdated' | 'PrimaryKeyUpdated' | 'ClaimAdded' | 'ClaimRevoked' | 'AssetDidRegistered' | 'AuthorizationAdded' | 'AuthorizationRevoked' | 'AuthorizationRejected' | 'AuthorizationConsumed' | 'AuthorizationRetryLimitReached' | 'CddRequirementForPrimaryKeyUpdated' | 'CddClaimsInvalidated' | 'SecondaryKeysFrozen' | 'SecondaryKeysUnfrozen' | 'CustomClaimTypeAdded' | 'ChildDidCreated' | 'ChildDidUnlinked'; } - /** @name PolymeshPrimitivesSecondaryKey (39) */ + /** @name PolymeshPrimitivesIdentityId (39) */ + interface PolymeshPrimitivesIdentityId extends U8aFixed {} + + /** @name PolymeshPrimitivesSecondaryKey (41) */ interface PolymeshPrimitivesSecondaryKey extends Struct { readonly key: AccountId32; readonly permissions: PolymeshPrimitivesSecondaryKeyPermissions; } - /** @name PolymeshPrimitivesSecondaryKeyPermissions (40) */ + /** @name PolymeshPrimitivesSecondaryKeyPermissions (42) */ interface PolymeshPrimitivesSecondaryKeyPermissions extends Struct { readonly asset: PolymeshPrimitivesSubsetSubsetRestrictionAssetId; readonly extrinsic: PolymeshPrimitivesSecondaryKeyExtrinsicPermissions; readonly portfolio: PolymeshPrimitivesSubsetSubsetRestrictionPortfolioId; } - /** @name PolymeshPrimitivesSubsetSubsetRestrictionAssetId (41) */ + /** @name PolymeshPrimitivesSubsetSubsetRestrictionAssetId (43) */ interface PolymeshPrimitivesSubsetSubsetRestrictionAssetId extends Enum { readonly isWhole: boolean; readonly isThese: boolean; @@ -305,10 +449,10 @@ declare module '@polkadot/types/lookup' { readonly type: 'Whole' | 'These' | 'Except'; } - /** @name PolymeshPrimitivesAssetAssetId (42) */ + /** @name PolymeshPrimitivesAssetAssetId (44) */ interface PolymeshPrimitivesAssetAssetId extends U8aFixed {} - /** @name PolymeshPrimitivesSecondaryKeyExtrinsicPermissions (46) */ + /** @name PolymeshPrimitivesSecondaryKeyExtrinsicPermissions (48) */ interface PolymeshPrimitivesSecondaryKeyExtrinsicPermissions extends Enum { readonly isWhole: boolean; readonly isThese: boolean; @@ -318,12 +462,12 @@ declare module '@polkadot/types/lookup' { readonly type: 'Whole' | 'These' | 'Except'; } - /** @name PolymeshPrimitivesSecondaryKeyPalletPermissions (50) */ + /** @name PolymeshPrimitivesSecondaryKeyPalletPermissions (52) */ interface PolymeshPrimitivesSecondaryKeyPalletPermissions extends Struct { readonly extrinsics: PolymeshPrimitivesSubsetSubsetRestrictionExtrinsicName; } - /** @name PolymeshPrimitivesSubsetSubsetRestrictionExtrinsicName (51) */ + /** @name PolymeshPrimitivesSubsetSubsetRestrictionExtrinsicName (53) */ interface PolymeshPrimitivesSubsetSubsetRestrictionExtrinsicName extends Enum { readonly isWhole: boolean; readonly isThese: boolean; @@ -333,7 +477,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Whole' | 'These' | 'Except'; } - /** @name PolymeshPrimitivesSubsetSubsetRestrictionPortfolioId (57) */ + /** @name PolymeshPrimitivesSubsetSubsetRestrictionPortfolioId (59) */ interface PolymeshPrimitivesSubsetSubsetRestrictionPortfolioId extends Enum { readonly isWhole: boolean; readonly isThese: boolean; @@ -343,13 +487,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'Whole' | 'These' | 'Except'; } - /** @name PolymeshPrimitivesIdentityIdPortfolioId (58) */ + /** @name PolymeshPrimitivesIdentityIdPortfolioId (60) */ interface PolymeshPrimitivesIdentityIdPortfolioId extends Struct { readonly did: PolymeshPrimitivesIdentityId; readonly kind: PolymeshPrimitivesIdentityIdPortfolioKind; } - /** @name PolymeshPrimitivesIdentityIdPortfolioKind (59) */ + /** @name PolymeshPrimitivesIdentityIdPortfolioKind (61) */ interface PolymeshPrimitivesIdentityIdPortfolioKind extends Enum { readonly isDefault: boolean; readonly isUser: boolean; @@ -357,7 +501,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Default' | 'User'; } - /** @name PolymeshPrimitivesIdentityClaim (64) */ + /** @name PolymeshPrimitivesIdentityClaim (66) */ interface PolymeshPrimitivesIdentityClaim extends Struct { readonly claimIssuer: PolymeshPrimitivesIdentityId; readonly issuanceDate: u64; @@ -366,7 +510,7 @@ declare module '@polkadot/types/lookup' { readonly claim: PolymeshPrimitivesIdentityClaimClaim; } - /** @name PolymeshPrimitivesIdentityClaimClaim (66) */ + /** @name PolymeshPrimitivesIdentityClaimClaim (68) */ interface PolymeshPrimitivesIdentityClaimClaim extends Enum { readonly isAccredited: boolean; readonly asAccredited: PolymeshPrimitivesIdentityClaimScope; @@ -391,7 +535,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Accredited' | 'Affiliate' | 'BuyLockup' | 'SellLockup' | 'CustomerDueDiligence' | 'KnowYourCustomer' | 'Jurisdiction' | 'Exempted' | 'Blocked' | 'Custom'; } - /** @name PolymeshPrimitivesIdentityClaimScope (67) */ + /** @name PolymeshPrimitivesIdentityClaimScope (69) */ interface PolymeshPrimitivesIdentityClaimScope extends Enum { readonly isIdentity: boolean; readonly asIdentity: PolymeshPrimitivesIdentityId; @@ -402,10 +546,10 @@ declare module '@polkadot/types/lookup' { readonly type: 'Identity' | 'Asset' | 'Custom'; } - /** @name PolymeshPrimitivesCddId (68) */ + /** @name PolymeshPrimitivesCddId (70) */ interface PolymeshPrimitivesCddId extends U8aFixed {} - /** @name PolymeshPrimitivesJurisdictionCountryCode (69) */ + /** @name PolymeshPrimitivesJurisdictionCountryCode (71) */ interface PolymeshPrimitivesJurisdictionCountryCode extends Enum { readonly isAf: boolean; readonly isAx: boolean; @@ -660,10 +804,10 @@ declare module '@polkadot/types/lookup' { readonly type: 'Af' | 'Ax' | 'Al' | 'Dz' | 'As' | 'Ad' | 'Ao' | 'Ai' | 'Aq' | 'Ag' | 'Ar' | 'Am' | 'Aw' | 'Au' | 'At' | 'Az' | 'Bs' | 'Bh' | 'Bd' | 'Bb' | 'By' | 'Be' | 'Bz' | 'Bj' | 'Bm' | 'Bt' | 'Bo' | 'Ba' | 'Bw' | 'Bv' | 'Br' | 'Vg' | 'Io' | 'Bn' | 'Bg' | 'Bf' | 'Bi' | 'Kh' | 'Cm' | 'Ca' | 'Cv' | 'Ky' | 'Cf' | 'Td' | 'Cl' | 'Cn' | 'Hk' | 'Mo' | 'Cx' | 'Cc' | 'Co' | 'Km' | 'Cg' | 'Cd' | 'Ck' | 'Cr' | 'Ci' | 'Hr' | 'Cu' | 'Cy' | 'Cz' | 'Dk' | 'Dj' | 'Dm' | 'Do' | 'Ec' | 'Eg' | 'Sv' | 'Gq' | 'Er' | 'Ee' | 'Et' | 'Fk' | 'Fo' | 'Fj' | 'Fi' | 'Fr' | 'Gf' | 'Pf' | 'Tf' | 'Ga' | 'Gm' | 'Ge' | 'De' | 'Gh' | 'Gi' | 'Gr' | 'Gl' | 'Gd' | 'Gp' | 'Gu' | 'Gt' | 'Gg' | 'Gn' | 'Gw' | 'Gy' | 'Ht' | 'Hm' | 'Va' | 'Hn' | 'Hu' | 'Is' | 'In' | 'Id' | 'Ir' | 'Iq' | 'Ie' | 'Im' | 'Il' | 'It' | 'Jm' | 'Jp' | 'Je' | 'Jo' | 'Kz' | 'Ke' | 'Ki' | 'Kp' | 'Kr' | 'Kw' | 'Kg' | 'La' | 'Lv' | 'Lb' | 'Ls' | 'Lr' | 'Ly' | 'Li' | 'Lt' | 'Lu' | 'Mk' | 'Mg' | 'Mw' | 'My' | 'Mv' | 'Ml' | 'Mt' | 'Mh' | 'Mq' | 'Mr' | 'Mu' | 'Yt' | 'Mx' | 'Fm' | 'Md' | 'Mc' | 'Mn' | 'Me' | 'Ms' | 'Ma' | 'Mz' | 'Mm' | 'Na' | 'Nr' | 'Np' | 'Nl' | 'An' | 'Nc' | 'Nz' | 'Ni' | 'Ne' | 'Ng' | 'Nu' | 'Nf' | 'Mp' | 'No' | 'Om' | 'Pk' | 'Pw' | 'Ps' | 'Pa' | 'Pg' | 'Py' | 'Pe' | 'Ph' | 'Pn' | 'Pl' | 'Pt' | 'Pr' | 'Qa' | 'Re' | 'Ro' | 'Ru' | 'Rw' | 'Bl' | 'Sh' | 'Kn' | 'Lc' | 'Mf' | 'Pm' | 'Vc' | 'Ws' | 'Sm' | 'St' | 'Sa' | 'Sn' | 'Rs' | 'Sc' | 'Sl' | 'Sg' | 'Sk' | 'Si' | 'Sb' | 'So' | 'Za' | 'Gs' | 'Ss' | 'Es' | 'Lk' | 'Sd' | 'Sr' | 'Sj' | 'Sz' | 'Se' | 'Ch' | 'Sy' | 'Tw' | 'Tj' | 'Tz' | 'Th' | 'Tl' | 'Tg' | 'Tk' | 'To' | 'Tt' | 'Tn' | 'Tr' | 'Tm' | 'Tc' | 'Tv' | 'Ug' | 'Ua' | 'Ae' | 'Gb' | 'Us' | 'Um' | 'Uy' | 'Uz' | 'Vu' | 'Ve' | 'Vn' | 'Vi' | 'Wf' | 'Eh' | 'Ye' | 'Zm' | 'Zw' | 'Bq' | 'Cw' | 'Sx'; } - /** @name PolymeshPrimitivesTicker (72) */ + /** @name PolymeshPrimitivesTicker (74) */ interface PolymeshPrimitivesTicker extends U8aFixed {} - /** @name PolymeshPrimitivesAuthorizationAuthorizationData (75) */ + /** @name PolymeshPrimitivesAuthorizationAuthorizationData (78) */ interface PolymeshPrimitivesAuthorizationAuthorizationData extends Enum { readonly isAttestPrimaryKeyRotation: boolean; readonly asAttestPrimaryKeyRotation: PolymeshPrimitivesIdentityId; @@ -687,7 +831,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'AttestPrimaryKeyRotation' | 'RotatePrimaryKey' | 'TransferTicker' | 'AddMultiSigSigner' | 'TransferAssetOwnership' | 'JoinIdentity' | 'PortfolioCustody' | 'BecomeAgent' | 'AddRelayerPayingKey' | 'RotatePrimaryKeyToSecondary'; } - /** @name PolymeshPrimitivesAgentAgentGroup (76) */ + /** @name PolymeshPrimitivesAgentAgentGroup (79) */ interface PolymeshPrimitivesAgentAgentGroup extends Enum { readonly isFull: boolean; readonly isCustom: boolean; @@ -698,8 +842,8 @@ declare module '@polkadot/types/lookup' { readonly type: 'Full' | 'Custom' | 'ExceptMeta' | 'PolymeshV1CAA' | 'PolymeshV1PIA'; } - /** @name PolymeshCommonUtilitiesGroupRawEventInstance2 (79) */ - interface PolymeshCommonUtilitiesGroupRawEventInstance2 extends Enum { + /** @name PalletGroupEvent (81) */ + interface PalletGroupEvent extends Enum { readonly isMemberAdded: boolean; readonly asMemberAdded: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; readonly isMemberRemoved: boolean; @@ -716,11 +860,8 @@ declare module '@polkadot/types/lookup' { readonly type: 'MemberAdded' | 'MemberRemoved' | 'MemberRevoked' | 'MembersSwapped' | 'MembersReset' | 'ActiveLimitChanged' | 'Dummy'; } - /** @name PalletGroupInstance2 (80) */ - type PalletGroupInstance2 = Null; - - /** @name PalletCommitteeRawEventInstance1 (82) */ - interface PalletCommitteeRawEventInstance1 extends Enum { + /** @name PalletCommitteeEvent (83) */ + interface PalletCommitteeEvent extends Enum { readonly isProposed: boolean; readonly asProposed: ITuple<[PolymeshPrimitivesIdentityId, u32, H256]>; readonly isVoted: boolean; @@ -738,143 +879,21 @@ declare module '@polkadot/types/lookup' { readonly isReleaseCoordinatorUpdated: boolean; readonly asReleaseCoordinatorUpdated: Option; readonly isExpiresAfterUpdated: boolean; - readonly asExpiresAfterUpdated: ITuple<[PolymeshPrimitivesIdentityId, PolymeshCommonUtilitiesMaybeBlock]>; + readonly asExpiresAfterUpdated: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesMaybeBlock]>; readonly isVoteThresholdUpdated: boolean; readonly asVoteThresholdUpdated: ITuple<[PolymeshPrimitivesIdentityId, u32, u32]>; readonly type: 'Proposed' | 'Voted' | 'VoteRetracted' | 'FinalVotes' | 'Approved' | 'Rejected' | 'Executed' | 'ReleaseCoordinatorUpdated' | 'ExpiresAfterUpdated' | 'VoteThresholdUpdated'; } - /** @name PalletCommitteeInstance1 (83) */ - type PalletCommitteeInstance1 = Null; - - /** @name PolymeshCommonUtilitiesMaybeBlock (86) */ - interface PolymeshCommonUtilitiesMaybeBlock extends Enum { + /** @name PolymeshPrimitivesMaybeBlock (86) */ + interface PolymeshPrimitivesMaybeBlock extends Enum { readonly isSome: boolean; readonly asSome: u32; readonly isNone: boolean; readonly type: 'Some' | 'None'; } - /** @name PolymeshCommonUtilitiesGroupRawEventInstance1 (87) */ - interface PolymeshCommonUtilitiesGroupRawEventInstance1 extends Enum { - readonly isMemberAdded: boolean; - readonly asMemberAdded: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; - readonly isMemberRemoved: boolean; - readonly asMemberRemoved: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; - readonly isMemberRevoked: boolean; - readonly asMemberRevoked: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; - readonly isMembersSwapped: boolean; - readonly asMembersSwapped: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; - readonly isMembersReset: boolean; - readonly asMembersReset: ITuple<[PolymeshPrimitivesIdentityId, Vec]>; - readonly isActiveLimitChanged: boolean; - readonly asActiveLimitChanged: ITuple<[PolymeshPrimitivesIdentityId, u32, u32]>; - readonly isDummy: boolean; - readonly type: 'MemberAdded' | 'MemberRemoved' | 'MemberRevoked' | 'MembersSwapped' | 'MembersReset' | 'ActiveLimitChanged' | 'Dummy'; - } - - /** @name PalletGroupInstance1 (88) */ - type PalletGroupInstance1 = Null; - - /** @name PalletCommitteeRawEventInstance3 (89) */ - interface PalletCommitteeRawEventInstance3 extends Enum { - readonly isProposed: boolean; - readonly asProposed: ITuple<[PolymeshPrimitivesIdentityId, u32, H256]>; - readonly isVoted: boolean; - readonly asVoted: ITuple<[PolymeshPrimitivesIdentityId, u32, H256, bool, u32, u32, u32]>; - readonly isVoteRetracted: boolean; - readonly asVoteRetracted: ITuple<[PolymeshPrimitivesIdentityId, u32, H256, bool]>; - readonly isFinalVotes: boolean; - readonly asFinalVotes: ITuple<[Option, u32, H256, Vec, Vec]>; - readonly isApproved: boolean; - readonly asApproved: ITuple<[Option, H256, u32, u32, u32]>; - readonly isRejected: boolean; - readonly asRejected: ITuple<[Option, H256, u32, u32, u32]>; - readonly isExecuted: boolean; - readonly asExecuted: ITuple<[Option, H256, Result]>; - readonly isReleaseCoordinatorUpdated: boolean; - readonly asReleaseCoordinatorUpdated: Option; - readonly isExpiresAfterUpdated: boolean; - readonly asExpiresAfterUpdated: ITuple<[PolymeshPrimitivesIdentityId, PolymeshCommonUtilitiesMaybeBlock]>; - readonly isVoteThresholdUpdated: boolean; - readonly asVoteThresholdUpdated: ITuple<[PolymeshPrimitivesIdentityId, u32, u32]>; - readonly type: 'Proposed' | 'Voted' | 'VoteRetracted' | 'FinalVotes' | 'Approved' | 'Rejected' | 'Executed' | 'ReleaseCoordinatorUpdated' | 'ExpiresAfterUpdated' | 'VoteThresholdUpdated'; - } - - /** @name PalletCommitteeInstance3 (90) */ - type PalletCommitteeInstance3 = Null; - - /** @name PolymeshCommonUtilitiesGroupRawEventInstance3 (91) */ - interface PolymeshCommonUtilitiesGroupRawEventInstance3 extends Enum { - readonly isMemberAdded: boolean; - readonly asMemberAdded: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; - readonly isMemberRemoved: boolean; - readonly asMemberRemoved: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; - readonly isMemberRevoked: boolean; - readonly asMemberRevoked: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; - readonly isMembersSwapped: boolean; - readonly asMembersSwapped: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; - readonly isMembersReset: boolean; - readonly asMembersReset: ITuple<[PolymeshPrimitivesIdentityId, Vec]>; - readonly isActiveLimitChanged: boolean; - readonly asActiveLimitChanged: ITuple<[PolymeshPrimitivesIdentityId, u32, u32]>; - readonly isDummy: boolean; - readonly type: 'MemberAdded' | 'MemberRemoved' | 'MemberRevoked' | 'MembersSwapped' | 'MembersReset' | 'ActiveLimitChanged' | 'Dummy'; - } - - /** @name PalletGroupInstance3 (92) */ - type PalletGroupInstance3 = Null; - - /** @name PalletCommitteeRawEventInstance4 (93) */ - interface PalletCommitteeRawEventInstance4 extends Enum { - readonly isProposed: boolean; - readonly asProposed: ITuple<[PolymeshPrimitivesIdentityId, u32, H256]>; - readonly isVoted: boolean; - readonly asVoted: ITuple<[PolymeshPrimitivesIdentityId, u32, H256, bool, u32, u32, u32]>; - readonly isVoteRetracted: boolean; - readonly asVoteRetracted: ITuple<[PolymeshPrimitivesIdentityId, u32, H256, bool]>; - readonly isFinalVotes: boolean; - readonly asFinalVotes: ITuple<[Option, u32, H256, Vec, Vec]>; - readonly isApproved: boolean; - readonly asApproved: ITuple<[Option, H256, u32, u32, u32]>; - readonly isRejected: boolean; - readonly asRejected: ITuple<[Option, H256, u32, u32, u32]>; - readonly isExecuted: boolean; - readonly asExecuted: ITuple<[Option, H256, Result]>; - readonly isReleaseCoordinatorUpdated: boolean; - readonly asReleaseCoordinatorUpdated: Option; - readonly isExpiresAfterUpdated: boolean; - readonly asExpiresAfterUpdated: ITuple<[PolymeshPrimitivesIdentityId, PolymeshCommonUtilitiesMaybeBlock]>; - readonly isVoteThresholdUpdated: boolean; - readonly asVoteThresholdUpdated: ITuple<[PolymeshPrimitivesIdentityId, u32, u32]>; - readonly type: 'Proposed' | 'Voted' | 'VoteRetracted' | 'FinalVotes' | 'Approved' | 'Rejected' | 'Executed' | 'ReleaseCoordinatorUpdated' | 'ExpiresAfterUpdated' | 'VoteThresholdUpdated'; - } - - /** @name PalletCommitteeInstance4 (94) */ - type PalletCommitteeInstance4 = Null; - - /** @name PolymeshCommonUtilitiesGroupRawEventInstance4 (95) */ - interface PolymeshCommonUtilitiesGroupRawEventInstance4 extends Enum { - readonly isMemberAdded: boolean; - readonly asMemberAdded: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; - readonly isMemberRemoved: boolean; - readonly asMemberRemoved: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; - readonly isMemberRevoked: boolean; - readonly asMemberRevoked: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; - readonly isMembersSwapped: boolean; - readonly asMembersSwapped: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; - readonly isMembersReset: boolean; - readonly asMembersReset: ITuple<[PolymeshPrimitivesIdentityId, Vec]>; - readonly isActiveLimitChanged: boolean; - readonly asActiveLimitChanged: ITuple<[PolymeshPrimitivesIdentityId, u32, u32]>; - readonly isDummy: boolean; - readonly type: 'MemberAdded' | 'MemberRemoved' | 'MemberRevoked' | 'MembersSwapped' | 'MembersReset' | 'ActiveLimitChanged' | 'Dummy'; - } - - /** @name PalletGroupInstance4 (96) */ - type PalletGroupInstance4 = Null; - - /** @name PalletMultisigEvent (97) */ + /** @name PalletMultisigEvent (92) */ interface PalletMultisigEvent extends Enum { readonly isMultiSigCreated: boolean; readonly asMultiSigCreated: { @@ -968,7 +987,58 @@ declare module '@polkadot/types/lookup' { readonly type: 'MultiSigCreated' | 'ProposalAdded' | 'ProposalExecuted' | 'MultiSigSignerAdded' | 'MultiSigSignersAuthorized' | 'MultiSigSignersRemoved' | 'MultiSigSignersRequiredChanged' | 'ProposalApprovalVote' | 'ProposalRejectionVote' | 'ProposalApproved' | 'ProposalRejected' | 'MultiSigAddedAdmin' | 'MultiSigRemovedAdmin' | 'MultiSigRemovedPayingDid'; } - /** @name PalletStakingPalletEvent (99) */ + /** @name PalletValidatorsEvent (94) */ + interface PalletValidatorsEvent extends Enum { + readonly isNominated: boolean; + readonly asNominated: { + readonly nominatorIdentity: PolymeshPrimitivesIdentityId; + readonly stash: AccountId32; + readonly targets: Vec; + } & Struct; + readonly isPermissionedIdentityAdded: boolean; + readonly asPermissionedIdentityAdded: { + readonly governanceCouncillDid: PolymeshPrimitivesIdentityId; + readonly validatorsIdentity: PolymeshPrimitivesIdentityId; + } & Struct; + readonly isPermissionedIdentityRemoved: boolean; + readonly asPermissionedIdentityRemoved: { + readonly governanceCouncillDid: PolymeshPrimitivesIdentityId; + readonly validatorsIdentity: PolymeshPrimitivesIdentityId; + } & Struct; + readonly isInvalidatedNominators: boolean; + readonly asInvalidatedNominators: { + readonly governanceCouncillDid: PolymeshPrimitivesIdentityId; + readonly governanceCouncillAccount: PolymeshPrimitivesIdentityId; + readonly expiredNominators: Vec; + } & Struct; + readonly isSlashingAllowedForChanged: boolean; + readonly asSlashingAllowedForChanged: { + readonly slashingSwitch: PalletValidatorsSlashingSwitch; + } & Struct; + readonly isRewardPaymentSchedulingInterrupted: boolean; + readonly asRewardPaymentSchedulingInterrupted: { + readonly accountId: AccountId32; + readonly era: u32; + readonly error: SpRuntimeDispatchError; + } & Struct; + readonly isCommissionCapUpdated: boolean; + readonly asCommissionCapUpdated: { + readonly governanceCouncillDid: PolymeshPrimitivesIdentityId; + readonly oldCommissionCap: Perbill; + readonly newCommissionCap: Perbill; + } & Struct; + readonly type: 'Nominated' | 'PermissionedIdentityAdded' | 'PermissionedIdentityRemoved' | 'InvalidatedNominators' | 'SlashingAllowedForChanged' | 'RewardPaymentSchedulingInterrupted' | 'CommissionCapUpdated'; + } + + /** @name PalletValidatorsSlashingSwitch (95) */ + interface PalletValidatorsSlashingSwitch extends Enum { + readonly isValidator: boolean; + readonly isValidatorAndNominator: boolean; + readonly isNone: boolean; + readonly type: 'Validator' | 'ValidatorAndNominator' | 'None'; + } + + /** @name PalletStakingPalletEvent (97) */ interface PalletStakingPalletEvent extends Enum { readonly isEraPaid: boolean; readonly asEraPaid: { @@ -978,8 +1048,8 @@ declare module '@polkadot/types/lookup' { } & Struct; readonly isRewarded: boolean; readonly asRewarded: { - readonly identity: PolymeshPrimitivesIdentityId; readonly stash: AccountId32; + readonly dest: PalletStakingRewardDestination; readonly amount: u128; } & Struct; readonly isSlashed: boolean; @@ -1000,13 +1070,11 @@ declare module '@polkadot/types/lookup' { readonly isStakersElected: boolean; readonly isBonded: boolean; readonly asBonded: { - readonly identity: PolymeshPrimitivesIdentityId; readonly stash: AccountId32; readonly amount: u128; } & Struct; readonly isUnbonded: boolean; readonly asUnbonded: { - readonly identity: PolymeshPrimitivesIdentityId; readonly stash: AccountId32; readonly amount: u128; } & Struct; @@ -1029,64 +1097,56 @@ declare module '@polkadot/types/lookup' { readonly asPayoutStarted: { readonly eraIndex: u32; readonly validatorStash: AccountId32; + readonly page: u32; + readonly next: Option; } & Struct; readonly isValidatorPrefsSet: boolean; readonly asValidatorPrefsSet: { readonly stash: AccountId32; readonly prefs: PalletStakingValidatorPrefs; } & Struct; + readonly isSnapshotVotersSizeExceeded: boolean; + readonly asSnapshotVotersSizeExceeded: { + readonly size_: u32; + } & Struct; + readonly isSnapshotTargetsSizeExceeded: boolean; + readonly asSnapshotTargetsSizeExceeded: { + readonly size_: u32; + } & Struct; readonly isForceEra: boolean; readonly asForceEra: { readonly mode: PalletStakingForcing; } & Struct; - readonly isNominated: boolean; - readonly asNominated: { - readonly nominatorIdentity: PolymeshPrimitivesIdentityId; - readonly stash: AccountId32; - readonly targets: Vec; + readonly isControllerBatchDeprecated: boolean; + readonly asControllerBatchDeprecated: { + readonly failures: u32; } & Struct; - readonly isPermissionedIdentityAdded: boolean; - readonly asPermissionedIdentityAdded: { - readonly governanceCouncillDid: PolymeshPrimitivesIdentityId; - readonly validatorsIdentity: PolymeshPrimitivesIdentityId; - } & Struct; - readonly isPermissionedIdentityRemoved: boolean; - readonly asPermissionedIdentityRemoved: { - readonly governanceCouncillDid: PolymeshPrimitivesIdentityId; - readonly validatorsIdentity: PolymeshPrimitivesIdentityId; - } & Struct; - readonly isInvalidatedNominators: boolean; - readonly asInvalidatedNominators: { - readonly governanceCouncillDid: PolymeshPrimitivesIdentityId; - readonly governanceCouncillAccount: PolymeshPrimitivesIdentityId; - readonly expiredNominators: Vec; - } & Struct; - readonly isSlashingAllowedForChanged: boolean; - readonly asSlashingAllowedForChanged: { - readonly slashingSwitch: PalletStakingSlashingSwitch; - } & Struct; - readonly isRewardPaymentSchedulingInterrupted: boolean; - readonly asRewardPaymentSchedulingInterrupted: { - readonly accountId: AccountId32; - readonly era: u32; - readonly error: SpRuntimeDispatchError; - } & Struct; - readonly isCommissionCapUpdated: boolean; - readonly asCommissionCapUpdated: { - readonly governanceCouncillDid: PolymeshPrimitivesIdentityId; - readonly oldCommissionCap: Perbill; - readonly newCommissionCap: Perbill; + readonly isCurrencyMigrated: boolean; + readonly asCurrencyMigrated: { + readonly stash: AccountId32; + readonly forceWithdraw: u128; } & Struct; - readonly type: 'EraPaid' | 'Rewarded' | 'Slashed' | 'SlashReported' | 'OldSlashingReportDiscarded' | 'StakersElected' | 'Bonded' | 'Unbonded' | 'Withdrawn' | 'Kicked' | 'StakingElectionFailed' | 'Chilled' | 'PayoutStarted' | 'ValidatorPrefsSet' | 'ForceEra' | 'Nominated' | 'PermissionedIdentityAdded' | 'PermissionedIdentityRemoved' | 'InvalidatedNominators' | 'SlashingAllowedForChanged' | 'RewardPaymentSchedulingInterrupted' | 'CommissionCapUpdated'; + readonly type: 'EraPaid' | 'Rewarded' | 'Slashed' | 'SlashReported' | 'OldSlashingReportDiscarded' | 'StakersElected' | 'Bonded' | 'Unbonded' | 'Withdrawn' | 'Kicked' | 'StakingElectionFailed' | 'Chilled' | 'PayoutStarted' | 'ValidatorPrefsSet' | 'SnapshotVotersSizeExceeded' | 'SnapshotTargetsSizeExceeded' | 'ForceEra' | 'ControllerBatchDeprecated' | 'CurrencyMigrated'; + } + + /** @name PalletStakingRewardDestination (98) */ + interface PalletStakingRewardDestination extends Enum { + readonly isStaked: boolean; + readonly isStash: boolean; + readonly isController: boolean; + readonly isAccount: boolean; + readonly asAccount: AccountId32; + readonly isNone: boolean; + readonly type: 'Staked' | 'Stash' | 'Controller' | 'Account' | 'None'; } - /** @name PalletStakingValidatorPrefs (101) */ + /** @name PalletStakingValidatorPrefs (100) */ interface PalletStakingValidatorPrefs extends Struct { readonly commission: Compact; readonly blocked: bool; } - /** @name PalletStakingForcing (103) */ + /** @name PalletStakingForcing (102) */ interface PalletStakingForcing extends Enum { readonly isNotForcing: boolean; readonly isForceNew: boolean; @@ -1095,15 +1155,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'NotForcing' | 'ForceNew' | 'ForceNone' | 'ForceAlways'; } - /** @name PalletStakingSlashingSwitch (104) */ - interface PalletStakingSlashingSwitch extends Enum { - readonly isValidator: boolean; - readonly isValidatorAndNominator: boolean; - readonly isNone: boolean; - readonly type: 'Validator' | 'ValidatorAndNominator' | 'None'; - } - - /** @name PalletOffencesEvent (105) */ + /** @name PalletOffencesEvent (103) */ interface PalletOffencesEvent extends Enum { readonly isOffence: boolean; readonly asOffence: { @@ -1113,16 +1165,24 @@ declare module '@polkadot/types/lookup' { readonly type: 'Offence'; } - /** @name PalletSessionEvent (106) */ + /** @name PalletSessionEvent (104) */ interface PalletSessionEvent extends Enum { readonly isNewSession: boolean; readonly asNewSession: { readonly sessionIndex: u32; } & Struct; - readonly type: 'NewSession'; + readonly isValidatorDisabled: boolean; + readonly asValidatorDisabled: { + readonly validator: AccountId32; + } & Struct; + readonly isValidatorReenabled: boolean; + readonly asValidatorReenabled: { + readonly validator: AccountId32; + } & Struct; + readonly type: 'NewSession' | 'ValidatorDisabled' | 'ValidatorReenabled'; } - /** @name PalletGrandpaEvent (107) */ + /** @name PalletGrandpaEvent (105) */ interface PalletGrandpaEvent extends Enum { readonly isNewAuthorities: boolean; readonly asNewAuthorities: { @@ -1133,13 +1193,10 @@ declare module '@polkadot/types/lookup' { readonly type: 'NewAuthorities' | 'Paused' | 'Resumed'; } - /** @name SpConsensusGrandpaAppPublic (110) */ - interface SpConsensusGrandpaAppPublic extends SpCoreEd25519Public {} + /** @name SpConsensusGrandpaAppPublic (108) */ + interface SpConsensusGrandpaAppPublic extends U8aFixed {} - /** @name SpCoreEd25519Public (111) */ - interface SpCoreEd25519Public extends U8aFixed {} - - /** @name PalletImOnlineEvent (112) */ + /** @name PalletImOnlineEvent (109) */ interface PalletImOnlineEvent extends Enum { readonly isHeartbeatReceived: boolean; readonly asHeartbeatReceived: { @@ -1148,43 +1205,46 @@ declare module '@polkadot/types/lookup' { readonly isAllGood: boolean; readonly isSomeOffline: boolean; readonly asSomeOffline: { - readonly offline: Vec>; + readonly offline: Vec>; } & Struct; readonly type: 'HeartbeatReceived' | 'AllGood' | 'SomeOffline'; } - /** @name PalletImOnlineSr25519AppSr25519Public (113) */ - interface PalletImOnlineSr25519AppSr25519Public extends SpCoreSr25519Public {} - - /** @name SpCoreSr25519Public (114) */ - interface SpCoreSr25519Public extends U8aFixed {} + /** @name PalletImOnlineSr25519AppSr25519Public (110) */ + interface PalletImOnlineSr25519AppSr25519Public extends U8aFixed {} - /** @name PalletStakingExposure (117) */ - interface PalletStakingExposure extends Struct { + /** @name SpStakingExposure (113) */ + interface SpStakingExposure extends Struct { readonly total: Compact; readonly own: Compact; - readonly others: Vec; + readonly others: Vec; } - /** @name PalletStakingIndividualExposure (120) */ - interface PalletStakingIndividualExposure extends Struct { + /** @name SpStakingIndividualExposure (116) */ + interface SpStakingIndividualExposure extends Struct { readonly who: AccountId32; readonly value: Compact; } - /** @name PalletSudoRawEvent (121) */ - interface PalletSudoRawEvent extends Enum { + /** @name PalletSudoEvent (117) */ + interface PalletSudoEvent extends Enum { readonly isSudid: boolean; - readonly asSudid: Result; + readonly asSudid: { + readonly sudoResult: Result; + } & Struct; readonly isKeyChanged: boolean; - readonly asKeyChanged: Option; + readonly asKeyChanged: { + readonly oldSudoer: Option; + } & Struct; readonly isSudoAsDone: boolean; - readonly asSudoAsDone: Result; + readonly asSudoAsDone: { + readonly sudoResult: Result; + } & Struct; readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone'; } - /** @name PolymeshCommonUtilitiesAssetRawEvent (122) */ - interface PolymeshCommonUtilitiesAssetRawEvent extends Enum { + /** @name PalletAssetEvent (118) */ + interface PalletAssetEvent extends Enum { readonly isAssetCreated: boolean; readonly asAssetCreated: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesAssetAssetId, bool, PolymeshPrimitivesAssetAssetType, PolymeshPrimitivesIdentityId, Bytes, Vec, Option]>; readonly isIdentifiersUpdated: boolean; @@ -1245,10 +1305,14 @@ declare module '@polkadot/types/lookup' { readonly asAssetMediatorsRemoved: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesAssetAssetId, BTreeSet]>; readonly isTickerLinkedToAsset: boolean; readonly asTickerLinkedToAsset: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesTicker, PolymeshPrimitivesAssetAssetId]>; - readonly type: 'AssetCreated' | 'IdentifiersUpdated' | 'DivisibilityChanged' | 'TickerRegistered' | 'TickerTransferred' | 'AssetOwnershipTransferred' | 'AssetFrozen' | 'AssetUnfrozen' | 'AssetRenamed' | 'FundingRoundSet' | 'DocumentAdded' | 'DocumentRemoved' | 'ControllerTransfer' | 'CustomAssetTypeExists' | 'CustomAssetTypeRegistered' | 'SetAssetMetadataValue' | 'SetAssetMetadataValueDetails' | 'RegisterAssetMetadataLocalType' | 'RegisterAssetMetadataGlobalType' | 'AssetTypeChanged' | 'LocalMetadataKeyDeleted' | 'MetadataValueDeleted' | 'AssetBalanceUpdated' | 'AssetAffirmationExemption' | 'RemoveAssetAffirmationExemption' | 'PreApprovedAsset' | 'RemovePreApprovedAsset' | 'AssetMediatorsAdded' | 'AssetMediatorsRemoved' | 'TickerLinkedToAsset'; + readonly isTickerUnlinkedFromAsset: boolean; + readonly asTickerUnlinkedFromAsset: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesTicker, PolymeshPrimitivesAssetAssetId]>; + readonly isGlobalMetadataSpecUpdated: boolean; + readonly asGlobalMetadataSpecUpdated: ITuple<[Bytes, PolymeshPrimitivesAssetMetadataAssetMetadataSpec]>; + readonly type: 'AssetCreated' | 'IdentifiersUpdated' | 'DivisibilityChanged' | 'TickerRegistered' | 'TickerTransferred' | 'AssetOwnershipTransferred' | 'AssetFrozen' | 'AssetUnfrozen' | 'AssetRenamed' | 'FundingRoundSet' | 'DocumentAdded' | 'DocumentRemoved' | 'ControllerTransfer' | 'CustomAssetTypeExists' | 'CustomAssetTypeRegistered' | 'SetAssetMetadataValue' | 'SetAssetMetadataValueDetails' | 'RegisterAssetMetadataLocalType' | 'RegisterAssetMetadataGlobalType' | 'AssetTypeChanged' | 'LocalMetadataKeyDeleted' | 'MetadataValueDeleted' | 'AssetBalanceUpdated' | 'AssetAffirmationExemption' | 'RemoveAssetAffirmationExemption' | 'PreApprovedAsset' | 'RemovePreApprovedAsset' | 'AssetMediatorsAdded' | 'AssetMediatorsRemoved' | 'TickerLinkedToAsset' | 'TickerUnlinkedFromAsset' | 'GlobalMetadataSpecUpdated'; } - /** @name PolymeshPrimitivesAssetAssetType (123) */ + /** @name PolymeshPrimitivesAssetAssetType (119) */ interface PolymeshPrimitivesAssetAssetType extends Enum { readonly isEquityCommon: boolean; readonly isEquityPreferred: boolean; @@ -1267,7 +1331,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'EquityCommon' | 'EquityPreferred' | 'Commodity' | 'FixedIncome' | 'Reit' | 'Fund' | 'RevenueShareAgreement' | 'StructuredProduct' | 'Derivative' | 'Custom' | 'StableCoin' | 'NonFungible'; } - /** @name PolymeshPrimitivesAssetNonFungibleType (125) */ + /** @name PolymeshPrimitivesAssetNonFungibleType (121) */ interface PolymeshPrimitivesAssetNonFungibleType extends Enum { readonly isDerivative: boolean; readonly isFixedIncome: boolean; @@ -1277,7 +1341,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Derivative' | 'FixedIncome' | 'Invoice' | 'Custom'; } - /** @name PolymeshPrimitivesAssetIdentifier (128) */ + /** @name PolymeshPrimitivesAssetIdentifier (124) */ interface PolymeshPrimitivesAssetIdentifier extends Enum { readonly isCusip: boolean; readonly asCusip: U8aFixed; @@ -1292,7 +1356,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Cusip' | 'Cins' | 'Isin' | 'Lei' | 'Figi'; } - /** @name PolymeshPrimitivesDocument (134) */ + /** @name PolymeshPrimitivesDocument (130) */ interface PolymeshPrimitivesDocument extends Struct { readonly uri: Bytes; readonly contentHash: PolymeshPrimitivesDocumentHash; @@ -1301,7 +1365,7 @@ declare module '@polkadot/types/lookup' { readonly filingDate: Option; } - /** @name PolymeshPrimitivesDocumentHash (136) */ + /** @name PolymeshPrimitivesDocumentHash (132) */ interface PolymeshPrimitivesDocumentHash extends Enum { readonly isNone: boolean; readonly isH512: boolean; @@ -1323,13 +1387,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'None' | 'H512' | 'H384' | 'H320' | 'H256' | 'H224' | 'H192' | 'H160' | 'H128'; } - /** @name PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail (147) */ + /** @name PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail (143) */ interface PolymeshPrimitivesAssetMetadataAssetMetadataValueDetail extends Struct { readonly expire: Option; readonly lockStatus: PolymeshPrimitivesAssetMetadataAssetMetadataLockStatus; } - /** @name PolymeshPrimitivesAssetMetadataAssetMetadataLockStatus (148) */ + /** @name PolymeshPrimitivesAssetMetadataAssetMetadataLockStatus (144) */ interface PolymeshPrimitivesAssetMetadataAssetMetadataLockStatus extends Enum { readonly isUnlocked: boolean; readonly isLocked: boolean; @@ -1338,14 +1402,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'Unlocked' | 'Locked' | 'LockedUntil'; } - /** @name PolymeshPrimitivesAssetMetadataAssetMetadataSpec (151) */ + /** @name PolymeshPrimitivesAssetMetadataAssetMetadataSpec (147) */ interface PolymeshPrimitivesAssetMetadataAssetMetadataSpec extends Struct { readonly url: Option; readonly description: Option; readonly typeDef: Option; } - /** @name PolymeshPrimitivesAssetMetadataAssetMetadataKey (158) */ + /** @name PolymeshPrimitivesAssetMetadataAssetMetadataKey (154) */ interface PolymeshPrimitivesAssetMetadataAssetMetadataKey extends Enum { readonly isGlobal: boolean; readonly asGlobal: u64; @@ -1354,7 +1418,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Global' | 'Local'; } - /** @name PolymeshPrimitivesPortfolioPortfolioUpdateReason (160) */ + /** @name PolymeshPrimitivesPortfolioPortfolioUpdateReason (156) */ interface PolymeshPrimitivesPortfolioPortfolioUpdateReason extends Enum { readonly isIssued: boolean; readonly asIssued: { @@ -1370,8 +1434,8 @@ declare module '@polkadot/types/lookup' { readonly type: 'Issued' | 'Redeemed' | 'Transferred' | 'ControllerTransfer'; } - /** @name PalletCorporateActionsDistributionEvent (164) */ - interface PalletCorporateActionsDistributionEvent extends Enum { + /** @name PalletCorporateActionsDistributionPalletEvent (160) */ + interface PalletCorporateActionsDistributionPalletEvent extends Enum { readonly isCreated: boolean; readonly asCreated: ITuple<[PolymeshPrimitivesEventOnly, PalletCorporateActionsCaId, PalletCorporateActionsDistribution]>; readonly isBenefitClaimed: boolean; @@ -1383,16 +1447,16 @@ declare module '@polkadot/types/lookup' { readonly type: 'Created' | 'BenefitClaimed' | 'Reclaimed' | 'Removed'; } - /** @name PolymeshPrimitivesEventOnly (165) */ + /** @name PolymeshPrimitivesEventOnly (161) */ interface PolymeshPrimitivesEventOnly extends PolymeshPrimitivesIdentityId {} - /** @name PalletCorporateActionsCaId (166) */ + /** @name PalletCorporateActionsCaId (162) */ interface PalletCorporateActionsCaId extends Struct { readonly assetId: PolymeshPrimitivesAssetAssetId; readonly localId: u32; } - /** @name PalletCorporateActionsDistribution (168) */ + /** @name PalletCorporateActionsDistribution (164) */ interface PalletCorporateActionsDistribution extends Struct { readonly from: PolymeshPrimitivesIdentityIdPortfolioId; readonly currency: PolymeshPrimitivesAssetAssetId; @@ -1404,8 +1468,8 @@ declare module '@polkadot/types/lookup' { readonly expiresAt: Option; } - /** @name PolymeshCommonUtilitiesCheckpointEvent (170) */ - interface PolymeshCommonUtilitiesCheckpointEvent extends Enum { + /** @name PalletAssetCheckpointPalletEvent (166) */ + interface PalletAssetCheckpointPalletEvent extends Enum { readonly isCheckpointCreated: boolean; readonly asCheckpointCreated: ITuple<[Option, PolymeshPrimitivesAssetAssetId, u64, u128, u64]>; readonly isMaximumSchedulesComplexityChanged: boolean; @@ -1417,13 +1481,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'CheckpointCreated' | 'MaximumSchedulesComplexityChanged' | 'ScheduleCreated' | 'ScheduleRemoved'; } - /** @name PolymeshCommonUtilitiesCheckpointScheduleCheckpoints (173) */ + /** @name PolymeshCommonUtilitiesCheckpointScheduleCheckpoints (169) */ interface PolymeshCommonUtilitiesCheckpointScheduleCheckpoints extends Struct { readonly pending: BTreeSet; } - /** @name PolymeshCommonUtilitiesComplianceManagerEvent (176) */ - interface PolymeshCommonUtilitiesComplianceManagerEvent extends Enum { + /** @name PalletComplianceManagerEvent (172) */ + interface PalletComplianceManagerEvent extends Enum { readonly isComplianceRequirementCreated: boolean; readonly asComplianceRequirementCreated: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesComplianceManagerComplianceRequirement]>; readonly isComplianceRequirementRemoved: boolean; @@ -1445,20 +1509,20 @@ declare module '@polkadot/types/lookup' { readonly type: 'ComplianceRequirementCreated' | 'ComplianceRequirementRemoved' | 'AssetComplianceReplaced' | 'AssetComplianceReset' | 'AssetComplianceResumed' | 'AssetCompliancePaused' | 'ComplianceRequirementChanged' | 'TrustedDefaultClaimIssuerAdded' | 'TrustedDefaultClaimIssuerRemoved'; } - /** @name PolymeshPrimitivesComplianceManagerComplianceRequirement (177) */ + /** @name PolymeshPrimitivesComplianceManagerComplianceRequirement (173) */ interface PolymeshPrimitivesComplianceManagerComplianceRequirement extends Struct { readonly senderConditions: Vec; readonly receiverConditions: Vec; readonly id: u32; } - /** @name PolymeshPrimitivesCondition (179) */ + /** @name PolymeshPrimitivesCondition (175) */ interface PolymeshPrimitivesCondition extends Struct { readonly conditionType: PolymeshPrimitivesConditionConditionType; readonly issuers: Vec; } - /** @name PolymeshPrimitivesConditionConditionType (180) */ + /** @name PolymeshPrimitivesConditionConditionType (176) */ interface PolymeshPrimitivesConditionConditionType extends Enum { readonly isIsPresent: boolean; readonly asIsPresent: PolymeshPrimitivesIdentityClaimClaim; @@ -1473,7 +1537,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'IsPresent' | 'IsAbsent' | 'IsAnyOf' | 'IsNoneOf' | 'IsIdentity'; } - /** @name PolymeshPrimitivesConditionTargetIdentity (182) */ + /** @name PolymeshPrimitivesConditionTargetIdentity (178) */ interface PolymeshPrimitivesConditionTargetIdentity extends Enum { readonly isExternalAgent: boolean; readonly isSpecific: boolean; @@ -1481,13 +1545,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'ExternalAgent' | 'Specific'; } - /** @name PolymeshPrimitivesConditionTrustedIssuer (184) */ + /** @name PolymeshPrimitivesConditionTrustedIssuer (180) */ interface PolymeshPrimitivesConditionTrustedIssuer extends Struct { readonly issuer: PolymeshPrimitivesIdentityId; readonly trustedFor: PolymeshPrimitivesConditionTrustedFor; } - /** @name PolymeshPrimitivesConditionTrustedFor (185) */ + /** @name PolymeshPrimitivesConditionTrustedFor (181) */ interface PolymeshPrimitivesConditionTrustedFor extends Enum { readonly isAny: boolean; readonly isSpecific: boolean; @@ -1495,7 +1559,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Any' | 'Specific'; } - /** @name PolymeshPrimitivesIdentityClaimClaimType (187) */ + /** @name PolymeshPrimitivesIdentityClaimClaimType (183) */ interface PolymeshPrimitivesIdentityClaimClaimType extends Enum { readonly isAccredited: boolean; readonly isAffiliate: boolean; @@ -1511,7 +1575,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Accredited' | 'Affiliate' | 'BuyLockup' | 'SellLockup' | 'CustomerDueDiligence' | 'KnowYourCustomer' | 'Jurisdiction' | 'Exempted' | 'Blocked' | 'Custom'; } - /** @name PalletCorporateActionsEvent (189) */ + /** @name PalletCorporateActionsEvent (185) */ interface PalletCorporateActionsEvent extends Enum { readonly isMaxDetailsLengthChanged: boolean; readonly asMaxDetailsLengthChanged: ITuple<[PolymeshPrimitivesIdentityId, u32]>; @@ -1532,20 +1596,20 @@ declare module '@polkadot/types/lookup' { readonly type: 'MaxDetailsLengthChanged' | 'DefaultTargetIdentitiesChanged' | 'DefaultWithholdingTaxChanged' | 'DidWithholdingTaxChanged' | 'CaInitiated' | 'CaLinkedToDoc' | 'CaRemoved' | 'RecordDateChanged'; } - /** @name PalletCorporateActionsTargetIdentities (190) */ + /** @name PalletCorporateActionsTargetIdentities (186) */ interface PalletCorporateActionsTargetIdentities extends Struct { readonly identities: Vec; readonly treatment: PalletCorporateActionsTargetTreatment; } - /** @name PalletCorporateActionsTargetTreatment (191) */ + /** @name PalletCorporateActionsTargetTreatment (187) */ interface PalletCorporateActionsTargetTreatment extends Enum { readonly isInclude: boolean; readonly isExclude: boolean; readonly type: 'Include' | 'Exclude'; } - /** @name PalletCorporateActionsCorporateAction (193) */ + /** @name PalletCorporateActionsCorporateAction (189) */ interface PalletCorporateActionsCorporateAction extends Struct { readonly kind: PalletCorporateActionsCaKind; readonly declDate: u64; @@ -1555,7 +1619,7 @@ declare module '@polkadot/types/lookup' { readonly withholdingTax: Vec>; } - /** @name PalletCorporateActionsCaKind (194) */ + /** @name PalletCorporateActionsCaKind (190) */ interface PalletCorporateActionsCaKind extends Enum { readonly isPredictableBenefit: boolean; readonly isUnpredictableBenefit: boolean; @@ -1565,13 +1629,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'PredictableBenefit' | 'UnpredictableBenefit' | 'IssuerNotice' | 'Reorganization' | 'Other'; } - /** @name PalletCorporateActionsRecordDate (196) */ + /** @name PalletCorporateActionsRecordDate (192) */ interface PalletCorporateActionsRecordDate extends Struct { readonly date: u64; readonly checkpoint: PalletCorporateActionsCaCheckpoint; } - /** @name PalletCorporateActionsCaCheckpoint (197) */ + /** @name PalletCorporateActionsCaCheckpoint (193) */ interface PalletCorporateActionsCaCheckpoint extends Enum { readonly isScheduled: boolean; readonly asScheduled: ITuple<[u64, u64]>; @@ -1580,8 +1644,8 @@ declare module '@polkadot/types/lookup' { readonly type: 'Scheduled' | 'Existing'; } - /** @name PalletCorporateActionsBallotEvent (202) */ - interface PalletCorporateActionsBallotEvent extends Enum { + /** @name PalletCorporateActionsBallotPalletEvent (198) */ + interface PalletCorporateActionsBallotPalletEvent extends Enum { readonly isCreated: boolean; readonly asCreated: ITuple<[PolymeshPrimitivesIdentityId, PalletCorporateActionsCaId, PalletCorporateActionsBallotBallotTimeRange, PalletCorporateActionsBallotBallotMeta, bool]>; readonly isVoteCast: boolean; @@ -1597,37 +1661,37 @@ declare module '@polkadot/types/lookup' { readonly type: 'Created' | 'VoteCast' | 'RangeChanged' | 'MetaChanged' | 'RcvChanged' | 'Removed'; } - /** @name PalletCorporateActionsBallotBallotTimeRange (203) */ + /** @name PalletCorporateActionsBallotBallotTimeRange (199) */ interface PalletCorporateActionsBallotBallotTimeRange extends Struct { readonly start: u64; readonly end: u64; } - /** @name PalletCorporateActionsBallotBallotMeta (204) */ + /** @name PalletCorporateActionsBallotBallotMeta (200) */ interface PalletCorporateActionsBallotBallotMeta extends Struct { readonly title: Bytes; readonly motions: Vec; } - /** @name PalletCorporateActionsBallotMotion (207) */ + /** @name PalletCorporateActionsBallotMotion (203) */ interface PalletCorporateActionsBallotMotion extends Struct { readonly title: Bytes; readonly infoLink: Bytes; readonly choices: Vec; } - /** @name PalletCorporateActionsBallotBallotVote (213) */ + /** @name PalletCorporateActionsBallotBallotVote (209) */ interface PalletCorporateActionsBallotBallotVote extends Struct { readonly power: u128; readonly fallback: Option; } - /** @name PalletPipsRawEvent (216) */ - interface PalletPipsRawEvent extends Enum { + /** @name PalletPipsEvent (212) */ + interface PalletPipsEvent extends Enum { readonly isHistoricalPipsPruned: boolean; readonly asHistoricalPipsPruned: ITuple<[PolymeshPrimitivesIdentityId, bool, bool]>; readonly isProposalCreated: boolean; - readonly asProposalCreated: ITuple<[PolymeshPrimitivesIdentityId, PalletPipsProposer, u32, u128, Option, Option, PolymeshCommonUtilitiesMaybeBlock, PalletPipsProposalData]>; + readonly asProposalCreated: ITuple<[PolymeshPrimitivesIdentityId, PalletPipsProposer, u32, u128, Option, Option, PolymeshPrimitivesMaybeBlock, PalletPipsProposalData]>; readonly isProposalStateUpdated: boolean; readonly asProposalStateUpdated: ITuple<[PolymeshPrimitivesIdentityId, u32, PalletPipsProposalState]>; readonly isVoted: boolean; @@ -1641,7 +1705,7 @@ declare module '@polkadot/types/lookup' { readonly isMinimumProposalDepositChanged: boolean; readonly asMinimumProposalDepositChanged: ITuple<[PolymeshPrimitivesIdentityId, u128, u128]>; readonly isPendingPipExpiryChanged: boolean; - readonly asPendingPipExpiryChanged: ITuple<[PolymeshPrimitivesIdentityId, PolymeshCommonUtilitiesMaybeBlock, PolymeshCommonUtilitiesMaybeBlock]>; + readonly asPendingPipExpiryChanged: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesMaybeBlock, PolymeshPrimitivesMaybeBlock]>; readonly isMaxPipSkipCountChanged: boolean; readonly asMaxPipSkipCountChanged: ITuple<[PolymeshPrimitivesIdentityId, u8, u8]>; readonly isActivePipLimitChanged: boolean; @@ -1667,7 +1731,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'HistoricalPipsPruned' | 'ProposalCreated' | 'ProposalStateUpdated' | 'Voted' | 'PipClosed' | 'ExecutionScheduled' | 'DefaultEnactmentPeriodChanged' | 'MinimumProposalDepositChanged' | 'PendingPipExpiryChanged' | 'MaxPipSkipCountChanged' | 'ActivePipLimitChanged' | 'ProposalRefund' | 'SnapshotCleared' | 'SnapshotTaken' | 'PipSkipped' | 'SnapshotResultsEnacted' | 'ExecutionSchedulingFailed' | 'ExpiryScheduled' | 'ExpirySchedulingFailed' | 'ExecutionCancellingFailed'; } - /** @name PalletPipsProposer (217) */ + /** @name PalletPipsProposer (213) */ interface PalletPipsProposer extends Enum { readonly isCommunity: boolean; readonly asCommunity: AccountId32; @@ -1676,14 +1740,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'Community' | 'Committee'; } - /** @name PalletPipsCommittee (218) */ + /** @name PalletPipsCommittee (214) */ interface PalletPipsCommittee extends Enum { readonly isTechnical: boolean; readonly isUpgrade: boolean; readonly type: 'Technical' | 'Upgrade'; } - /** @name PalletPipsProposalData (222) */ + /** @name PalletPipsProposalData (218) */ interface PalletPipsProposalData extends Enum { readonly isHash: boolean; readonly asHash: H256; @@ -1692,7 +1756,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Hash' | 'Proposal'; } - /** @name PalletPipsProposalState (223) */ + /** @name PalletPipsProposalState (219) */ interface PalletPipsProposalState extends Enum { readonly isPending: boolean; readonly isRejected: boolean; @@ -1703,14 +1767,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'Pending' | 'Rejected' | 'Scheduled' | 'Failed' | 'Executed' | 'Expired'; } - /** @name PalletPipsSnapshottedPip (226) */ + /** @name PalletPipsSnapshottedPip (222) */ interface PalletPipsSnapshottedPip extends Struct { readonly id: u32; readonly weight: ITuple<[bool, u128]>; } - /** @name PolymeshCommonUtilitiesPortfolioEvent (232) */ - interface PolymeshCommonUtilitiesPortfolioEvent extends Enum { + /** @name PalletPortfolioEvent (228) */ + interface PalletPortfolioEvent extends Enum { readonly isPortfolioCreated: boolean; readonly asPortfolioCreated: ITuple<[PolymeshPrimitivesIdentityId, u64, Bytes]>; readonly isPortfolioDeleted: boolean; @@ -1727,10 +1791,14 @@ declare module '@polkadot/types/lookup' { readonly asPreApprovedPortfolio: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesAssetAssetId]>; readonly isRevokePreApprovedPortfolio: boolean; readonly asRevokePreApprovedPortfolio: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityIdPortfolioId, PolymeshPrimitivesAssetAssetId]>; - readonly type: 'PortfolioCreated' | 'PortfolioDeleted' | 'PortfolioRenamed' | 'UserPortfolios' | 'PortfolioCustodianChanged' | 'FundsMovedBetweenPortfolios' | 'PreApprovedPortfolio' | 'RevokePreApprovedPortfolio'; + readonly isAllowIdentityToCreatePortfolios: boolean; + readonly asAllowIdentityToCreatePortfolios: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; + readonly isRevokeCreatePortfoliosPermission: boolean; + readonly asRevokeCreatePortfoliosPermission: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId]>; + readonly type: 'PortfolioCreated' | 'PortfolioDeleted' | 'PortfolioRenamed' | 'UserPortfolios' | 'PortfolioCustodianChanged' | 'FundsMovedBetweenPortfolios' | 'PreApprovedPortfolio' | 'RevokePreApprovedPortfolio' | 'AllowIdentityToCreatePortfolios' | 'RevokeCreatePortfoliosPermission'; } - /** @name PolymeshPrimitivesPortfolioFundDescription (236) */ + /** @name PolymeshPrimitivesPortfolioFundDescription (232) */ interface PolymeshPrimitivesPortfolioFundDescription extends Enum { readonly isFungible: boolean; readonly asFungible: { @@ -1742,14 +1810,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'Fungible' | 'NonFungible'; } - /** @name PolymeshPrimitivesNftNfTs (237) */ + /** @name PolymeshPrimitivesNftNfTs (233) */ interface PolymeshPrimitivesNftNfTs extends Struct { readonly assetId: PolymeshPrimitivesAssetAssetId; readonly ids: Vec; } - /** @name PalletProtocolFeeRawEvent (240) */ - interface PalletProtocolFeeRawEvent extends Enum { + /** @name PalletProtocolFeeEvent (236) */ + interface PalletProtocolFeeEvent extends Enum { readonly isFeeSet: boolean; readonly asFeeSet: ITuple<[PolymeshPrimitivesIdentityId, u128]>; readonly isCoefficientSet: boolean; @@ -1759,10 +1827,10 @@ declare module '@polkadot/types/lookup' { readonly type: 'FeeSet' | 'CoefficientSet' | 'FeeCharged'; } - /** @name PolymeshPrimitivesPosRatio (241) */ + /** @name PolymeshPrimitivesPosRatio (237) */ interface PolymeshPrimitivesPosRatio extends ITuple<[u32, u32]> {} - /** @name PalletSchedulerEvent (242) */ + /** @name PalletSchedulerEvent (238) */ interface PalletSchedulerEvent extends Enum { readonly isScheduled: boolean; readonly asScheduled: { @@ -1780,6 +1848,18 @@ declare module '@polkadot/types/lookup' { readonly id: Option; readonly result: Result; } & Struct; + readonly isRetrySet: boolean; + readonly asRetrySet: { + readonly task: ITuple<[u32, u32]>; + readonly id: Option; + readonly period: u32; + readonly retries: u8; + } & Struct; + readonly isRetryCancelled: boolean; + readonly asRetryCancelled: { + readonly task: ITuple<[u32, u32]>; + readonly id: Option; + } & Struct; readonly isCallUnavailable: boolean; readonly asCallUnavailable: { readonly task: ITuple<[u32, u32]>; @@ -1790,16 +1870,25 @@ declare module '@polkadot/types/lookup' { readonly task: ITuple<[u32, u32]>; readonly id: Option; } & Struct; + readonly isRetryFailed: boolean; + readonly asRetryFailed: { + readonly task: ITuple<[u32, u32]>; + readonly id: Option; + } & Struct; readonly isPermanentlyOverweight: boolean; readonly asPermanentlyOverweight: { readonly task: ITuple<[u32, u32]>; readonly id: Option; } & Struct; - readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallUnavailable' | 'PeriodicFailed' | 'PermanentlyOverweight'; + readonly isAgendaIncomplete: boolean; + readonly asAgendaIncomplete: { + readonly when: u32; + } & Struct; + readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'RetrySet' | 'RetryCancelled' | 'CallUnavailable' | 'PeriodicFailed' | 'RetryFailed' | 'PermanentlyOverweight' | 'AgendaIncomplete'; } - /** @name PolymeshCommonUtilitiesSettlementRawEvent (245) */ - interface PolymeshCommonUtilitiesSettlementRawEvent extends Enum { + /** @name PalletSettlementEvent (241) */ + interface PalletSettlementEvent extends Enum { readonly isVenueCreated: boolean; readonly asVenueCreated: ITuple<[PolymeshPrimitivesIdentityId, u64, Bytes, PolymeshPrimitivesSettlementVenueType]>; readonly isVenueDetailsUpdated: boolean; @@ -1822,8 +1911,6 @@ declare module '@polkadot/types/lookup' { readonly asVenuesBlocked: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesAssetAssetId, Vec]>; readonly isLegFailedExecution: boolean; readonly asLegFailedExecution: ITuple<[PolymeshPrimitivesIdentityId, u64, u64]>; - readonly isInstructionFailed: boolean; - readonly asInstructionFailed: ITuple<[PolymeshPrimitivesIdentityId, u64]>; readonly isInstructionExecuted: boolean; readonly asInstructionExecuted: ITuple<[PolymeshPrimitivesIdentityId, u64]>; readonly isVenueUnauthorized: boolean; @@ -1848,10 +1935,12 @@ declare module '@polkadot/types/lookup' { readonly asMediatorAffirmationWithdrawn: ITuple<[PolymeshPrimitivesIdentityId, u64]>; readonly isInstructionMediators: boolean; readonly asInstructionMediators: ITuple<[u64, BTreeSet]>; - readonly type: 'VenueCreated' | 'VenueDetailsUpdated' | 'VenueTypeUpdated' | 'InstructionAffirmed' | 'AffirmationWithdrawn' | 'InstructionRejected' | 'ReceiptClaimed' | 'VenueFiltering' | 'VenuesAllowed' | 'VenuesBlocked' | 'LegFailedExecution' | 'InstructionFailed' | 'InstructionExecuted' | 'VenueUnauthorized' | 'SchedulingFailed' | 'InstructionRescheduled' | 'VenueSignersUpdated' | 'SettlementManuallyExecuted' | 'InstructionCreated' | 'FailedToExecuteInstruction' | 'InstructionAutomaticallyAffirmed' | 'MediatorAffirmationReceived' | 'MediatorAffirmationWithdrawn' | 'InstructionMediators'; + readonly isInstructionLocked: boolean; + readonly asInstructionLocked: ITuple<[PolymeshPrimitivesIdentityId, u64]>; + readonly type: 'VenueCreated' | 'VenueDetailsUpdated' | 'VenueTypeUpdated' | 'InstructionAffirmed' | 'AffirmationWithdrawn' | 'InstructionRejected' | 'ReceiptClaimed' | 'VenueFiltering' | 'VenuesAllowed' | 'VenuesBlocked' | 'LegFailedExecution' | 'InstructionExecuted' | 'VenueUnauthorized' | 'SchedulingFailed' | 'InstructionRescheduled' | 'VenueSignersUpdated' | 'SettlementManuallyExecuted' | 'InstructionCreated' | 'FailedToExecuteInstruction' | 'InstructionAutomaticallyAffirmed' | 'MediatorAffirmationReceived' | 'MediatorAffirmationWithdrawn' | 'InstructionMediators' | 'InstructionLocked'; } - /** @name PolymeshPrimitivesSettlementVenueType (248) */ + /** @name PolymeshPrimitivesSettlementVenueType (244) */ interface PolymeshPrimitivesSettlementVenueType extends Enum { readonly isOther: boolean; readonly isDistribution: boolean; @@ -1860,20 +1949,21 @@ declare module '@polkadot/types/lookup' { readonly type: 'Other' | 'Distribution' | 'Sto' | 'Exchange'; } - /** @name PolymeshPrimitivesSettlementReceiptMetadata (251) */ + /** @name PolymeshPrimitivesSettlementReceiptMetadata (247) */ interface PolymeshPrimitivesSettlementReceiptMetadata extends U8aFixed {} - /** @name PolymeshPrimitivesSettlementSettlementType (254) */ + /** @name PolymeshPrimitivesSettlementSettlementType (250) */ interface PolymeshPrimitivesSettlementSettlementType extends Enum { readonly isSettleOnAffirmation: boolean; readonly isSettleOnBlock: boolean; readonly asSettleOnBlock: u32; readonly isSettleManual: boolean; readonly asSettleManual: u32; - readonly type: 'SettleOnAffirmation' | 'SettleOnBlock' | 'SettleManual'; + readonly isSettleAfterLock: boolean; + readonly type: 'SettleOnAffirmation' | 'SettleOnBlock' | 'SettleManual' | 'SettleAfterLock'; } - /** @name PolymeshPrimitivesSettlementLeg (256) */ + /** @name PolymeshPrimitivesSettlementLeg (252) */ interface PolymeshPrimitivesSettlementLeg extends Enum { readonly isFungible: boolean; readonly asFungible: { @@ -1898,8 +1988,8 @@ declare module '@polkadot/types/lookup' { readonly type: 'Fungible' | 'NonFungible' | 'OffChain'; } - /** @name PolymeshCommonUtilitiesStatisticsEvent (257) */ - interface PolymeshCommonUtilitiesStatisticsEvent extends Enum { + /** @name PalletStatisticsEvent (253) */ + interface PalletStatisticsEvent extends Enum { readonly isStatTypesAdded: boolean; readonly asStatTypesAdded: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesAssetAssetId, Vec]>; readonly isStatTypesRemoved: boolean; @@ -1915,26 +2005,26 @@ declare module '@polkadot/types/lookup' { readonly type: 'StatTypesAdded' | 'StatTypesRemoved' | 'AssetStatsUpdated' | 'SetAssetTransferCompliance' | 'TransferConditionExemptionsAdded' | 'TransferConditionExemptionsRemoved'; } - /** @name PolymeshPrimitivesStatisticsStatType (259) */ + /** @name PolymeshPrimitivesStatisticsStatType (255) */ interface PolymeshPrimitivesStatisticsStatType extends Struct { readonly operationType: PolymeshPrimitivesStatisticsStatOpType; readonly claimIssuer: Option>; } - /** @name PolymeshPrimitivesStatisticsStatOpType (260) */ + /** @name PolymeshPrimitivesStatisticsStatOpType (256) */ interface PolymeshPrimitivesStatisticsStatOpType extends Enum { readonly isCount: boolean; readonly isBalance: boolean; readonly type: 'Count' | 'Balance'; } - /** @name PolymeshPrimitivesStatisticsStatUpdate (264) */ + /** @name PolymeshPrimitivesStatisticsStatUpdate (260) */ interface PolymeshPrimitivesStatisticsStatUpdate extends Struct { readonly key2: PolymeshPrimitivesStatisticsStat2ndKey; readonly value: Option; } - /** @name PolymeshPrimitivesStatisticsStat2ndKey (265) */ + /** @name PolymeshPrimitivesStatisticsStat2ndKey (261) */ interface PolymeshPrimitivesStatisticsStat2ndKey extends Enum { readonly isNoClaimStat: boolean; readonly isClaim: boolean; @@ -1942,7 +2032,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'NoClaimStat' | 'Claim'; } - /** @name PolymeshPrimitivesStatisticsStatClaim (266) */ + /** @name PolymeshPrimitivesStatisticsStatClaim (262) */ interface PolymeshPrimitivesStatisticsStatClaim extends Enum { readonly isAccredited: boolean; readonly asAccredited: bool; @@ -1953,7 +2043,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Accredited' | 'Affiliate' | 'Jurisdiction'; } - /** @name PolymeshPrimitivesTransferComplianceTransferCondition (270) */ + /** @name PolymeshPrimitivesTransferComplianceTransferCondition (266) */ interface PolymeshPrimitivesTransferComplianceTransferCondition extends Enum { readonly isMaxInvestorCount: boolean; readonly asMaxInvestorCount: u64; @@ -1966,31 +2056,72 @@ declare module '@polkadot/types/lookup' { readonly type: 'MaxInvestorCount' | 'MaxInvestorOwnership' | 'ClaimCount' | 'ClaimOwnership'; } - /** @name PolymeshPrimitivesTransferComplianceTransferConditionExemptKey (271) */ + /** @name PolymeshPrimitivesTransferComplianceTransferConditionExemptKey (267) */ interface PolymeshPrimitivesTransferComplianceTransferConditionExemptKey extends Struct { readonly assetId: PolymeshPrimitivesAssetAssetId; readonly op: PolymeshPrimitivesStatisticsStatOpType; readonly claimType: Option; } - /** @name PalletStoRawEvent (273) */ - interface PalletStoRawEvent extends Enum { + /** @name PalletStoEvent (269) */ + interface PalletStoEvent extends Enum { readonly isFundraiserCreated: boolean; - readonly asFundraiserCreated: ITuple<[PolymeshPrimitivesIdentityId, u64, Bytes, PalletStoFundraiser]>; + readonly asFundraiserCreated: { + readonly agentDid: PolymeshPrimitivesIdentityId; + readonly offeringAsset: PolymeshPrimitivesAssetAssetId; + readonly raisingAsset: PolymeshPrimitivesAssetAssetId; + readonly fundraiserId: u64; + readonly fundraiserName: Bytes; + readonly fundraiser: PalletStoFundraiser; + } & Struct; readonly isInvested: boolean; - readonly asInvested: ITuple<[PolymeshPrimitivesIdentityId, u64, PolymeshPrimitivesAssetAssetId, PolymeshPrimitivesAssetAssetId, u128, u128]>; + readonly asInvested: { + readonly investorDid: PolymeshPrimitivesIdentityId; + readonly offeringAsset: PolymeshPrimitivesAssetAssetId; + readonly fundraiserId: u64; + readonly fundingAsset: PalletStoFundingAsset; + readonly offeringAmount: u128; + readonly raiseAmount: u128; + } & Struct; readonly isFundraiserFrozen: boolean; - readonly asFundraiserFrozen: ITuple<[PolymeshPrimitivesIdentityId, u64]>; + readonly asFundraiserFrozen: { + readonly agentDid: PolymeshPrimitivesIdentityId; + readonly offeringAsset: PolymeshPrimitivesAssetAssetId; + readonly fundraiserId: u64; + } & Struct; readonly isFundraiserUnfrozen: boolean; - readonly asFundraiserUnfrozen: ITuple<[PolymeshPrimitivesIdentityId, u64]>; + readonly asFundraiserUnfrozen: { + readonly agentDid: PolymeshPrimitivesIdentityId; + readonly offeringAsset: PolymeshPrimitivesAssetAssetId; + readonly fundraiserId: u64; + } & Struct; readonly isFundraiserWindowModified: boolean; - readonly asFundraiserWindowModified: ITuple<[PolymeshPrimitivesEventOnly, u64, u64, Option, u64, Option]>; + readonly asFundraiserWindowModified: { + readonly agentDid: PolymeshPrimitivesEventOnly; + readonly offeringAsset: PolymeshPrimitivesAssetAssetId; + readonly fundraiserId: u64; + readonly oldStart: u64; + readonly oldEnd: Option; + readonly newStart: u64; + readonly newEnd: Option; + } & Struct; readonly isFundraiserClosed: boolean; - readonly asFundraiserClosed: ITuple<[PolymeshPrimitivesIdentityId, u64]>; - readonly type: 'FundraiserCreated' | 'Invested' | 'FundraiserFrozen' | 'FundraiserUnfrozen' | 'FundraiserWindowModified' | 'FundraiserClosed'; + readonly asFundraiserClosed: { + readonly agentDid: PolymeshPrimitivesIdentityId; + readonly offeringAsset: PolymeshPrimitivesAssetAssetId; + readonly fundraiserId: u64; + } & Struct; + readonly isFundraiserOffchainFundingEnabled: boolean; + readonly asFundraiserOffchainFundingEnabled: { + readonly agentDid: PolymeshPrimitivesIdentityId; + readonly offeringAsset: PolymeshPrimitivesAssetAssetId; + readonly fundraiserId: u64; + readonly ticker: PolymeshPrimitivesTicker; + } & Struct; + readonly type: 'FundraiserCreated' | 'Invested' | 'FundraiserFrozen' | 'FundraiserUnfrozen' | 'FundraiserWindowModified' | 'FundraiserClosed' | 'FundraiserOffchainFundingEnabled'; } - /** @name PalletStoFundraiser (276) */ + /** @name PalletStoFundraiser (272) */ interface PalletStoFundraiser extends Struct { readonly creator: PolymeshPrimitivesIdentityId; readonly offeringPortfolio: PolymeshPrimitivesIdentityIdPortfolioId; @@ -2005,14 +2136,14 @@ declare module '@polkadot/types/lookup' { readonly minimumInvestment: u128; } - /** @name PalletStoFundraiserTier (278) */ + /** @name PalletStoFundraiserTier (274) */ interface PalletStoFundraiserTier extends Struct { readonly total: u128; readonly price: u128; readonly remaining: u128; } - /** @name PalletStoFundraiserStatus (279) */ + /** @name PalletStoFundraiserStatus (275) */ interface PalletStoFundraiserStatus extends Enum { readonly isLive: boolean; readonly isFrozen: boolean; @@ -2021,8 +2152,17 @@ declare module '@polkadot/types/lookup' { readonly type: 'Live' | 'Frozen' | 'Closed' | 'ClosedEarly'; } - /** @name PalletTreasuryRawEvent (280) */ - interface PalletTreasuryRawEvent extends Enum { + /** @name PalletStoFundingAsset (276) */ + interface PalletStoFundingAsset extends Enum { + readonly isOnChain: boolean; + readonly asOnChain: PolymeshPrimitivesAssetAssetId; + readonly isOffChain: boolean; + readonly asOffChain: PolymeshPrimitivesTicker; + readonly type: 'OnChain' | 'OffChain'; + } + + /** @name PalletTreasuryEvent (277) */ + interface PalletTreasuryEvent extends Enum { readonly isTreasuryDisbursement: boolean; readonly asTreasuryDisbursement: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesIdentityId, AccountId32, u128]>; readonly isTreasuryDisbursementFailed: boolean; @@ -2032,7 +2172,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'TreasuryDisbursement' | 'TreasuryDisbursementFailed' | 'TreasuryReimbursement'; } - /** @name PalletUtilityEvent (281) */ + /** @name PalletUtilityEvent (278) */ interface PalletUtilityEvent extends Enum { readonly isBatchInterrupted: boolean; readonly asBatchInterrupted: { @@ -2056,24 +2196,18 @@ declare module '@polkadot/types/lookup' { readonly target: AccountId32; readonly result: Result; } & Struct; - readonly isBatchInterruptedOld: boolean; - readonly asBatchInterruptedOld: ITuple<[Vec, ITuple<[u32, SpRuntimeDispatchError]>]>; - readonly isBatchOptimisticFailed: boolean; - readonly asBatchOptimisticFailed: ITuple<[Vec, Vec>]>; - readonly isBatchCompletedOld: boolean; - readonly asBatchCompletedOld: Vec; - readonly type: 'BatchInterrupted' | 'BatchCompleted' | 'BatchCompletedWithErrors' | 'ItemCompleted' | 'ItemFailed' | 'DispatchedAs' | 'RelayedTx' | 'BatchInterruptedOld' | 'BatchOptimisticFailed' | 'BatchCompletedOld'; + readonly type: 'BatchInterrupted' | 'BatchCompleted' | 'BatchCompletedWithErrors' | 'ItemCompleted' | 'ItemFailed' | 'DispatchedAs' | 'RelayedTx'; } - /** @name PolymeshCommonUtilitiesBaseEvent (285) */ - interface PolymeshCommonUtilitiesBaseEvent extends Enum { + /** @name PalletBaseEvent (279) */ + interface PalletBaseEvent extends Enum { readonly isUnexpectedError: boolean; readonly asUnexpectedError: Option; readonly type: 'UnexpectedError'; } - /** @name PolymeshCommonUtilitiesExternalAgentsEvent (287) */ - interface PolymeshCommonUtilitiesExternalAgentsEvent extends Enum { + /** @name PalletExternalAgentsEvent (281) */ + interface PalletExternalAgentsEvent extends Enum { readonly isGroupCreated: boolean; readonly asGroupCreated: ITuple<[PolymeshPrimitivesEventOnly, PolymeshPrimitivesAssetAssetId, u32, PolymeshPrimitivesSecondaryKeyExtrinsicPermissions]>; readonly isGroupPermissionsUpdated: boolean; @@ -2087,8 +2221,8 @@ declare module '@polkadot/types/lookup' { readonly type: 'GroupCreated' | 'GroupPermissionsUpdated' | 'AgentAdded' | 'AgentRemoved' | 'GroupChanged'; } - /** @name PolymeshCommonUtilitiesRelayerRawEvent (288) */ - interface PolymeshCommonUtilitiesRelayerRawEvent extends Enum { + /** @name PalletRelayerEvent (282) */ + interface PalletRelayerEvent extends Enum { readonly isAuthorizedPayingKey: boolean; readonly asAuthorizedPayingKey: ITuple<[PolymeshPrimitivesEventOnly, AccountId32, AccountId32, u128, u64]>; readonly isAcceptedPayingKey: boolean; @@ -2100,7 +2234,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'AuthorizedPayingKey' | 'AcceptedPayingKey' | 'RemovedPayingKey' | 'UpdatedPolyxLimit'; } - /** @name PalletContractsEvent (289) */ + /** @name PalletContractsEvent (283) */ interface PalletContractsEvent extends Enum { readonly isInstantiated: boolean; readonly asInstantiated: { @@ -2115,6 +2249,8 @@ declare module '@polkadot/types/lookup' { readonly isCodeStored: boolean; readonly asCodeStored: { readonly codeHash: H256; + readonly depositHeld: u128; + readonly uploader: AccountId32; } & Struct; readonly isContractEmitted: boolean; readonly asContractEmitted: { @@ -2124,6 +2260,8 @@ declare module '@polkadot/types/lookup' { readonly isCodeRemoved: boolean; readonly asCodeRemoved: { readonly codeHash: H256; + readonly depositReleased: u128; + readonly remover: AccountId32; } & Struct; readonly isContractCodeUpdated: boolean; readonly asContractCodeUpdated: { @@ -2133,7 +2271,7 @@ declare module '@polkadot/types/lookup' { } & Struct; readonly isCalled: boolean; readonly asCalled: { - readonly caller: AccountId32; + readonly caller: PalletContractsOrigin; readonly contract: AccountId32; } & Struct; readonly isDelegateCalled: boolean; @@ -2141,11 +2279,34 @@ declare module '@polkadot/types/lookup' { readonly contract: AccountId32; readonly codeHash: H256; } & Struct; - readonly type: 'Instantiated' | 'Terminated' | 'CodeStored' | 'ContractEmitted' | 'CodeRemoved' | 'ContractCodeUpdated' | 'Called' | 'DelegateCalled'; + readonly isStorageDepositTransferredAndHeld: boolean; + readonly asStorageDepositTransferredAndHeld: { + readonly from: AccountId32; + readonly to: AccountId32; + readonly amount: u128; + } & Struct; + readonly isStorageDepositTransferredAndReleased: boolean; + readonly asStorageDepositTransferredAndReleased: { + readonly from: AccountId32; + readonly to: AccountId32; + readonly amount: u128; + } & Struct; + readonly type: 'Instantiated' | 'Terminated' | 'CodeStored' | 'ContractEmitted' | 'CodeRemoved' | 'ContractCodeUpdated' | 'Called' | 'DelegateCalled' | 'StorageDepositTransferredAndHeld' | 'StorageDepositTransferredAndReleased'; } - /** @name PolymeshContractsRawEvent (290) */ - interface PolymeshContractsRawEvent extends Enum { + /** @name PalletContractsOrigin (284) */ + interface PalletContractsOrigin extends Enum { + readonly isRoot: boolean; + readonly isSigned: boolean; + readonly asSigned: AccountId32; + readonly type: 'Root' | 'Signed'; + } + + /** @name PolymeshRuntimeDevelopRuntime (285) */ + type PolymeshRuntimeDevelopRuntime = Null; + + /** @name PolymeshContractsEvent (286) */ + interface PolymeshContractsEvent extends Enum { readonly isApiHashUpdated: boolean; readonly asApiHashUpdated: ITuple<[PolymeshContractsApi, PolymeshContractsChainVersion, H256]>; readonly isScRuntimeCall: boolean; @@ -2153,22 +2314,22 @@ declare module '@polkadot/types/lookup' { readonly type: 'ApiHashUpdated' | 'ScRuntimeCall'; } - /** @name PolymeshContractsApi (291) */ + /** @name PolymeshContractsApi (287) */ interface PolymeshContractsApi extends Struct { readonly desc: U8aFixed; readonly major: u32; } - /** @name PolymeshContractsChainVersion (292) */ + /** @name PolymeshContractsChainVersion (288) */ interface PolymeshContractsChainVersion extends Struct { readonly specVersion: u32; readonly txVersion: u32; } - /** @name PolymeshContractsChainExtensionExtrinsicId (293) */ + /** @name PolymeshContractsChainExtensionExtrinsicId (289) */ interface PolymeshContractsChainExtensionExtrinsicId extends ITuple<[u8, u8]> {} - /** @name PalletPreimageEvent (294) */ + /** @name PalletPreimageEvent (290) */ interface PalletPreimageEvent extends Enum { readonly isNoted: boolean; readonly asNoted: { @@ -2185,8 +2346,8 @@ declare module '@polkadot/types/lookup' { readonly type: 'Noted' | 'Requested' | 'Cleared'; } - /** @name PolymeshCommonUtilitiesNftEvent (295) */ - interface PolymeshCommonUtilitiesNftEvent extends Enum { + /** @name PalletNftEvent (291) */ + interface PalletNftEvent extends Enum { readonly isNftCollectionCreated: boolean; readonly asNftCollectionCreated: ITuple<[PolymeshPrimitivesIdentityId, PolymeshPrimitivesAssetAssetId, u64]>; readonly isNftPortfolioUpdated: boolean; @@ -2194,7 +2355,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'NftCollectionCreated' | 'NftPortfolioUpdated'; } - /** @name PalletElectionProviderMultiPhaseEvent (297) */ + /** @name PalletElectionProviderMultiPhaseEvent (293) */ interface PalletElectionProviderMultiPhaseEvent extends Enum { readonly isSolutionStored: boolean; readonly asSolutionStored: { @@ -2227,7 +2388,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'SolutionStored' | 'ElectionFinalized' | 'ElectionFailed' | 'Rewarded' | 'Slashed' | 'PhaseTransitioned'; } - /** @name PalletElectionProviderMultiPhaseElectionCompute (298) */ + /** @name PalletElectionProviderMultiPhaseElectionCompute (294) */ interface PalletElectionProviderMultiPhaseElectionCompute extends Enum { readonly isOnChain: boolean; readonly isSigned: boolean; @@ -2237,14 +2398,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'OnChain' | 'Signed' | 'Unsigned' | 'Fallback' | 'Emergency'; } - /** @name SpNposElectionsElectionScore (299) */ + /** @name SpNposElectionsElectionScore (295) */ interface SpNposElectionsElectionScore extends Struct { readonly minimalStake: u128; readonly sumStake: u128; readonly sumStakeSquared: u128; } - /** @name PalletElectionProviderMultiPhasePhase (300) */ + /** @name PalletElectionProviderMultiPhasePhase (296) */ interface PalletElectionProviderMultiPhasePhase extends Enum { readonly isOff: boolean; readonly isSigned: boolean; @@ -2254,16 +2415,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Off' | 'Signed' | 'Unsigned' | 'Emergency'; } - /** @name PalletTestUtilsRawEvent (302) */ - interface PalletTestUtilsRawEvent extends Enum { - readonly isDidStatus: boolean; - readonly asDidStatus: ITuple<[PolymeshPrimitivesIdentityId, AccountId32]>; - readonly isCddStatus: boolean; - readonly asCddStatus: ITuple<[Option, AccountId32, bool]>; - readonly type: 'DidStatus' | 'CddStatus'; - } - - /** @name FrameSystemPhase (303) */ + /** @name FrameSystemPhase (298) */ interface FrameSystemPhase extends Enum { readonly isApplyExtrinsic: boolean; readonly asApplyExtrinsic: u32; @@ -2272,13 +2424,19 @@ declare module '@polkadot/types/lookup' { readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization'; } - /** @name FrameSystemLastRuntimeUpgradeInfo (306) */ + /** @name FrameSystemLastRuntimeUpgradeInfo (301) */ interface FrameSystemLastRuntimeUpgradeInfo extends Struct { readonly specVersion: Compact; readonly specName: Text; } - /** @name FrameSystemCall (308) */ + /** @name FrameSystemCodeUpgradeAuthorization (304) */ + interface FrameSystemCodeUpgradeAuthorization extends Struct { + readonly codeHash: H256; + readonly checkVersion: bool; + } + + /** @name FrameSystemCall (305) */ interface FrameSystemCall extends Enum { readonly isRemark: boolean; readonly asRemark: { @@ -2313,24 +2471,36 @@ declare module '@polkadot/types/lookup' { readonly asRemarkWithEvent: { readonly remark: Bytes; } & Struct; - readonly type: 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent'; + readonly isAuthorizeUpgrade: boolean; + readonly asAuthorizeUpgrade: { + readonly codeHash: H256; + } & Struct; + readonly isAuthorizeUpgradeWithoutChecks: boolean; + readonly asAuthorizeUpgradeWithoutChecks: { + readonly codeHash: H256; + } & Struct; + readonly isApplyAuthorizedUpgrade: boolean; + readonly asApplyAuthorizedUpgrade: { + readonly code: Bytes; + } & Struct; + readonly type: 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent' | 'AuthorizeUpgrade' | 'AuthorizeUpgradeWithoutChecks' | 'ApplyAuthorizedUpgrade'; } - /** @name FrameSystemLimitsBlockWeights (312) */ + /** @name FrameSystemLimitsBlockWeights (309) */ interface FrameSystemLimitsBlockWeights extends Struct { readonly baseBlock: SpWeightsWeightV2Weight; readonly maxBlock: SpWeightsWeightV2Weight; readonly perClass: FrameSupportDispatchPerDispatchClassWeightsPerClass; } - /** @name FrameSupportDispatchPerDispatchClassWeightsPerClass (313) */ + /** @name FrameSupportDispatchPerDispatchClassWeightsPerClass (310) */ interface FrameSupportDispatchPerDispatchClassWeightsPerClass extends Struct { readonly normal: FrameSystemLimitsWeightsPerClass; readonly operational: FrameSystemLimitsWeightsPerClass; readonly mandatory: FrameSystemLimitsWeightsPerClass; } - /** @name FrameSystemLimitsWeightsPerClass (314) */ + /** @name FrameSystemLimitsWeightsPerClass (311) */ interface FrameSystemLimitsWeightsPerClass extends Struct { readonly baseExtrinsic: SpWeightsWeightV2Weight; readonly maxExtrinsic: Option; @@ -2338,25 +2508,25 @@ declare module '@polkadot/types/lookup' { readonly reserved: Option; } - /** @name FrameSystemLimitsBlockLength (316) */ + /** @name FrameSystemLimitsBlockLength (313) */ interface FrameSystemLimitsBlockLength extends Struct { readonly max: FrameSupportDispatchPerDispatchClassU32; } - /** @name FrameSupportDispatchPerDispatchClassU32 (317) */ + /** @name FrameSupportDispatchPerDispatchClassU32 (314) */ interface FrameSupportDispatchPerDispatchClassU32 extends Struct { readonly normal: u32; readonly operational: u32; readonly mandatory: u32; } - /** @name SpWeightsRuntimeDbWeight (318) */ + /** @name SpWeightsRuntimeDbWeight (315) */ interface SpWeightsRuntimeDbWeight extends Struct { readonly read: u64; readonly write: u64; } - /** @name SpVersionRuntimeVersion (319) */ + /** @name SpVersionRuntimeVersion (316) */ interface SpVersionRuntimeVersion extends Struct { readonly specName: Text; readonly implName: Text; @@ -2365,10 +2535,10 @@ declare module '@polkadot/types/lookup' { readonly implVersion: u32; readonly apis: Vec>; readonly transactionVersion: u32; - readonly stateVersion: u8; + readonly systemVersion: u8; } - /** @name FrameSystemError (324) */ + /** @name FrameSystemError (321) */ interface FrameSystemError extends Enum { readonly isInvalidSpecName: boolean; readonly isSpecVersionNeedsToIncrease: boolean; @@ -2376,13 +2546,16 @@ declare module '@polkadot/types/lookup' { readonly isNonDefaultComposite: boolean; readonly isNonZeroRefCount: boolean; readonly isCallFiltered: boolean; - readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered'; + readonly isMultiBlockMigrationsOngoing: boolean; + readonly isNothingAuthorized: boolean; + readonly isUnauthorized: boolean; + readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered' | 'MultiBlockMigrationsOngoing' | 'NothingAuthorized' | 'Unauthorized'; } - /** @name SpConsensusBabeAppPublic (327) */ - interface SpConsensusBabeAppPublic extends SpCoreSr25519Public {} + /** @name SpConsensusBabeAppPublic (324) */ + interface SpConsensusBabeAppPublic extends U8aFixed {} - /** @name SpConsensusBabeDigestsNextConfigDescriptor (330) */ + /** @name SpConsensusBabeDigestsNextConfigDescriptor (327) */ interface SpConsensusBabeDigestsNextConfigDescriptor extends Enum { readonly isV1: boolean; readonly asV1: { @@ -2392,7 +2565,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'V1'; } - /** @name SpConsensusBabeAllowedSlots (332) */ + /** @name SpConsensusBabeAllowedSlots (329) */ interface SpConsensusBabeAllowedSlots extends Enum { readonly isPrimarySlots: boolean; readonly isPrimaryAndSecondaryPlainSlots: boolean; @@ -2400,7 +2573,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'PrimarySlots' | 'PrimaryAndSecondaryPlainSlots' | 'PrimaryAndSecondaryVRFSlots'; } - /** @name SpConsensusBabeDigestsPreDigest (336) */ + /** @name SpConsensusBabeDigestsPreDigest (333) */ interface SpConsensusBabeDigestsPreDigest extends Enum { readonly isPrimary: boolean; readonly asPrimary: SpConsensusBabeDigestsPrimaryPreDigest; @@ -2411,35 +2584,39 @@ declare module '@polkadot/types/lookup' { readonly type: 'Primary' | 'SecondaryPlain' | 'SecondaryVRF'; } - /** @name SpConsensusBabeDigestsPrimaryPreDigest (337) */ + /** @name SpConsensusBabeDigestsPrimaryPreDigest (334) */ interface SpConsensusBabeDigestsPrimaryPreDigest extends Struct { readonly authorityIndex: u32; readonly slot: u64; - readonly vrfOutput: U8aFixed; - readonly vrfProof: U8aFixed; + readonly vrfSignature: SpCoreSr25519VrfVrfSignature; + } + + /** @name SpCoreSr25519VrfVrfSignature (335) */ + interface SpCoreSr25519VrfVrfSignature extends Struct { + readonly preOutput: U8aFixed; + readonly proof: U8aFixed; } - /** @name SpConsensusBabeDigestsSecondaryPlainPreDigest (338) */ + /** @name SpConsensusBabeDigestsSecondaryPlainPreDigest (336) */ interface SpConsensusBabeDigestsSecondaryPlainPreDigest extends Struct { readonly authorityIndex: u32; readonly slot: u64; } - /** @name SpConsensusBabeDigestsSecondaryVRFPreDigest (339) */ + /** @name SpConsensusBabeDigestsSecondaryVRFPreDigest (337) */ interface SpConsensusBabeDigestsSecondaryVRFPreDigest extends Struct { readonly authorityIndex: u32; readonly slot: u64; - readonly vrfOutput: U8aFixed; - readonly vrfProof: U8aFixed; + readonly vrfSignature: SpCoreSr25519VrfVrfSignature; } - /** @name SpConsensusBabeBabeEpochConfiguration (340) */ + /** @name SpConsensusBabeBabeEpochConfiguration (338) */ interface SpConsensusBabeBabeEpochConfiguration extends Struct { readonly c: ITuple<[u64, u64]>; readonly allowedSlots: SpConsensusBabeAllowedSlots; } - /** @name PalletBabeCall (344) */ + /** @name PalletBabeCall (342) */ interface PalletBabeCall extends Enum { readonly isReportEquivocation: boolean; readonly asReportEquivocation: { @@ -2458,7 +2635,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'ReportEquivocation' | 'ReportEquivocationUnsigned' | 'PlanConfigChange'; } - /** @name SpConsensusSlotsEquivocationProof (345) */ + /** @name SpConsensusSlotsEquivocationProof (343) */ interface SpConsensusSlotsEquivocationProof extends Struct { readonly offender: SpConsensusBabeAppPublic; readonly slot: u64; @@ -2466,7 +2643,7 @@ declare module '@polkadot/types/lookup' { readonly secondHeader: SpRuntimeHeader; } - /** @name SpRuntimeHeader (346) */ + /** @name SpRuntimeHeader (344) */ interface SpRuntimeHeader extends Struct { readonly parentHash: H256; readonly number: Compact; @@ -2475,17 +2652,14 @@ declare module '@polkadot/types/lookup' { readonly digest: SpRuntimeDigest; } - /** @name SpRuntimeBlakeTwo256 (347) */ - type SpRuntimeBlakeTwo256 = Null; - - /** @name SpSessionMembershipProof (348) */ + /** @name SpSessionMembershipProof (345) */ interface SpSessionMembershipProof extends Struct { readonly session: u32; readonly trieNodes: Vec; readonly validatorCount: u32; } - /** @name PalletBabeError (349) */ + /** @name PalletBabeError (346) */ interface PalletBabeError extends Enum { readonly isInvalidEquivocationProof: boolean; readonly isInvalidKeyOwnershipProof: boolean; @@ -2494,7 +2668,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'InvalidEquivocationProof' | 'InvalidKeyOwnershipProof' | 'DuplicateOffenceReport' | 'InvalidConfiguration'; } - /** @name PalletTimestampCall (350) */ + /** @name PalletTimestampCall (347) */ interface PalletTimestampCall extends Enum { readonly isSet: boolean; readonly asSet: { @@ -2503,7 +2677,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Set'; } - /** @name PalletIndicesCall (352) */ + /** @name PalletIndicesCall (349) */ interface PalletIndicesCall extends Enum { readonly isClaim: boolean; readonly asClaim: { @@ -2528,10 +2702,14 @@ declare module '@polkadot/types/lookup' { readonly asFreeze: { readonly index: u32; } & Struct; - readonly type: 'Claim' | 'Transfer' | 'Free' | 'ForceTransfer' | 'Freeze'; + readonly isPokeDeposit: boolean; + readonly asPokeDeposit: { + readonly index: u32; + } & Struct; + readonly type: 'Claim' | 'Transfer' | 'Free' | 'ForceTransfer' | 'Freeze' | 'PokeDeposit'; } - /** @name PalletIndicesError (354) */ + /** @name PalletIndicesError (351) */ interface PalletIndicesError extends Enum { readonly isNotAssigned: boolean; readonly isNotOwner: boolean; @@ -2541,100 +2719,180 @@ declare module '@polkadot/types/lookup' { readonly type: 'NotAssigned' | 'NotOwner' | 'InUse' | 'NotTransfer' | 'Permanent'; } - /** @name PalletBalancesBalanceLock (356) */ + /** @name PalletBalancesBalanceLock (353) */ interface PalletBalancesBalanceLock extends Struct { readonly id: U8aFixed; readonly amount: u128; - readonly reasons: PolymeshCommonUtilitiesBalancesReasons; + readonly reasons: PalletBalancesReasons; } - /** @name PolymeshCommonUtilitiesBalancesReasons (357) */ - interface PolymeshCommonUtilitiesBalancesReasons extends Enum { + /** @name PalletBalancesReasons (354) */ + interface PalletBalancesReasons extends Enum { readonly isFee: boolean; readonly isMisc: boolean; readonly isAll: boolean; readonly type: 'Fee' | 'Misc' | 'All'; } - /** @name PalletBalancesCall (358) */ + /** @name PalletBalancesReserveData (357) */ + interface PalletBalancesReserveData extends Struct { + readonly id: U8aFixed; + readonly amount: u128; + } + + /** @name PolymeshRuntimeDevelopRuntimeRuntimeHoldReason (361) */ + interface PolymeshRuntimeDevelopRuntimeRuntimeHoldReason extends Enum { + readonly isStaking: boolean; + readonly asStaking: PalletStakingPalletHoldReason; + readonly isContracts: boolean; + readonly asContracts: PalletContractsHoldReason; + readonly isPreimage: boolean; + readonly asPreimage: PalletPreimageHoldReason; + readonly type: 'Staking' | 'Contracts' | 'Preimage'; + } + + /** @name PalletStakingPalletHoldReason (362) */ + interface PalletStakingPalletHoldReason extends Enum { + readonly isStaking: boolean; + readonly type: 'Staking'; + } + + /** @name PalletContractsHoldReason (363) */ + interface PalletContractsHoldReason extends Enum { + readonly isCodeUploadDepositReserve: boolean; + readonly isStorageDepositReserve: boolean; + readonly type: 'CodeUploadDepositReserve' | 'StorageDepositReserve'; + } + + /** @name PalletPreimageHoldReason (364) */ + interface PalletPreimageHoldReason extends Enum { + readonly isPreimage: boolean; + readonly type: 'Preimage'; + } + + /** @name FrameSupportTokensMiscIdAmount (367) */ + interface FrameSupportTokensMiscIdAmount extends Struct { + readonly id: U8aFixed; + readonly amount: u128; + } + + /** @name PalletBalancesCall (369) */ interface PalletBalancesCall extends Enum { - readonly isTransfer: boolean; - readonly asTransfer: { + readonly isTransferAllowDeath: boolean; + readonly asTransferAllowDeath: { readonly dest: MultiAddress; readonly value: Compact; } & Struct; - readonly isTransferWithMemo: boolean; - readonly asTransferWithMemo: { + readonly isForceTransfer: boolean; + readonly asForceTransfer: { + readonly source: MultiAddress; + readonly dest: MultiAddress; + readonly value: Compact; + } & Struct; + readonly isTransferKeepAlive: boolean; + readonly asTransferKeepAlive: { readonly dest: MultiAddress; readonly value: Compact; - readonly memo: Option; } & Struct; - readonly isDepositBlockRewardReserveBalance: boolean; - readonly asDepositBlockRewardReserveBalance: { - readonly value: Compact; + readonly isTransferAll: boolean; + readonly asTransferAll: { + readonly dest: MultiAddress; + readonly keepAlive: bool; + } & Struct; + readonly isForceUnreserve: boolean; + readonly asForceUnreserve: { + readonly who: MultiAddress; + readonly amount: u128; } & Struct; - readonly isSetBalance: boolean; - readonly asSetBalance: { + readonly isUpgradeAccounts: boolean; + readonly asUpgradeAccounts: { + readonly who: Vec; + } & Struct; + readonly isForceSetBalance: boolean; + readonly asForceSetBalance: { readonly who: MultiAddress; readonly newFree: Compact; - readonly newReserved: Compact; } & Struct; - readonly isForceTransfer: boolean; - readonly asForceTransfer: { - readonly source: MultiAddress; - readonly dest: MultiAddress; + readonly isForceAdjustTotalIssuance: boolean; + readonly asForceAdjustTotalIssuance: { + readonly direction: PalletBalancesAdjustmentDirection; + readonly delta: Compact; + } & Struct; + readonly isBurn: boolean; + readonly asBurn: { readonly value: Compact; + readonly keepAlive: bool; } & Struct; - readonly isBurnAccountBalance: boolean; - readonly asBurnAccountBalance: { - readonly amount: u128; + readonly isTransferWithMemo: boolean; + readonly asTransferWithMemo: { + readonly dest: MultiAddress; + readonly value: Compact; + readonly memo: Option; } & Struct; - readonly type: 'Transfer' | 'TransferWithMemo' | 'DepositBlockRewardReserveBalance' | 'SetBalance' | 'ForceTransfer' | 'BurnAccountBalance'; + readonly type: 'TransferAllowDeath' | 'ForceTransfer' | 'TransferKeepAlive' | 'TransferAll' | 'ForceUnreserve' | 'UpgradeAccounts' | 'ForceSetBalance' | 'ForceAdjustTotalIssuance' | 'Burn' | 'TransferWithMemo'; + } + + /** @name PalletBalancesAdjustmentDirection (370) */ + interface PalletBalancesAdjustmentDirection extends Enum { + readonly isIncrease: boolean; + readonly isDecrease: boolean; + readonly type: 'Increase' | 'Decrease'; } - /** @name PalletBalancesError (359) */ + /** @name PalletBalancesError (371) */ interface PalletBalancesError extends Enum { + readonly isVestingBalance: boolean; readonly isLiquidityRestrictions: boolean; - readonly isOverflow: boolean; readonly isInsufficientBalance: boolean; readonly isExistentialDeposit: boolean; - readonly isReceiverCddMissing: boolean; - readonly type: 'LiquidityRestrictions' | 'Overflow' | 'InsufficientBalance' | 'ExistentialDeposit' | 'ReceiverCddMissing'; + readonly isExpendability: boolean; + readonly isExistingVestingSchedule: boolean; + readonly isDeadAccount: boolean; + readonly isTooManyReserves: boolean; + readonly isTooManyHolds: boolean; + readonly isTooManyFreezes: boolean; + readonly isIssuanceDeactivated: boolean; + readonly isDeltaZero: boolean; + readonly isLockIdentifierNotFound: boolean; + readonly isOverflow: boolean; + readonly isMaxLocksExceeded: boolean; + readonly type: 'VestingBalance' | 'LiquidityRestrictions' | 'InsufficientBalance' | 'ExistentialDeposit' | 'Expendability' | 'ExistingVestingSchedule' | 'DeadAccount' | 'TooManyReserves' | 'TooManyHolds' | 'TooManyFreezes' | 'IssuanceDeactivated' | 'DeltaZero' | 'LockIdentifierNotFound' | 'Overflow' | 'MaxLocksExceeded'; } - /** @name PalletTransactionPaymentReleases (361) */ + /** @name PalletTransactionPaymentReleases (373) */ interface PalletTransactionPaymentReleases extends Enum { readonly isV1Ancient: boolean; readonly isV2: boolean; readonly type: 'V1Ancient' | 'V2'; } - /** @name SpWeightsWeightToFeeCoefficient (363) */ - interface SpWeightsWeightToFeeCoefficient extends Struct { - readonly coeffInteger: u128; - readonly coeffFrac: Perbill; - readonly negative: bool; - readonly degree: u8; + /** @name PalletTransactionPaymentCall (374) */ + interface PalletTransactionPaymentCall extends Enum { + readonly isSetDisableFees: boolean; + readonly asSetDisableFees: { + readonly value: bool; + } & Struct; + readonly type: 'SetDisableFees'; } - /** @name PolymeshPrimitivesIdentityDidRecord (364) */ + /** @name PolymeshPrimitivesIdentityDidRecord (375) */ interface PolymeshPrimitivesIdentityDidRecord extends Struct { readonly primaryKey: Option; } - /** @name PalletIdentityClaim1stKey (366) */ + /** @name PalletIdentityClaim1stKey (377) */ interface PalletIdentityClaim1stKey extends Struct { readonly target: PolymeshPrimitivesIdentityId; readonly claimType: PolymeshPrimitivesIdentityClaimClaimType; } - /** @name PalletIdentityClaim2ndKey (367) */ + /** @name PalletIdentityClaim2ndKey (378) */ interface PalletIdentityClaim2ndKey extends Struct { readonly issuer: PolymeshPrimitivesIdentityId; readonly scope: Option; } - /** @name PolymeshPrimitivesSecondaryKeyKeyRecord (368) */ + /** @name PolymeshPrimitivesSecondaryKeyKeyRecord (379) */ interface PolymeshPrimitivesSecondaryKeyKeyRecord extends Enum { readonly isPrimaryKey: boolean; readonly asPrimaryKey: PolymeshPrimitivesIdentityId; @@ -2645,7 +2903,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'PrimaryKey' | 'SecondaryKey' | 'MultiSigSignerKey'; } - /** @name PolymeshPrimitivesSecondaryKeySignatory (371) */ + /** @name PolymeshPrimitivesSecondaryKeySignatory (382) */ interface PolymeshPrimitivesSecondaryKeySignatory extends Enum { readonly isIdentity: boolean; readonly asIdentity: PolymeshPrimitivesIdentityId; @@ -2654,7 +2912,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Identity' | 'Account'; } - /** @name PolymeshPrimitivesAuthorization (372) */ + /** @name PolymeshPrimitivesAuthorization (383) */ interface PolymeshPrimitivesAuthorization extends Struct { readonly authorizationData: PolymeshPrimitivesAuthorizationAuthorizationData; readonly authorizedBy: PolymeshPrimitivesIdentityId; @@ -2663,7 +2921,7 @@ declare module '@polkadot/types/lookup' { readonly count: u32; } - /** @name PalletIdentityCall (376) */ + /** @name PalletIdentityCall (387) */ interface PalletIdentityCall extends Enum { readonly isCddRegisterDid: boolean; readonly asCddRegisterDid: { @@ -2774,19 +3032,19 @@ declare module '@polkadot/types/lookup' { readonly type: 'CddRegisterDid' | 'InvalidateCddClaims' | 'AcceptPrimaryKey' | 'ChangeCddRequirementForMkRotation' | 'JoinIdentityAsKey' | 'LeaveIdentityAsKey' | 'AddClaim' | 'RevokeClaim' | 'FreezeSecondaryKeys' | 'UnfreezeSecondaryKeys' | 'AddAuthorization' | 'RemoveAuthorization' | 'GcAddCddClaim' | 'GcRevokeCddClaim' | 'RevokeClaimByIndex' | 'RotatePrimaryKeyToSecondary' | 'AddSecondaryKeysWithAuthorization' | 'SetSecondaryKeyPermissions' | 'RemoveSecondaryKeys' | 'RegisterCustomClaimType' | 'CddRegisterDidWithCdd' | 'CreateChildIdentity' | 'CreateChildIdentities' | 'UnlinkChildIdentity'; } - /** @name PolymeshCommonUtilitiesIdentitySecondaryKeyWithAuth (378) */ + /** @name PolymeshCommonUtilitiesIdentitySecondaryKeyWithAuth (389) */ interface PolymeshCommonUtilitiesIdentitySecondaryKeyWithAuth extends Struct { readonly secondaryKey: PolymeshPrimitivesSecondaryKey; readonly authSignature: H512; } - /** @name PolymeshCommonUtilitiesIdentityCreateChildIdentityWithAuth (381) */ + /** @name PolymeshCommonUtilitiesIdentityCreateChildIdentityWithAuth (392) */ interface PolymeshCommonUtilitiesIdentityCreateChildIdentityWithAuth extends Struct { readonly key: AccountId32; readonly authSignature: H512; } - /** @name PalletIdentityError (382) */ + /** @name PalletIdentityError (393) */ interface PalletIdentityError extends Enum { readonly isAlreadyLinked: boolean; readonly isMissingIdentity: boolean; @@ -2810,7 +3068,6 @@ declare module '@polkadot/types/lookup' { readonly isFailedToChargeFee: boolean; readonly isNotASigner: boolean; readonly isCannotDecodeSignerAccountId: boolean; - readonly isMultiSigHasBalance: boolean; readonly isAccountKeyIsBeingUsed: boolean; readonly isCustomScopeTooLong: boolean; readonly isCustomClaimTypeAlreadyExists: boolean; @@ -2822,17 +3079,22 @@ declare module '@polkadot/types/lookup' { readonly isDuplicateKey: boolean; readonly isExceptNotAllowedForExtrinsics: boolean; readonly isExceededNumberOfGivenAuths: boolean; - readonly type: 'AlreadyLinked' | 'MissingIdentity' | 'Unauthorized' | 'InvalidAccountKey' | 'UnAuthorizedCddProvider' | 'InvalidAuthorizationFromOwner' | 'InvalidAuthorizationFromCddProvider' | 'NotCddProviderAttestation' | 'AuthorizationsNotForSameDids' | 'DidMustAlreadyExist' | 'AuthorizationExpired' | 'TargetHasNoCdd' | 'AuthorizationHasBeenRevoked' | 'InvalidAuthorizationSignature' | 'KeyNotAllowed' | 'NotPrimaryKey' | 'DidDoesNotExist' | 'DidAlreadyExists' | 'SecondaryKeysContainPrimaryKey' | 'FailedToChargeFee' | 'NotASigner' | 'CannotDecodeSignerAccountId' | 'MultiSigHasBalance' | 'AccountKeyIsBeingUsed' | 'CustomScopeTooLong' | 'CustomClaimTypeAlreadyExists' | 'CustomClaimTypeDoesNotExist' | 'ClaimDoesNotExist' | 'IsChildIdentity' | 'NoParentIdentity' | 'NotParentOrChildIdentity' | 'DuplicateKey' | 'ExceptNotAllowedForExtrinsics' | 'ExceededNumberOfGivenAuths'; + readonly isBadAuthorizationType: boolean; + readonly isInvalidAuthorization: boolean; + readonly isUnauthorizedCallerFrozenDid: boolean; + readonly isUnauthorizedCallerDidMissingCdd: boolean; + readonly isUnauthorizedCallerMissingPermissions: boolean; + readonly type: 'AlreadyLinked' | 'MissingIdentity' | 'Unauthorized' | 'InvalidAccountKey' | 'UnAuthorizedCddProvider' | 'InvalidAuthorizationFromOwner' | 'InvalidAuthorizationFromCddProvider' | 'NotCddProviderAttestation' | 'AuthorizationsNotForSameDids' | 'DidMustAlreadyExist' | 'AuthorizationExpired' | 'TargetHasNoCdd' | 'AuthorizationHasBeenRevoked' | 'InvalidAuthorizationSignature' | 'KeyNotAllowed' | 'NotPrimaryKey' | 'DidDoesNotExist' | 'DidAlreadyExists' | 'SecondaryKeysContainPrimaryKey' | 'FailedToChargeFee' | 'NotASigner' | 'CannotDecodeSignerAccountId' | 'AccountKeyIsBeingUsed' | 'CustomScopeTooLong' | 'CustomClaimTypeAlreadyExists' | 'CustomClaimTypeDoesNotExist' | 'ClaimDoesNotExist' | 'IsChildIdentity' | 'NoParentIdentity' | 'NotParentOrChildIdentity' | 'DuplicateKey' | 'ExceptNotAllowedForExtrinsics' | 'ExceededNumberOfGivenAuths' | 'BadAuthorizationType' | 'InvalidAuthorization' | 'UnauthorizedCallerFrozenDid' | 'UnauthorizedCallerDidMissingCdd' | 'UnauthorizedCallerMissingPermissions'; } - /** @name PolymeshCommonUtilitiesGroupInactiveMember (384) */ - interface PolymeshCommonUtilitiesGroupInactiveMember extends Struct { + /** @name PolymeshPrimitivesGroupInactiveMember (395) */ + interface PolymeshPrimitivesGroupInactiveMember extends Struct { readonly id: PolymeshPrimitivesIdentityId; readonly deactivatedAt: u64; readonly expiry: Option; } - /** @name PalletGroupCall (385) */ + /** @name PalletGroupCall (396) */ interface PalletGroupCall extends Enum { readonly isSetActiveMembersLimit: boolean; readonly asSetActiveMembersLimit: { @@ -2865,7 +3127,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'SetActiveMembersLimit' | 'DisableMember' | 'AddMember' | 'RemoveMember' | 'SwapMember' | 'ResetMembers' | 'AbdicateMembership'; } - /** @name PalletGroupError (386) */ + /** @name PalletGroupError (397) */ interface PalletGroupError extends Enum { readonly isOnlyPrimaryKeyAllowed: boolean; readonly isDuplicateMember: boolean; @@ -2876,7 +3138,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'OnlyPrimaryKeyAllowed' | 'DuplicateMember' | 'NoSuchMember' | 'LastMemberCannotQuit' | 'ActiveMembersLimitExceeded' | 'ActiveMembersLimitOverflow'; } - /** @name PalletCommitteeCall (388) */ + /** @name PalletCommitteeCall (399) */ interface PalletCommitteeCall extends Enum { readonly isSetVoteThreshold: boolean; readonly asSetVoteThreshold: { @@ -2889,7 +3151,7 @@ declare module '@polkadot/types/lookup' { } & Struct; readonly isSetExpiresAfter: boolean; readonly asSetExpiresAfter: { - readonly expiry: PolymeshCommonUtilitiesMaybeBlock; + readonly expiry: PolymeshPrimitivesMaybeBlock; } & Struct; readonly isVoteOrPropose: boolean; readonly asVoteOrPropose: { @@ -2905,7 +3167,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'SetVoteThreshold' | 'SetReleaseCoordinator' | 'SetExpiresAfter' | 'VoteOrPropose' | 'Vote'; } - /** @name PalletMultisigCall (394) */ + /** @name PalletMultisigCall (405) */ interface PalletMultisigCall extends Enum { readonly isCreateMultisig: boolean; readonly asCreateMultisig: { @@ -2923,7 +3185,7 @@ declare module '@polkadot/types/lookup' { readonly asApprove: { readonly multisig: AccountId32; readonly proposalId: u64; - readonly maxWeight: SpWeightsWeightV2Weight; + readonly maxWeight: Option; } & Struct; readonly isReject: boolean; readonly asReject: { @@ -2983,14 +3245,51 @@ declare module '@polkadot/types/lookup' { readonly asJoinIdentity: { readonly authId: u64; } & Struct; - readonly type: 'CreateMultisig' | 'CreateProposal' | 'Approve' | 'Reject' | 'AcceptMultisigSigner' | 'AddMultisigSigners' | 'RemoveMultisigSigners' | 'AddMultisigSignersViaAdmin' | 'RemoveMultisigSignersViaAdmin' | 'ChangeSigsRequired' | 'ChangeSigsRequiredViaAdmin' | 'AddAdmin' | 'RemoveAdminViaAdmin' | 'RemovePayer' | 'RemovePayerViaPayer' | 'ApproveJoinIdentity' | 'JoinIdentity'; + readonly isRemoveAdmin: boolean; + readonly type: 'CreateMultisig' | 'CreateProposal' | 'Approve' | 'Reject' | 'AcceptMultisigSigner' | 'AddMultisigSigners' | 'RemoveMultisigSigners' | 'AddMultisigSignersViaAdmin' | 'RemoveMultisigSignersViaAdmin' | 'ChangeSigsRequired' | 'ChangeSigsRequiredViaAdmin' | 'AddAdmin' | 'RemoveAdminViaAdmin' | 'RemovePayer' | 'RemovePayerViaPayer' | 'ApproveJoinIdentity' | 'JoinIdentity' | 'RemoveAdmin'; + } + + /** @name PalletValidatorsCall (407) */ + interface PalletValidatorsCall extends Enum { + readonly isAddPermissionedValidator: boolean; + readonly asAddPermissionedValidator: { + readonly identity: PolymeshPrimitivesIdentityId; + readonly intendedCount: Option; + } & Struct; + readonly isRemovePermissionedValidator: boolean; + readonly asRemovePermissionedValidator: { + readonly identity: PolymeshPrimitivesIdentityId; + } & Struct; + readonly isPayoutStakersBySystem: boolean; + readonly asPayoutStakersBySystem: { + readonly validatorStash: AccountId32; + readonly era: u32; + } & Struct; + readonly isChangeSlashingAllowedFor: boolean; + readonly asChangeSlashingAllowedFor: { + readonly slashingSwitch: PalletValidatorsSlashingSwitch; + } & Struct; + readonly isUpdatePermissionedValidatorIntendedCount: boolean; + readonly asUpdatePermissionedValidatorIntendedCount: { + readonly identity: PolymeshPrimitivesIdentityId; + readonly newIntendedCount: u32; + } & Struct; + readonly isChillFromGovernance: boolean; + readonly asChillFromGovernance: { + readonly identity: PolymeshPrimitivesIdentityId; + readonly stashKeys: Vec; + } & Struct; + readonly isSetCommissionCap: boolean; + readonly asSetCommissionCap: { + readonly newCap: Perbill; + } & Struct; + readonly type: 'AddPermissionedValidator' | 'RemovePermissionedValidator' | 'PayoutStakersBySystem' | 'ChangeSlashingAllowedFor' | 'UpdatePermissionedValidatorIntendedCount' | 'ChillFromGovernance' | 'SetCommissionCap'; } - /** @name PalletStakingPalletCall (396) */ + /** @name PalletStakingPalletCall (408) */ interface PalletStakingPalletCall extends Enum { readonly isBond: boolean; readonly asBond: { - readonly controller: MultiAddress; readonly value: Compact; readonly payee: PalletStakingRewardDestination; } & Struct; @@ -3020,9 +3319,6 @@ declare module '@polkadot/types/lookup' { readonly payee: PalletStakingRewardDestination; } & Struct; readonly isSetController: boolean; - readonly asSetController: { - readonly controller: MultiAddress; - } & Struct; readonly isSetValidatorCount: boolean; readonly asSetValidatorCount: { readonly new_: Compact; @@ -3078,10 +3374,11 @@ declare module '@polkadot/types/lookup' { readonly maxValidatorCount: PalletStakingPalletConfigOpU32; readonly chillThreshold: PalletStakingPalletConfigOpPercent; readonly minCommission: PalletStakingPalletConfigOpPerbill; + readonly maxStakedRewards: PalletStakingPalletConfigOpPercent; } & Struct; readonly isChillOther: boolean; readonly asChillOther: { - readonly controller: AccountId32; + readonly stash: AccountId32; } & Struct; readonly isForceApplyMinCommission: boolean; readonly asForceApplyMinCommission: { @@ -3091,57 +3388,41 @@ declare module '@polkadot/types/lookup' { readonly asSetMinCommission: { readonly new_: Perbill; } & Struct; - readonly isAddPermissionedValidator: boolean; - readonly asAddPermissionedValidator: { - readonly identity: PolymeshPrimitivesIdentityId; - readonly intendedCount: Option; - } & Struct; - readonly isRemovePermissionedValidator: boolean; - readonly asRemovePermissionedValidator: { - readonly identity: PolymeshPrimitivesIdentityId; - } & Struct; - readonly isValidateCddExpiryNominators: boolean; - readonly asValidateCddExpiryNominators: { - readonly targets: Vec; - } & Struct; - readonly isPayoutStakersBySystem: boolean; - readonly asPayoutStakersBySystem: { + readonly isPayoutStakersByPage: boolean; + readonly asPayoutStakersByPage: { readonly validatorStash: AccountId32; readonly era: u32; + readonly page: u32; } & Struct; - readonly isChangeSlashingAllowedFor: boolean; - readonly asChangeSlashingAllowedFor: { - readonly slashingSwitch: PalletStakingSlashingSwitch; + readonly isUpdatePayee: boolean; + readonly asUpdatePayee: { + readonly controller: AccountId32; } & Struct; - readonly isUpdatePermissionedValidatorIntendedCount: boolean; - readonly asUpdatePermissionedValidatorIntendedCount: { - readonly identity: PolymeshPrimitivesIdentityId; - readonly newIntendedCount: u32; + readonly isDeprecateControllerBatch: boolean; + readonly asDeprecateControllerBatch: { + readonly controllers: Vec; } & Struct; - readonly isChillFromGovernance: boolean; - readonly asChillFromGovernance: { - readonly identity: PolymeshPrimitivesIdentityId; - readonly stashKeys: Vec; + readonly isRestoreLedger: boolean; + readonly asRestoreLedger: { + readonly stash: AccountId32; + readonly maybeController: Option; + readonly maybeTotal: Option; + readonly maybeUnlocking: Option>; } & Struct; - readonly isSetCommissionCap: boolean; - readonly asSetCommissionCap: { - readonly newCap: Perbill; + readonly isMigrateCurrency: boolean; + readonly asMigrateCurrency: { + readonly stash: AccountId32; } & Struct; - readonly type: 'Bond' | 'BondExtra' | 'Unbond' | 'WithdrawUnbonded' | 'Validate' | 'Nominate' | 'Chill' | 'SetPayee' | 'SetController' | 'SetValidatorCount' | 'IncreaseValidatorCount' | 'ScaleValidatorCount' | 'ForceNoEras' | 'ForceNewEra' | 'SetInvulnerables' | 'ForceUnstake' | 'ForceNewEraAlways' | 'CancelDeferredSlash' | 'PayoutStakers' | 'Rebond' | 'ReapStash' | 'Kick' | 'SetStakingConfigs' | 'ChillOther' | 'ForceApplyMinCommission' | 'SetMinCommission' | 'AddPermissionedValidator' | 'RemovePermissionedValidator' | 'ValidateCddExpiryNominators' | 'PayoutStakersBySystem' | 'ChangeSlashingAllowedFor' | 'UpdatePermissionedValidatorIntendedCount' | 'ChillFromGovernance' | 'SetCommissionCap'; - } - - /** @name PalletStakingRewardDestination (397) */ - interface PalletStakingRewardDestination extends Enum { - readonly isStaked: boolean; - readonly isStash: boolean; - readonly isController: boolean; - readonly isAccount: boolean; - readonly asAccount: AccountId32; - readonly isNone: boolean; - readonly type: 'Staked' | 'Stash' | 'Controller' | 'Account' | 'None'; + readonly isManualSlash: boolean; + readonly asManualSlash: { + readonly validatorStash: AccountId32; + readonly era: u32; + readonly slashFraction: Perbill; + } & Struct; + readonly type: 'Bond' | 'BondExtra' | 'Unbond' | 'WithdrawUnbonded' | 'Validate' | 'Nominate' | 'Chill' | 'SetPayee' | 'SetController' | 'SetValidatorCount' | 'IncreaseValidatorCount' | 'ScaleValidatorCount' | 'ForceNoEras' | 'ForceNewEra' | 'SetInvulnerables' | 'ForceUnstake' | 'ForceNewEraAlways' | 'CancelDeferredSlash' | 'PayoutStakers' | 'Rebond' | 'ReapStash' | 'Kick' | 'SetStakingConfigs' | 'ChillOther' | 'ForceApplyMinCommission' | 'SetMinCommission' | 'PayoutStakersByPage' | 'UpdatePayee' | 'DeprecateControllerBatch' | 'RestoreLedger' | 'MigrateCurrency' | 'ManualSlash'; } - /** @name PalletStakingPalletConfigOpU128 (400) */ + /** @name PalletStakingPalletConfigOpU128 (412) */ interface PalletStakingPalletConfigOpU128 extends Enum { readonly isNoop: boolean; readonly isSet: boolean; @@ -3150,7 +3431,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Noop' | 'Set' | 'Remove'; } - /** @name PalletStakingPalletConfigOpU32 (401) */ + /** @name PalletStakingPalletConfigOpU32 (413) */ interface PalletStakingPalletConfigOpU32 extends Enum { readonly isNoop: boolean; readonly isSet: boolean; @@ -3159,7 +3440,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Noop' | 'Set' | 'Remove'; } - /** @name PalletStakingPalletConfigOpPercent (402) */ + /** @name PalletStakingPalletConfigOpPercent (414) */ interface PalletStakingPalletConfigOpPercent extends Enum { readonly isNoop: boolean; readonly isSet: boolean; @@ -3168,7 +3449,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Noop' | 'Set' | 'Remove'; } - /** @name PalletStakingPalletConfigOpPerbill (403) */ + /** @name PalletStakingPalletConfigOpPerbill (415) */ interface PalletStakingPalletConfigOpPerbill extends Enum { readonly isNoop: boolean; readonly isSet: boolean; @@ -3177,7 +3458,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'Noop' | 'Set' | 'Remove'; } - /** @name PalletSessionCall (405) */ + /** @name PalletStakingUnlockChunk (419) */ + interface PalletStakingUnlockChunk extends Struct { + readonly value: Compact; + readonly era: Compact; + } + + /** @name PalletSessionCall (421) */ interface PalletSessionCall extends Enum { readonly isSetKeys: boolean; readonly asSetKeys: { @@ -3188,7 +3475,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'SetKeys' | 'PurgeKeys'; } - /** @name PolymeshRuntimeDevelopRuntimeSessionKeys (406) */ + /** @name PolymeshRuntimeDevelopRuntimeSessionKeys (422) */ interface PolymeshRuntimeDevelopRuntimeSessionKeys extends Struct { readonly grandpa: SpConsensusGrandpaAppPublic; readonly babe: SpConsensusBabeAppPublic; @@ -3196,10 +3483,10 @@ declare module '@polkadot/types/lookup' { readonly authorityDiscovery: SpAuthorityDiscoveryAppPublic; } - /** @name SpAuthorityDiscoveryAppPublic (407) */ - interface SpAuthorityDiscoveryAppPublic extends SpCoreSr25519Public {} + /** @name SpAuthorityDiscoveryAppPublic (423) */ + interface SpAuthorityDiscoveryAppPublic extends U8aFixed {} - /** @name PalletGrandpaCall (408) */ + /** @name PalletGrandpaCall (424) */ interface PalletGrandpaCall extends Enum { readonly isReportEquivocation: boolean; readonly asReportEquivocation: { @@ -3219,13 +3506,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'ReportEquivocation' | 'ReportEquivocationUnsigned' | 'NoteStalled'; } - /** @name SpConsensusGrandpaEquivocationProof (409) */ + /** @name SpConsensusGrandpaEquivocationProof (425) */ interface SpConsensusGrandpaEquivocationProof extends Struct { readonly setId: u64; readonly equivocation: SpConsensusGrandpaEquivocation; } - /** @name SpConsensusGrandpaEquivocation (410) */ + /** @name SpConsensusGrandpaEquivocation (426) */ interface SpConsensusGrandpaEquivocation extends Enum { readonly isPrevote: boolean; readonly asPrevote: FinalityGrandpaEquivocationPrevote; @@ -3234,7 +3521,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Prevote' | 'Precommit'; } - /** @name FinalityGrandpaEquivocationPrevote (411) */ + /** @name FinalityGrandpaEquivocationPrevote (427) */ interface FinalityGrandpaEquivocationPrevote extends Struct { readonly roundNumber: u64; readonly identity: SpConsensusGrandpaAppPublic; @@ -3242,19 +3529,16 @@ declare module '@polkadot/types/lookup' { readonly second: ITuple<[FinalityGrandpaPrevote, SpConsensusGrandpaAppSignature]>; } - /** @name FinalityGrandpaPrevote (412) */ + /** @name FinalityGrandpaPrevote (428) */ interface FinalityGrandpaPrevote extends Struct { readonly targetHash: H256; readonly targetNumber: u32; } - /** @name SpConsensusGrandpaAppSignature (413) */ - interface SpConsensusGrandpaAppSignature extends SpCoreEd25519Signature {} + /** @name SpConsensusGrandpaAppSignature (429) */ + interface SpConsensusGrandpaAppSignature extends U8aFixed {} - /** @name SpCoreEd25519Signature (414) */ - interface SpCoreEd25519Signature extends U8aFixed {} - - /** @name FinalityGrandpaEquivocationPrecommit (416) */ + /** @name FinalityGrandpaEquivocationPrecommit (431) */ interface FinalityGrandpaEquivocationPrecommit extends Struct { readonly roundNumber: u64; readonly identity: SpConsensusGrandpaAppPublic; @@ -3262,13 +3546,13 @@ declare module '@polkadot/types/lookup' { readonly second: ITuple<[FinalityGrandpaPrecommit, SpConsensusGrandpaAppSignature]>; } - /** @name FinalityGrandpaPrecommit (417) */ + /** @name FinalityGrandpaPrecommit (432) */ interface FinalityGrandpaPrecommit extends Struct { readonly targetHash: H256; readonly targetNumber: u32; } - /** @name PalletImOnlineCall (419) */ + /** @name PalletImOnlineCall (434) */ interface PalletImOnlineCall extends Enum { readonly isHeartbeat: boolean; readonly asHeartbeat: { @@ -3278,28 +3562,18 @@ declare module '@polkadot/types/lookup' { readonly type: 'Heartbeat'; } - /** @name PalletImOnlineHeartbeat (420) */ + /** @name PalletImOnlineHeartbeat (435) */ interface PalletImOnlineHeartbeat extends Struct { readonly blockNumber: u32; - readonly networkState: SpCoreOffchainOpaqueNetworkState; readonly sessionIndex: u32; readonly authorityIndex: u32; readonly validatorsLen: u32; } - /** @name SpCoreOffchainOpaqueNetworkState (421) */ - interface SpCoreOffchainOpaqueNetworkState extends Struct { - readonly peerId: OpaquePeerId; - readonly externalAddresses: Vec; - } - - /** @name PalletImOnlineSr25519AppSr25519Signature (425) */ - interface PalletImOnlineSr25519AppSr25519Signature extends SpCoreSr25519Signature {} - - /** @name SpCoreSr25519Signature (426) */ - interface SpCoreSr25519Signature extends U8aFixed {} + /** @name PalletImOnlineSr25519AppSr25519Signature (436) */ + interface PalletImOnlineSr25519AppSr25519Signature extends U8aFixed {} - /** @name PalletSudoCall (427) */ + /** @name PalletSudoCall (437) */ interface PalletSudoCall extends Enum { readonly isSudo: boolean; readonly asSudo: { @@ -3322,7 +3596,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Sudo' | 'SudoUncheckedWeight' | 'SetKey' | 'SudoAs'; } - /** @name PalletAssetCall (428) */ + /** @name PalletAssetCall (438) */ interface PalletAssetCall extends Enum { readonly isRegisterUniqueTicker: boolean; readonly asRegisterUniqueTicker: { @@ -3386,7 +3660,7 @@ declare module '@polkadot/types/lookup' { readonly isSetFundingRound: boolean; readonly asSetFundingRound: { readonly assetId: PolymeshPrimitivesAssetAssetId; - readonly foundingRoundName: Bytes; + readonly fundingRoundName: Bytes; } & Struct; readonly isUpdateIdentifiers: boolean; readonly asUpdateIdentifiers: { @@ -3489,11 +3763,21 @@ declare module '@polkadot/types/lookup' { readonly ticker: PolymeshPrimitivesTicker; readonly assetId: PolymeshPrimitivesAssetAssetId; } & Struct; - readonly type: 'RegisterUniqueTicker' | 'AcceptTickerTransfer' | 'AcceptAssetOwnershipTransfer' | 'CreateAsset' | 'Freeze' | 'Unfreeze' | 'RenameAsset' | 'Issue' | 'Redeem' | 'MakeDivisible' | 'AddDocuments' | 'RemoveDocuments' | 'SetFundingRound' | 'UpdateIdentifiers' | 'ControllerTransfer' | 'RegisterCustomAssetType' | 'CreateAssetWithCustomType' | 'SetAssetMetadata' | 'SetAssetMetadataDetails' | 'RegisterAndSetLocalAssetMetadata' | 'RegisterAssetMetadataLocalType' | 'RegisterAssetMetadataGlobalType' | 'UpdateAssetType' | 'RemoveLocalMetadataKey' | 'RemoveMetadataValue' | 'ExemptAssetAffirmation' | 'RemoveAssetAffirmationExemption' | 'PreApproveAsset' | 'RemoveAssetPreApproval' | 'AddMandatoryMediators' | 'RemoveMandatoryMediators' | 'LinkTickerToAssetId'; + readonly isUnlinkTickerFromAssetId: boolean; + readonly asUnlinkTickerFromAssetId: { + readonly ticker: PolymeshPrimitivesTicker; + readonly assetId: PolymeshPrimitivesAssetAssetId; + } & Struct; + readonly isUpdateGlobalMetadataSpec: boolean; + readonly asUpdateGlobalMetadataSpec: { + readonly assetMetadataName: Bytes; + readonly assetMetadataSpec: PolymeshPrimitivesAssetMetadataAssetMetadataSpec; + } & Struct; + readonly type: 'RegisterUniqueTicker' | 'AcceptTickerTransfer' | 'AcceptAssetOwnershipTransfer' | 'CreateAsset' | 'Freeze' | 'Unfreeze' | 'RenameAsset' | 'Issue' | 'Redeem' | 'MakeDivisible' | 'AddDocuments' | 'RemoveDocuments' | 'SetFundingRound' | 'UpdateIdentifiers' | 'ControllerTransfer' | 'RegisterCustomAssetType' | 'CreateAssetWithCustomType' | 'SetAssetMetadata' | 'SetAssetMetadataDetails' | 'RegisterAndSetLocalAssetMetadata' | 'RegisterAssetMetadataLocalType' | 'RegisterAssetMetadataGlobalType' | 'UpdateAssetType' | 'RemoveLocalMetadataKey' | 'RemoveMetadataValue' | 'ExemptAssetAffirmation' | 'RemoveAssetAffirmationExemption' | 'PreApproveAsset' | 'RemoveAssetPreApproval' | 'AddMandatoryMediators' | 'RemoveMandatoryMediators' | 'LinkTickerToAssetId' | 'UnlinkTickerFromAssetId' | 'UpdateGlobalMetadataSpec'; } - /** @name PalletCorporateActionsDistributionCall (431) */ - interface PalletCorporateActionsDistributionCall extends Enum { + /** @name PalletCorporateActionsDistributionPalletCall (441) */ + interface PalletCorporateActionsDistributionPalletCall extends Enum { readonly isDistribute: boolean; readonly asDistribute: { readonly caId: PalletCorporateActionsCaId; @@ -3524,8 +3808,8 @@ declare module '@polkadot/types/lookup' { readonly type: 'Distribute' | 'Claim' | 'PushBenefit' | 'Reclaim' | 'RemoveDistribution'; } - /** @name PalletAssetCheckpointCall (433) */ - interface PalletAssetCheckpointCall extends Enum { + /** @name PalletAssetCheckpointPalletCall (443) */ + interface PalletAssetCheckpointPalletCall extends Enum { readonly isCreateCheckpoint: boolean; readonly asCreateCheckpoint: { readonly assetId: PolymeshPrimitivesAssetAssetId; @@ -3547,7 +3831,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'CreateCheckpoint' | 'SetSchedulesMaxComplexity' | 'CreateSchedule' | 'RemoveSchedule'; } - /** @name PalletComplianceManagerCall (434) */ + /** @name PalletComplianceManagerCall (444) */ interface PalletComplianceManagerCall extends Enum { readonly isAddComplianceRequirement: boolean; readonly asAddComplianceRequirement: { @@ -3595,7 +3879,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'AddComplianceRequirement' | 'RemoveComplianceRequirement' | 'ReplaceAssetCompliance' | 'ResetAssetCompliance' | 'PauseAssetCompliance' | 'ResumeAssetCompliance' | 'AddDefaultTrustedClaimIssuer' | 'RemoveDefaultTrustedClaimIssuer' | 'ChangeComplianceRequirement'; } - /** @name PalletCorporateActionsCall (435) */ + /** @name PalletCorporateActionsCall (445) */ interface PalletCorporateActionsCall extends Enum { readonly isSetMaxDetailsLength: boolean; readonly asSetMaxDetailsLength: { @@ -3652,10 +3936,17 @@ declare module '@polkadot/types/lookup' { readonly paymentAt: u64; readonly expiresAt: Option; } & Struct; - readonly type: 'SetMaxDetailsLength' | 'SetDefaultTargets' | 'SetDefaultWithholdingTax' | 'SetDidWithholdingTax' | 'InitiateCorporateAction' | 'LinkCaDoc' | 'RemoveCa' | 'ChangeRecordDate' | 'InitiateCorporateActionAndDistribute'; + readonly isInitiateCorporateActionAndBallot: boolean; + readonly asInitiateCorporateActionAndBallot: { + readonly caArgs: PalletCorporateActionsInitiateCorporateActionArgs; + readonly ballotTimeRange: PalletCorporateActionsBallotBallotTimeRange; + readonly ballotMeta: PalletCorporateActionsBallotBallotMeta; + readonly rcv: bool; + } & Struct; + readonly type: 'SetMaxDetailsLength' | 'SetDefaultTargets' | 'SetDefaultWithholdingTax' | 'SetDidWithholdingTax' | 'InitiateCorporateAction' | 'LinkCaDoc' | 'RemoveCa' | 'ChangeRecordDate' | 'InitiateCorporateActionAndDistribute' | 'InitiateCorporateActionAndBallot'; } - /** @name PalletCorporateActionsRecordDateSpec (437) */ + /** @name PalletCorporateActionsRecordDateSpec (447) */ interface PalletCorporateActionsRecordDateSpec extends Enum { readonly isScheduled: boolean; readonly asScheduled: u64; @@ -3666,7 +3957,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Scheduled' | 'ExistingSchedule' | 'Existing'; } - /** @name PalletCorporateActionsInitiateCorporateActionArgs (440) */ + /** @name PalletCorporateActionsInitiateCorporateActionArgs (450) */ interface PalletCorporateActionsInitiateCorporateActionArgs extends Struct { readonly assetId: PolymeshPrimitivesAssetAssetId; readonly kind: PalletCorporateActionsCaKind; @@ -3678,8 +3969,8 @@ declare module '@polkadot/types/lookup' { readonly withholdingTax: Option>>; } - /** @name PalletCorporateActionsBallotCall (441) */ - interface PalletCorporateActionsBallotCall extends Enum { + /** @name PalletCorporateActionsBallotPalletCall (451) */ + interface PalletCorporateActionsBallotPalletCall extends Enum { readonly isAttachBallot: boolean; readonly asAttachBallot: { readonly caId: PalletCorporateActionsCaId; @@ -3714,7 +4005,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'AttachBallot' | 'Vote' | 'ChangeEnd' | 'ChangeMeta' | 'ChangeRcv' | 'RemoveBallot'; } - /** @name PalletPipsCall (442) */ + /** @name PalletPipsCall (452) */ interface PalletPipsCall extends Enum { readonly isSetPruneHistoricalPips: boolean; readonly asSetPruneHistoricalPips: { @@ -3730,7 +4021,7 @@ declare module '@polkadot/types/lookup' { } & Struct; readonly isSetPendingPipExpiry: boolean; readonly asSetPendingPipExpiry: { - readonly expiry: PolymeshCommonUtilitiesMaybeBlock; + readonly expiry: PolymeshPrimitivesMaybeBlock; } & Struct; readonly isSetMaxPipSkipCount: boolean; readonly asSetMaxPipSkipCount: { @@ -3788,7 +4079,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'SetPruneHistoricalPips' | 'SetMinProposalDeposit' | 'SetDefaultEnactmentPeriod' | 'SetPendingPipExpiry' | 'SetMaxPipSkipCount' | 'SetActivePipLimit' | 'Propose' | 'Vote' | 'ApproveCommitteeProposal' | 'RejectProposal' | 'PruneProposal' | 'RescheduleExecution' | 'ClearSnapshot' | 'Snapshot' | 'EnactSnapshotResults' | 'ExecuteScheduledPip' | 'ExpireScheduledPip'; } - /** @name PalletPipsSnapshotResult (445) */ + /** @name PalletPipsSnapshotResult (455) */ interface PalletPipsSnapshotResult extends Enum { readonly isApprove: boolean; readonly isReject: boolean; @@ -3796,7 +4087,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Approve' | 'Reject' | 'Skip'; } - /** @name PalletPortfolioCall (446) */ + /** @name PalletPortfolioCall (456) */ interface PalletPortfolioCall extends Enum { readonly isCreatePortfolio: boolean; readonly asCreatePortfolio: { @@ -3851,13 +4142,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'CreatePortfolio' | 'DeletePortfolio' | 'RenamePortfolio' | 'QuitPortfolioCustody' | 'AcceptPortfolioCustody' | 'MovePortfolioFunds' | 'PreApprovePortfolio' | 'RemovePortfolioPreApproval' | 'AllowIdentityToCreatePortfolios' | 'RevokeCreatePortfoliosPermission' | 'CreateCustodyPortfolio'; } - /** @name PolymeshPrimitivesPortfolioFund (448) */ + /** @name PolymeshPrimitivesPortfolioFund (458) */ interface PolymeshPrimitivesPortfolioFund extends Struct { readonly description: PolymeshPrimitivesPortfolioFundDescription; readonly memo: Option; } - /** @name PalletProtocolFeeCall (449) */ + /** @name PalletProtocolFeeCall (459) */ interface PalletProtocolFeeCall extends Enum { readonly isChangeCoefficient: boolean; readonly asChangeCoefficient: { @@ -3871,7 +4162,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'ChangeCoefficient' | 'ChangeBaseFee'; } - /** @name PolymeshCommonUtilitiesProtocolFeeProtocolOp (450) */ + /** @name PolymeshCommonUtilitiesProtocolFeeProtocolOp (460) */ interface PolymeshCommonUtilitiesProtocolFeeProtocolOp extends Enum { readonly isAssetRegisterTicker: boolean; readonly isAssetIssue: boolean; @@ -3892,7 +4183,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'AssetRegisterTicker' | 'AssetIssue' | 'AssetAddDocuments' | 'AssetCreateAsset' | 'CheckpointCreateSchedule' | 'ComplianceManagerAddComplianceRequirement' | 'IdentityCddRegisterDid' | 'IdentityAddClaim' | 'IdentityAddSecondaryKeysWithAuthorization' | 'PipsPropose' | 'ContractsPutCode' | 'CorporateBallotAttachBallot' | 'CapitalDistributionDistribute' | 'NftCreateCollection' | 'NftMint' | 'IdentityCreateChildIdentity'; } - /** @name PalletSchedulerCall (451) */ + /** @name PalletSchedulerCall (461) */ interface PalletSchedulerCall extends Enum { readonly isSchedule: boolean; readonly asSchedule: { @@ -3933,10 +4224,30 @@ declare module '@polkadot/types/lookup' { readonly priority: u8; readonly call: Call; } & Struct; - readonly type: 'Schedule' | 'Cancel' | 'ScheduleNamed' | 'CancelNamed' | 'ScheduleAfter' | 'ScheduleNamedAfter'; + readonly isSetRetry: boolean; + readonly asSetRetry: { + readonly task: ITuple<[u32, u32]>; + readonly retries: u8; + readonly period: u32; + } & Struct; + readonly isSetRetryNamed: boolean; + readonly asSetRetryNamed: { + readonly id: U8aFixed; + readonly retries: u8; + readonly period: u32; + } & Struct; + readonly isCancelRetry: boolean; + readonly asCancelRetry: { + readonly task: ITuple<[u32, u32]>; + } & Struct; + readonly isCancelRetryNamed: boolean; + readonly asCancelRetryNamed: { + readonly id: U8aFixed; + } & Struct; + readonly type: 'Schedule' | 'Cancel' | 'ScheduleNamed' | 'CancelNamed' | 'ScheduleAfter' | 'ScheduleNamedAfter' | 'SetRetry' | 'SetRetryNamed' | 'CancelRetry' | 'CancelRetryNamed'; } - /** @name PalletSettlementCall (453) */ + /** @name PalletSettlementCall (463) */ interface PalletSettlementCall extends Enum { readonly isCreateVenue: boolean; readonly asCreateVenue: { @@ -3958,7 +4269,7 @@ declare module '@polkadot/types/lookup' { readonly asAffirmWithReceipts: { readonly id: u64; readonly receiptDetails: Vec; - readonly portfolios: Vec; + readonly portfolios: BTreeSet; } & Struct; readonly isSetVenueFiltering: boolean; readonly asSetVenueFiltering: { @@ -4006,18 +4317,18 @@ declare module '@polkadot/types/lookup' { readonly tradeDate: Option; readonly valueDate: Option; readonly legs: Vec; - readonly portfolios: Vec; + readonly portfolios: BTreeSet; readonly instructionMemo: Option; } & Struct; readonly isAffirmInstruction: boolean; readonly asAffirmInstruction: { readonly id: u64; - readonly portfolios: Vec; + readonly portfolios: BTreeSet; } & Struct; readonly isWithdrawAffirmation: boolean; readonly asWithdrawAffirmation: { readonly id: u64; - readonly portfolios: Vec; + readonly portfolios: BTreeSet; } & Struct; readonly isRejectInstruction: boolean; readonly asRejectInstruction: { @@ -4033,13 +4344,13 @@ declare module '@polkadot/types/lookup' { readonly asAffirmWithReceiptsWithCount: { readonly id: u64; readonly receiptDetails: Vec; - readonly portfolios: Vec; + readonly portfolios: BTreeSet; readonly numberOfAssets: Option; } & Struct; readonly isAffirmInstructionWithCount: boolean; readonly asAffirmInstructionWithCount: { readonly id: u64; - readonly portfolios: Vec; + readonly portfolios: BTreeSet; readonly numberOfAssets: Option; } & Struct; readonly isRejectInstructionWithCount: boolean; @@ -4051,7 +4362,7 @@ declare module '@polkadot/types/lookup' { readonly isWithdrawAffirmationWithCount: boolean; readonly asWithdrawAffirmationWithCount: { readonly id: u64; - readonly portfolios: Vec; + readonly portfolios: BTreeSet; readonly numberOfAssets: Option; } & Struct; readonly isAddInstructionWithMediators: boolean; @@ -4071,7 +4382,7 @@ declare module '@polkadot/types/lookup' { readonly tradeDate: Option; readonly valueDate: Option; readonly legs: Vec; - readonly portfolios: Vec; + readonly portfolios: BTreeSet; readonly instructionMemo: Option; readonly mediators: BTreeSet; } & Struct; @@ -4089,10 +4400,15 @@ declare module '@polkadot/types/lookup' { readonly instructionId: u64; readonly numberOfAssets: Option; } & Struct; - readonly type: 'CreateVenue' | 'UpdateVenueDetails' | 'UpdateVenueType' | 'AffirmWithReceipts' | 'SetVenueFiltering' | 'AllowVenues' | 'DisallowVenues' | 'UpdateVenueSigners' | 'ExecuteManualInstruction' | 'AddInstruction' | 'AddAndAffirmInstruction' | 'AffirmInstruction' | 'WithdrawAffirmation' | 'RejectInstruction' | 'ExecuteScheduledInstruction' | 'AffirmWithReceiptsWithCount' | 'AffirmInstructionWithCount' | 'RejectInstructionWithCount' | 'WithdrawAffirmationWithCount' | 'AddInstructionWithMediators' | 'AddAndAffirmWithMediators' | 'AffirmInstructionAsMediator' | 'WithdrawAffirmationAsMediator' | 'RejectInstructionAsMediator'; + readonly isLockInstruction: boolean; + readonly asLockInstruction: { + readonly instId: u64; + readonly weightLimit: SpWeightsWeightV2Weight; + } & Struct; + readonly type: 'CreateVenue' | 'UpdateVenueDetails' | 'UpdateVenueType' | 'AffirmWithReceipts' | 'SetVenueFiltering' | 'AllowVenues' | 'DisallowVenues' | 'UpdateVenueSigners' | 'ExecuteManualInstruction' | 'AddInstruction' | 'AddAndAffirmInstruction' | 'AffirmInstruction' | 'WithdrawAffirmation' | 'RejectInstruction' | 'ExecuteScheduledInstruction' | 'AffirmWithReceiptsWithCount' | 'AffirmInstructionWithCount' | 'RejectInstructionWithCount' | 'WithdrawAffirmationWithCount' | 'AddInstructionWithMediators' | 'AddAndAffirmWithMediators' | 'AffirmInstructionAsMediator' | 'WithdrawAffirmationAsMediator' | 'RejectInstructionAsMediator' | 'LockInstruction'; } - /** @name PolymeshPrimitivesSettlementReceiptDetails (455) */ + /** @name PolymeshPrimitivesSettlementReceiptDetails (465) */ interface PolymeshPrimitivesSettlementReceiptDetails extends Struct { readonly uid: u64; readonly instructionId: u64; @@ -4102,35 +4418,32 @@ declare module '@polkadot/types/lookup' { readonly metadata: Option; } - /** @name SpRuntimeMultiSignature (456) */ + /** @name SpRuntimeMultiSignature (466) */ interface SpRuntimeMultiSignature extends Enum { readonly isEd25519: boolean; - readonly asEd25519: SpCoreEd25519Signature; + readonly asEd25519: U8aFixed; readonly isSr25519: boolean; - readonly asSr25519: SpCoreSr25519Signature; + readonly asSr25519: U8aFixed; readonly isEcdsa: boolean; - readonly asEcdsa: SpCoreEcdsaSignature; + readonly asEcdsa: U8aFixed; readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa'; } - /** @name SpCoreEcdsaSignature (457) */ - interface SpCoreEcdsaSignature extends U8aFixed {} - - /** @name PolymeshPrimitivesSettlementAffirmationCount (460) */ + /** @name PolymeshPrimitivesSettlementAffirmationCount (470) */ interface PolymeshPrimitivesSettlementAffirmationCount extends Struct { readonly senderAssetCount: PolymeshPrimitivesSettlementAssetCount; readonly receiverAssetCount: PolymeshPrimitivesSettlementAssetCount; readonly offchainCount: u32; } - /** @name PolymeshPrimitivesSettlementAssetCount (461) */ + /** @name PolymeshPrimitivesSettlementAssetCount (471) */ interface PolymeshPrimitivesSettlementAssetCount extends Struct { readonly fungible: u32; readonly nonFungible: u32; readonly offChain: u32; } - /** @name PalletStatisticsCall (464) */ + /** @name PalletStatisticsCall (474) */ interface PalletStatisticsCall extends Enum { readonly isSetActiveAssetStats: boolean; readonly asSetActiveAssetStats: { @@ -4157,7 +4470,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'SetActiveAssetStats' | 'BatchUpdateAssetStats' | 'SetAssetTransferCompliance' | 'SetEntitiesExempt'; } - /** @name PalletStoCall (468) */ + /** @name PalletStoCall (478) */ interface PalletStoCall extends Enum { readonly isCreateFundraiser: boolean; readonly asCreateFundraiser: { @@ -4174,46 +4487,68 @@ declare module '@polkadot/types/lookup' { } & Struct; readonly isInvest: boolean; readonly asInvest: { - readonly investmentPortfolio: PolymeshPrimitivesIdentityIdPortfolioId; - readonly fundingPortfolio: PolymeshPrimitivesIdentityIdPortfolioId; readonly offeringAsset: PolymeshPrimitivesAssetAssetId; - readonly id: u64; + readonly fundraiserId: u64; + readonly investmentPortfolio: PolymeshPrimitivesIdentityIdPortfolioId; + readonly funding: PalletStoFundingMethod; readonly purchaseAmount: u128; readonly maxPrice: Option; - readonly receipt: Option; } & Struct; readonly isFreezeFundraiser: boolean; readonly asFreezeFundraiser: { readonly offeringAsset: PolymeshPrimitivesAssetAssetId; - readonly id: u64; + readonly fundraiserId: u64; } & Struct; readonly isUnfreezeFundraiser: boolean; readonly asUnfreezeFundraiser: { readonly offeringAsset: PolymeshPrimitivesAssetAssetId; - readonly id: u64; + readonly fundraiserId: u64; } & Struct; readonly isModifyFundraiserWindow: boolean; readonly asModifyFundraiserWindow: { readonly offeringAsset: PolymeshPrimitivesAssetAssetId; - readonly id: u64; + readonly fundraiserId: u64; readonly start: u64; readonly end: Option; } & Struct; readonly isStop: boolean; readonly asStop: { readonly offeringAsset: PolymeshPrimitivesAssetAssetId; - readonly id: u64; + readonly fundraiserId: u64; + } & Struct; + readonly isEnableOffchainFunding: boolean; + readonly asEnableOffchainFunding: { + readonly offeringAsset: PolymeshPrimitivesAssetAssetId; + readonly fundraiserId: u64; + readonly ticker: PolymeshPrimitivesTicker; } & Struct; - readonly type: 'CreateFundraiser' | 'Invest' | 'FreezeFundraiser' | 'UnfreezeFundraiser' | 'ModifyFundraiserWindow' | 'Stop'; + readonly type: 'CreateFundraiser' | 'Invest' | 'FreezeFundraiser' | 'UnfreezeFundraiser' | 'ModifyFundraiserWindow' | 'Stop' | 'EnableOffchainFunding'; } - /** @name PalletStoPriceTier (470) */ + /** @name PalletStoPriceTier (480) */ interface PalletStoPriceTier extends Struct { readonly total: u128; readonly price: u128; } - /** @name PalletTreasuryCall (472) */ + /** @name PalletStoFundingMethod (481) */ + interface PalletStoFundingMethod extends Enum { + readonly isOnChain: boolean; + readonly asOnChain: PolymeshPrimitivesIdentityIdPortfolioId; + readonly isOffChain: boolean; + readonly asOffChain: PolymeshPrimitivesStoFundraiserReceiptDetails; + readonly type: 'OnChain' | 'OffChain'; + } + + /** @name PolymeshPrimitivesStoFundraiserReceiptDetails (482) */ + interface PolymeshPrimitivesStoFundraiserReceiptDetails extends Struct { + readonly uid: u64; + readonly signer: AccountId32; + readonly signature: SpRuntimeMultiSignature; + readonly metadata: Option; + } + + /** @name PalletTreasuryCall (483) */ interface PalletTreasuryCall extends Enum { readonly isDisbursement: boolean; readonly asDisbursement: { @@ -4226,13 +4561,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'Disbursement' | 'Reimbursement'; } - /** @name PolymeshPrimitivesBeneficiary (474) */ + /** @name PolymeshPrimitivesBeneficiary (485) */ interface PolymeshPrimitivesBeneficiary extends Struct { readonly id: PolymeshPrimitivesIdentityId; readonly amount: u128; } - /** @name PalletUtilityCall (475) */ + /** @name PalletUtilityCall (486) */ interface PalletUtilityCall extends Enum { readonly isBatch: boolean; readonly asBatch: { @@ -4262,47 +4597,34 @@ declare module '@polkadot/types/lookup' { readonly call: Call; readonly weight: SpWeightsWeightV2Weight; } & Struct; - readonly isBatchOld: boolean; - readonly asBatchOld: { - readonly calls: Vec; - } & Struct; - readonly isBatchAtomic: boolean; - readonly asBatchAtomic: { - readonly calls: Vec; - } & Struct; - readonly isBatchOptimistic: boolean; - readonly asBatchOptimistic: { - readonly calls: Vec; - } & Struct; readonly isAsDerivative: boolean; readonly asAsDerivative: { readonly index: u16; readonly call: Call; } & Struct; - readonly type: 'Batch' | 'RelayTx' | 'BatchAll' | 'DispatchAs' | 'ForceBatch' | 'WithWeight' | 'BatchOld' | 'BatchAtomic' | 'BatchOptimistic' | 'AsDerivative'; + readonly type: 'Batch' | 'RelayTx' | 'BatchAll' | 'DispatchAs' | 'ForceBatch' | 'WithWeight' | 'AsDerivative'; } - /** @name PalletUtilityUniqueCall (477) */ + /** @name PalletUtilityUniqueCall (488) */ interface PalletUtilityUniqueCall extends Struct { readonly nonce: u64; readonly call: Call; } - /** @name PolymeshRuntimeDevelopRuntimeOriginCaller (478) */ + /** @name PolymeshRuntimeDevelopRuntimeOriginCaller (489) */ interface PolymeshRuntimeDevelopRuntimeOriginCaller extends Enum { readonly isSystem: boolean; readonly asSystem: FrameSupportDispatchRawOrigin; - readonly isVoid: boolean; readonly isPolymeshCommittee: boolean; - readonly asPolymeshCommittee: PalletCommitteeRawOriginInstance1; + readonly asPolymeshCommittee: PalletCommitteeRawOrigin; readonly isTechnicalCommittee: boolean; - readonly asTechnicalCommittee: PalletCommitteeRawOriginInstance3; + readonly asTechnicalCommittee: PalletCommitteeRawOrigin; readonly isUpgradeCommittee: boolean; - readonly asUpgradeCommittee: PalletCommitteeRawOriginInstance4; - readonly type: 'System' | 'Void' | 'PolymeshCommittee' | 'TechnicalCommittee' | 'UpgradeCommittee'; + readonly asUpgradeCommittee: PalletCommitteeRawOrigin; + readonly type: 'System' | 'PolymeshCommittee' | 'TechnicalCommittee' | 'UpgradeCommittee'; } - /** @name FrameSupportDispatchRawOrigin (479) */ + /** @name FrameSupportDispatchRawOrigin (490) */ interface FrameSupportDispatchRawOrigin extends Enum { readonly isRoot: boolean; readonly isSigned: boolean; @@ -4311,31 +4633,16 @@ declare module '@polkadot/types/lookup' { readonly type: 'Root' | 'Signed' | 'None'; } - /** @name PalletCommitteeRawOriginInstance1 (480) */ - interface PalletCommitteeRawOriginInstance1 extends Enum { - readonly isEndorsed: boolean; - readonly type: 'Endorsed'; - } - - /** @name PalletCommitteeRawOriginInstance3 (481) */ - interface PalletCommitteeRawOriginInstance3 extends Enum { - readonly isEndorsed: boolean; - readonly type: 'Endorsed'; - } - - /** @name PalletCommitteeRawOriginInstance4 (482) */ - interface PalletCommitteeRawOriginInstance4 extends Enum { + /** @name PalletCommitteeRawOrigin (491) */ + interface PalletCommitteeRawOrigin extends Enum { readonly isEndorsed: boolean; readonly type: 'Endorsed'; } - /** @name SpCoreVoid (483) */ - type SpCoreVoid = Null; - - /** @name PalletBaseCall (484) */ + /** @name PalletBaseCall (494) */ type PalletBaseCall = Null; - /** @name PalletExternalAgentsCall (485) */ + /** @name PalletExternalAgentsCall (495) */ interface PalletExternalAgentsCall extends Enum { readonly isCreateGroup: boolean; readonly asCreateGroup: { @@ -4383,7 +4690,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'CreateGroup' | 'SetGroupPermissions' | 'RemoveAgent' | 'Abdicate' | 'ChangeGroup' | 'AcceptBecomeAgent' | 'CreateGroupAndAddAuth' | 'CreateAndChangeCustomGroup'; } - /** @name PalletRelayerCall (486) */ + /** @name PalletRelayerCall (496) */ interface PalletRelayerCall extends Enum { readonly isSetPayingKey: boolean; readonly asSetPayingKey: { @@ -4417,7 +4724,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'SetPayingKey' | 'AcceptPayingKey' | 'RemovePayingKey' | 'UpdatePolyxLimit' | 'IncreasePolyxLimit' | 'DecreasePolyxLimit'; } - /** @name PalletContractsCall (487) */ + /** @name PalletContractsCall (497) */ interface PalletContractsCall extends Enum { readonly isCallOldWeight: boolean; readonly asCallOldWeight: { @@ -4486,17 +4793,21 @@ declare module '@polkadot/types/lookup' { readonly data: Bytes; readonly salt: Bytes; } & Struct; - readonly type: 'CallOldWeight' | 'InstantiateWithCodeOldWeight' | 'InstantiateOldWeight' | 'UploadCode' | 'RemoveCode' | 'SetCode' | 'Call' | 'InstantiateWithCode' | 'Instantiate'; + readonly isMigrate: boolean; + readonly asMigrate: { + readonly weightLimit: SpWeightsWeightV2Weight; + } & Struct; + readonly type: 'CallOldWeight' | 'InstantiateWithCodeOldWeight' | 'InstantiateOldWeight' | 'UploadCode' | 'RemoveCode' | 'SetCode' | 'Call' | 'InstantiateWithCode' | 'Instantiate' | 'Migrate'; } - /** @name PalletContractsWasmDeterminism (491) */ + /** @name PalletContractsWasmDeterminism (499) */ interface PalletContractsWasmDeterminism extends Enum { - readonly isDeterministic: boolean; - readonly isAllowIndeterminism: boolean; - readonly type: 'Deterministic' | 'AllowIndeterminism'; + readonly isEnforced: boolean; + readonly isRelaxed: boolean; + readonly type: 'Enforced' | 'Relaxed'; } - /** @name PolymeshContractsCall (492) */ + /** @name PolymeshContractsCall (500) */ interface PolymeshContractsCall extends Enum { readonly isInstantiateWithCodePerms: boolean; readonly asInstantiateWithCodePerms: { @@ -4548,18 +4859,18 @@ declare module '@polkadot/types/lookup' { readonly type: 'InstantiateWithCodePerms' | 'InstantiateWithHashPerms' | 'UpdateCallRuntimeWhitelist' | 'InstantiateWithCodeAsPrimaryKey' | 'InstantiateWithHashAsPrimaryKey' | 'UpgradeApi'; } - /** @name PolymeshContractsNextUpgrade (495) */ + /** @name PolymeshContractsNextUpgrade (503) */ interface PolymeshContractsNextUpgrade extends Struct { readonly chainVersion: PolymeshContractsChainVersion; readonly apiHash: PolymeshContractsApiCodeHash; } - /** @name PolymeshContractsApiCodeHash (496) */ + /** @name PolymeshContractsApiCodeHash (504) */ interface PolymeshContractsApiCodeHash extends Struct { readonly hash_: H256; } - /** @name PalletPreimageCall (497) */ + /** @name PalletPreimageCall (505) */ interface PalletPreimageCall extends Enum { readonly isNotePreimage: boolean; readonly asNotePreimage: { @@ -4577,10 +4888,14 @@ declare module '@polkadot/types/lookup' { readonly asUnrequestPreimage: { readonly hash_: H256; } & Struct; - readonly type: 'NotePreimage' | 'UnnotePreimage' | 'RequestPreimage' | 'UnrequestPreimage'; + readonly isEnsureUpdated: boolean; + readonly asEnsureUpdated: { + readonly hashes: Vec; + } & Struct; + readonly type: 'NotePreimage' | 'UnnotePreimage' | 'RequestPreimage' | 'UnrequestPreimage' | 'EnsureUpdated'; } - /** @name PalletNftCall (498) */ + /** @name PalletNftCall (506) */ interface PalletNftCall extends Enum { readonly isCreateNftCollection: boolean; readonly asCreateNftCollection: { @@ -4599,6 +4914,7 @@ declare module '@polkadot/types/lookup' { readonly assetId: PolymeshPrimitivesAssetAssetId; readonly nftId: u64; readonly portfolioKind: PolymeshPrimitivesIdentityIdPortfolioKind; + readonly numberOfKeys: Option; } & Struct; readonly isControllerTransfer: boolean; readonly asControllerTransfer: { @@ -4609,16 +4925,16 @@ declare module '@polkadot/types/lookup' { readonly type: 'CreateNftCollection' | 'IssueNft' | 'RedeemNft' | 'ControllerTransfer'; } - /** @name PolymeshPrimitivesNftNftCollectionKeys (501) */ + /** @name PolymeshPrimitivesNftNftCollectionKeys (509) */ interface PolymeshPrimitivesNftNftCollectionKeys extends Vec {} - /** @name PolymeshPrimitivesNftNftMetadataAttribute (504) */ + /** @name PolymeshPrimitivesNftNftMetadataAttribute (512) */ interface PolymeshPrimitivesNftNftMetadataAttribute extends Struct { readonly key: PolymeshPrimitivesAssetMetadataAssetMetadataKey; readonly value: Bytes; } - /** @name PalletElectionProviderMultiPhaseCall (505) */ + /** @name PalletElectionProviderMultiPhaseCall (514) */ interface PalletElectionProviderMultiPhaseCall extends Enum { readonly isSubmitUnsigned: boolean; readonly asSubmitUnsigned: { @@ -4645,14 +4961,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'SubmitUnsigned' | 'SetMinimumUntrustedScore' | 'SetEmergencyElectionResult' | 'Submit' | 'GovernanceFallback'; } - /** @name PalletElectionProviderMultiPhaseRawSolution (506) */ + /** @name PalletElectionProviderMultiPhaseRawSolution (515) */ interface PalletElectionProviderMultiPhaseRawSolution extends Struct { readonly solution: PolymeshRuntimeCommonNposSolution16; readonly score: SpNposElectionsElectionScore; readonly round: u32; } - /** @name PolymeshRuntimeCommonNposSolution16 (507) */ + /** @name PolymeshRuntimeCommonNposSolution16 (516) */ interface PolymeshRuntimeCommonNposSolution16 extends Struct { readonly votes1: Vec, Compact]>>; readonly votes2: Vec, ITuple<[Compact, Compact]>, Compact]>>; @@ -4672,45 +4988,27 @@ declare module '@polkadot/types/lookup' { readonly votes16: Vec, Vec, Compact]>>, Compact]>>; } - /** @name PalletElectionProviderMultiPhaseSolutionOrSnapshotSize (558) */ + /** @name PalletElectionProviderMultiPhaseSolutionOrSnapshotSize (567) */ interface PalletElectionProviderMultiPhaseSolutionOrSnapshotSize extends Struct { readonly voters: Compact; readonly targets: Compact; } - /** @name SpNposElectionsSupport (562) */ + /** @name SpNposElectionsSupport (571) */ interface SpNposElectionsSupport extends Struct { readonly total: u128; readonly voters: Vec>; } - /** @name PalletTestUtilsCall (565) */ - interface PalletTestUtilsCall extends Enum { - readonly isRegisterDid: boolean; - readonly asRegisterDid: { - readonly secondaryKeys: Vec; - } & Struct; - readonly isMockCddRegisterDid: boolean; - readonly asMockCddRegisterDid: { - readonly targetAccount: AccountId32; - } & Struct; - readonly isGetMyDid: boolean; - readonly isGetCddOf: boolean; - readonly asGetCddOf: { - readonly of: AccountId32; - } & Struct; - readonly type: 'RegisterDid' | 'MockCddRegisterDid' | 'GetMyDid' | 'GetCddOf'; - } - - /** @name PalletCommitteePolymeshVotes (566) */ + /** @name PalletCommitteePolymeshVotes (574) */ interface PalletCommitteePolymeshVotes extends Struct { readonly index: u32; readonly ayes: Vec; readonly nays: Vec; - readonly expiry: PolymeshCommonUtilitiesMaybeBlock; + readonly expiry: PolymeshPrimitivesMaybeBlock; } - /** @name PalletCommitteeError (568) */ + /** @name PalletCommitteeError (575) */ interface PalletCommitteeError extends Enum { readonly isDuplicateVote: boolean; readonly isNotAMember: boolean; @@ -4724,13 +5022,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'DuplicateVote' | 'NotAMember' | 'NoSuchProposal' | 'ProposalExpired' | 'DuplicateProposal' | 'MismatchedVotingIndex' | 'InvalidProportion' | 'FirstVoteReject' | 'ProposalsLimitReached'; } - /** @name PolymeshPrimitivesMultisigProposalVoteCount (577) */ + /** @name PolymeshPrimitivesMultisigProposalVoteCount (584) */ interface PolymeshPrimitivesMultisigProposalVoteCount extends Struct { readonly approvals: u64; readonly rejections: u64; } - /** @name PolymeshPrimitivesMultisigProposalState (578) */ + /** @name PolymeshPrimitivesMultisigProposalState (585) */ interface PolymeshPrimitivesMultisigProposalState extends Enum { readonly isActive: boolean; readonly asActive: { @@ -4742,7 +5040,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Active' | 'ExecutionSuccessful' | 'ExecutionFailed' | 'Rejected'; } - /** @name PalletMultisigError (580) */ + /** @name PalletMultisigError (587) */ interface PalletMultisigError extends Enum { readonly isProposalMissing: boolean; readonly isDecodingError: boolean; @@ -4766,63 +5064,76 @@ declare module '@polkadot/types/lookup' { readonly isMultisigMissingIdentity: boolean; readonly isTooManySigners: boolean; readonly isNoPayingDid: boolean; - readonly type: 'ProposalMissing' | 'DecodingError' | 'RequiredSignersIsZero' | 'NotASigner' | 'NoSuchMultisig' | 'NotEnoughSigners' | 'NonceOverflow' | 'AlreadyVoted' | 'AlreadyASigner' | 'IdentityNotAdmin' | 'IdentityNotPayer' | 'ChangeNotAllowed' | 'SignerAlreadyLinkedToMultisig' | 'SignerAlreadyLinkedToIdentity' | 'NestingNotAllowed' | 'ProposalAlreadyRejected' | 'ProposalExpired' | 'ProposalAlreadyExecuted' | 'MaxWeightTooLow' | 'MultisigMissingIdentity' | 'TooManySigners' | 'NoPayingDid'; + readonly isInvalidExpiryDate: boolean; + readonly isInvalidatedProposal: boolean; + readonly isAdminNotFound: boolean; + readonly isBadAuthorizationType: boolean; + readonly type: 'ProposalMissing' | 'DecodingError' | 'RequiredSignersIsZero' | 'NotASigner' | 'NoSuchMultisig' | 'NotEnoughSigners' | 'NonceOverflow' | 'AlreadyVoted' | 'AlreadyASigner' | 'IdentityNotAdmin' | 'IdentityNotPayer' | 'ChangeNotAllowed' | 'SignerAlreadyLinkedToMultisig' | 'SignerAlreadyLinkedToIdentity' | 'NestingNotAllowed' | 'ProposalAlreadyRejected' | 'ProposalExpired' | 'ProposalAlreadyExecuted' | 'MaxWeightTooLow' | 'MultisigMissingIdentity' | 'TooManySigners' | 'NoPayingDid' | 'InvalidExpiryDate' | 'InvalidatedProposal' | 'AdminNotFound' | 'BadAuthorizationType'; } - /** @name PalletBridgeBridgeTxDetail (582) */ - interface PalletBridgeBridgeTxDetail extends Struct { - readonly amount: u128; - readonly status: PalletBridgeBridgeTxStatus; - readonly executionBlock: u32; - readonly txHash: H256; + /** @name PalletValidatorsPermissionedIdentityPrefs (588) */ + interface PalletValidatorsPermissionedIdentityPrefs extends Struct { + readonly intendedCount: u32; + readonly runningCount: u32; } - /** @name PalletBridgeBridgeTxStatus (583) */ - interface PalletBridgeBridgeTxStatus extends Enum { - readonly isAbsent: boolean; - readonly isPending: boolean; - readonly asPending: u8; - readonly isFrozen: boolean; - readonly isTimelocked: boolean; - readonly isHandled: boolean; - readonly type: 'Absent' | 'Pending' | 'Frozen' | 'Timelocked' | 'Handled'; + /** @name PalletValidatorsError (589) */ + interface PalletValidatorsError extends Enum { + readonly isStashIdentityDoesNotExist: boolean; + readonly isStashIdentityNotPermissioned: boolean; + readonly isIdentityIsAlreadyPermissioned: boolean; + readonly isIdentityIsMissingCDD: boolean; + readonly isIntendedCountIsExceedingConsensusLimit: boolean; + readonly isIdentityNotFound: boolean; + readonly isValidatorNotFound: boolean; + readonly isCommissionTooHigh: boolean; + readonly isCommissionUnchanged: boolean; + readonly type: 'StashIdentityDoesNotExist' | 'StashIdentityNotPermissioned' | 'IdentityIsAlreadyPermissioned' | 'IdentityIsMissingCDD' | 'IntendedCountIsExceedingConsensusLimit' | 'IdentityNotFound' | 'ValidatorNotFound' | 'CommissionTooHigh' | 'CommissionUnchanged'; } - /** @name PalletStakingStakingLedger (586) */ + /** @name PalletStakingStakingLedger (590) */ interface PalletStakingStakingLedger extends Struct { readonly stash: AccountId32; readonly total: Compact; readonly active: Compact; readonly unlocking: Vec; - readonly claimedRewards: Vec; - } - - /** @name PalletStakingUnlockChunk (588) */ - interface PalletStakingUnlockChunk extends Struct { - readonly value: Compact; - readonly era: Compact; + readonly legacyClaimedRewards: Vec; } - /** @name PalletStakingNominations (591) */ + /** @name PalletStakingNominations (592) */ interface PalletStakingNominations extends Struct { readonly targets: Vec; readonly submittedIn: u32; readonly suppressed: bool; } - /** @name PalletStakingActiveEraInfo (593) */ + /** @name PalletStakingActiveEraInfo (594) */ interface PalletStakingActiveEraInfo extends Struct { readonly index: u32; readonly start: Option; } - /** @name PalletStakingEraRewardPoints (595) */ + /** @name SpStakingPagedExposureMetadata (596) */ + interface SpStakingPagedExposureMetadata extends Struct { + readonly total: Compact; + readonly own: Compact; + readonly nominatorCount: u32; + readonly pageCount: u32; + } + + /** @name SpStakingExposurePage (598) */ + interface SpStakingExposurePage extends Struct { + readonly pageTotal: Compact; + readonly others: Vec; + } + + /** @name PalletStakingEraRewardPoints (599) */ interface PalletStakingEraRewardPoints extends Struct { readonly total: u32; readonly individual: BTreeMap; } - /** @name PalletStakingUnappliedSlash (599) */ + /** @name PalletStakingUnappliedSlash (604) */ interface PalletStakingUnappliedSlash extends Struct { readonly validator: AccountId32; readonly own: u128; @@ -4831,7 +5142,7 @@ declare module '@polkadot/types/lookup' { readonly payout: u128; } - /** @name PalletStakingSlashingSlashingSpans (601) */ + /** @name PalletStakingSlashingSlashingSpans (606) */ interface PalletStakingSlashingSlashingSpans extends Struct { readonly spanIndex: u32; readonly lastStart: u32; @@ -4839,19 +5150,13 @@ declare module '@polkadot/types/lookup' { readonly prior: Vec; } - /** @name PalletStakingSlashingSpanRecord (602) */ + /** @name PalletStakingSlashingSpanRecord (607) */ interface PalletStakingSlashingSpanRecord extends Struct { readonly slashed: u128; readonly paidOut: u128; } - /** @name PalletStakingPermissionedIdentityPrefs (605) */ - interface PalletStakingPermissionedIdentityPrefs extends Struct { - readonly intendedCount: u32; - readonly runningCount: u32; - } - - /** @name PalletStakingPalletError (607) */ + /** @name PalletStakingPalletError (608) */ interface PalletStakingPalletError extends Enum { readonly isNotController: boolean; readonly isNotStash: boolean; @@ -4868,6 +5173,7 @@ declare module '@polkadot/types/lookup' { readonly isInvalidNumberOfNominations: boolean; readonly isNotSortedAndUnique: boolean; readonly isAlreadyClaimed: boolean; + readonly isInvalidPage: boolean; readonly isIncorrectHistoryDepth: boolean; readonly isIncorrectSlashingSpans: boolean; readonly isBadState: boolean; @@ -4878,29 +5184,27 @@ declare module '@polkadot/types/lookup' { readonly isTooManyValidators: boolean; readonly isCommissionTooLow: boolean; readonly isBoundNotMet: boolean; - readonly isStashIdentityDoesNotExist: boolean; - readonly isStashIdentityNotPermissioned: boolean; - readonly isStashIdentityNotCDDed: boolean; - readonly isIdentityIsAlreadyPermissioned: boolean; - readonly isIdentityIsMissingCDD: boolean; - readonly isIntendedCountIsExceedingConsensusLimit: boolean; - readonly isIdentityNotFound: boolean; - readonly isValidatorNotFound: boolean; - readonly isCommissionTooHigh: boolean; - readonly isCommissionUnchanged: boolean; - readonly type: 'NotController' | 'NotStash' | 'AlreadyBonded' | 'AlreadyPaired' | 'EmptyTargets' | 'DuplicateIndex' | 'InvalidSlashIndex' | 'InsufficientBond' | 'NoMoreChunks' | 'NoUnlockChunk' | 'FundedTarget' | 'InvalidEraToReward' | 'InvalidNumberOfNominations' | 'NotSortedAndUnique' | 'AlreadyClaimed' | 'IncorrectHistoryDepth' | 'IncorrectSlashingSpans' | 'BadState' | 'TooManyTargets' | 'BadTarget' | 'CannotChillOther' | 'TooManyNominators' | 'TooManyValidators' | 'CommissionTooLow' | 'BoundNotMet' | 'StashIdentityDoesNotExist' | 'StashIdentityNotPermissioned' | 'StashIdentityNotCDDed' | 'IdentityIsAlreadyPermissioned' | 'IdentityIsMissingCDD' | 'IntendedCountIsExceedingConsensusLimit' | 'IdentityNotFound' | 'ValidatorNotFound' | 'CommissionTooHigh' | 'CommissionUnchanged'; - } - - /** @name SpStakingOffenceOffenceDetails (608) */ + readonly isControllerDeprecated: boolean; + readonly isCannotRestoreLedger: boolean; + readonly isRewardDestinationRestricted: boolean; + readonly isNotEnoughFunds: boolean; + readonly isVirtualStakerNotAllowed: boolean; + readonly isCannotReapStash: boolean; + readonly isAlreadyMigrated: boolean; + readonly isRestricted: boolean; + readonly type: 'NotController' | 'NotStash' | 'AlreadyBonded' | 'AlreadyPaired' | 'EmptyTargets' | 'DuplicateIndex' | 'InvalidSlashIndex' | 'InsufficientBond' | 'NoMoreChunks' | 'NoUnlockChunk' | 'FundedTarget' | 'InvalidEraToReward' | 'InvalidNumberOfNominations' | 'NotSortedAndUnique' | 'AlreadyClaimed' | 'InvalidPage' | 'IncorrectHistoryDepth' | 'IncorrectSlashingSpans' | 'BadState' | 'TooManyTargets' | 'BadTarget' | 'CannotChillOther' | 'TooManyNominators' | 'TooManyValidators' | 'CommissionTooLow' | 'BoundNotMet' | 'ControllerDeprecated' | 'CannotRestoreLedger' | 'RewardDestinationRestricted' | 'NotEnoughFunds' | 'VirtualStakerNotAllowed' | 'CannotReapStash' | 'AlreadyMigrated' | 'Restricted'; + } + + /** @name SpStakingOffenceOffenceDetails (609) */ interface SpStakingOffenceOffenceDetails extends Struct { - readonly offender: ITuple<[AccountId32, PalletStakingExposure]>; + readonly offender: ITuple<[AccountId32, SpStakingExposure]>; readonly reporters: Vec; } - /** @name SpCoreCryptoKeyTypeId (613) */ + /** @name SpCoreCryptoKeyTypeId (617) */ interface SpCoreCryptoKeyTypeId extends U8aFixed {} - /** @name PalletSessionError (614) */ + /** @name PalletSessionError (618) */ interface PalletSessionError extends Enum { readonly isInvalidProof: boolean; readonly isNoAssociatedValidatorId: boolean; @@ -4910,7 +5214,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'InvalidProof' | 'NoAssociatedValidatorId' | 'DuplicatedKey' | 'NoKeys' | 'NoAccount'; } - /** @name PalletGrandpaStoredState (615) */ + /** @name PalletGrandpaStoredState (621) */ interface PalletGrandpaStoredState extends Enum { readonly isLive: boolean; readonly isPendingPause: boolean; @@ -4927,7 +5231,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Live' | 'PendingPause' | 'Paused' | 'PendingResume'; } - /** @name PalletGrandpaStoredPendingChange (616) */ + /** @name PalletGrandpaStoredPendingChange (622) */ interface PalletGrandpaStoredPendingChange extends Struct { readonly scheduledAt: u32; readonly delay: u32; @@ -4935,7 +5239,7 @@ declare module '@polkadot/types/lookup' { readonly forced: Option; } - /** @name PalletGrandpaError (618) */ + /** @name PalletGrandpaError (624) */ interface PalletGrandpaError extends Enum { readonly isPauseFailed: boolean; readonly isResumeFailed: boolean; @@ -4947,38 +5251,32 @@ declare module '@polkadot/types/lookup' { readonly type: 'PauseFailed' | 'ResumeFailed' | 'ChangePending' | 'TooSoon' | 'InvalidKeyOwnershipProof' | 'InvalidEquivocationProof' | 'DuplicateOffenceReport'; } - /** @name PalletImOnlineBoundedOpaqueNetworkState (622) */ - interface PalletImOnlineBoundedOpaqueNetworkState extends Struct { - readonly peerId: Bytes; - readonly externalAddresses: Vec; - } - - /** @name PalletImOnlineError (626) */ + /** @name PalletImOnlineError (628) */ interface PalletImOnlineError extends Enum { readonly isInvalidKey: boolean; readonly isDuplicatedHeartbeat: boolean; readonly type: 'InvalidKey' | 'DuplicatedHeartbeat'; } - /** @name PalletSudoError (628) */ + /** @name PalletSudoError (630) */ interface PalletSudoError extends Enum { readonly isRequireSudo: boolean; readonly type: 'RequireSudo'; } - /** @name PalletAssetTickerRegistration (629) */ + /** @name PalletAssetTickerRegistration (631) */ interface PalletAssetTickerRegistration extends Struct { readonly owner: PolymeshPrimitivesIdentityId; readonly expiry: Option; } - /** @name PalletAssetTickerRegistrationConfig (630) */ + /** @name PalletAssetTickerRegistrationConfig (632) */ interface PalletAssetTickerRegistrationConfig extends Struct { readonly maxTickerLength: u8; readonly registrationLength: Option; } - /** @name PalletAssetAssetDetails (631) */ + /** @name PalletAssetAssetDetails (633) */ interface PalletAssetAssetDetails extends Struct { readonly totalSupply: u128; readonly ownerDid: PolymeshPrimitivesIdentityId; @@ -4986,7 +5284,7 @@ declare module '@polkadot/types/lookup' { readonly assetType: PolymeshPrimitivesAssetAssetType; } - /** @name PalletAssetError (641) */ + /** @name PalletAssetError (643) */ interface PalletAssetError extends Enum { readonly isUnauthorized: boolean; readonly isAssetAlreadyCreated: boolean; @@ -5035,11 +5333,14 @@ declare module '@polkadot/types/lookup' { readonly isTickerIsAlreadyLinkedToAnAsset: boolean; readonly isAssetIdGenerationError: boolean; readonly isTickerNotRegisteredToCaller: boolean; - readonly type: 'Unauthorized' | 'AssetAlreadyCreated' | 'TickerTooLong' | 'TickerNotAlphanumeric' | 'TickerAlreadyRegistered' | 'TotalSupplyAboveLimit' | 'NoSuchAsset' | 'AlreadyFrozen' | 'NotAnOwner' | 'BalanceOverflow' | 'TotalSupplyOverflow' | 'InvalidGranularity' | 'NotFrozen' | 'InvalidTransfer' | 'InsufficientBalance' | 'AssetAlreadyDivisible' | 'InvalidEthereumSignature' | 'TickerRegistrationExpired' | 'SenderSameAsReceiver' | 'NoSuchDoc' | 'MaxLengthOfAssetNameExceeded' | 'FundingRoundNameMaxLengthExceeded' | 'InvalidAssetIdentifier' | 'InvestorUniquenessClaimNotAllowed' | 'InvalidCustomAssetTypeId' | 'AssetMetadataNameMaxLengthExceeded' | 'AssetMetadataValueMaxLengthExceeded' | 'AssetMetadataTypeDefMaxLengthExceeded' | 'AssetMetadataKeyIsMissing' | 'AssetMetadataValueIsLocked' | 'AssetMetadataLocalKeyAlreadyExists' | 'AssetMetadataGlobalKeyAlreadyExists' | 'TickerFirstByteNotValid' | 'UnexpectedNonFungibleToken' | 'IncompatibleAssetTypeUpdate' | 'AssetMetadataKeyBelongsToNFTCollection' | 'AssetMetadataValueIsEmpty' | 'NumberOfAssetMediatorsExceeded' | 'InvalidTickerCharacter' | 'InvalidTransferFrozenAsset' | 'InvalidTransferComplianceFailure' | 'InvalidTransferInvalidReceiverCDD' | 'InvalidTransferInvalidSenderCDD' | 'TickerRegistrationNotFound' | 'TickerIsAlreadyLinkedToAnAsset' | 'AssetIdGenerationError' | 'TickerNotRegisteredToCaller'; + readonly isAssetIsAlreadyLinkedToATicker: boolean; + readonly isTickerIsNotLinkedToTheAsset: boolean; + readonly isBadAuthorizationType: boolean; + readonly type: 'Unauthorized' | 'AssetAlreadyCreated' | 'TickerTooLong' | 'TickerNotAlphanumeric' | 'TickerAlreadyRegistered' | 'TotalSupplyAboveLimit' | 'NoSuchAsset' | 'AlreadyFrozen' | 'NotAnOwner' | 'BalanceOverflow' | 'TotalSupplyOverflow' | 'InvalidGranularity' | 'NotFrozen' | 'InvalidTransfer' | 'InsufficientBalance' | 'AssetAlreadyDivisible' | 'InvalidEthereumSignature' | 'TickerRegistrationExpired' | 'SenderSameAsReceiver' | 'NoSuchDoc' | 'MaxLengthOfAssetNameExceeded' | 'FundingRoundNameMaxLengthExceeded' | 'InvalidAssetIdentifier' | 'InvestorUniquenessClaimNotAllowed' | 'InvalidCustomAssetTypeId' | 'AssetMetadataNameMaxLengthExceeded' | 'AssetMetadataValueMaxLengthExceeded' | 'AssetMetadataTypeDefMaxLengthExceeded' | 'AssetMetadataKeyIsMissing' | 'AssetMetadataValueIsLocked' | 'AssetMetadataLocalKeyAlreadyExists' | 'AssetMetadataGlobalKeyAlreadyExists' | 'TickerFirstByteNotValid' | 'UnexpectedNonFungibleToken' | 'IncompatibleAssetTypeUpdate' | 'AssetMetadataKeyBelongsToNFTCollection' | 'AssetMetadataValueIsEmpty' | 'NumberOfAssetMediatorsExceeded' | 'InvalidTickerCharacter' | 'InvalidTransferFrozenAsset' | 'InvalidTransferComplianceFailure' | 'InvalidTransferInvalidReceiverCDD' | 'InvalidTransferInvalidSenderCDD' | 'TickerRegistrationNotFound' | 'TickerIsAlreadyLinkedToAnAsset' | 'AssetIdGenerationError' | 'TickerNotRegisteredToCaller' | 'AssetIsAlreadyLinkedToATicker' | 'TickerIsNotLinkedToTheAsset' | 'BadAuthorizationType'; } - /** @name PalletCorporateActionsDistributionError (644) */ - interface PalletCorporateActionsDistributionError extends Enum { + /** @name PalletCorporateActionsDistributionPalletError (646) */ + interface PalletCorporateActionsDistributionPalletError extends Enum { readonly isCaNotBenefit: boolean; readonly isAlreadyExists: boolean; readonly isExpiryBeforePayment: boolean; @@ -5058,15 +5359,15 @@ declare module '@polkadot/types/lookup' { readonly type: 'CaNotBenefit' | 'AlreadyExists' | 'ExpiryBeforePayment' | 'HolderAlreadyPaid' | 'NoSuchDistribution' | 'CannotClaimBeforeStart' | 'CannotClaimAfterExpiry' | 'BalancePerShareProductOverflowed' | 'NotDistributionCreator' | 'AlreadyReclaimed' | 'NotExpired' | 'DistributionStarted' | 'InsufficientRemainingAmount' | 'DistributionAmountIsZero' | 'DistributionPerShareIsZero'; } - /** @name PolymeshCommonUtilitiesCheckpointNextCheckpoints (648) */ + /** @name PolymeshCommonUtilitiesCheckpointNextCheckpoints (650) */ interface PolymeshCommonUtilitiesCheckpointNextCheckpoints extends Struct { readonly nextAt: u64; readonly totalPending: u64; readonly schedules: BTreeMap; } - /** @name PalletAssetCheckpointError (654) */ - interface PalletAssetCheckpointError extends Enum { + /** @name PalletAssetCheckpointPalletError (656) */ + interface PalletAssetCheckpointPalletError extends Enum { readonly isNoSuchSchedule: boolean; readonly isScheduleNotRemovable: boolean; readonly isSchedulesOverMaxComplexity: boolean; @@ -5076,13 +5377,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'NoSuchSchedule' | 'ScheduleNotRemovable' | 'SchedulesOverMaxComplexity' | 'ScheduleIsEmpty' | 'ScheduleFinished' | 'ScheduleHasExpiredCheckpoints'; } - /** @name PolymeshPrimitivesComplianceManagerAssetCompliance (655) */ + /** @name PolymeshPrimitivesComplianceManagerAssetCompliance (657) */ interface PolymeshPrimitivesComplianceManagerAssetCompliance extends Struct { readonly paused: bool; readonly requirements: Vec; } - /** @name PalletComplianceManagerError (657) */ + /** @name PalletComplianceManagerError (659) */ interface PalletComplianceManagerError extends Enum { readonly isUnauthorized: boolean; readonly isDidNotExist: boolean; @@ -5094,7 +5395,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Unauthorized' | 'DidNotExist' | 'InvalidComplianceRequirementId' | 'IncorrectOperationOnTrustedIssuer' | 'DuplicateComplianceRequirements' | 'ComplianceRequirementTooComplex' | 'WeightLimitExceeded'; } - /** @name PalletCorporateActionsError (660) */ + /** @name PalletCorporateActionsError (662) */ interface PalletCorporateActionsError extends Enum { readonly isDetailsTooLong: boolean; readonly isDuplicateDidTax: boolean; @@ -5110,8 +5411,8 @@ declare module '@polkadot/types/lookup' { readonly type: 'DetailsTooLong' | 'DuplicateDidTax' | 'TooManyDidTaxes' | 'TooManyTargetIds' | 'NoSuchCheckpointId' | 'NoSuchCA' | 'NoRecordDate' | 'RecordDateAfterStart' | 'DeclDateAfterRecordDate' | 'DeclDateInFuture' | 'NotTargetedByCA'; } - /** @name PalletCorporateActionsBallotError (664) */ - interface PalletCorporateActionsBallotError extends Enum { + /** @name PalletCorporateActionsBallotPalletError (666) */ + interface PalletCorporateActionsBallotPalletError extends Enum { readonly isCaNotNotice: boolean; readonly isAlreadyExists: boolean; readonly isNoSuchBallot: boolean; @@ -5129,36 +5430,36 @@ declare module '@polkadot/types/lookup' { readonly type: 'CaNotNotice' | 'AlreadyExists' | 'NoSuchBallot' | 'StartAfterEnd' | 'NowAfterEnd' | 'NumberOfChoicesOverflow' | 'VotingAlreadyStarted' | 'VotingNotStarted' | 'VotingAlreadyEnded' | 'WrongVoteCount' | 'InsufficientVotes' | 'NoSuchRCVFallback' | 'RcvSelfCycle' | 'RcvNotAllowed'; } - /** @name PalletPermissionsError (665) */ + /** @name PalletPermissionsError (667) */ interface PalletPermissionsError extends Enum { readonly isUnauthorizedCaller: boolean; readonly type: 'UnauthorizedCaller'; } - /** @name PalletPipsPipsMetadata (666) */ + /** @name PalletPipsPipsMetadata (668) */ interface PalletPipsPipsMetadata extends Struct { readonly id: u32; readonly url: Option; readonly description: Option; readonly createdAt: u32; readonly transactionVersion: u32; - readonly expiry: PolymeshCommonUtilitiesMaybeBlock; + readonly expiry: PolymeshPrimitivesMaybeBlock; } - /** @name PalletPipsDepositInfo (668) */ + /** @name PalletPipsDepositInfo (670) */ interface PalletPipsDepositInfo extends Struct { readonly owner: AccountId32; readonly amount: u128; } - /** @name PalletPipsPip (669) */ + /** @name PalletPipsPip (671) */ interface PalletPipsPip extends Struct { readonly id: u32; readonly proposal: Call; readonly proposer: PalletPipsProposer; } - /** @name PalletPipsVotingResult (670) */ + /** @name PalletPipsVotingResult (672) */ interface PalletPipsVotingResult extends Struct { readonly ayesCount: u32; readonly ayesStake: u128; @@ -5166,17 +5467,17 @@ declare module '@polkadot/types/lookup' { readonly naysStake: u128; } - /** @name PalletPipsVote (671) */ + /** @name PalletPipsVote (673) */ interface PalletPipsVote extends ITuple<[bool, u128]> {} - /** @name PalletPipsSnapshotMetadata (672) */ + /** @name PalletPipsSnapshotMetadata (674) */ interface PalletPipsSnapshotMetadata extends Struct { readonly createdAt: u32; readonly madeBy: AccountId32; readonly id: u32; } - /** @name PalletPipsError (674) */ + /** @name PalletPipsError (676) */ interface PalletPipsError extends Enum { readonly isRescheduleNotByReleaseCoordinator: boolean; readonly isNotFromCommunity: boolean; @@ -5196,10 +5497,12 @@ declare module '@polkadot/types/lookup' { readonly isSnapshotIdMismatch: boolean; readonly isScheduledProposalDoesntExist: boolean; readonly isProposalNotInScheduledState: boolean; - readonly type: 'RescheduleNotByReleaseCoordinator' | 'NotFromCommunity' | 'NotByCommittee' | 'TooManyActivePips' | 'IncorrectDeposit' | 'InsufficientDeposit' | 'NoSuchProposal' | 'NotACommitteeMember' | 'InvalidFutureBlockNumber' | 'NumberOfVotesExceeded' | 'StakeAmountOfVotesExceeded' | 'MissingCurrentIdentity' | 'IncorrectProposalState' | 'CannotSkipPip' | 'SnapshotResultTooLarge' | 'SnapshotIdMismatch' | 'ScheduledProposalDoesntExist' | 'ProposalNotInScheduledState'; + readonly isInvalidPipId: boolean; + readonly isInvalidTaskName: boolean; + readonly type: 'RescheduleNotByReleaseCoordinator' | 'NotFromCommunity' | 'NotByCommittee' | 'TooManyActivePips' | 'IncorrectDeposit' | 'InsufficientDeposit' | 'NoSuchProposal' | 'NotACommitteeMember' | 'InvalidFutureBlockNumber' | 'NumberOfVotesExceeded' | 'StakeAmountOfVotesExceeded' | 'MissingCurrentIdentity' | 'IncorrectProposalState' | 'CannotSkipPip' | 'SnapshotResultTooLarge' | 'SnapshotIdMismatch' | 'ScheduledProposalDoesntExist' | 'ProposalNotInScheduledState' | 'InvalidPipId' | 'InvalidTaskName'; } - /** @name PalletPortfolioError (682) */ + /** @name PalletPortfolioError (684) */ interface PalletPortfolioError extends Enum { readonly isPortfolioDoesNotExist: boolean; readonly isInsufficientPortfolioBalance: boolean; @@ -5219,10 +5522,13 @@ declare module '@polkadot/types/lookup' { readonly isEmptyTransfer: boolean; readonly isMissingOwnersPermission: boolean; readonly isInvalidTransferSenderIdMatchesReceiverId: boolean; - readonly type: 'PortfolioDoesNotExist' | 'InsufficientPortfolioBalance' | 'DestinationIsSamePortfolio' | 'PortfolioNameAlreadyInUse' | 'SecondaryKeyNotAuthorizedForPortfolio' | 'UnauthorizedCustodian' | 'InsufficientTokensLocked' | 'PortfolioNotEmpty' | 'DifferentIdentityPortfolios' | 'NoDuplicateAssetsAllowed' | 'NftNotFoundInPortfolio' | 'NftAlreadyLocked' | 'NftNotLocked' | 'InvalidTransferNFTNotOwned' | 'InvalidTransferNFTIsLocked' | 'EmptyTransfer' | 'MissingOwnersPermission' | 'InvalidTransferSenderIdMatchesReceiverId'; + readonly isSelfAdditionNotAllowed: boolean; + readonly isBadAuthorizationType: boolean; + readonly isDefaultPortfoliosCannotHaveCustodians: boolean; + readonly type: 'PortfolioDoesNotExist' | 'InsufficientPortfolioBalance' | 'DestinationIsSamePortfolio' | 'PortfolioNameAlreadyInUse' | 'SecondaryKeyNotAuthorizedForPortfolio' | 'UnauthorizedCustodian' | 'InsufficientTokensLocked' | 'PortfolioNotEmpty' | 'DifferentIdentityPortfolios' | 'NoDuplicateAssetsAllowed' | 'NftNotFoundInPortfolio' | 'NftAlreadyLocked' | 'NftNotLocked' | 'InvalidTransferNFTNotOwned' | 'InvalidTransferNFTIsLocked' | 'EmptyTransfer' | 'MissingOwnersPermission' | 'InvalidTransferSenderIdMatchesReceiverId' | 'SelfAdditionNotAllowed' | 'BadAuthorizationType' | 'DefaultPortfoliosCannotHaveCustodians'; } - /** @name PalletProtocolFeeError (683) */ + /** @name PalletProtocolFeeError (685) */ interface PalletProtocolFeeError extends Enum { readonly isInsufficientAccountBalance: boolean; readonly isUnHandledImbalances: boolean; @@ -5230,7 +5536,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'InsufficientAccountBalance' | 'UnHandledImbalances' | 'InsufficientSubsidyBalance'; } - /** @name PalletSchedulerScheduled (686) */ + /** @name PalletSchedulerScheduled (688) */ interface PalletSchedulerScheduled extends Struct { readonly maybeId: Option; readonly priority: u8; @@ -5239,7 +5545,7 @@ declare module '@polkadot/types/lookup' { readonly origin: PolymeshRuntimeDevelopRuntimeOriginCaller; } - /** @name FrameSupportPreimagesBounded (687) */ + /** @name FrameSupportPreimagesBounded (689) */ interface FrameSupportPreimagesBounded extends Enum { readonly isLegacy: boolean; readonly asLegacy: { @@ -5255,7 +5561,17 @@ declare module '@polkadot/types/lookup' { readonly type: 'Legacy' | 'Inline' | 'Lookup'; } - /** @name PalletSchedulerError (690) */ + /** @name SpRuntimeBlakeTwo256 (690) */ + type SpRuntimeBlakeTwo256 = Null; + + /** @name PalletSchedulerRetryConfig (693) */ + interface PalletSchedulerRetryConfig extends Struct { + readonly totalRetries: u8; + readonly remaining: u8; + readonly period: u32; + } + + /** @name PalletSchedulerError (694) */ interface PalletSchedulerError extends Enum { readonly isFailedToSchedule: boolean; readonly isNotFound: boolean; @@ -5265,13 +5581,13 @@ declare module '@polkadot/types/lookup' { readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange' | 'Named'; } - /** @name PolymeshPrimitivesSettlementVenue (691) */ + /** @name PolymeshPrimitivesSettlementVenue (695) */ interface PolymeshPrimitivesSettlementVenue extends Struct { readonly creator: PolymeshPrimitivesIdentityId; readonly venueType: PolymeshPrimitivesSettlementVenueType; } - /** @name PolymeshPrimitivesSettlementInstruction (695) */ + /** @name PolymeshPrimitivesSettlementInstruction (699) */ interface PolymeshPrimitivesSettlementInstruction extends Struct { readonly instructionId: u64; readonly venueId: Option; @@ -5281,7 +5597,7 @@ declare module '@polkadot/types/lookup' { readonly valueDate: Option; } - /** @name PolymeshPrimitivesSettlementLegStatus (697) */ + /** @name PolymeshPrimitivesSettlementLegStatus (701) */ interface PolymeshPrimitivesSettlementLegStatus extends Enum { readonly isPendingTokenLock: boolean; readonly isExecutionPending: boolean; @@ -5290,7 +5606,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'PendingTokenLock' | 'ExecutionPending' | 'ExecutionToBeSkipped'; } - /** @name PolymeshPrimitivesSettlementAffirmationStatus (699) */ + /** @name PolymeshPrimitivesSettlementAffirmationStatus (703) */ interface PolymeshPrimitivesSettlementAffirmationStatus extends Enum { readonly isUnknown: boolean; readonly isPending: boolean; @@ -5298,7 +5614,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Unknown' | 'Pending' | 'Affirmed'; } - /** @name PolymeshPrimitivesSettlementInstructionStatus (702) */ + /** @name PolymeshPrimitivesSettlementInstructionStatus (706) */ interface PolymeshPrimitivesSettlementInstructionStatus extends Enum { readonly isUnknown: boolean; readonly isPending: boolean; @@ -5307,10 +5623,11 @@ declare module '@polkadot/types/lookup' { readonly asSuccess: u32; readonly isRejected: boolean; readonly asRejected: u32; - readonly type: 'Unknown' | 'Pending' | 'Failed' | 'Success' | 'Rejected'; + readonly isLockedForExecution: boolean; + readonly type: 'Unknown' | 'Pending' | 'Failed' | 'Success' | 'Rejected' | 'LockedForExecution'; } - /** @name PolymeshPrimitivesSettlementMediatorAffirmationStatus (704) */ + /** @name PolymeshPrimitivesSettlementMediatorAffirmationStatus (708) */ interface PolymeshPrimitivesSettlementMediatorAffirmationStatus extends Enum { readonly isUnknown: boolean; readonly isPending: boolean; @@ -5321,7 +5638,7 @@ declare module '@polkadot/types/lookup' { readonly type: 'Unknown' | 'Pending' | 'Affirmed'; } - /** @name PalletSettlementError (706) */ + /** @name PalletSettlementError (710) */ interface PalletSettlementError extends Enum { readonly isInvalidVenue: boolean; readonly isUnauthorized: boolean; @@ -5366,34 +5683,42 @@ declare module '@polkadot/types/lookup' { readonly isCallerIsNotAMediator: boolean; readonly isInvalidExpiryDate: boolean; readonly isMediatorAffirmationExpired: boolean; - readonly type: 'InvalidVenue' | 'Unauthorized' | 'InstructionNotAffirmed' | 'UnauthorizedSigner' | 'ReceiptAlreadyClaimed' | 'UnauthorizedVenue' | 'InstructionDatesInvalid' | 'InstructionSettleBlockPassed' | 'InvalidSignature' | 'SameSenderReceiver' | 'SettleOnPastBlock' | 'UnexpectedAffirmationStatus' | 'FailedToSchedule' | 'UnknownInstruction' | 'SignerAlreadyExists' | 'SignerDoesNotExist' | 'ZeroAmount' | 'InstructionSettleBlockNotReached' | 'CallerIsNotAParty' | 'MaxNumberOfNFTsExceeded' | 'NumberOfTransferredNFTsUnderestimated' | 'ReceiptForInvalidLegType' | 'WeightLimitExceeded' | 'MaxNumberOfFungibleAssetsExceeded' | 'MaxNumberOfOffChainAssetsExceeded' | 'NumberOfFungibleTransfersUnderestimated' | 'UnexpectedOFFChainAsset' | 'OffChainAssetCantBeLocked' | 'NumberOfOffChainTransfersUnderestimated' | 'LegNotFound' | 'InputWeightIsLessThanMinimum' | 'MaxNumberOfReceiptsExceeded' | 'NotAllAffirmationsHaveBeenReceived' | 'InvalidInstructionStatusForExecution' | 'FailedToReleaseLockOrTransferAssets' | 'DuplicateReceiptUid' | 'ReceiptInstructionIdMissmatch' | 'MultipleReceiptsForOneLeg' | 'UnexpectedLegStatus' | 'NumberOfVenueSignersExceeded' | 'CallerIsNotAMediator' | 'InvalidExpiryDate' | 'MediatorAffirmationExpired'; - } - - /** @name PolymeshPrimitivesStatisticsStat1stKey (709) */ + readonly isOffChainAssetsMustHaveAVenue: boolean; + readonly isUnexpectedSettlementType: boolean; + readonly isInvalidInstructionStatusForRejection: boolean; + readonly isLockTimestampNotFound: boolean; + readonly isExceededMaximumLockingPeriod: boolean; + readonly isFailedAssetTransferringConditions: boolean; + readonly isInvalidInstructionStatusForWithdrawal: boolean; + readonly isInvalidTaskName: boolean; + readonly type: 'InvalidVenue' | 'Unauthorized' | 'InstructionNotAffirmed' | 'UnauthorizedSigner' | 'ReceiptAlreadyClaimed' | 'UnauthorizedVenue' | 'InstructionDatesInvalid' | 'InstructionSettleBlockPassed' | 'InvalidSignature' | 'SameSenderReceiver' | 'SettleOnPastBlock' | 'UnexpectedAffirmationStatus' | 'FailedToSchedule' | 'UnknownInstruction' | 'SignerAlreadyExists' | 'SignerDoesNotExist' | 'ZeroAmount' | 'InstructionSettleBlockNotReached' | 'CallerIsNotAParty' | 'MaxNumberOfNFTsExceeded' | 'NumberOfTransferredNFTsUnderestimated' | 'ReceiptForInvalidLegType' | 'WeightLimitExceeded' | 'MaxNumberOfFungibleAssetsExceeded' | 'MaxNumberOfOffChainAssetsExceeded' | 'NumberOfFungibleTransfersUnderestimated' | 'UnexpectedOFFChainAsset' | 'OffChainAssetCantBeLocked' | 'NumberOfOffChainTransfersUnderestimated' | 'LegNotFound' | 'InputWeightIsLessThanMinimum' | 'MaxNumberOfReceiptsExceeded' | 'NotAllAffirmationsHaveBeenReceived' | 'InvalidInstructionStatusForExecution' | 'FailedToReleaseLockOrTransferAssets' | 'DuplicateReceiptUid' | 'ReceiptInstructionIdMissmatch' | 'MultipleReceiptsForOneLeg' | 'UnexpectedLegStatus' | 'NumberOfVenueSignersExceeded' | 'CallerIsNotAMediator' | 'InvalidExpiryDate' | 'MediatorAffirmationExpired' | 'OffChainAssetsMustHaveAVenue' | 'UnexpectedSettlementType' | 'InvalidInstructionStatusForRejection' | 'LockTimestampNotFound' | 'ExceededMaximumLockingPeriod' | 'FailedAssetTransferringConditions' | 'InvalidInstructionStatusForWithdrawal' | 'InvalidTaskName'; + } + + /** @name PolymeshPrimitivesStatisticsStat1stKey (713) */ interface PolymeshPrimitivesStatisticsStat1stKey extends Struct { readonly assetId: PolymeshPrimitivesAssetAssetId; readonly statType: PolymeshPrimitivesStatisticsStatType; } - /** @name PolymeshPrimitivesTransferComplianceAssetTransferCompliance (710) */ + /** @name PolymeshPrimitivesTransferComplianceAssetTransferCompliance (714) */ interface PolymeshPrimitivesTransferComplianceAssetTransferCompliance extends Struct { readonly paused: bool; readonly requirements: BTreeSet; } - /** @name PalletStatisticsError (714) */ + /** @name PalletStatisticsError (718) */ interface PalletStatisticsError extends Enum { - readonly isInvalidTransfer: boolean; + readonly isInvalidTransferStatisticsFailure: boolean; readonly isStatTypeMissing: boolean; readonly isStatTypeNeededByTransferCondition: boolean; readonly isCannotRemoveStatTypeInUse: boolean; readonly isStatTypeLimitReached: boolean; readonly isTransferConditionLimitReached: boolean; readonly isWeightLimitExceeded: boolean; - readonly type: 'InvalidTransfer' | 'StatTypeMissing' | 'StatTypeNeededByTransferCondition' | 'CannotRemoveStatTypeInUse' | 'StatTypeLimitReached' | 'TransferConditionLimitReached' | 'WeightLimitExceeded'; + readonly type: 'InvalidTransferStatisticsFailure' | 'StatTypeMissing' | 'StatTypeNeededByTransferCondition' | 'CannotRemoveStatTypeInUse' | 'StatTypeLimitReached' | 'TransferConditionLimitReached' | 'WeightLimitExceeded'; } - /** @name PalletStoError (717) */ + /** @name PalletStoError (721) */ interface PalletStoError extends Enum { readonly isUnauthorized: boolean; readonly isOverflow: boolean; @@ -5407,17 +5732,19 @@ declare module '@polkadot/types/lookup' { readonly isInvalidOfferingWindow: boolean; readonly isMaxPriceExceeded: boolean; readonly isInvestmentAmountTooLow: boolean; - readonly type: 'Unauthorized' | 'Overflow' | 'InsufficientTokensRemaining' | 'FundraiserNotFound' | 'FundraiserNotLive' | 'FundraiserClosed' | 'FundraiserExpired' | 'InvalidVenue' | 'InvalidPriceTiers' | 'InvalidOfferingWindow' | 'MaxPriceExceeded' | 'InvestmentAmountTooLow'; + readonly isInvalidSignature: boolean; + readonly isOffchainFundingNotAllowed: boolean; + readonly type: 'Unauthorized' | 'Overflow' | 'InsufficientTokensRemaining' | 'FundraiserNotFound' | 'FundraiserNotLive' | 'FundraiserClosed' | 'FundraiserExpired' | 'InvalidVenue' | 'InvalidPriceTiers' | 'InvalidOfferingWindow' | 'MaxPriceExceeded' | 'InvestmentAmountTooLow' | 'InvalidSignature' | 'OffchainFundingNotAllowed'; } - /** @name PalletTreasuryError (718) */ + /** @name PalletTreasuryError (722) */ interface PalletTreasuryError extends Enum { readonly isInsufficientBalance: boolean; readonly isInvalidIdentity: boolean; readonly type: 'InsufficientBalance' | 'InvalidIdentity'; } - /** @name PalletUtilityError (719) */ + /** @name PalletUtilityError (723) */ interface PalletUtilityError extends Enum { readonly isTooManyCalls: boolean; readonly isInvalidSignature: boolean; @@ -5427,14 +5754,14 @@ declare module '@polkadot/types/lookup' { readonly type: 'TooManyCalls' | 'InvalidSignature' | 'TargetCddMissing' | 'InvalidNonce' | 'UnableToDeriveAccountId'; } - /** @name PalletBaseError (720) */ + /** @name PalletBaseError (724) */ interface PalletBaseError extends Enum { readonly isTooLong: boolean; readonly isCounterOverflow: boolean; readonly type: 'TooLong' | 'CounterOverflow'; } - /** @name PalletExternalAgentsError (723) */ + /** @name PalletExternalAgentsError (727) */ interface PalletExternalAgentsError extends Enum { readonly isNoSuchAG: boolean; readonly isUnauthorizedAgent: boolean; @@ -5442,16 +5769,17 @@ declare module '@polkadot/types/lookup' { readonly isNotAnAgent: boolean; readonly isRemovingLastFullAgent: boolean; readonly isSecondaryKeyNotAuthorizedForAsset: boolean; - readonly type: 'NoSuchAG' | 'UnauthorizedAgent' | 'AlreadyAnAgent' | 'NotAnAgent' | 'RemovingLastFullAgent' | 'SecondaryKeyNotAuthorizedForAsset'; + readonly isBadAuthorizationType: boolean; + readonly type: 'NoSuchAG' | 'UnauthorizedAgent' | 'AlreadyAnAgent' | 'NotAnAgent' | 'RemovingLastFullAgent' | 'SecondaryKeyNotAuthorizedForAsset' | 'BadAuthorizationType'; } - /** @name PalletRelayerSubsidy (724) */ + /** @name PalletRelayerSubsidy (728) */ interface PalletRelayerSubsidy extends Struct { readonly payingKey: AccountId32; readonly remaining: u128; } - /** @name PalletRelayerError (725) */ + /** @name PalletRelayerError (729) */ interface PalletRelayerError extends Enum { readonly isUserKeyCddMissing: boolean; readonly isPayingKeyCddMissing: boolean; @@ -5460,186 +5788,90 @@ declare module '@polkadot/types/lookup' { readonly isNotAuthorizedForPayingKey: boolean; readonly isNotAuthorizedForUserKey: boolean; readonly isOverflow: boolean; - readonly type: 'UserKeyCddMissing' | 'PayingKeyCddMissing' | 'NoPayingKey' | 'NotPayingKey' | 'NotAuthorizedForPayingKey' | 'NotAuthorizedForUserKey' | 'Overflow'; + readonly isBadAuthorizationType: boolean; + readonly type: 'UserKeyCddMissing' | 'PayingKeyCddMissing' | 'NoPayingKey' | 'NotPayingKey' | 'NotAuthorizedForPayingKey' | 'NotAuthorizedForUserKey' | 'Overflow' | 'BadAuthorizationType'; } - /** @name PalletContractsWasmPrefabWasmModule (727) */ - interface PalletContractsWasmPrefabWasmModule extends Struct { - readonly instructionWeightsVersion: Compact; - readonly initial: Compact; - readonly maximum: Compact; - readonly code: Bytes; - readonly determinism: PalletContractsWasmDeterminism; - } - - /** @name PalletContractsWasmOwnerInfo (729) */ - interface PalletContractsWasmOwnerInfo extends Struct { + /** @name PalletContractsWasmCodeInfo (731) */ + interface PalletContractsWasmCodeInfo extends Struct { readonly owner: AccountId32; readonly deposit: Compact; readonly refcount: Compact; + readonly determinism: PalletContractsWasmDeterminism; + readonly codeLen: u32; } - /** @name PalletContractsStorageContractInfo (730) */ + /** @name PalletContractsStorageContractInfo (732) */ interface PalletContractsStorageContractInfo extends Struct { readonly trieId: Bytes; - readonly depositAccount: AccountId32; readonly codeHash: H256; readonly storageBytes: u32; readonly storageItems: u32; readonly storageByteDeposit: u128; readonly storageItemDeposit: u128; readonly storageBaseDeposit: u128; + readonly delegateDependencies: BTreeMap; } - /** @name PalletContractsStorageDeletedContract (733) */ - interface PalletContractsStorageDeletedContract extends Struct { - readonly trieId: Bytes; + /** @name PalletContractsStorageDeletionQueueManager (737) */ + interface PalletContractsStorageDeletionQueueManager extends Struct { + readonly insertCounter: u32; + readonly deleteCounter: u32; } - /** @name PalletContractsSchedule (735) */ + /** @name PalletContractsSchedule (739) */ interface PalletContractsSchedule extends Struct { readonly limits: PalletContractsScheduleLimits; readonly instructionWeights: PalletContractsScheduleInstructionWeights; - readonly hostFnWeights: PalletContractsScheduleHostFnWeights; } - /** @name PalletContractsScheduleLimits (736) */ + /** @name PalletContractsScheduleLimits (740) */ interface PalletContractsScheduleLimits extends Struct { readonly eventTopics: u32; - readonly globals: u32; - readonly locals: u32; - readonly parameters: u32; readonly memoryPages: u32; - readonly tableSize: u32; - readonly brTableSize: u32; readonly subjectLen: u32; readonly payloadLen: u32; + readonly runtimeMemory: u32; + readonly validatorRuntimeMemory: u32; + readonly eventRefTime: u64; } - /** @name PalletContractsScheduleInstructionWeights (737) */ + /** @name PalletContractsScheduleInstructionWeights (741) */ interface PalletContractsScheduleInstructionWeights extends Struct { - readonly version: u32; - readonly fallback: u32; - readonly i64const: u32; - readonly i64load: u32; - readonly i64store: u32; - readonly select: u32; - readonly r_if: u32; - readonly br: u32; - readonly brIf: u32; - readonly brTable: u32; - readonly brTablePerEntry: u32; - readonly call: u32; - readonly callIndirect: u32; - readonly callIndirectPerParam: u32; - readonly callPerLocal: u32; - readonly localGet: u32; - readonly localSet: u32; - readonly localTee: u32; - readonly globalGet: u32; - readonly globalSet: u32; - readonly memoryCurrent: u32; - readonly memoryGrow: u32; - readonly i64clz: u32; - readonly i64ctz: u32; - readonly i64popcnt: u32; - readonly i64eqz: u32; - readonly i64extendsi32: u32; - readonly i64extendui32: u32; - readonly i32wrapi64: u32; - readonly i64eq: u32; - readonly i64ne: u32; - readonly i64lts: u32; - readonly i64ltu: u32; - readonly i64gts: u32; - readonly i64gtu: u32; - readonly i64les: u32; - readonly i64leu: u32; - readonly i64ges: u32; - readonly i64geu: u32; - readonly i64add: u32; - readonly i64sub: u32; - readonly i64mul: u32; - readonly i64divs: u32; - readonly i64divu: u32; - readonly i64rems: u32; - readonly i64remu: u32; - readonly i64and: u32; - readonly i64or: u32; - readonly i64xor: u32; - readonly i64shl: u32; - readonly i64shrs: u32; - readonly i64shru: u32; - readonly i64rotl: u32; - readonly i64rotr: u32; - } - - /** @name PalletContractsScheduleHostFnWeights (738) */ - interface PalletContractsScheduleHostFnWeights extends Struct { - readonly caller: SpWeightsWeightV2Weight; - readonly isContract: SpWeightsWeightV2Weight; - readonly codeHash: SpWeightsWeightV2Weight; - readonly ownCodeHash: SpWeightsWeightV2Weight; - readonly callerIsOrigin: SpWeightsWeightV2Weight; - readonly address: SpWeightsWeightV2Weight; - readonly gasLeft: SpWeightsWeightV2Weight; - readonly balance: SpWeightsWeightV2Weight; - readonly valueTransferred: SpWeightsWeightV2Weight; - readonly minimumBalance: SpWeightsWeightV2Weight; - readonly blockNumber: SpWeightsWeightV2Weight; - readonly now: SpWeightsWeightV2Weight; - readonly weightToFee: SpWeightsWeightV2Weight; - readonly gas: SpWeightsWeightV2Weight; - readonly input: SpWeightsWeightV2Weight; - readonly inputPerByte: SpWeightsWeightV2Weight; - readonly r_return: SpWeightsWeightV2Weight; - readonly returnPerByte: SpWeightsWeightV2Weight; - readonly terminate: SpWeightsWeightV2Weight; - readonly random: SpWeightsWeightV2Weight; - readonly depositEvent: SpWeightsWeightV2Weight; - readonly depositEventPerTopic: SpWeightsWeightV2Weight; - readonly depositEventPerByte: SpWeightsWeightV2Weight; - readonly debugMessage: SpWeightsWeightV2Weight; - readonly debugMessagePerByte: SpWeightsWeightV2Weight; - readonly setStorage: SpWeightsWeightV2Weight; - readonly setStoragePerNewByte: SpWeightsWeightV2Weight; - readonly setStoragePerOldByte: SpWeightsWeightV2Weight; - readonly setCodeHash: SpWeightsWeightV2Weight; - readonly clearStorage: SpWeightsWeightV2Weight; - readonly clearStoragePerByte: SpWeightsWeightV2Weight; - readonly containsStorage: SpWeightsWeightV2Weight; - readonly containsStoragePerByte: SpWeightsWeightV2Weight; - readonly getStorage: SpWeightsWeightV2Weight; - readonly getStoragePerByte: SpWeightsWeightV2Weight; - readonly takeStorage: SpWeightsWeightV2Weight; - readonly takeStoragePerByte: SpWeightsWeightV2Weight; - readonly transfer: SpWeightsWeightV2Weight; - readonly call: SpWeightsWeightV2Weight; - readonly delegateCall: SpWeightsWeightV2Weight; - readonly callTransferSurcharge: SpWeightsWeightV2Weight; - readonly callPerClonedByte: SpWeightsWeightV2Weight; - readonly instantiate: SpWeightsWeightV2Weight; - readonly instantiateTransferSurcharge: SpWeightsWeightV2Weight; - readonly instantiatePerInputByte: SpWeightsWeightV2Weight; - readonly instantiatePerSaltByte: SpWeightsWeightV2Weight; - readonly hashSha2256: SpWeightsWeightV2Weight; - readonly hashSha2256PerByte: SpWeightsWeightV2Weight; - readonly hashKeccak256: SpWeightsWeightV2Weight; - readonly hashKeccak256PerByte: SpWeightsWeightV2Weight; - readonly hashBlake2256: SpWeightsWeightV2Weight; - readonly hashBlake2256PerByte: SpWeightsWeightV2Weight; - readonly hashBlake2128: SpWeightsWeightV2Weight; - readonly hashBlake2128PerByte: SpWeightsWeightV2Weight; - readonly ecdsaRecover: SpWeightsWeightV2Weight; - readonly ecdsaToEthAddress: SpWeightsWeightV2Weight; - readonly reentranceCount: SpWeightsWeightV2Weight; - readonly accountReentranceCount: SpWeightsWeightV2Weight; - readonly instantiationNonce: SpWeightsWeightV2Weight; - } - - /** @name PalletContractsError (739) */ + readonly base: u32; + } + + /** @name PalletContractsEnvironment (742) */ + interface PalletContractsEnvironment extends Struct { + readonly accountId: PalletContractsEnvironmentTypeAccountId32; + readonly balance: PalletContractsEnvironmentTypeU128; + readonly hash_: PalletContractsEnvironmentTypeH256; + readonly hasher: PalletContractsEnvironmentTypeBlakeTwo256; + readonly timestamp: PalletContractsEnvironmentTypeU64; + readonly blockNumber: PalletContractsEnvironmentTypeU32; + } + + /** @name PalletContractsEnvironmentTypeAccountId32 (743) */ + type PalletContractsEnvironmentTypeAccountId32 = Null; + + /** @name PalletContractsEnvironmentTypeU128 (744) */ + type PalletContractsEnvironmentTypeU128 = Null; + + /** @name PalletContractsEnvironmentTypeH256 (745) */ + type PalletContractsEnvironmentTypeH256 = Null; + + /** @name PalletContractsEnvironmentTypeBlakeTwo256 (746) */ + type PalletContractsEnvironmentTypeBlakeTwo256 = Null; + + /** @name PalletContractsEnvironmentTypeU64 (747) */ + type PalletContractsEnvironmentTypeU64 = Null; + + /** @name PalletContractsEnvironmentTypeU32 (748) */ + type PalletContractsEnvironmentTypeU32 = Null; + + /** @name PalletContractsError (750) */ interface PalletContractsError extends Enum { - readonly isInvalidScheduleVersion: boolean; + readonly isInvalidSchedule: boolean; readonly isInvalidCallFlags: boolean; readonly isOutOfGas: boolean; readonly isOutputBufferTooSmall: boolean; @@ -5648,6 +5880,7 @@ declare module '@polkadot/types/lookup' { readonly isContractNotFound: boolean; readonly isCodeTooLarge: boolean; readonly isCodeNotFound: boolean; + readonly isCodeInfoNotFound: boolean; readonly isOutOfBounds: boolean; readonly isDecodingFailed: boolean; readonly isContractTrapped: boolean; @@ -5657,20 +5890,28 @@ declare module '@polkadot/types/lookup' { readonly isRandomSubjectTooLong: boolean; readonly isTooManyTopics: boolean; readonly isNoChainExtension: boolean; - readonly isDeletionQueueFull: boolean; + readonly isXcmDecodeFailed: boolean; readonly isDuplicateContract: boolean; readonly isTerminatedInConstructor: boolean; readonly isReentranceDenied: boolean; + readonly isStateChangeDenied: boolean; readonly isStorageDepositNotEnoughFunds: boolean; readonly isStorageDepositLimitExhausted: boolean; readonly isCodeInUse: boolean; readonly isContractReverted: boolean; readonly isCodeRejected: boolean; readonly isIndeterministic: boolean; - readonly type: 'InvalidScheduleVersion' | 'InvalidCallFlags' | 'OutOfGas' | 'OutputBufferTooSmall' | 'TransferFailed' | 'MaxCallDepthReached' | 'ContractNotFound' | 'CodeTooLarge' | 'CodeNotFound' | 'OutOfBounds' | 'DecodingFailed' | 'ContractTrapped' | 'ValueTooLarge' | 'TerminatedWhileReentrant' | 'InputForwarded' | 'RandomSubjectTooLong' | 'TooManyTopics' | 'NoChainExtension' | 'DeletionQueueFull' | 'DuplicateContract' | 'TerminatedInConstructor' | 'ReentranceDenied' | 'StorageDepositNotEnoughFunds' | 'StorageDepositLimitExhausted' | 'CodeInUse' | 'ContractReverted' | 'CodeRejected' | 'Indeterministic'; + readonly isMigrationInProgress: boolean; + readonly isNoMigrationPerformed: boolean; + readonly isMaxDelegateDependenciesReached: boolean; + readonly isDelegateDependencyNotFound: boolean; + readonly isDelegateDependencyAlreadyExists: boolean; + readonly isCannotAddSelfAsDelegateDependency: boolean; + readonly isOutOfTransientStorage: boolean; + readonly type: 'InvalidSchedule' | 'InvalidCallFlags' | 'OutOfGas' | 'OutputBufferTooSmall' | 'TransferFailed' | 'MaxCallDepthReached' | 'ContractNotFound' | 'CodeTooLarge' | 'CodeNotFound' | 'CodeInfoNotFound' | 'OutOfBounds' | 'DecodingFailed' | 'ContractTrapped' | 'ValueTooLarge' | 'TerminatedWhileReentrant' | 'InputForwarded' | 'RandomSubjectTooLong' | 'TooManyTopics' | 'NoChainExtension' | 'XcmDecodeFailed' | 'DuplicateContract' | 'TerminatedInConstructor' | 'ReentranceDenied' | 'StateChangeDenied' | 'StorageDepositNotEnoughFunds' | 'StorageDepositLimitExhausted' | 'CodeInUse' | 'ContractReverted' | 'CodeRejected' | 'Indeterministic' | 'MigrationInProgress' | 'NoMigrationPerformed' | 'MaxDelegateDependenciesReached' | 'DelegateDependencyNotFound' | 'DelegateDependencyAlreadyExists' | 'CannotAddSelfAsDelegateDependency' | 'OutOfTransientStorage'; } - /** @name PolymeshContractsError (741) */ + /** @name PolymeshContractsError (752) */ interface PolymeshContractsError extends Enum { readonly isInvalidFuncId: boolean; readonly isInvalidRuntimeCall: boolean; @@ -5687,8 +5928,8 @@ declare module '@polkadot/types/lookup' { readonly type: 'InvalidFuncId' | 'InvalidRuntimeCall' | 'ReadStorageFailed' | 'DataLeftAfterDecoding' | 'InLenTooLarge' | 'OutLenTooLarge' | 'InstantiatorWithNoIdentity' | 'RuntimeCallDenied' | 'CallerNotAPrimaryKey' | 'MissingKeyPermissions' | 'InvalidChainVersion' | 'NoUpgradesSupported'; } - /** @name PalletPreimageRequestStatus (742) */ - interface PalletPreimageRequestStatus extends Enum { + /** @name PalletPreimageOldRequestStatus (753) */ + interface PalletPreimageOldRequestStatus extends Enum { readonly isUnrequested: boolean; readonly asUnrequested: { readonly deposit: ITuple<[AccountId32, u128]>; @@ -5703,7 +5944,23 @@ declare module '@polkadot/types/lookup' { readonly type: 'Unrequested' | 'Requested'; } - /** @name PalletPreimageError (746) */ + /** @name PalletPreimageRequestStatus (755) */ + interface PalletPreimageRequestStatus extends Enum { + readonly isUnrequested: boolean; + readonly asUnrequested: { + readonly ticket: ITuple<[AccountId32, u128]>; + readonly len: u32; + } & Struct; + readonly isRequested: boolean; + readonly asRequested: { + readonly maybeTicket: Option>; + readonly count: u32; + readonly maybeLen: Option; + } & Struct; + readonly type: 'Unrequested' | 'Requested'; + } + + /** @name PalletPreimageError (760) */ interface PalletPreimageError extends Enum { readonly isTooBig: boolean; readonly isAlreadyNoted: boolean; @@ -5711,16 +5968,18 @@ declare module '@polkadot/types/lookup' { readonly isNotNoted: boolean; readonly isRequested: boolean; readonly isNotRequested: boolean; - readonly type: 'TooBig' | 'AlreadyNoted' | 'NotAuthorized' | 'NotNoted' | 'Requested' | 'NotRequested'; + readonly isTooMany: boolean; + readonly isTooFew: boolean; + readonly type: 'TooBig' | 'AlreadyNoted' | 'NotAuthorized' | 'NotNoted' | 'Requested' | 'NotRequested' | 'TooMany' | 'TooFew'; } - /** @name PolymeshPrimitivesNftNftCollection (747) */ + /** @name PolymeshPrimitivesNftNftCollection (761) */ interface PolymeshPrimitivesNftNftCollection extends Struct { readonly id: u64; readonly assetId: PolymeshPrimitivesAssetAssetId; } - /** @name PalletNftError (752) */ + /** @name PalletNftError (765) */ interface PalletNftError extends Enum { readonly isBalanceOverflow: boolean; readonly isBalanceUnderflow: boolean; @@ -5749,23 +6008,25 @@ declare module '@polkadot/types/lookup' { readonly isInvalidNFTTransferInvalidReceiverCDD: boolean; readonly isInvalidNFTTransferInvalidSenderCDD: boolean; readonly isInvalidAssetId: boolean; - readonly type: 'BalanceOverflow' | 'BalanceUnderflow' | 'CollectionAlredyRegistered' | 'CollectionNotFound' | 'DuplicateMetadataKey' | 'DuplicatedNFTId' | 'InvalidAssetType' | 'InvalidMetadataAttribute' | 'InvalidNFTTransferCollectionNotFound' | 'InvalidNFTTransferSamePortfolio' | 'InvalidNFTTransferNFTNotOwned' | 'InvalidNFTTransferCountOverflow' | 'InvalidNFTTransferComplianceFailure' | 'InvalidNFTTransferFrozenAsset' | 'InvalidNFTTransferInsufficientCount' | 'MaxNumberOfKeysExceeded' | 'MaxNumberOfNFTsPerLegExceeded' | 'NftNotFound' | 'UnregisteredMetadataKey' | 'ZeroCount' | 'SupplyOverflow' | 'SupplyUnderflow' | 'InvalidNFTTransferNFTIsLocked' | 'InvalidNFTTransferSenderIdMatchesReceiverId' | 'InvalidNFTTransferInvalidReceiverCDD' | 'InvalidNFTTransferInvalidSenderCDD' | 'InvalidAssetId'; + readonly isNftIsLocked: boolean; + readonly isNumberOfKeysIsLessThanExpected: boolean; + readonly type: 'BalanceOverflow' | 'BalanceUnderflow' | 'CollectionAlredyRegistered' | 'CollectionNotFound' | 'DuplicateMetadataKey' | 'DuplicatedNFTId' | 'InvalidAssetType' | 'InvalidMetadataAttribute' | 'InvalidNFTTransferCollectionNotFound' | 'InvalidNFTTransferSamePortfolio' | 'InvalidNFTTransferNFTNotOwned' | 'InvalidNFTTransferCountOverflow' | 'InvalidNFTTransferComplianceFailure' | 'InvalidNFTTransferFrozenAsset' | 'InvalidNFTTransferInsufficientCount' | 'MaxNumberOfKeysExceeded' | 'MaxNumberOfNFTsPerLegExceeded' | 'NftNotFound' | 'UnregisteredMetadataKey' | 'ZeroCount' | 'SupplyOverflow' | 'SupplyUnderflow' | 'InvalidNFTTransferNFTIsLocked' | 'InvalidNFTTransferSenderIdMatchesReceiverId' | 'InvalidNFTTransferInvalidReceiverCDD' | 'InvalidNFTTransferInvalidSenderCDD' | 'InvalidAssetId' | 'NftIsLocked' | 'NumberOfKeysIsLessThanExpected'; } - /** @name PalletElectionProviderMultiPhaseReadySolution (753) */ + /** @name PalletElectionProviderMultiPhaseReadySolution (766) */ interface PalletElectionProviderMultiPhaseReadySolution extends Struct { readonly supports: Vec>; readonly score: SpNposElectionsElectionScore; readonly compute: PalletElectionProviderMultiPhaseElectionCompute; } - /** @name PalletElectionProviderMultiPhaseRoundSnapshot (755) */ + /** @name PalletElectionProviderMultiPhaseRoundSnapshot (768) */ interface PalletElectionProviderMultiPhaseRoundSnapshot extends Struct { readonly voters: Vec]>>; readonly targets: Vec; } - /** @name PalletElectionProviderMultiPhaseSignedSignedSubmission (761) */ + /** @name PalletElectionProviderMultiPhaseSignedSignedSubmission (774) */ interface PalletElectionProviderMultiPhaseSignedSignedSubmission extends Struct { readonly who: AccountId32; readonly deposit: u128; @@ -5773,7 +6034,7 @@ declare module '@polkadot/types/lookup' { readonly callFee: u128; } - /** @name PalletElectionProviderMultiPhaseError (762) */ + /** @name PalletElectionProviderMultiPhaseError (775) */ interface PalletElectionProviderMultiPhaseError extends Enum { readonly isPreDispatchEarlySubmission: boolean; readonly isPreDispatchWrongWinnerCount: boolean; @@ -5789,37 +6050,29 @@ declare module '@polkadot/types/lookup' { readonly isFallbackFailed: boolean; readonly isBoundNotMet: boolean; readonly isTooManyWinners: boolean; - readonly type: 'PreDispatchEarlySubmission' | 'PreDispatchWrongWinnerCount' | 'PreDispatchWeakSubmission' | 'SignedQueueFull' | 'SignedCannotPayDeposit' | 'SignedInvalidWitness' | 'SignedTooMuchWeight' | 'OcwCallWrongEra' | 'MissingSnapshotMetadata' | 'InvalidSubmissionIndex' | 'CallNotAllowed' | 'FallbackFailed' | 'BoundNotMet' | 'TooManyWinners'; + readonly isPreDispatchDifferentRound: boolean; + readonly type: 'PreDispatchEarlySubmission' | 'PreDispatchWrongWinnerCount' | 'PreDispatchWeakSubmission' | 'SignedQueueFull' | 'SignedCannotPayDeposit' | 'SignedInvalidWitness' | 'SignedTooMuchWeight' | 'OcwCallWrongEra' | 'MissingSnapshotMetadata' | 'InvalidSubmissionIndex' | 'CallNotAllowed' | 'FallbackFailed' | 'BoundNotMet' | 'TooManyWinners' | 'PreDispatchDifferentRound'; } - /** @name PalletTestUtilsError (763) */ - type PalletTestUtilsError = Null; - - /** @name FrameSystemExtensionsCheckSpecVersion (766) */ + /** @name FrameSystemExtensionsCheckSpecVersion (778) */ type FrameSystemExtensionsCheckSpecVersion = Null; - /** @name FrameSystemExtensionsCheckTxVersion (767) */ + /** @name FrameSystemExtensionsCheckTxVersion (779) */ type FrameSystemExtensionsCheckTxVersion = Null; - /** @name FrameSystemExtensionsCheckGenesis (768) */ + /** @name FrameSystemExtensionsCheckGenesis (780) */ type FrameSystemExtensionsCheckGenesis = Null; - /** @name FrameSystemExtensionsCheckNonce (771) */ + /** @name FrameSystemExtensionsCheckNonce (783) */ interface FrameSystemExtensionsCheckNonce extends Compact {} - /** @name PolymeshExtensionsCheckWeight (772) */ - interface PolymeshExtensionsCheckWeight extends FrameSystemExtensionsCheckWeight {} - - /** @name FrameSystemExtensionsCheckWeight (773) */ + /** @name FrameSystemExtensionsCheckWeight (784) */ type FrameSystemExtensionsCheckWeight = Null; - /** @name PalletTransactionPaymentChargeTransactionPayment (774) */ + /** @name PalletTransactionPaymentChargeTransactionPayment (785) */ interface PalletTransactionPaymentChargeTransactionPayment extends Compact {} - /** @name PalletPermissionsStoreCallMetadata (775) */ + /** @name PalletPermissionsStoreCallMetadata (786) */ type PalletPermissionsStoreCallMetadata = Null; - /** @name PolymeshRuntimeDevelopRuntime (776) */ - type PolymeshRuntimeDevelopRuntime = Null; - } // declare module diff --git a/scripts/cli/src/util/init.ts b/scripts/cli/src/util/init.ts index e4ebdb38b8..171349e10a 100644 --- a/scripts/cli/src/util/init.ts +++ b/scripts/cli/src/util/init.ts @@ -230,18 +230,6 @@ export async function keyToIdentityIds( return (0 as unknown); } -// Returns the asset did -export function tickerToDid(ticker: Ticker) { - let tickerString = String.fromCharCode.apply(ticker); - let tickerUintArray = Uint8Array.from(tickerString, (x) => x.charCodeAt(0)); - return blake2AsHex( - u8aConcat( - stringToU8a("SECURITY_TOKEN:"), - u8aFixLength(tickerUintArray, 96, true) - ) - ); -} - export async function generateStashKeys( accounts: string[] ): Promise { diff --git a/scripts/cli/src/util/offchain_worker_test.ts b/scripts/cli/src/util/offchain_worker_test.ts index a60760aa0e..375796207c 100644 --- a/scripts/cli/src/util/offchain_worker_test.ts +++ b/scripts/cli/src/util/offchain_worker_test.ts @@ -27,7 +27,7 @@ async function main(): Promise { // Add as secondary key to the existing did who wants to be a potential nominator await addSecondaryKeys(stash_nominators, controller_keys); await authorizeJoinToIdentities(stash_nominators, controller_keys); - await addNominator(controller_keys, stash_nominators, alice, validators_key); + await addNominator(stash_nominators, alice, validators_key); init.subscribeCddOffchainWorker(); } diff --git a/scripts/cli/util/distributePOLYX.js b/scripts/cli/util/distributePOLYX.js index cce27ea4b6..0f2cec9a6d 100644 --- a/scripts/cli/util/distributePOLYX.js +++ b/scripts/cli/util/distributePOLYX.js @@ -37,7 +37,7 @@ async function batchAtomic(api, sender, receivers, amount) { for (i = 0; i < receivers.length; i++) { if (receivers[i] != senderDid.toString()) { console.log("Prepping for DID: ", receivers[i].toString()); - let tx = await api.tx.balances.transfer(receivers[i].address, amount); + let tx = await api.tx.balances.transferWithMemo(receivers[i].address, amount, null); txArray.push(tx); } else { console.log("Skipping Sender"); diff --git a/scripts/cli/util/init.mjs b/scripts/cli/util/init.mjs index 872fd8c55e..7c83ef68a8 100644 --- a/scripts/cli/util/init.mjs +++ b/scripts/cli/util/init.mjs @@ -322,16 +322,6 @@ async function issueTokenPerDid(api, accounts, ticker, amount, fundingRound) { } -// Returns the asset did -function tickerToDid(ticker) { - return blake2AsHex( - u8aConcat( - stringToU8a("SECURITY_TOKEN:"), - u8aFixLength(stringToU8a(ticker), 96, true) - ) - ); -} - // Creates claim compliance for an asset async function createClaimCompliance(api, accounts, dids, ticker) { @@ -682,7 +672,6 @@ let reqImports = { receiverConditions1, createClaimCompliance, addClaimsToDids, - tickerToDid, sendTransaction, generateStashKeys, generateEntity, diff --git a/scripts/cli/util/offchain_worker_test.js b/scripts/cli/util/offchain_worker_test.js index 92aecc7daa..6a5b0d82f0 100644 --- a/scripts/cli/util/offchain_worker_test.js +++ b/scripts/cli/util/offchain_worker_test.js @@ -52,7 +52,7 @@ async function main() { await reqImports["authorizeJoinToIdentities"]( api, stash_nominators, nominator_dids, controller_keys); await reqImports["blockTillPoolEmpty"](api); - await addNominator(api, controller_keys, stash_nominators, testEntities[0], validators_key); + await addNominator(api, stash_nominators, testEntities[0], validators_key); await reqImports["blockTillPoolEmpty"](api); subscribeCddOffchainWorker(api); @@ -110,25 +110,19 @@ async function getExpiries(api, length) { return expiries; } -async function addNominator(api, controller, stash, from, validator) { +async function addNominator(api, stash, from, validator) { let transfer_amount = new BN(1).mul(new BN(10).pow(new BN(6))); let operators = [validator[0].address, validator[1].address]; let bond_amount = new BN(3).mul(new BN(10).pow(new BN(6))); // bond nominator first for (let i = 0; i < stash.length; i++) { - const tx = api.tx.staking.bond(controller[i].address, bond_amount, "Controller"); + const tx = api.tx.staking.bond(bond_amount, "Controller"); await reqImports["signAndSendTransaction"](tx, stash[i]); - } - await reqImports["blockTillPoolEmpty"](api); - // fund controller keys - await reqImports["distributePolyBatch"](api, controller, transfer_amount, from); - await reqImports["blockTillPoolEmpty"](api); - - for (let i = 0; i < controller.length; i++) { const tx = api.tx.staking.nominate(operators); - await reqImports["signAndSendTransaction"](tx, controller[i]); + await reqImports["signAndSendTransaction"](tx, stash[i]); } + await reqImports["blockTillPoolEmpty"](api); } async function subscribeCddOffchainWorker(api) { diff --git a/scripts/test.sh b/scripts/test.sh index be4e52833b..8559648399 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -2,15 +2,13 @@ SKIP_WASM_BUILD=1 RUST_BACKTRACE=1 \ cargo test \ - --package pallet-staking \ + --package pallet-validators \ --package pallet-group \ --package pallet-sudo \ --package pallet-pips \ --package polymesh-primitives \ --package polymesh-contracts \ --package node-rpc-runtime-api \ - --package pallet-transaction-payment \ --package polymesh-runtime-tests \ - --package pallet-balances:0.1.0 \ --package asset-metadata \ "$@" diff --git a/src/benchmarking.rs b/src/benchmarking.rs index 2c00bbe7bc..3e8800465b 100644 --- a/src/benchmarking.rs +++ b/src/benchmarking.rs @@ -2,38 +2,40 @@ //! //! Should only be used for benchmarking as it may break in other contexts. -use crate::service::FullClient; -use polymesh_primitives::{AccountId, Balance, Signature}; +use std::result::Result as StdResult; +use std::sync::Arc; +use std::time::Duration; -use polymesh_runtime_common::BlockHashCount; -use polymesh_runtime_develop::runtime::{self, BalancesCall, SystemCall}; -use sc_cli::Result; +use sc_cli::Result as CliResult; use sc_client_api::BlockBackend; -use sc_executor::NativeExecutionDispatch; use sp_core::{Encode, Pair}; use sp_inherents::{InherentData, InherentDataProvider}; use sp_keyring::Sr25519Keyring; use sp_runtime::{OpaqueExtrinsic, SaturatedConversion}; -use std::{sync::Arc, time::Duration}; +use polymesh_primitives::{AccountId, Balance, Signature}; +use polymesh_runtime_common::BlockHashCount; +use polymesh_runtime_develop::runtime::RuntimeCall as DevRuntimeCall; +use polymesh_runtime_develop::runtime::{BalancesCall, TxExtension, VERSION}; +use polymesh_runtime_develop::runtime::{SignedPayload, SystemCall, UncheckedExtrinsic}; + +use crate::service::FullClient; /// Generates extrinsics for the `benchmark overhead` command. /// /// Note: Should only be used for benchmarking. -pub struct RemarkBuilder { - client: Arc>, +pub struct RemarkBuilder { + client: Arc>, } -impl RemarkBuilder { - /// Creates a new [`Self`] from the given client. - pub fn new(client: Arc>) -> Self { +impl RemarkBuilder { + /// Creates a new [`RemarkBuilder`] from the given client. + pub fn new(client: Arc>) -> Self { Self { client } } } -impl frame_benchmarking_cli::ExtrinsicBuilder - for RemarkBuilder -{ +impl frame_benchmarking_cli::ExtrinsicBuilder for RemarkBuilder { fn pallet(&self) -> &str { "system" } @@ -42,11 +44,10 @@ impl frame_benchmarking_cli::ExtrinsicB "remark" } - fn build(&self, nonce: u32) -> std::result::Result { - let acc = Sr25519Keyring::Bob.pair(); - let extrinsic: OpaqueExtrinsic = create_benchmark_extrinsic( + fn build(&self, nonce: u32) -> StdResult { + let extrinsic = create_benchmark_extrinsic( self.client.as_ref(), - acc, + Sr25519Keyring::Bob.pair(), SystemCall::remark { remark: vec![] }.into(), nonce, ) @@ -59,15 +60,15 @@ impl frame_benchmarking_cli::ExtrinsicB /// Generates `Balances::Transfer` extrinsics for the benchmarks. /// /// Note: Should only be used for benchmarking. -pub struct TransferBuilder { - client: Arc>, +pub struct TransferBuilder { + client: Arc>, dest: AccountId, value: Balance, } -impl TransferBuilder { +impl TransferBuilder { /// Creates a new [`Self`] from the given client. - pub fn new(client: Arc>, dest: AccountId, value: Balance) -> Self { + pub fn new(client: Arc>, dest: AccountId, value: Balance) -> Self { Self { client, dest, @@ -76,9 +77,7 @@ impl TransferBuilder { } } -impl frame_benchmarking_cli::ExtrinsicBuilder - for TransferBuilder -{ +impl frame_benchmarking_cli::ExtrinsicBuilder for TransferBuilder { fn pallet(&self) -> &str { "balances" } @@ -88,11 +87,10 @@ impl frame_benchmarking_cli::ExtrinsicB } fn build(&self, nonce: u32) -> std::result::Result { - let acc = Sr25519Keyring::Bob.pair(); - let extrinsic: OpaqueExtrinsic = create_benchmark_extrinsic( + let extrinsic = create_benchmark_extrinsic( self.client.as_ref(), - acc, - BalancesCall::transfer { + Sr25519Keyring::Bob.pair(), + BalancesCall::transfer_allow_death { dest: self.dest.clone().into(), value: self.value.into(), } @@ -108,12 +106,12 @@ impl frame_benchmarking_cli::ExtrinsicB /// Create a transaction using the given `call`. /// /// Note: Should only be used for benchmarking. -pub fn create_benchmark_extrinsic( - client: &FullClient, +pub fn create_benchmark_extrinsic( + client: &FullClient, sender: sp_core::sr25519::Pair, - call: runtime::RuntimeCall, + call: DevRuntimeCall, nonce: u32, -) -> runtime::UncheckedExtrinsic { +) -> UncheckedExtrinsic { let genesis_hash = client .block_hash(0) .ok() @@ -126,48 +124,63 @@ pub fn create_benchmark_extrinsic( .checked_next_power_of_two() .map(|c| c / 2) .unwrap_or(2) as u64; - let extra: runtime::SignedExtra = ( - frame_system::CheckSpecVersion::::new(), - frame_system::CheckTxVersion::::new(), - frame_system::CheckGenesis::::new(), - frame_system::CheckEra::::from(sp_runtime::generic::Era::mortal( + let tx_ext: TxExtension = ( + ( + frame_system::AuthorizeCall::new(), + frame_system::CheckNonZeroSender::new(), + frame_system::CheckSpecVersion::new(), + frame_system::CheckTxVersion::new(), + frame_system::CheckGenesis::new(), + ), + frame_system::CheckEra::from(sp_runtime::generic::Era::mortal( period, best_block.saturated_into(), )), - frame_system::CheckNonce::::from(nonce), + frame_system::CheckNonce::from(nonce), frame_system::CheckWeight::new(), - pallet_transaction_payment::ChargeTransactionPayment::::from(0), + polymesh_transaction_payment::ChargeTransactionPayment::from(0), pallet_permissions::StoreCallMetadata::new(), + frame_metadata_hash_extension::CheckMetadataHash::new(false), + pallet_revive::evm::tx_extension::SetOrigin::default(), + frame_system::WeightReclaim::new(), ); - let raw_payload = runtime::SignedPayload::from_raw( + let raw_payload = SignedPayload::from_raw( call.clone(), - extra.clone(), + tx_ext.clone(), ( - runtime::VERSION.spec_version, - runtime::VERSION.transaction_version, - genesis_hash, + ( + (), + (), + VERSION.spec_version, + VERSION.transaction_version, + genesis_hash, + ), best_hash, (), (), (), (), + None, + (), + (), ), ); let signature = raw_payload.using_encoded(|e| sender.sign(e)); - runtime::UncheckedExtrinsic::new_signed( + sp_runtime::generic::UncheckedExtrinsic::new_signed( call.clone(), sp_runtime::AccountId32::from(sender.public()).into(), Signature::Sr25519(signature.clone()), - extra.clone(), + tx_ext.clone(), ) + .into() } /// Generates inherent data for the `benchmark overhead` command. /// /// Note: Should only be used for benchmarking. -pub fn inherent_benchmark_data() -> Result { +pub(crate) fn inherent_benchmark_data() -> CliResult { let mut inherent_data = InherentData::new(); let d = Duration::from_millis(0); let timestamp = sp_timestamp::InherentDataProvider::new(d.into()); diff --git a/src/bin/main.rs b/src/bin/main.rs new file mode 100644 index 0000000000..38fa738730 --- /dev/null +++ b/src/bin/main.rs @@ -0,0 +1,8 @@ +//! Polymesh Node CLI binary. + +fn main() -> sc_cli::Result<()> { + let args = std::env::args_os() + .map(|s| s.to_string_lossy().to_string()) + .collect::>(); + polymesh::command::run_with_args(args) +} diff --git a/src/chain_spec.rs b/src/chain_spec.rs deleted file mode 100644 index 19a00c4e6e..0000000000 --- a/src/chain_spec.rs +++ /dev/null @@ -1,1104 +0,0 @@ -use codec::{Decode, Encode}; -use grandpa::AuthorityId as GrandpaId; -use pallet_asset::TickerRegistrationConfig; -use pallet_im_online::sr25519::AuthorityId as ImOnlineId; -use pallet_staking::StakerStatus; -use polymesh_common_utilities::protocol_fee::ProtocolOp; -use polymesh_primitives::{ - asset_metadata::{AssetMetadataName, AssetMetadataSpec}, - constants::{currency::ONE_POLY, TREASURY_PALLET_ID}, - identity_id::GenesisIdentityRecord, - AccountId, IdentityId, MaybeBlock, Moment, PosRatio, SecondaryKey, Signature, - SystematicIssuers, Ticker, -}; -use sc_chain_spec::{ChainSpecExtension, ChainType}; -use sc_service::Properties; -use sc_telemetry::TelemetryEndpoints; -use serde_json::json; -use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; -use sp_consensus_babe::AuthorityId as BabeId; -use sp_core::{sr25519, Pair, Public}; -use sp_runtime::traits::{AccountIdConversion, IdentifyAccount, Verify}; -use sp_runtime::PerThing; -#[cfg(feature = "std")] -use sp_runtime::{Deserialize, Serialize}; -use std::convert::TryInto; - -// The URL for the telemetry server. -const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polymesh.network/submit/"; - -const BOOTSTRAP_KEYS: u128 = 6_000 * ONE_POLY; -const BOOTSTRAP_TREASURY: u128 = 17_500_000 * ONE_POLY; - -const DEV_KEYS: u128 = 30_000_000 * ONE_POLY; -const DEV_TREASURY: u128 = 50_000_000 * ONE_POLY; - -const INITIAL_BOND: u128 = 500 * ONE_POLY; - -/// Node `ChainSpec` extensions. -/// -/// Additional parameters for some Substrate core modules, -/// customizable from the chain spec. -#[derive(Default, Clone, Serialize, Deserialize, ChainSpecExtension)] -#[serde(rename_all = "camelCase")] -pub struct Extensions { - /// The light sync state. - /// - /// This value will be set by the `sync-state rpc` implementation. - pub light_sync_state: sc_sync_state_rpc::LightSyncStateExtension, -} - -pub type GenericChainSpec = sc_service::GenericChainSpec; - -/// Generate a crypto pair from seed. -pub fn get_from_seed(seed: &str) -> ::Public { - TPublic::Pair::from_string(&format!("//{}", seed), None) - .expect("static values are valid; qed") - .public() -} - -type AccountPublic = ::Signer; - -/// Generate an account ID from seed. -pub fn get_account_id_from_seed(seed: &str) -> AccountId -where - AccountPublic: From<::Public>, -{ - AccountPublic::from(get_from_seed::(seed)).into_account() -} - -fn seeded_acc_id(seed: &str) -> AccountId { - get_account_id_from_seed::(seed) -} - -/// Generate an Aura authority key. -pub fn get_authority_keys_from_seed(s: &str, uniq: bool) -> InitialAuth { - let stash_acc_id = seeded_acc_id(&format!("{}//stash", s)); - let acc_id = seeded_acc_id(s); - - let (grandpa_id, babe_id, im_online_id, discovery_id) = if uniq { - ( - get_from_seed::(&format!("{}//gran", s)), - get_from_seed::(&format!("{}//babe", s)), - get_from_seed::(&format!("{}//imon", s)), - get_from_seed::(&format!("{}//auth", s)), - ) - } else { - ( - get_from_seed::(s), - get_from_seed::(s), - get_from_seed::(s), - get_from_seed::(s), - ) - }; - - ( - stash_acc_id, - acc_id, - grandpa_id, - babe_id, - im_online_id, - discovery_id, - ) -} - -fn polymesh_props(ss58: u8) -> Properties { - json!({ "ss58Format": ss58, "tokenDecimals": 6, "tokenSymbol": "POLYX" }) - .as_object() - .unwrap() - .clone() -} - -macro_rules! session_keys { - () => { - fn session_keys( - grandpa: GrandpaId, - babe: BabeId, - im_online: ImOnlineId, - authority_discovery: AuthorityDiscoveryId, - ) -> rt::SessionKeys { - rt::SessionKeys { - babe, - grandpa, - im_online, - authority_discovery, - } - } - }; -} - -macro_rules! asset { - () => { - pallet_asset::GenesisConfig { - ticker_registration_config: ticker_registration_config(), - reserved_country_currency_codes: currency_codes(), - asset_metadata: asset_metadata(), - } - }; -} - -fn ticker_registration_config() -> TickerRegistrationConfig { - TickerRegistrationConfig { - max_ticker_length: 12, - registration_length: Some(5_184_000_000), - } -} - -fn currency_codes() -> Vec { - // Fiat Currency Struct - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - #[derive(Encode, Decode, Clone, Debug, PartialEq, Eq)] - pub struct FiatCurrency { - pub codes: Vec, - } - - let currency_file = include_str!("data/currency_symbols.json"); - let currency_data: FiatCurrency = serde_json::from_str(¤cy_file).unwrap(); - currency_data - .codes - .into_iter() - .map(|y| Ticker::from_slice_truncated(y.as_bytes())) - .collect() -} - -fn asset_metadata() -> Vec<(AssetMetadataName, AssetMetadataSpec)> { - let metadata_json = include_str!("data/asset_metadata.json"); - serde_json::from_str(&metadata_json).expect("Asset Metadata") -} - -macro_rules! checkpoint { - () => {{ - // We use a weekly complexity. That is, >= 7 days apart per CP is OK. - use polymesh_primitives::calendar::{CalendarPeriod, CalendarUnit::Week}; - let period = CalendarPeriod { - unit: Week, - amount: 1, - }; - pallet_asset::checkpoint::GenesisConfig { - schedules_max_complexity: period.complexity(), - } - }}; -} - -type InitialAuth = ( - AccountId, - AccountId, - GrandpaId, - BabeId, - ImOnlineId, - AuthorityDiscoveryId, -); - -// alias type to make clippy happy. -type GenesisProcessedData = ( - Vec>, - Vec<( - IdentityId, - AccountId, - AccountId, - u128, - StakerStatus, - )>, - Vec<(AccountId, u128)>, -); - -fn adjust_last(bytes: &mut [u8], n: u8) -> &str { - bytes[bytes.len() - 1] = n + b'0'; - core::str::from_utf8(bytes).unwrap() -} - -fn genesis_processed_data( - initial_authorities: &Vec, //Alice, Bob, Charlie - root_key: AccountId, //polymesh_5 - treasury_amount: u128, - key_amount: u128, -) -> GenesisProcessedData { - // Identities and their roles - // 1 = [Polymesh] GenesisCouncil (1 of 3) + UpgradeCommittee (1 of 1) + TechnicalCommittee (1 of 1) + GCReleaseCoordinator - // 2 = GenesisCouncil (2 of 3) - // 3 = GenesisCouncil (3 of 3) - // 4 = Operator - // 5 = Sudo - - // Identity_01 - // Primary Key: polymesh_1 - - // Identity_02 - // Primary Key: polymesh_2 - - // Identity_03 - // Primary Key: polymesh_3 - - // Identity_04 - // Primary Key: polymesh_4 - // Secondary Keys: Alice, Alice//stash, Bob, Bob//stash, Charlie, Charlie//stash - - // Identity_05 - // Primary Key: polymesh_5 - - let mut identities = Vec::new(); - let mut balances = Vec::new(); - let mut keys = Vec::new(); - - let mut create_id = |nonce: u8, primary_key: AccountId| { - keys.push(primary_key.clone()); - balances.push((primary_key.clone(), key_amount)); - identities.push(GenesisIdentityRecord::new(nonce, primary_key)); - }; - - // Creating Identities 1-4 (GC + Operators) - for i in 1..5u8 { - create_id(i, seeded_acc_id(adjust_last(&mut { *b"polymesh_0" }, i))); - } - - // Creating identity for sudo - create_id(5u8, root_key); - - // 3 operators, all self staking at genesis - let mut stakers = Vec::with_capacity(initial_authorities.len()); - for (stash, controller, ..) in initial_authorities { - stakers.push(( - IdentityId::from(4), // All operators have the same Identity - stash.clone(), - controller.clone(), - INITIAL_BOND, - pallet_staking::StakerStatus::Validator, - )); - // Make stash and controller 4th Identity's secondary keys. - let mut push_key = |key: &AccountId| { - balances.push((key.clone(), key_amount)); - identities[3] - .secondary_keys - .push(SecondaryKey::from_account_id_with_full_perms(key.clone())); - keys.push(key.clone()); - }; - push_key(stash); - push_key(controller); - } - - // Give CDD issuer to operator and sudo since it won't receive CDD from the group automatically - identities[3] - .issuers - .push(SystematicIssuers::CDDProvider.as_id()); - - // Give CDD issuer to operator and sudo since it won't receive CDD from the group automatically - identities[4] - .issuers - .push(SystematicIssuers::CDDProvider.as_id()); - - // Treasury - balances.push(( - TREASURY_PALLET_ID.into_account_truncating(), - treasury_amount, - )); - - (identities, stakers, balances) -} - -#[cfg(not(feature = "ci-runtime"))] -fn dev_genesis_processed_data( - initial_authorities: &Vec, - other_funded_accounts: Vec, - treasury_amount: u128, - key_amount: u128, -) -> GenesisProcessedData { - let mut identity = GenesisIdentityRecord::new(1u8, initial_authorities[0].0.clone()); - let mut balances = Vec::new(); - - let mut stakers = Vec::with_capacity(initial_authorities.len()); - identity - .secondary_keys - .reserve(initial_authorities.len() * 2 + other_funded_accounts.len()); - let mut add_sk = |acc: AccountId| { - balances.push((acc.clone(), key_amount)); - identity - .secondary_keys - .push(SecondaryKey::from_account_id_with_full_perms(acc)) - }; - for (stash, controller, ..) in initial_authorities { - stakers.push(( - IdentityId::from(1), - stash.clone(), - controller.clone(), - INITIAL_BOND, - pallet_staking::StakerStatus::Validator, - )); - add_sk(stash.clone()); - add_sk(controller.clone()); - } - - for account in other_funded_accounts { - add_sk(account); - } - - // Treasury - balances.push(( - TREASURY_PALLET_ID.into_account_truncating(), - treasury_amount, - )); - - // The 0th key is the primary key - identity.secondary_keys.remove(0); - - (vec![identity], stakers, balances) -} - -fn frame(wasm_binary: Option<&[u8]>) -> frame_system::GenesisConfig { - frame_system::GenesisConfig { - code: wasm_binary.expect("WASM binary was not generated").to_vec(), - } -} - -macro_rules! session { - ($inits:expr, $build:expr) => { - pallet_session::GenesisConfig { - keys: $inits - .iter() - .map(|x| { - let sks = $build(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone()); - (x.0.clone(), x.0.clone(), sks) - }) - .collect::>(), - } - }; -} - -macro_rules! staking { - ($auths:expr, $stakers:expr, $cap:expr) => { - pallet_staking::GenesisConfig { - validator_count: 40, - validator_commission_cap: $cap, - minimum_validator_count: 1, - stakers: $stakers, - invulnerables: vec![], - slash_reward_fraction: sp_runtime::Perbill::from_percent(10), - ..Default::default() - } - }; -} - -macro_rules! pips { - ($period:expr, $expiry:expr, $limit:expr) => { - pallet_pips::GenesisConfig { - prune_historical_pips: false, - min_proposal_deposit: 2_000_000_000, - default_enactment_period: $period, - max_pip_skip_count: 2, - active_pip_limit: $limit, - pending_pip_expiry: $expiry, - } - }; -} - -macro_rules! group_membership { - ($($member:expr),*) => { - pallet_group::GenesisConfig { - active_members_limit: 20, - active_members: vec![$(IdentityId::from($member)),*], - phantom: Default::default(), - } - }; -} - -macro_rules! corporate_actions { - () => { - pallet_corporate_actions::GenesisConfig { - max_details_length: 1024, - } - }; -} - -macro_rules! committee { - ($rc:expr) => { - committee!($rc, (1, 2)) - }; - ($rc:expr, $vote:expr) => { - pallet_committee::GenesisConfig { - vote_threshold: $vote, - members: vec![], - release_coordinator: IdentityId::from($rc), - expires_after: <_>::default(), - phantom: Default::default(), - } - }; -} - -fn protocol_fees() -> Vec<(ProtocolOp, u128)> { - vec![ - (ProtocolOp::AssetCreateAsset, 2_500 * 1_000_000), - (ProtocolOp::AssetRegisterTicker, 500 * 1_000_000), - ] -} - -macro_rules! protocol_fee { - () => { - pallet_protocol_fee::GenesisConfig { - base_fees: protocol_fees(), - coefficient: PosRatio(1, 1), - } - }; -} - -macro_rules! polymesh_contracts { - ($root_key:expr) => { - polymesh_contracts::GenesisConfig { - call_whitelist: contracts_call_whitelist(), - upgradable_code: contracts_upgradable_code(), - upgradable_description: "POLY" - .as_bytes() - .try_into() - .expect("Wrong Length - should be length 4"), - upgradable_major: 7, - upgradable_owner: $root_key, - } - }; -} - -fn contracts_upgradable_code() -> Vec { - // NB - Contract should match the `upgradable_major` version above. - let upgradable_code = include_bytes!("data/contracts/polymesh_ink_7.wasm").to_vec(); - upgradable_code -} - -fn contracts_call_whitelist() -> Vec { - let whitelist_file = include_str!("data/contracts_call_whitelist.json"); - serde_json::from_str::>(&whitelist_file) - .expect("Failed to read contracts call whitelist") -} - -#[cfg(not(feature = "ci-runtime"))] -pub mod general { - use super::*; - use polymesh_runtime_develop::{self as rt, constants::time}; - - pub type ChainSpec = GenericChainSpec; - - session_keys!(); - - fn genesis( - initial_authorities: Vec, - root_key: AccountId, - other_funded_accounts: Vec, - treasury_amount: u128, - key_amount: u128, - ) -> rt::runtime::GenesisConfig { - let (identities, stakers, balances) = dev_genesis_processed_data( - &initial_authorities, - other_funded_accounts, - treasury_amount, - key_amount, - ); - - rt::runtime::GenesisConfig { - system: frame(rt::WASM_BINARY), - asset: asset!(), - checkpoint: checkpoint!(), - identity: pallet_identity::GenesisConfig { - identities, - ..Default::default() - }, - balances: rt::runtime::BalancesConfig { balances }, - indices: pallet_indices::GenesisConfig { indices: vec![] }, - sudo: pallet_sudo::GenesisConfig { - key: Some(root_key.clone()), - }, - session: session!(initial_authorities, session_keys), - staking: staking!( - initial_authorities, - stakers, - PerThing::from_rational(1u64, 4u64) - ), - pips: pips!(time::MINUTES, MaybeBlock::None, 25), - im_online: Default::default(), - authority_discovery: Default::default(), - babe: pallet_babe::GenesisConfig { - authorities: vec![], - epoch_config: Some(rt::runtime::BABE_GENESIS_EPOCH_CONFIG), - }, - grandpa: Default::default(), - /* - pallet_contracts: Some(pallet_contracts::GenesisConfig { - current_schedule: pallet_contracts::Schedule { - enable_println, // this should only be enabled on development chains - ..Default::default() - }, - }), - */ - // Governance Council: - committee_membership: group_membership!(1), - polymesh_committee: committee!(1), - // CDD providers - cdd_service_providers: group_membership!(1), - // Technical Committee: - technical_committee_membership: group_membership!(1), - technical_committee: committee!(1), - // Upgrade Committee: - upgrade_committee_membership: group_membership!(1), - upgrade_committee: committee!(1), - protocol_fee: protocol_fee!(), - settlement: Default::default(), - portfolio: Default::default(), - statistics: Default::default(), - multi_sig: Default::default(), - corporate_action: corporate_actions!(), - capital_distribution: Default::default(), - corporate_ballot: Default::default(), - polymesh_contracts: polymesh_contracts!(Some(root_key)), - } - } - - fn develop_genesis() -> rt::runtime::GenesisConfig { - genesis( - vec![get_authority_keys_from_seed("Alice", false)], - seeded_acc_id("Alice"), - vec![ - seeded_acc_id("Bob"), - seeded_acc_id("Charlie"), - seeded_acc_id("Dave"), - seeded_acc_id("Eve"), - ], - DEV_TREASURY, - DEV_KEYS, - ) - } - - fn config( - name: &str, - id: &str, - ctype: ChainType, - genesis: impl 'static + Sync + Send + Fn() -> rt::runtime::GenesisConfig, - ) -> ChainSpec { - let props = Some(polymesh_props(42)); - ChainSpec::from_genesis( - name, - id, - ctype, - genesis, - vec![], - None, - None, - None, - props, - <_>::default(), - ) - } - - pub fn develop_config() -> ChainSpec { - config( - "Development", - "dev", - ChainType::Development, - develop_genesis, - ) - } - - fn local_genesis() -> rt::runtime::GenesisConfig { - genesis( - vec![ - get_authority_keys_from_seed("Alice", false), - get_authority_keys_from_seed("Bob", false), - get_authority_keys_from_seed("Charlie", false), - ], - seeded_acc_id("Alice"), - vec![seeded_acc_id("Dave"), seeded_acc_id("Eve")], - DEV_TREASURY, - DEV_KEYS, - ) - } - - pub fn local_config() -> ChainSpec { - config( - "Local Development", - "local_dev", - ChainType::Local, - local_genesis, - ) - } -} - -pub mod testnet { - use super::*; - use polymesh_runtime_testnet::{self as rt, constants::time}; - - pub type ChainSpec = GenericChainSpec; - - session_keys!(); - - fn genesis( - initial_authorities: Vec, - root_key: AccountId, - treasury_amount: u128, - key_amount: u128, - ) -> rt::runtime::GenesisConfig { - let (identities, stakers, balances) = genesis_processed_data( - &initial_authorities, - root_key.clone(), - treasury_amount, - key_amount, - ); - - rt::runtime::GenesisConfig { - system: frame(rt::WASM_BINARY), - asset: asset!(), - checkpoint: checkpoint!(), - identity: pallet_identity::GenesisConfig { - identities, - ..Default::default() - }, - balances: rt::runtime::BalancesConfig { balances }, - indices: pallet_indices::GenesisConfig { indices: vec![] }, - session: session!(initial_authorities, session_keys), - staking: staking!( - initial_authorities, - stakers, - PerThing::from_rational(1u64, 10u64) - ), - pips: pips!(time::DAYS * 30, MaybeBlock::None, 1000), - im_online: Default::default(), - authority_discovery: Default::default(), - babe: pallet_babe::GenesisConfig { - authorities: vec![], - epoch_config: Some(rt::runtime::BABE_GENESIS_EPOCH_CONFIG), - }, - grandpa: Default::default(), - /* - pallet_contracts: Some(pallet_contracts::GenesisConfig { - current_schedule: pallet_contracts::Schedule { - enable_println, // this should only be enabled on development chains - ..Default::default() - }, - }), - */ - // Governing council - committee_membership: group_membership!(1, 2, 3), // 3 GC members - polymesh_committee: committee!(1, (2, 3)), // RC = 1, 2/3 votes required - // CDD providers - cdd_service_providers: group_membership!(1), - // Technical Committee: - technical_committee_membership: group_membership!(3, 4, 5), // One GC member + genesis operator + Bridge Multisig - technical_committee: committee!(3), // RC = 3, 1/2 votes required - // Upgrade Committee: - upgrade_committee_membership: group_membership!(1), // One GC member - upgrade_committee: committee!(1), // RC = 1, 1/2 votes required - protocol_fee: protocol_fee!(), - settlement: Default::default(), - portfolio: Default::default(), - statistics: Default::default(), - multi_sig: Default::default(), - corporate_action: corporate_actions!(), - capital_distribution: Default::default(), - corporate_ballot: Default::default(), - polymesh_contracts: polymesh_contracts!(Some(root_key)), - } - } - - fn bootstrap_genesis() -> rt::runtime::GenesisConfig { - genesis( - vec![ - get_authority_keys_from_seed("Alice", false), - get_authority_keys_from_seed("Bob", false), - get_authority_keys_from_seed("Charlie", false), - ], - seeded_acc_id("polymesh_5"), - BOOTSTRAP_TREASURY, - BOOTSTRAP_KEYS, - ) - } - - pub fn bootstrap_config() -> ChainSpec { - // provide boot nodes - let boot_nodes = vec![ - "/dns4/testnet-bootnode-001.polymesh.live/tcp/443/wss/p2p/12D3KooWNG4hedmYixq3Vx4crj5VFxHLFWjqYfbAZwFekHJ8Y7du".parse().expect("Unable to parse bootnode"), - "/dns4/testnet-bootnode-002.polymesh.live/tcp/443/wss/p2p/12D3KooW9uY8zFnHB5UKyLuwUpZLpPUSJYT2tYfFvpfNCd2K1ceZ".parse().expect("Unable to parse bootnode"), - "/dns4/testnet-bootnode-003.polymesh.live/tcp/443/wss/p2p/12D3KooWB7AyqsmerKTmcMoyMJJw6ddwWUJ7nFBDGw2viNGN2DBX".parse().expect("Unable to parse bootnode"), - "/dns4/testnet-bootnode-001.polymesh.live/tcp/30333/p2p/12D3KooWNG4hedmYixq3Vx4crj5VFxHLFWjqYfbAZwFekHJ8Y7du".parse().expect("Unable to parse bootnode"), - "/dns4/testnet-bootnode-002.polymesh.live/tcp/30333/p2p/12D3KooW9uY8zFnHB5UKyLuwUpZLpPUSJYT2tYfFvpfNCd2K1ceZ".parse().expect("Unable to parse bootnode"), - "/dns4/testnet-bootnode-003.polymesh.live/tcp/30333/p2p/12D3KooWB7AyqsmerKTmcMoyMJJw6ddwWUJ7nFBDGw2viNGN2DBX".parse().expect("Unable to parse bootnode"), - ]; - ChainSpec::from_genesis( - "Polymesh Testnet", - "testnet", - ChainType::Live, - bootstrap_genesis, - boot_nodes, - Some( - TelemetryEndpoints::new(vec![(STAGING_TELEMETRY_URL.to_string(), 0)]) - .expect("Testnet bootstrap telemetry url is valid; qed"), - ), - Some(&*"/polymesh/testnet"), - None, - Some(polymesh_props(42)), - Default::default(), - ) - } - - fn develop_genesis() -> rt::runtime::GenesisConfig { - genesis( - vec![get_authority_keys_from_seed("Alice", false)], - seeded_acc_id("Eve"), - BOOTSTRAP_TREASURY, - BOOTSTRAP_KEYS, - ) - } - - pub fn develop_config() -> ChainSpec { - // provide boot nodes - let boot_nodes = vec![]; - ChainSpec::from_genesis( - "Polymesh Testnet Develop", - "dev_testnet", - ChainType::Development, - develop_genesis, - boot_nodes, - None, - None, - None, - Some(polymesh_props(42)), - Default::default(), - ) - } - - fn local_genesis() -> rt::runtime::GenesisConfig { - genesis( - vec![ - get_authority_keys_from_seed("Alice", false), - get_authority_keys_from_seed("Bob", false), - get_authority_keys_from_seed("Charlie", false), - ], - seeded_acc_id("Eve"), - BOOTSTRAP_TREASURY, - BOOTSTRAP_KEYS, - ) - } - - pub fn local_config() -> ChainSpec { - // provide boot nodes - let boot_nodes = vec![]; - ChainSpec::from_genesis( - "Polymesh Testnet Local", - "local_testnet", - ChainType::Local, - local_genesis, - boot_nodes, - None, - None, - None, - Some(polymesh_props(42)), - Default::default(), - ) - } -} - -pub mod mainnet { - use super::*; - use polymesh_runtime_mainnet::{self as rt, constants::time}; - - pub type ChainSpec = GenericChainSpec; - - session_keys!(); - - fn genesis( - initial_authorities: Vec, - root_key: AccountId, - treasury_amount: u128, - key_amount: u128, - ) -> rt::runtime::GenesisConfig { - let (identities, stakers, balances) = genesis_processed_data( - &initial_authorities, - root_key.clone(), - treasury_amount, - key_amount, - ); - - rt::runtime::GenesisConfig { - system: frame(rt::WASM_BINARY), - asset: asset!(), - checkpoint: checkpoint!(), - identity: pallet_identity::GenesisConfig { - identities, - ..Default::default() - }, - balances: rt::runtime::BalancesConfig { balances }, - indices: pallet_indices::GenesisConfig { indices: vec![] }, - session: session!(initial_authorities, session_keys), - staking: staking!( - initial_authorities, - stakers, - PerThing::from_rational(1u64, 10u64) - ), - pips: pips!(time::DAYS * 30, MaybeBlock::Some(time::DAYS * 90), 1000), - im_online: Default::default(), - authority_discovery: Default::default(), - babe: pallet_babe::GenesisConfig { - authorities: vec![], - epoch_config: Some(rt::runtime::BABE_GENESIS_EPOCH_CONFIG), - }, - grandpa: Default::default(), - /* - pallet_contracts: Some(pallet_contracts::GenesisConfig { - current_schedule: pallet_contracts::Schedule { - enable_println, // this should only be enabled on development chains - ..Default::default() - }, - }), - */ - // Governing council - committee_membership: group_membership!(1, 2, 3), // 3 GC members - polymesh_committee: committee!(1, (2, 3)), // RC = 1, 2/3 votes required - // CDD providers - cdd_service_providers: group_membership!(1), // GC_1 is also a CDD provider - // Technical Committee: - technical_committee_membership: group_membership!(1), // One GC member - technical_committee: committee!(1), // 1/2 votes required - // Upgrade Committee: - upgrade_committee_membership: group_membership!(1), // One GC member - upgrade_committee: committee!(1), // 1/2 votes required - protocol_fee: protocol_fee!(), - settlement: Default::default(), - portfolio: Default::default(), - statistics: Default::default(), - multi_sig: Default::default(), - corporate_action: corporate_actions!(), - capital_distribution: Default::default(), - corporate_ballot: Default::default(), - polymesh_contracts: polymesh_contracts!(Some(root_key)), - } - } - - fn bootstrap_genesis() -> rt::runtime::GenesisConfig { - genesis( - vec![ - get_authority_keys_from_seed("Alice", false), - get_authority_keys_from_seed("Bob", false), - get_authority_keys_from_seed("Charlie", false), - ], - seeded_acc_id("polymesh_5"), - BOOTSTRAP_TREASURY, - BOOTSTRAP_KEYS, - ) - } - - pub fn bootstrap_config() -> ChainSpec { - // provide boot nodes - let boot_nodes = vec![ - "/dns4/mainnet-bootnode-001.polymesh.network/tcp/443/wss/p2p/12D3KooWDiaRBvzjt1p95mTqJETxJw3nz1E6fF2Yf62ojimEGJS7".parse().expect("Unable to parse bootnode"), - "/dns4/mainnet-bootnode-002.polymesh.network/tcp/443/wss/p2p/12D3KooWN9E6gtgybnXwDVNMUGwSA82pzBj72ibGYfZuomyEDQTU".parse().expect("Unable to parse bootnode"), - "/dns4/mainnet-bootnode-003.polymesh.network/tcp/443/wss/p2p/12D3KooWQ3K8jGadCQSVhihLEsJfSz3TJGgBHMU3vTtK3jd2Wq5E".parse().expect("Unable to parse bootnode"), - "/dns4/mainnet-bootnode-004.polymesh.network/tcp/443/wss/p2p/12D3KooWAjLb7S2FKk1Bxyw3vkaqgcSpjfxHwpGvqcXACFYSK8Xq".parse().expect("Unable to parse bootnode"), - "/dns4/mainnet-bootnode-005.polymesh.network/tcp/443/wss/p2p/12D3KooWKvXCP5b5PW4tHFAYyFVk3kRhwF3qXJbnVcPSGHP6Zmjg".parse().expect("Unable to parse bootnode"), - "/dns4/mainnet-bootnode-006.polymesh.network/tcp/443/wss/p2p/12D3KooWBQhDAjfo13dM4nsogXD39F5TcN9iTVzjXgPqFn9Yaccz".parse().expect("Unable to parse bootnode"), - "/dns4/mainnet-bootnode-007.polymesh.network/tcp/443/wss/p2p/12D3KooWMwFdYC53MqdyR9WYvJiPfxfYXh65NfY9QSuZeyKa53fg".parse().expect("Unable to parse bootnode"), - "/dns4/mainnet-bootnode-001.polymesh.network/tcp/30333/p2p/12D3KooWDiaRBvzjt1p95mTqJETxJw3nz1E6fF2Yf62ojimEGJS7".parse().expect("Unable to parse bootnode"), - "/dns4/mainnet-bootnode-002.polymesh.network/tcp/30333/p2p/12D3KooWN9E6gtgybnXwDVNMUGwSA82pzBj72ibGYfZuomyEDQTU".parse().expect("Unable to parse bootnode"), - "/dns4/mainnet-bootnode-003.polymesh.network/tcp/30333/p2p/12D3KooWQ3K8jGadCQSVhihLEsJfSz3TJGgBHMU3vTtK3jd2Wq5E".parse().expect("Unable to parse bootnode"), - "/dns4/mainnet-bootnode-004.polymesh.network/tcp/30333/p2p/12D3KooWAjLb7S2FKk1Bxyw3vkaqgcSpjfxHwpGvqcXACFYSK8Xq".parse().expect("Unable to parse bootnode"), - "/dns4/mainnet-bootnode-005.polymesh.network/tcp/30333/p2p/12D3KooWKvXCP5b5PW4tHFAYyFVk3kRhwF3qXJbnVcPSGHP6Zmjg".parse().expect("Unable to parse bootnode"), - "/dns4/mainnet-bootnode-006.polymesh.network/tcp/30333/p2p/12D3KooWBQhDAjfo13dM4nsogXD39F5TcN9iTVzjXgPqFn9Yaccz".parse().expect("Unable to parse bootnode"), - "/dns4/mainnet-bootnode-007.polymesh.network/tcp/30333/p2p/12D3KooWMwFdYC53MqdyR9WYvJiPfxfYXh65NfY9QSuZeyKa53fg".parse().expect("Unable to parse bootnode"), - ]; - ChainSpec::from_genesis( - "Polymesh Mainnet", - "mainnet", - ChainType::Live, - bootstrap_genesis, - boot_nodes, - Some( - TelemetryEndpoints::new(vec![(STAGING_TELEMETRY_URL.to_string(), 0)]) - .expect("Mainnet bootstrap telemetry url is valid; qed"), - ), - Some(&*"/polymesh/mainnet"), - None, - Some(polymesh_props(12)), - Default::default(), - ) - } - - fn develop_genesis() -> rt::runtime::GenesisConfig { - genesis( - vec![get_authority_keys_from_seed("Alice", false)], - seeded_acc_id("Eve"), - BOOTSTRAP_TREASURY, - BOOTSTRAP_KEYS, - ) - } - - pub fn develop_config() -> ChainSpec { - // provide boot nodes - let boot_nodes = vec![]; - ChainSpec::from_genesis( - "Polymesh Mainnet Develop", - "dev_mainnet", - ChainType::Development, - develop_genesis, - boot_nodes, - None, - None, - None, - Some(polymesh_props(12)), - Default::default(), - ) - } - - fn local_genesis() -> rt::runtime::GenesisConfig { - genesis( - vec![ - get_authority_keys_from_seed("Alice", false), - get_authority_keys_from_seed("Bob", false), - get_authority_keys_from_seed("Charlie", false), - ], - seeded_acc_id("Eve"), - BOOTSTRAP_TREASURY, - BOOTSTRAP_KEYS, - ) - } - - pub fn local_config() -> ChainSpec { - // provide boot nodes - let boot_nodes = vec![]; - ChainSpec::from_genesis( - "Polymesh Mainnet Local", - "local_mainnet", - ChainType::Local, - local_genesis, - boot_nodes, - None, - None, - None, - Some(polymesh_props(12)), - Default::default(), - ) - } -} - -#[cfg(feature = "ci-runtime")] -pub mod general { - use super::*; - use polymesh_runtime_develop::{self as rt, constants::time}; - - pub type ChainSpec = GenericChainSpec; - - session_keys!(); - - fn genesis( - initial_authorities: Vec, - root_key: AccountId, - treasury_amount: u128, - key_amount: u128, - ) -> rt::runtime::GenesisConfig { - let (identities, stakers, balances) = genesis_processed_data( - &initial_authorities, - root_key.clone(), - treasury_amount, - key_amount, - ); - - rt::runtime::GenesisConfig { - system: frame(rt::WASM_BINARY), - asset: asset!(), - checkpoint: checkpoint!(), - identity: pallet_identity::GenesisConfig { - identities, - ..Default::default() - }, - balances: rt::runtime::BalancesConfig { balances }, - indices: pallet_indices::GenesisConfig { indices: vec![] }, - sudo: pallet_sudo::GenesisConfig { - key: Some(root_key.clone()), - }, - session: session!(initial_authorities, session_keys), - staking: staking!(initial_authorities, stakers, PerThing::zero()), - pips: pips!(time::DAYS * 7, MaybeBlock::None, 1000), - im_online: Default::default(), - authority_discovery: Default::default(), - babe: pallet_babe::GenesisConfig { - authorities: vec![], - epoch_config: Some(rt::runtime::BABE_GENESIS_EPOCH_CONFIG), - }, - grandpa: Default::default(), - /* - pallet_contracts: Some(pallet_contracts::GenesisConfig { - current_schedule: pallet_contracts::Schedule { - enable_println, // this should only be enabled on development chains - ..Default::default() - }, - }), - */ - // Governing council - committee_membership: group_membership!(1, 2, 3, 5), - polymesh_committee: committee!(1, (2, 4)), - // CDD providers - cdd_service_providers: group_membership!(1, 2, 3, 5), - // Technical Committee: - technical_committee_membership: group_membership!(3, 5), - technical_committee: committee!(5), - // Upgrade Committee: - upgrade_committee_membership: group_membership!(1, 5), - upgrade_committee: committee!(5), - protocol_fee: protocol_fee!(), - settlement: Default::default(), - portfolio: Default::default(), - statistics: Default::default(), - multi_sig: Default::default(), - corporate_action: corporate_actions!(), - capital_distribution: Default::default(), - corporate_ballot: Default::default(), - polymesh_contracts: polymesh_contracts!(Some(root_key)), - } - } - - fn develop_genesis() -> rt::runtime::GenesisConfig { - genesis( - vec![get_authority_keys_from_seed("Bob", false)], - seeded_acc_id("Alice"), - DEV_TREASURY, - DEV_KEYS, - ) - } - - pub fn develop_config() -> ChainSpec { - // provide boot nodes - let boot_nodes = vec![]; - ChainSpec::from_genesis( - "Polymesh CI Develop", - "dev_ci", - ChainType::Development, - develop_genesis, - boot_nodes, - None, - None, - None, - Some(polymesh_props(42)), - Default::default(), - ) - } - - fn local_genesis() -> rt::runtime::GenesisConfig { - genesis( - vec![ - get_authority_keys_from_seed("Alice", false), - get_authority_keys_from_seed("Bob", false), - get_authority_keys_from_seed("Charlie", false), - ], - seeded_acc_id("Alice"), - DEV_TREASURY, - DEV_KEYS, - ) - } - - pub fn local_config() -> ChainSpec { - // provide boot nodes - let boot_nodes = vec![]; - ChainSpec::from_genesis( - "Polymesh CI Local", - "local_ci", - ChainType::Local, - local_genesis, - boot_nodes, - None, - None, - None, - Some(polymesh_props(42)), - Default::default(), - ) - } -} diff --git a/src/chain_spec/ci_runtime.rs b/src/chain_spec/ci_runtime.rs new file mode 100644 index 0000000000..c15006dce4 --- /dev/null +++ b/src/chain_spec/ci_runtime.rs @@ -0,0 +1,119 @@ +use sc_chain_spec::ChainType; +use sp_runtime::PerThing; + +use polymesh_primitives::{AccountId, IdentityId, MaybeBlock}; +use polymesh_runtime_develop::constants::time::DAYS; +use polymesh_runtime_develop::runtime::BABE_GENESIS_EPOCH_CONFIG; + +use crate::chain_spec::common::asset_genesis_config; +use crate::chain_spec::common::ChainSpec; +use crate::chain_spec::common::{checkpoint_genesis_config, committee_genesis_config}; +use crate::chain_spec::common::{corporate_actions_genesis_config, staking_genesis_config}; +use crate::chain_spec::common::{get_authority_keys_from_seed, pips_genesis_config}; +use crate::chain_spec::common::{group_genesis_config, polymesh_properties}; +use crate::chain_spec::common::{polymesh_contracts_genesis_config, seeded_acc_id}; +use crate::chain_spec::common::{protocol_fee_genesis_config, validators_genesis_config}; +use crate::chain_spec::common::{ChainSpecMode, InitialAuth}; + +pub(crate) fn ci_chain_spec(chain_spec_mode: ChainSpecMode) -> ChainSpec { + let code = polymesh_runtime_develop::runtime::WASM_BINARY + .expect("Development wasm binary is not available."); + + match chain_spec_mode { + ChainSpecMode::Bootstrap => unimplemented!(), + ChainSpecMode::Development => dev_chain_spec(code), + ChainSpecMode::Local => local_chain_spec(code), + } +} + +/// Returns [`ChainSpec`] for creating a development chain. +fn dev_chain_spec(code: &[u8]) -> ChainSpec { + let initial_authorities = vec![get_authority_keys_from_seed("Bob", false)]; + + let root_key = seeded_acc_id("Alice"); + + let genesis_json_config = ci_genesis_config(initial_authorities, root_key); + + ChainSpec::builder(code, Default::default()) + .with_name("Polymesh CI Develop") + .with_id("dev_ci") + .with_chain_type(ChainType::Development) + .with_properties(polymesh_properties(42)) + .with_genesis_config_patch(genesis_json_config) + .build() +} + +/// Returns [`ChainSpec`] for creating a local development chain. +fn local_chain_spec(code: &[u8]) -> ChainSpec { + let initial_authorities = vec![ + get_authority_keys_from_seed("Alice", false), + get_authority_keys_from_seed("Bob", false), + get_authority_keys_from_seed("Charlie", false), + ]; + + let root_key = seeded_acc_id("Alice"); + + let genesis_json_config = ci_genesis_config(initial_authorities, root_key); + + ChainSpec::builder(code, Default::default()) + .with_name("Polymesh CI Local") + .with_id("local_ci") + .with_chain_type(ChainType::Local) + .with_properties(polymesh_properties(42)) + .with_genesis_config_patch(genesis_json_config) + .build() +} + +fn ci_genesis_config( + initial_authorities: Vec, + root_key: AccountId, +) -> serde_json::Value { + let genesis_data = + crate::chain_spec::develop_runtime::genesis_data(&initial_authorities, &[root_key.clone()]); + + let session_keys = crate::chain_spec::develop_runtime::session_keys(&initial_authorities); + + let (identity_1, identity_2, identity_3, identity_5) = ( + IdentityId::from(1), + IdentityId::from(2), + IdentityId::from(3), + IdentityId::from(5), + ); + + serde_json::json!({ + "asset": asset_genesis_config(), + "checkpoint": checkpoint_genesis_config(), + "identity": { + "identities": genesis_data.identities_record, + }, + "balances": { + "balances": genesis_data.identities_balance, + }, + "sudo": { + "key": Some(root_key.clone()), + }, + "session": { + "keys": session_keys, + }, + "validators": validators_genesis_config(&genesis_data.stakers_data, PerThing::zero()), + "staking": staking_genesis_config(&genesis_data.stakers_data), + "pips": pips_genesis_config(DAYS * 7, MaybeBlock::None, 1_000), + "babe": { + "epochConfig": Some(BABE_GENESIS_EPOCH_CONFIG), + }, + // Governing council + "committeeMembership": group_genesis_config(vec![identity_1, identity_2, identity_3, identity_5]), + "polymeshCommittee": committee_genesis_config((2, 4), identity_1), + // CDD providers + "cddServiceProviders": group_genesis_config(vec![identity_1, identity_2, identity_3, identity_5]), + // Technical Committee + "technicalCommitteeMembership": group_genesis_config(vec![identity_3, identity_5]), + "technicalCommittee": committee_genesis_config((1, 2), identity_5), + // Upgrade Committee + "upgradeCommitteeMembership": group_genesis_config(vec![identity_1, identity_5]), + "upgradeCommittee": committee_genesis_config((1, 2), identity_5), + "protocolFee": protocol_fee_genesis_config(), + "corporateAction": corporate_actions_genesis_config(), + "polymeshContracts": polymesh_contracts_genesis_config(root_key), + }) +} diff --git a/src/chain_spec/common.rs b/src/chain_spec/common.rs new file mode 100644 index 0000000000..66a5084315 --- /dev/null +++ b/src/chain_spec/common.rs @@ -0,0 +1,343 @@ +use std::convert::TryInto; + +use pallet_im_online::sr25519::AuthorityId as ImOnlineId; +use pallet_staking::StakerStatus; +use sc_chain_spec::ChainSpecExtension; +use sc_consensus_grandpa::AuthorityId as GrandpaId; +use sc_service::Properties; +use serde::{Deserialize, Serialize}; +use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; +use sp_consensus_babe::AuthorityId as BabeId; +use sp_consensus_beefy::ecdsa_crypto::AuthorityId as BeefyId; +use sp_core::{sr25519, Pair, Public}; +use sp_runtime::traits::{IdentifyAccount, Verify}; +use sp_runtime::Perbill; + +use pallet_asset::TickerRegistrationConfig; +use polymesh_common_utilities::protocol_fee::ProtocolOp; +use polymesh_primitives::asset_metadata::{AssetMetadataName, AssetMetadataSpec}; +use polymesh_primitives::calendar::{CalendarPeriod, CalendarUnit}; +use polymesh_primitives::constants::currency::ONE_POLY; +use polymesh_primitives::identity_id::GenesisIdentityRecord; +use polymesh_primitives::{AccountId, Balance, BlockNumber, IdentityId, Moment, Signature, Ticker}; +use polymesh_primitives::{MaybeBlock, PosRatio}; + +// The URL for the telemetry server. +pub(crate) const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polymesh.network/submit/"; +pub(crate) const BOOTSTRAP_KEYS: u128 = 6_000 * ONE_POLY; +pub(crate) const BOOTSTRAP_TREASURY: u128 = 17_500_000 * ONE_POLY; +pub(crate) const DEV_KEYS: u128 = 30_000_000 * ONE_POLY; +pub(crate) const DEV_TREASURY: u128 = 50_000_000 * ONE_POLY; +pub(crate) const INITIAL_BOND: u128 = 500 * ONE_POLY; + +pub(crate) type InitialAuth = ( + AccountId, + AccountId, + GrandpaId, + BabeId, + ImOnlineId, + AuthorityDiscoveryId, + BeefyId, +); +pub(crate) type AccountPublic = ::Signer; + +/// Node `ChainSpec` extensions. +/// +/// Additional parameters for some Substrate core modules, +/// customizable from the chain spec. +#[derive(Default, Clone, Serialize, Deserialize, ChainSpecExtension)] +#[serde(rename_all = "camelCase")] +pub struct Extensions { + /// The light sync state extension used by the sync-state rpc. + pub light_sync_state: sc_sync_state_rpc::LightSyncStateExtension, +} + +/// Specialized `ChainSpec`. +pub(crate) type ChainSpec = sc_service::GenericChainSpec; + +pub(crate) fn polymesh_properties(ss58_format: u8) -> Properties { + let mut properties = Properties::new(); + properties.insert("ss58Format".to_string(), ss58_format.into()); + properties.insert("tokenDecimals".to_string(), 6.into()); + properties.insert("tokenSymbol".to_string(), "POLYX".into()); + + properties +} + +/// Generate an account ID from seed. +pub fn get_account_id_from_seed(seed: &str) -> AccountId +where + AccountPublic: From<::Public>, +{ + AccountPublic::from(get_from_seed::(seed)).into_account() +} + +pub(crate) fn seeded_acc_id(seed: &str) -> AccountId { + get_account_id_from_seed::(seed) +} + +/// Generate a crypto pair from seed. +pub(crate) fn get_from_seed(seed: &str) -> ::Public { + TPublic::Pair::from_string(&format!("//{}", seed), None) + .expect("static values are valid; qed") + .public() +} + +/// Generate an Aura authority key. +pub(crate) fn get_authority_keys_from_seed(s: &str, uniq: bool) -> InitialAuth { + let stash_acc_id = seeded_acc_id(&format!("{}//stash", s)); + let acc_id = seeded_acc_id(s); + + let (grandpa_id, babe_id, im_online_id, discovery_id, beefy_id) = if uniq { + ( + get_from_seed::(&format!("{}//gran", s)), + get_from_seed::(&format!("{}//babe", s)), + get_from_seed::(&format!("{}//imon", s)), + get_from_seed::(&format!("{}//auth", s)), + get_from_seed::(&format!("{}//beef", s)), + ) + } else { + ( + get_from_seed::(s), + get_from_seed::(s), + get_from_seed::(s), + get_from_seed::(s), + get_from_seed::(s), + ) + }; + + ( + stash_acc_id, + acc_id, + grandpa_id, + babe_id, + im_online_id, + discovery_id, + beefy_id, + ) +} + +pub(crate) fn adjust_last(bytes: &mut [u8], n: u8) -> &str { + bytes[bytes.len() - 1] = n + b'0'; + core::str::from_utf8(bytes).unwrap() +} + +//========================================================================== +// Common genesis config uses across different runtimes +//========================================================================== + +pub(crate) fn asset_genesis_config() -> serde_json::Value { + let ticker_reg_config = TickerRegistrationConfig:: { + max_ticker_length: 12, + registration_length: Some(5_184_000_000), + }; + + serde_json::json!({ + "tickerRegistrationConfig": ticker_reg_config, + "reservedCountryCurrencyCodes": currency_codes(), + "assetMetadata": asset_metadata(), + }) +} + +pub(crate) fn checkpoint_genesis_config() -> serde_json::Value { + let period = CalendarPeriod { + unit: CalendarUnit::Week, + amount: 1, + }; + + serde_json::json!({ + "schedulesMaxComplexity": period.complexity(), + }) +} + +pub(crate) fn validators_genesis_config( + initial_stakers: &[StakersData], + validator_commission_cap: Perbill, +) -> serde_json::Value { + serde_json::json!({ + "validators": initial_stakers.iter().filter_map(|x| { + if let StakerStatus::Validator = x.status { + Some(x.identity_id) + } else { + None + } + }) + .collect::>(), + "validatorCommissionCap": validator_commission_cap, + }) +} + +pub(crate) fn staking_genesis_config(initial_stakers: &[StakersData]) -> serde_json::Value { + serde_json::json!({ + "validatorCount": 40, + "minimumValidatorCount": 1, + "stakers": initial_stakers.iter().map(|x| { + ( + x.stash_id.clone(), + x.controller_id.clone(), + x.bonded_amount, + x.status.clone(), + ) + }) + .collect::>(), + "slashRewardFraction": Perbill::from_percent(10), + }) +} + +pub(crate) fn pips_genesis_config( + enactment_period: BlockNumber, + pending_pip_expiry: MaybeBlock, + active_pip_limit: u32, +) -> serde_json::Value { + serde_json::json!({ + "pruneHistoricalPips": false, + "minProposalDeposit": 2_000_000_000, + "defaultEnactmentPeriod": enactment_period, + "pendingPipExpiry": pending_pip_expiry, + "maxPipSkipCount": 2, + "activePipLimit": active_pip_limit, + }) +} + +pub(crate) fn group_genesis_config(active_members_ids: Vec) -> serde_json::Value { + serde_json::json!({ + "activeMembersLimit": 20, + "activeMembers": active_members_ids, + }) +} + +pub(crate) fn committee_genesis_config( + vote_threshold: (u32, u32), + release_coordinator: IdentityId, +) -> serde_json::Value { + serde_json::json!({ + "voteThreshold": vote_threshold, + "releaseCoordinator": release_coordinator, + }) +} + +pub(crate) fn protocol_fee_genesis_config() -> serde_json::Value { + let protocol_fee: Vec<(ProtocolOp, u128)> = vec![ + (ProtocolOp::AssetCreateAsset, 2_500 * 1_000_000), + (ProtocolOp::AssetRegisterTicker, 500 * 1_000_000), + ]; + + serde_json::json!({ + "baseFees": protocol_fee, + "coefficient": PosRatio(1, 1) + }) +} + +pub(crate) fn corporate_actions_genesis_config() -> serde_json::Value { + serde_json::json!({ + "maxDetailsLength": 1_024, + }) +} + +pub(crate) fn polymesh_contracts_genesis_config(upgradable_owner: AccountId) -> serde_json::Value { + let upgradable_description: [u8; 4] = "POLY".as_bytes().try_into().unwrap(); + + serde_json::json!({ + "callWhitelist": contracts_call_whitelist(), + "upgradableCode": upgradable_code(), + "upgradableDescription": upgradable_description, + "upgradableMajor": 7, + "upgradableOwner": upgradable_owner, + }) +} + +fn currency_codes() -> Vec { + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + pub struct FiatCurrency { + pub codes: Vec, + } + + let currency_file = include_str!("../data/currency_symbols.json"); + let currency_data: FiatCurrency = + serde_json::from_str(¤cy_file).expect("unable do parse/deserialize currency file"); + + currency_data + .codes + .into_iter() + .map(|y| Ticker::from_slice_truncated(y.as_bytes())) + .collect() +} + +fn asset_metadata() -> Vec<(AssetMetadataName, AssetMetadataSpec)> { + let asset_metadata_file = include_str!("../data/asset_metadata.json"); + serde_json::from_str(&asset_metadata_file) + .expect("unable do parse/deserialize asset_metadata file") +} + +fn contracts_call_whitelist() -> Vec { + let whitelist_file = include_str!("../data/contracts_call_whitelist.json"); + serde_json::from_str::>(&whitelist_file) + .expect("unable do parse/deserialize contracts_call_whitelist file") +} + +fn upgradable_code() -> Vec { + // Contract should match the `upgradable_major` version above. + include_bytes!("../data/contracts/polymesh_ink_7.wasm").to_vec() +} + +//========================================================================== +// Types used for generating the genesis config +//========================================================================== + +/// The `ChainSpec` setup mode. +pub(crate) enum ChainSpecMode { + Bootstrap, + Development, + Local, +} + +/// Data required for setting up a staker in genesis. +#[derive(Serialize, Deserialize)] +pub(crate) struct StakersData { + identity_id: IdentityId, + stash_id: AccountId, + controller_id: AccountId, + bonded_amount: Balance, + status: StakerStatus, +} + +impl StakersData { + /// Creates a new [`StakersData`] instance. + pub(crate) fn new( + identity_id: IdentityId, + stash_id: AccountId, + controller_id: AccountId, + bonded_amount: Balance, + status: StakerStatus, + ) -> Self { + Self { + identity_id, + stash_id, + controller_id, + bonded_amount, + status, + } + } +} + +/// Data required for setting up the initial genesis state. +pub(crate) struct GenesisData { + pub(crate) identities_record: Vec>, + pub(crate) stakers_data: Vec, + pub(crate) identities_balance: Vec<(AccountId, Balance)>, +} + +impl GenesisData { + /// Creates a new [`GenesisData`] instance. + pub(crate) fn new( + identities_record: Vec>, + stakers_data: Vec, + identities_balance: Vec<(AccountId, Balance)>, + ) -> Self { + Self { + identities_record, + stakers_data, + identities_balance, + } + } +} diff --git a/src/chain_spec/develop_runtime.rs b/src/chain_spec/develop_runtime.rs new file mode 100644 index 0000000000..602c388734 --- /dev/null +++ b/src/chain_spec/develop_runtime.rs @@ -0,0 +1,229 @@ +use sc_chain_spec::ChainType; +use sp_runtime::traits::AccountIdConversion; +use sp_runtime::PerThing; + +use pallet_staking::StakerStatus; +use polymesh_primitives::constants::TREASURY_PALLET_ID; +use polymesh_primitives::identity_id::GenesisIdentityRecord; +use polymesh_primitives::{AccountId, Balance, IdentityId, MaybeBlock, SecondaryKey}; +use polymesh_runtime_develop::constants::time::MINUTES; +use polymesh_runtime_develop::runtime::{SessionKeys, BABE_GENESIS_EPOCH_CONFIG}; + +use crate::chain_spec::common::asset_genesis_config; +use crate::chain_spec::common::{checkpoint_genesis_config, committee_genesis_config}; +use crate::chain_spec::common::{corporate_actions_genesis_config, staking_genesis_config}; +use crate::chain_spec::common::{get_authority_keys_from_seed, pips_genesis_config}; +use crate::chain_spec::common::{group_genesis_config, polymesh_properties}; +use crate::chain_spec::common::{polymesh_contracts_genesis_config, seeded_acc_id}; +use crate::chain_spec::common::{protocol_fee_genesis_config, validators_genesis_config}; +use crate::chain_spec::common::{ChainSpec, DEV_KEYS, DEV_TREASURY, INITIAL_BOND}; +use crate::chain_spec::common::{ChainSpecMode, GenesisData, InitialAuth, StakersData}; + +pub(crate) fn develop_chain_spec(chain_spec_mode: ChainSpecMode) -> ChainSpec { + let code = polymesh_runtime_develop::runtime::WASM_BINARY + .expect("Development wasm binary is not available."); + + match chain_spec_mode { + ChainSpecMode::Bootstrap => unimplemented!(), + ChainSpecMode::Development => dev_chain_spec(code), + ChainSpecMode::Local => local_chain_spec(code), + } +} + +/// Returns [`ChainSpec`] for creating a development chain. +fn dev_chain_spec(code: &[u8]) -> ChainSpec { + let initial_authorities = vec![get_authority_keys_from_seed("Alice", false)]; + + let other_funded_accounts = vec![ + seeded_acc_id("Bob"), + seeded_acc_id("Charlie"), + seeded_acc_id("Dave"), + seeded_acc_id("Eve"), + // ETH dev alith + array_bytes::hex_n_into_unchecked( + "f24ff3a9cf04c71dbc94d0b566f7a27b94566caceeeeeeeeeeeeeeeeeeeeeeee", + ), + // ETH dev baltathar + array_bytes::hex_n_into_unchecked( + "3cd0a705a2dc65e5b1e1205896baa2be8a07c6e0eeeeeeeeeeeeeeeeeeeeeeee", + ), + // ETH dev charleth + array_bytes::hex_n_into_unchecked( + "798d4ba9baf0064ec19eb4f0a1a45785ae9d6dfceeeeeeeeeeeeeeeeeeeeeeee", + ), + // ETH dev dorothy + array_bytes::hex_n_into_unchecked( + "773539d4ac0e786233d90a233654ccee26a613d9eeeeeeeeeeeeeeeeeeeeeeee", + ), + // ETH dev ethan + array_bytes::hex_n_into_unchecked( + "ff64d3f6efe2317ee2807d223a0bdc4c0c49dfdbeeeeeeeeeeeeeeeeeeeeeeee", + ), + ]; + + let root_key = seeded_acc_id("Alice"); + + let genesis_json_config = + develop_genesis_config(initial_authorities, other_funded_accounts, root_key); + + ChainSpec::builder(code, Default::default()) + .with_name("Development") + .with_id("dev") + .with_chain_type(ChainType::Development) + .with_properties(polymesh_properties(42)) + .with_genesis_config_patch(genesis_json_config) + .build() +} + +/// Returns [`ChainSpec`] for creating a local development chain. +fn local_chain_spec(code: &[u8]) -> ChainSpec { + let initial_authorities = vec![ + get_authority_keys_from_seed("Alice", false), + get_authority_keys_from_seed("Bob", false), + get_authority_keys_from_seed("Charlie", false), + ]; + + let other_funded_accounts = vec![seeded_acc_id("Dave"), seeded_acc_id("Eve")]; + + let root_key = seeded_acc_id("Alice"); + + let genesis_json_config = + develop_genesis_config(initial_authorities, other_funded_accounts, root_key); + + ChainSpec::builder(code, Default::default()) + .with_name("Local Development") + .with_id("local_dev") + .with_chain_type(ChainType::Local) + .with_properties(polymesh_properties(42)) + .with_genesis_config_patch(genesis_json_config) + .build() +} + +fn develop_genesis_config( + initial_authorities: Vec, + other_funded_accounts: Vec, + root_key: AccountId, +) -> serde_json::Value { + let genesis_data = genesis_data(&initial_authorities, &other_funded_accounts); + + let session_keys = session_keys(&initial_authorities); + + let (vote_threshold, identity_1) = ((1, 2), IdentityId::from(1)); + let group_genesis_config = group_genesis_config(vec![identity_1]); + let committee_genesis_config = committee_genesis_config(vote_threshold, identity_1); + + serde_json::json!({ + "asset": asset_genesis_config(), + "checkpoint": checkpoint_genesis_config(), + "identity": { + "identities": genesis_data.identities_record, + }, + "balances": { + "balances": genesis_data.identities_balance, + }, + "sudo": { + "key": Some(root_key.clone()), + }, + "session": { + "keys": session_keys, + }, + "validators": validators_genesis_config(&genesis_data.stakers_data, PerThing::from_rational(1u64, 4u64)), + "staking": staking_genesis_config(&genesis_data.stakers_data), + "pips": pips_genesis_config(MINUTES, MaybeBlock::None, 25), + "babe": { + "epochConfig": Some(BABE_GENESIS_EPOCH_CONFIG), + }, + "committeeMembership": group_genesis_config, + "polymeshCommittee": committee_genesis_config, + "cddServiceProviders": group_genesis_config, + "technicalCommitteeMembership": group_genesis_config, + "technicalCommittee": committee_genesis_config, + "upgradeCommitteeMembership": group_genesis_config, + "upgradeCommittee": committee_genesis_config, + "protocolFee": protocol_fee_genesis_config(), + "corporateAction": corporate_actions_genesis_config(), + "polymeshContracts": polymesh_contracts_genesis_config(root_key), + }) +} + +/// Returns [`GenesisData`] given the initial authorities and other funded accounts. +pub fn genesis_data( + initial_authorities: &[InitialAuth], + other_funded_accounts: &[AccountId], +) -> GenesisData { + let mut stakers_data = Vec::new(); + let mut identities_balance = Vec::new(); + let mut genesis_id_record = GenesisIdentityRecord::new(1u8, initial_authorities[0].0.clone()); + + for (stash_acc, controller_acc, ..) in initial_authorities { + let staker = StakersData::new( + IdentityId::from(1), + stash_acc.clone(), + controller_acc.clone(), + INITIAL_BOND, + StakerStatus::Validator, + ); + stakers_data.push(staker); + add_secondary_key( + stash_acc.clone(), + &mut identities_balance, + &mut genesis_id_record, + ); + add_secondary_key( + controller_acc.clone(), + &mut identities_balance, + &mut genesis_id_record, + ); + } + + for acc_id in other_funded_accounts { + add_secondary_key( + acc_id.clone(), + &mut identities_balance, + &mut genesis_id_record, + ); + } + + // Treasury + identities_balance.push((TREASURY_PALLET_ID.into_account_truncating(), DEV_TREASURY)); + + // The 0th key is the primary key + genesis_id_record.secondary_keys.remove(0); + + GenesisData::new(vec![genesis_id_record], stakers_data, identities_balance) +} + +/// Adds `account_id` as a secondary key with full permissions of `genesis_id_record`. +fn add_secondary_key( + account_id: AccountId, + identities_balance: &mut Vec<(AccountId, Balance)>, + genesis_id_record: &mut GenesisIdentityRecord, +) { + identities_balance.push((account_id.clone(), DEV_KEYS)); + genesis_id_record + .secondary_keys + .push(SecondaryKey::from_account_id_with_full_perms(account_id)); +} + +/// Returns the initial list of validator at genesis representing by their `(AccountId, ValidatorId, Keys)`. +pub(crate) fn session_keys( + init_authorities: &[InitialAuth], +) -> Vec<(AccountId, AccountId, SessionKeys)> { + let mut initial_session_keys = Vec::new(); + + for initial_auth in init_authorities { + initial_session_keys.push(( + initial_auth.0.clone(), + initial_auth.0.clone(), + SessionKeys { + grandpa: initial_auth.2.clone(), + babe: initial_auth.3.clone(), + im_online: initial_auth.4.clone(), + authority_discovery: initial_auth.5.clone(), + beefy: initial_auth.6.clone(), + }, + )) + } + + initial_session_keys +} diff --git a/src/chain_spec/mainnet_runtime.rs b/src/chain_spec/mainnet_runtime.rs new file mode 100644 index 0000000000..5e66160c69 --- /dev/null +++ b/src/chain_spec/mainnet_runtime.rs @@ -0,0 +1,290 @@ +use pallet_staking::StakerStatus; +use sc_chain_spec::ChainType; +use sc_network::config::MultiaddrWithPeerId; +use sc_telemetry::TelemetryEndpoints; +use sp_runtime::traits::AccountIdConversion; +use sp_runtime::PerThing; + +use polymesh_primitives::constants::TREASURY_PALLET_ID; +use polymesh_primitives::identity_id::GenesisIdentityRecord; +use polymesh_primitives::{AccountId, MaybeBlock, SecondaryKey}; +use polymesh_primitives::{Balance, IdentityId, SystematicIssuers}; +use polymesh_runtime_mainnet::constants::time::DAYS; +use polymesh_runtime_mainnet::runtime::{SessionKeys, BABE_GENESIS_EPOCH_CONFIG}; + +use crate::chain_spec::common::asset_genesis_config; +use crate::chain_spec::common::{adjust_last, get_authority_keys_from_seed}; +use crate::chain_spec::common::{checkpoint_genesis_config, committee_genesis_config}; +use crate::chain_spec::common::{corporate_actions_genesis_config, staking_genesis_config}; +use crate::chain_spec::common::{group_genesis_config, polymesh_properties, seeded_acc_id}; +use crate::chain_spec::common::{pips_genesis_config, polymesh_contracts_genesis_config}; +use crate::chain_spec::common::{protocol_fee_genesis_config, validators_genesis_config}; +use crate::chain_spec::common::{ChainSpec, ChainSpecMode}; +use crate::chain_spec::common::{GenesisData, InitialAuth, StakersData}; +use crate::chain_spec::common::{BOOTSTRAP_KEYS, BOOTSTRAP_TREASURY}; +use crate::chain_spec::common::{INITIAL_BOND, STAGING_TELEMETRY_URL}; + +pub fn mainnet_chain_spec(chain_spec_mode: ChainSpecMode) -> ChainSpec { + let code = polymesh_runtime_mainnet::runtime::WASM_BINARY + .expect("Mainnet wasm binary is not available."); + + match chain_spec_mode { + ChainSpecMode::Bootstrap => bootstap_chain_spec(code), + ChainSpecMode::Development => dev_chain_spec(code), + ChainSpecMode::Local => local_chain_spec(code), + } +} + +/// Returns [`ChainSpec`] for bootstrapping mainnet. +fn bootstap_chain_spec(code: &[u8]) -> ChainSpec { + let root_key = seeded_acc_id("polymesh_5"); + + let initial_authorities = vec![ + get_authority_keys_from_seed("Alice", false), + get_authority_keys_from_seed("Bob", false), + get_authority_keys_from_seed("Charlie", false), + ]; + + let mainnet_telemetry = TelemetryEndpoints::new(vec![(STAGING_TELEMETRY_URL.to_string(), 0)]) + .expect("Mainnet bootstrap telemetry url is valid; qed"); + + ChainSpec::builder(code, Default::default()) + .with_name("Polymesh Mainnet") + .with_id("mainnet") + .with_chain_type(ChainType::Live) + .with_boot_nodes(mainnet_boot_nodes()) + .with_telemetry_endpoints(mainnet_telemetry) + .with_protocol_id("/polymesh/mainnet") + .with_properties(polymesh_properties(12)) + .with_genesis_config_patch(mainnet_genesis_config(initial_authorities, root_key)) + .build() +} + +/// Returns [`ChainSpec`] for creating a dev mainnet chain. +fn dev_chain_spec(code: &[u8]) -> ChainSpec { + let root_key = seeded_acc_id("Eve"); + + let initial_authorities = vec![get_authority_keys_from_seed("Alice", false)]; + + ChainSpec::builder(code, Default::default()) + .with_name("Polymesh Mainnet Develop") + .with_id("dev_mainnet") + .with_chain_type(ChainType::Development) + .with_properties(polymesh_properties(12)) + .with_genesis_config_patch(mainnet_genesis_config(initial_authorities, root_key)) + .build() +} + +/// Returns [`ChainSpec`] for creating a local mainnet chain. +fn local_chain_spec(code: &[u8]) -> ChainSpec { + let root_key = seeded_acc_id("Eve"); + + let initial_authorities = vec![ + get_authority_keys_from_seed("Alice", false), + get_authority_keys_from_seed("Bob", false), + get_authority_keys_from_seed("Charlie", false), + ]; + + ChainSpec::builder(code, Default::default()) + .with_name("Polymesh Mainnet Local") + .with_id("local_mainnet") + .with_chain_type(ChainType::Local) + .with_properties(polymesh_properties(12)) + .with_genesis_config_patch(mainnet_genesis_config(initial_authorities, root_key)) + .build() +} + +fn mainnet_genesis_config( + initial_authorities: Vec, + root_key: AccountId, +) -> serde_json::Value { + let genesis_data = genesis_data(&initial_authorities, root_key.clone()); + + let session_keys = session_keys(&initial_authorities); + + let (identity_1, identity_2, identity_3) = ( + IdentityId::from(1), + IdentityId::from(2), + IdentityId::from(3), + ); + + serde_json::json!({ + "asset": asset_genesis_config(), + "checkpoint": checkpoint_genesis_config(), + "identity": { + "identities": genesis_data.identities_record, + }, + "balances": { + "balances": genesis_data.identities_balance, + }, + "session": { + "keys": session_keys, + }, + "validators": validators_genesis_config(&genesis_data.stakers_data, PerThing::from_rational(1u64, 4u64)), + "staking": staking_genesis_config(&genesis_data.stakers_data), + "pips": pips_genesis_config(DAYS * 30, MaybeBlock::Some(DAYS * 90), 1_000), + "babe": { + "epochConfig": Some(BABE_GENESIS_EPOCH_CONFIG), + }, + // Governing council + "committeeMembership": group_genesis_config(vec![identity_1, identity_2, identity_3]), // three GC members + "polymeshCommittee": committee_genesis_config((2, 3), identity_1), // RC = 1, 2/3 votes required + // CDD providers + "cddServiceProviders": group_genesis_config(vec![identity_1]), // GC_1 is also a CDD provider + // Technical Committee + "technicalCommitteeMembership": group_genesis_config(vec![identity_1]), // One GC member + "technicalCommittee": committee_genesis_config((1, 2), identity_1), // 1/2 votes required + // Upgrade Committee + "upgradeCommitteeMembership": group_genesis_config(vec![identity_1]), // One GC member + "upgradeCommittee": committee_genesis_config((1, 2), identity_1), // 1/2 votes required + "protocolFee": protocol_fee_genesis_config(), + "corporateAction": corporate_actions_genesis_config(), + "polymeshContracts": polymesh_contracts_genesis_config(root_key), + }) +} + +pub(crate) fn genesis_data( + initial_authorities: &[InitialAuth], + root_key: AccountId, +) -> GenesisData { + // Identities and their roles + // 1 = [Polymesh] GenesisCouncil (1 of 3) + UpgradeCommittee (1 of 1) + TechnicalCommittee (1 of 1) + GCReleaseCoordinator + // 2 = GenesisCouncil (2 of 3) + // 3 = GenesisCouncil (3 of 3) + // 4 = Operator + // 5 = Sudo + + // Identity_01 + // Primary Key: polymesh_1 + + // Identity_02 + // Primary Key: polymesh_2 + + // Identity_03 + // Primary Key: polymesh_3 + + // Identity_04 + // Primary Key: polymesh_4 + // Secondary Keys: Alice, Alice//stash, Bob, Bob//stash, Charlie, Charlie//stash + + // Identity_05 + // Primary Key: polymesh_5 + + let mut identities_balance = Vec::new(); + let mut genesis_id_records = Vec::new(); + + // Creating Identities 1-4 (GC + Operators) + for i in 1..=4 { + let new_acc = seeded_acc_id(adjust_last(&mut { *b"polymesh_0" }, i)); + create_identity(i, new_acc, &mut identities_balance, &mut genesis_id_records); + } + + // Creating identity for sudo + create_identity( + 5u8, + root_key, + &mut identities_balance, + &mut genesis_id_records, + ); + + let mut stakers_data = Vec::new(); + for (stash_acc, controller_acc, ..) in initial_authorities { + let staker = StakersData::new( + IdentityId::from(4), // All operators have the same identity + stash_acc.clone(), + controller_acc.clone(), + INITIAL_BOND, + StakerStatus::Validator, + ); + stakers_data.push(staker); + add_secondary_key( + stash_acc.clone(), + &mut identities_balance, + &mut genesis_id_records, + ); + add_secondary_key( + controller_acc.clone(), + &mut identities_balance, + &mut genesis_id_records, + ); + } + + // Give CDD issuer to operator and sudo since it won't receive CDD from the group automatically + genesis_id_records[3] + .issuers + .push(SystematicIssuers::CDDProvider.as_id()); + + // Give CDD issuer to operator and sudo since it won't receive CDD from the group automatically + genesis_id_records[4] + .issuers + .push(SystematicIssuers::CDDProvider.as_id()); + + // Treasury + identities_balance.push(( + TREASURY_PALLET_ID.into_account_truncating(), + BOOTSTRAP_TREASURY, + )); + + GenesisData::new(genesis_id_records, stakers_data, identities_balance) +} + +fn create_identity( + nonce: u8, + primary_key: AccountId, + account_balances: &mut Vec<(AccountId, Balance)>, + genesis_identities: &mut Vec>, +) { + account_balances.push((primary_key.clone(), BOOTSTRAP_KEYS)); + genesis_identities.push(GenesisIdentityRecord::new(nonce, primary_key)); +} + +fn add_secondary_key( + account_id: AccountId, + identities_balance: &mut Vec<(AccountId, Balance)>, + genesis_id_record: &mut Vec>, +) { + identities_balance.push((account_id.clone(), BOOTSTRAP_KEYS)); + genesis_id_record[3] + .secondary_keys + .push(SecondaryKey::from_account_id_with_full_perms(account_id)); +} + +fn mainnet_boot_nodes() -> Vec { + vec![ + "/dns4/mainnet-bootnode-001.polymesh.network/tcp/443/wss/p2p/12D3KooWDiaRBvzjt1p95mTqJETxJw3nz1E6fF2Yf62ojimEGJS7".parse().expect("Unable to parse bootnode"), + "/dns4/mainnet-bootnode-002.polymesh.network/tcp/443/wss/p2p/12D3KooWN9E6gtgybnXwDVNMUGwSA82pzBj72ibGYfZuomyEDQTU".parse().expect("Unable to parse bootnode"), + "/dns4/mainnet-bootnode-003.polymesh.network/tcp/443/wss/p2p/12D3KooWQ3K8jGadCQSVhihLEsJfSz3TJGgBHMU3vTtK3jd2Wq5E".parse().expect("Unable to parse bootnode"), + "/dns4/mainnet-bootnode-004.polymesh.network/tcp/443/wss/p2p/12D3KooWAjLb7S2FKk1Bxyw3vkaqgcSpjfxHwpGvqcXACFYSK8Xq".parse().expect("Unable to parse bootnode"), + "/dns4/mainnet-bootnode-005.polymesh.network/tcp/443/wss/p2p/12D3KooWKvXCP5b5PW4tHFAYyFVk3kRhwF3qXJbnVcPSGHP6Zmjg".parse().expect("Unable to parse bootnode"), + "/dns4/mainnet-bootnode-006.polymesh.network/tcp/443/wss/p2p/12D3KooWBQhDAjfo13dM4nsogXD39F5TcN9iTVzjXgPqFn9Yaccz".parse().expect("Unable to parse bootnode"), + "/dns4/mainnet-bootnode-007.polymesh.network/tcp/443/wss/p2p/12D3KooWMwFdYC53MqdyR9WYvJiPfxfYXh65NfY9QSuZeyKa53fg".parse().expect("Unable to parse bootnode"), + "/dns4/mainnet-bootnode-001.polymesh.network/tcp/30333/p2p/12D3KooWDiaRBvzjt1p95mTqJETxJw3nz1E6fF2Yf62ojimEGJS7".parse().expect("Unable to parse bootnode"), + "/dns4/mainnet-bootnode-002.polymesh.network/tcp/30333/p2p/12D3KooWN9E6gtgybnXwDVNMUGwSA82pzBj72ibGYfZuomyEDQTU".parse().expect("Unable to parse bootnode"), + "/dns4/mainnet-bootnode-003.polymesh.network/tcp/30333/p2p/12D3KooWQ3K8jGadCQSVhihLEsJfSz3TJGgBHMU3vTtK3jd2Wq5E".parse().expect("Unable to parse bootnode"), + "/dns4/mainnet-bootnode-004.polymesh.network/tcp/30333/p2p/12D3KooWAjLb7S2FKk1Bxyw3vkaqgcSpjfxHwpGvqcXACFYSK8Xq".parse().expect("Unable to parse bootnode"), + "/dns4/mainnet-bootnode-005.polymesh.network/tcp/30333/p2p/12D3KooWKvXCP5b5PW4tHFAYyFVk3kRhwF3qXJbnVcPSGHP6Zmjg".parse().expect("Unable to parse bootnode"), + "/dns4/mainnet-bootnode-006.polymesh.network/tcp/30333/p2p/12D3KooWBQhDAjfo13dM4nsogXD39F5TcN9iTVzjXgPqFn9Yaccz".parse().expect("Unable to parse bootnode"), + "/dns4/mainnet-bootnode-007.polymesh.network/tcp/30333/p2p/12D3KooWMwFdYC53MqdyR9WYvJiPfxfYXh65NfY9QSuZeyKa53fg".parse().expect("Unable to parse bootnode"), + ] +} + +/// Returns the initial list of validator at genesis representing by their `(AccountId, ValidatorId, Keys)`. +fn session_keys(init_authorities: &[InitialAuth]) -> Vec<(AccountId, AccountId, SessionKeys)> { + let mut initial_session_keys = Vec::new(); + + for initial_auth in init_authorities { + initial_session_keys.push(( + initial_auth.0.clone(), + initial_auth.0.clone(), + SessionKeys { + grandpa: initial_auth.2.clone(), + babe: initial_auth.3.clone(), + im_online: initial_auth.4.clone(), + authority_discovery: initial_auth.5.clone(), + beefy: initial_auth.6.clone(), + }, + )) + } + + initial_session_keys +} diff --git a/src/chain_spec/mod.rs b/src/chain_spec/mod.rs new file mode 100644 index 0000000000..63dd8b26bd --- /dev/null +++ b/src/chain_spec/mod.rs @@ -0,0 +1,5 @@ +pub(crate) mod ci_runtime; +pub(crate) mod common; +pub(crate) mod develop_runtime; +pub(crate) mod mainnet_runtime; +pub(crate) mod testnet_runtime; diff --git a/src/chain_spec/testnet_runtime.rs b/src/chain_spec/testnet_runtime.rs new file mode 100644 index 0000000000..cd927807aa --- /dev/null +++ b/src/chain_spec/testnet_runtime.rs @@ -0,0 +1,167 @@ +use sc_chain_spec::ChainType; +use sc_network::config::MultiaddrWithPeerId; +use sc_telemetry::TelemetryEndpoints; +use sp_runtime::PerThing; + +use polymesh_primitives::{AccountId, IdentityId, MaybeBlock}; +use polymesh_runtime_testnet::constants::time::DAYS; +use polymesh_runtime_testnet::runtime::{SessionKeys, BABE_GENESIS_EPOCH_CONFIG}; + +use crate::chain_spec::common::{asset_genesis_config, group_genesis_config}; +use crate::chain_spec::common::{checkpoint_genesis_config, committee_genesis_config}; +use crate::chain_spec::common::{corporate_actions_genesis_config, staking_genesis_config}; +use crate::chain_spec::common::{get_authority_keys_from_seed, polymesh_properties, seeded_acc_id}; +use crate::chain_spec::common::{pips_genesis_config, polymesh_contracts_genesis_config}; +use crate::chain_spec::common::{protocol_fee_genesis_config, validators_genesis_config}; +use crate::chain_spec::common::{ChainSpec, ChainSpecMode, InitialAuth, STAGING_TELEMETRY_URL}; + +pub fn testnet_chain_spec(chain_spec_mode: ChainSpecMode) -> ChainSpec { + let code = polymesh_runtime_testnet::runtime::WASM_BINARY + .expect("Mainnet wasm binary is not available."); + + match chain_spec_mode { + ChainSpecMode::Bootstrap => bootstap_chain_spec(code), + ChainSpecMode::Development => dev_chain_spec(code), + ChainSpecMode::Local => local_chain_spec(code), + } +} + +fn bootstap_chain_spec(code: &[u8]) -> ChainSpec { + let root_key = seeded_acc_id("polymesh_5"); + + let initial_authorities = vec![ + get_authority_keys_from_seed("Alice", false), + get_authority_keys_from_seed("Bob", false), + get_authority_keys_from_seed("Charlie", false), + ]; + + let testnet_telemetry = TelemetryEndpoints::new(vec![(STAGING_TELEMETRY_URL.to_string(), 0)]) + .expect("Testnet bootstrap telemetry url is valid; qed"); + + ChainSpec::builder(code, Default::default()) + .with_name("Polymesh Testnet") + .with_id("testnet") + .with_chain_type(ChainType::Live) + .with_boot_nodes(testnet_boot_nodes()) + .with_telemetry_endpoints(testnet_telemetry) + .with_protocol_id("/polymesh/testnet") + .with_properties(polymesh_properties(42)) + .with_genesis_config_patch(testnet_genesis_config(initial_authorities, root_key)) + .build() +} + +fn dev_chain_spec(code: &[u8]) -> ChainSpec { + let root_key = seeded_acc_id("Eve"); + + let initial_authorities = vec![get_authority_keys_from_seed("Alice", false)]; + + ChainSpec::builder(code, Default::default()) + .with_name("Polymesh Testnet Develop") + .with_id("dev_testnet") + .with_chain_type(ChainType::Development) + .with_properties(polymesh_properties(42)) + .with_genesis_config_patch(testnet_genesis_config(initial_authorities, root_key)) + .build() +} + +fn local_chain_spec(code: &[u8]) -> ChainSpec { + let root_key = seeded_acc_id("Eve"); + + let initial_authorities = vec![ + get_authority_keys_from_seed("Alice", false), + get_authority_keys_from_seed("Bob", false), + get_authority_keys_from_seed("Charlie", false), + ]; + + ChainSpec::builder(code, Default::default()) + .with_name("Polymesh Testnet Local") + .with_id("local_testnet") + .with_chain_type(ChainType::Local) + .with_properties(polymesh_properties(42)) + .with_genesis_config_patch(testnet_genesis_config(initial_authorities, root_key)) + .build() +} + +fn testnet_genesis_config( + initial_authorities: Vec, + root_key: AccountId, +) -> serde_json::Value { + let genesis_data = + crate::chain_spec::mainnet_runtime::genesis_data(&initial_authorities, root_key.clone()); + + let session_keys = session_keys(&initial_authorities); + + let (identity_1, identity_2, identity_3) = ( + IdentityId::from(1), + IdentityId::from(2), + IdentityId::from(3), + ); + + let (identity_4, identity_5) = (IdentityId::from(4), IdentityId::from(5)); + + serde_json::json!({ + "asset": asset_genesis_config(), + "checkpoint": checkpoint_genesis_config(), + "identity": { + "identities": genesis_data.identities_record, + }, + "balances": { + "balances": genesis_data.identities_balance, + }, + "session": { + "keys": session_keys, + }, + "validators": validators_genesis_config(&genesis_data.stakers_data, PerThing::from_rational(1u64, 4u64)), + "staking": staking_genesis_config(&genesis_data.stakers_data), + "pips": pips_genesis_config(DAYS * 30, MaybeBlock::None, 1_000), + "babe": { + "epochConfig": Some(BABE_GENESIS_EPOCH_CONFIG), + }, + // Governing council + "committeeMembership": group_genesis_config(vec![identity_1, identity_2, identity_3]), // three GC members + "polymeshCommittee": committee_genesis_config((2, 3), identity_1), // RC = 1, 2/3 votes required + // CDD providers + "cddServiceProviders": group_genesis_config(vec![identity_1]), + // Technical Committee + "technicalCommitteeMembership": group_genesis_config(vec![identity_3, identity_4, identity_5]), // One GC member + genesis operator + Bridge Multisig + "technicalCommittee": committee_genesis_config((1, 2), identity_3), // RC = 3, 1/2 votes required + // Upgrade Committee + "upgradeCommitteeMembership": group_genesis_config(vec![identity_1]), // One GC member + "upgradeCommittee": committee_genesis_config((1, 2), identity_1), // 1/2 votes required + "protocolFee": protocol_fee_genesis_config(), + "corporateAction": corporate_actions_genesis_config(), + "polymeshContracts": polymesh_contracts_genesis_config(root_key), + }) +} + +fn testnet_boot_nodes() -> Vec { + vec![ + "/dns4/testnet-bootnode-001.polymesh.live/tcp/443/wss/p2p/12D3KooWNG4hedmYixq3Vx4crj5VFxHLFWjqYfbAZwFekHJ8Y7du".parse().expect("Unable to parse bootnode"), + "/dns4/testnet-bootnode-002.polymesh.live/tcp/443/wss/p2p/12D3KooW9uY8zFnHB5UKyLuwUpZLpPUSJYT2tYfFvpfNCd2K1ceZ".parse().expect("Unable to parse bootnode"), + "/dns4/testnet-bootnode-003.polymesh.live/tcp/443/wss/p2p/12D3KooWB7AyqsmerKTmcMoyMJJw6ddwWUJ7nFBDGw2viNGN2DBX".parse().expect("Unable to parse bootnode"), + "/dns4/testnet-bootnode-001.polymesh.live/tcp/30333/p2p/12D3KooWNG4hedmYixq3Vx4crj5VFxHLFWjqYfbAZwFekHJ8Y7du".parse().expect("Unable to parse bootnode"), + "/dns4/testnet-bootnode-002.polymesh.live/tcp/30333/p2p/12D3KooW9uY8zFnHB5UKyLuwUpZLpPUSJYT2tYfFvpfNCd2K1ceZ".parse().expect("Unable to parse bootnode"), + "/dns4/testnet-bootnode-003.polymesh.live/tcp/30333/p2p/12D3KooWB7AyqsmerKTmcMoyMJJw6ddwWUJ7nFBDGw2viNGN2DBX".parse().expect("Unable to parse bootnode"), + ] +} + +/// Returns the initial list of validator at genesis representing by their `(AccountId, ValidatorId, Keys)`. +fn session_keys(init_authorities: &[InitialAuth]) -> Vec<(AccountId, AccountId, SessionKeys)> { + let mut initial_session_keys = Vec::new(); + + for initial_auth in init_authorities { + initial_session_keys.push(( + initial_auth.0.clone(), + initial_auth.0.clone(), + SessionKeys { + grandpa: initial_auth.2.clone(), + babe: initial_auth.3.clone(), + im_online: initial_auth.4.clone(), + authority_discovery: initial_auth.5.clone(), + beefy: initial_auth.6.clone(), + }, + )) + } + + initial_session_keys +} diff --git a/src/cli.rs b/src/cli.rs index 206a1914a5..0084cddccb 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,32 +1,60 @@ #[derive(Debug, clap::Parser)] pub struct Cli { /// Possible subcommand with parameters. - #[clap(subcommand)] + #[command(subcommand)] pub subcommand: Option, + #[allow(missing_docs)] #[clap(flatten)] - pub run: RunCmd, -} + pub run: sc_cli::RunCmd, + + /// Disable the BEEFY gadget + #[arg(long)] + pub no_beefy: bool, + + /// Disable automatic hardware benchmarks. + /// + /// By default these benchmarks are automatically ran at startup and measure + /// the CPU speed, the memory bandwidth and the disk speed. + /// + /// The results are then printed out in the logs, and also sent as part of + /// telemetry, if telemetry is enabled. + #[arg(long)] + pub no_hardware_benchmarks: bool, -#[allow(missing_docs)] -#[derive(Debug, clap::Parser)] -pub struct RunCmd { #[allow(missing_docs)] #[clap(flatten)] - pub base: sc_cli::RunCmd, - /// Enable validator mode. - /// - /// It is an alias of the `--validator` flag. User has the choice to use either `--validator` or `--operator` flag both works same. - #[clap(long)] - pub operator: bool, + pub storage_monitor: sc_storage_monitor::StorageMonitorParams, } /// Possible subcommands of the main binary. #[derive(Debug, clap::Subcommand)] pub enum Subcommand { + /// Sub-commands concerned with benchmarking. + /// + /// The pallet benchmarking moved to the `pallet` sub-command. + #[command(subcommand)] + Benchmark(frame_benchmarking_cli::BenchmarkCmd), + + /// Key management cli utilities + #[command(subcommand)] + Key(sc_cli::KeySubcommand), + + /// Verify a signature for a message, provided on STDIN, with a given (public or secret) key. + Verify(sc_cli::VerifyCmd), + + /// Generate a seed that provides a vanity address. + Vanity(sc_cli::VanityCmd), + + /// Sign a message, with a given (secret) key. + Sign(sc_cli::SignCmd), + /// Build a chain specification. BuildSpec(sc_cli::BuildSpecCmd), + /// Export the chain specification. + ExportChainSpec(sc_cli::ExportChainSpecCmd), + /// Validate blocks. CheckBlock(sc_cli::CheckBlockCmd), @@ -45,8 +73,6 @@ pub enum Subcommand { /// Revert the chain to a previous state. Revert(sc_cli::RevertCmd), - /// The custom benchmark subcommmand benchmarking runtime pallets. - #[clap(name = "benchmark", about = "Benchmark runtime pallets.")] - #[clap(subcommand)] - Benchmark(frame_benchmarking_cli::BenchmarkCmd), + /// Db meta columns information. + ChainInfo(sc_cli::ChainInfoCmd), } diff --git a/src/command.rs b/src/command.rs index cb1b3505a5..e3bd11dbd0 100644 --- a/src/command.rs +++ b/src/command.rs @@ -15,23 +15,28 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::benchmarking::{inherent_benchmark_data, RemarkBuilder, TransferBuilder}; -use crate::chain_spec; -use crate::cli::{Cli, Subcommand}; -use crate::service::{ - self, general_chain_ops, mainnet_chain_ops, new_partial, testnet_chain_ops, FullClient, - FullServiceComponents, GeneralExecutor, IsNetwork, MainnetExecutor, Network, NewChainOps, - TestnetExecutor, -}; +use std::path::PathBuf; +use std::sync::Arc; + +use core::future::Future; use frame_benchmarking_cli::*; -use sc_cli::{ChainSpec, Result, RuntimeVersion, SubstrateCli}; +use log::info; +use sc_cli::SubstrateCli; use sc_service::{Configuration, TaskManager}; use sp_keyring::Sr25519Keyring; +use sp_runtime::traits::HashingFor; -use core::future::Future; -use log::info; use polymesh_primitives::Block; -use std::sync::Arc; + +use crate::benchmarking::{inherent_benchmark_data, RemarkBuilder, TransferBuilder}; +use crate::chain_spec::ci_runtime::ci_chain_spec; +use crate::chain_spec::common::{ChainSpec as GenericChainSpec, ChainSpecMode}; +use crate::chain_spec::develop_runtime::develop_chain_spec; +use crate::chain_spec::mainnet_runtime::mainnet_chain_spec; +use crate::chain_spec::testnet_runtime::testnet_chain_spec; +use crate::cli::{Cli, Subcommand}; +use crate::service::{self, general_chain_ops, mainnet_chain_ops, new_partial, testnet_chain_ops}; +use crate::service::{FullClient, HostFunctions, IsNetwork, Network, NewChainOps}; impl SubstrateCli for Cli { fn impl_name() -> String { @@ -39,7 +44,7 @@ impl SubstrateCli for Cli { } fn impl_version() -> String { - env!("CARGO_PKG_VERSION").into() + env!("SUBSTRATE_CLI_IMPL_VERSION").into() } fn description() -> String { @@ -64,145 +69,68 @@ impl SubstrateCli for Cli { fn load_spec(&self, id: &str) -> std::result::Result, String> { Ok(match id { - "dev" => Box::new(chain_spec::general::develop_config()), - "local" => Box::new(chain_spec::general::local_config()), - "testnet-dev" => Box::new(chain_spec::testnet::develop_config()), - "testnet-local" => Box::new(chain_spec::testnet::local_config()), - "testnet-bootstrap" => Box::new(chain_spec::testnet::bootstrap_config()), - "mainnet-dev" => Box::new(chain_spec::mainnet::develop_config()), - "mainnet-local" => Box::new(chain_spec::mainnet::local_config()), - "mainnet-bootstrap" => Box::new(chain_spec::mainnet::bootstrap_config()), - "MAINNET" | "mainnet" => Box::new(chain_spec::mainnet::ChainSpec::from_json_bytes( + "" => { + return Err( + "Please specify which chain you want to run, e.g. --dev or --chain=local" + .into(), + ); + } + "dev" => { + if cfg!(feature = "ci-runtime") { + Box::new(ci_chain_spec(ChainSpecMode::Development)) + } else { + Box::new(develop_chain_spec(ChainSpecMode::Development)) + } + } + "local" => { + if cfg!(feature = "ci-runtime") { + Box::new(ci_chain_spec(ChainSpecMode::Local)) + } else { + Box::new(develop_chain_spec(ChainSpecMode::Local)) + } + } + "testnet-dev" => Box::new(testnet_chain_spec(ChainSpecMode::Development)), + "testnet-local" => Box::new(testnet_chain_spec(ChainSpecMode::Local)), + "testnet-bootstrap" => Box::new(testnet_chain_spec(ChainSpecMode::Bootstrap)), + "mainnet-dev" => Box::new(mainnet_chain_spec(ChainSpecMode::Development)), + "mainnet-local" => Box::new(mainnet_chain_spec(ChainSpecMode::Local)), + "mainnet-bootstrap" => Box::new(mainnet_chain_spec(ChainSpecMode::Bootstrap)), + "MAINNET" | "mainnet" => Box::new(GenericChainSpec::from_json_bytes( &include_bytes!("./chain_specs/mainnet_raw.json")[..], )?), - "TESTNET" | "testnet" => Box::new(chain_spec::testnet::ChainSpec::from_json_bytes( + "TESTNET" | "testnet" => Box::new(GenericChainSpec::from_json_bytes( &include_bytes!("./chain_specs/testnet_raw.json")[..], )?), // STAGING network should be considered unstable and may be replaced at any time. - "STAGING" | "staging" => Box::new(chain_spec::testnet::ChainSpec::from_json_bytes( + "STAGING" | "staging" => Box::new(GenericChainSpec::from_json_bytes( &include_bytes!("./chain_specs/staging_raw.json")[..], )?), - path => { - if let Some(path) = path.strip_prefix("dev:") { - Box::new(chain_spec::general::ChainSpec::from_json_file( - std::path::PathBuf::from(path), - )?) - } else if let Some(path) = path.strip_prefix("testnet:") { - Box::new(chain_spec::testnet::ChainSpec::from_json_file( - std::path::PathBuf::from(path), - )?) - } else if let Some(path) = path.strip_prefix("mainnet:") { - Box::new(chain_spec::mainnet::ChainSpec::from_json_file( - std::path::PathBuf::from(path), - )?) - } else { - Box::new(chain_spec::mainnet::ChainSpec::from_json_file( - std::path::PathBuf::from(path), - )?) - } - } + path => Box::new(GenericChainSpec::from_json_file(PathBuf::from(path))?), }) } - - fn native_runtime_version(chain_spec: &Box) -> &'static RuntimeVersion { - match chain_spec.network() { - Network::Testnet => &polymesh_runtime_testnet::runtime::VERSION, - Network::Mainnet => &polymesh_runtime_mainnet::runtime::VERSION, - Network::Other => &polymesh_runtime_develop::runtime::VERSION, - } - } } /// Parses Polymesh specific CLI arguments and run the service. -pub fn run() -> Result<()> { - let mut cli = Cli::from_args(); - if cli.run.operator { - cli.run.base.validator = true; - } +pub fn run_with_args(args: Vec) -> sc_cli::Result<()> { + let cli = Cli::from_iter(args); + match &cli.subcommand { None => { - let runner = cli.create_runner(&cli.run.base)?; - let network = runner.config().chain_spec.network(); + let runner = cli.create_runner(&cli.run)?; - //let authority_discovery_enabled = cli.run.authority_discovery_enabled; info!( "Reserved nodes: {:?}", - cli.run.base.network_params.reserved_nodes + cli.run.network_params.reserved_nodes ); runner.run_node_until_exit(|config| async move { - match network { - Network::Testnet => service::testnet_new_full(config), - Network::Mainnet => service::mainnet_new_full(config), - Network::Other => service::general_new_full(config), - } - .map_err(sc_cli::Error::Service) + service::new_full(config, cli).map_err(sc_cli::Error::Service) }) } - Some(Subcommand::BuildSpec(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.sync_run(|config| cmd.run(config.chain_spec, config.network)) + Some(Subcommand::ExportChainSpec(cmd)) => { + let chain_spec = cli.load_spec(&cmd.chain)?; + cmd.run(chain_spec) } - Some(Subcommand::CheckBlock(cmd)) => async_run( - &cli, - cmd, - |(c, _, iq, tm), _| Ok((cmd.run(c, iq), tm)), - |(c, _, iq, tm), _| Ok((cmd.run(c, iq), tm)), - |(c, _, iq, tm), _| Ok((cmd.run(c, iq), tm)), - ), - Some(Subcommand::ExportBlocks(cmd)) => async_run( - &cli, - cmd, - |(c, .., tm), config| Ok((cmd.run(c, config.database), tm)), - |(c, .., tm), config| Ok((cmd.run(c, config.database), tm)), - |(c, .., tm), config| Ok((cmd.run(c, config.database), tm)), - ), - Some(Subcommand::ExportState(cmd)) => async_run( - &cli, - cmd, - |(c, .., tm), config| Ok((cmd.run(c, config.chain_spec), tm)), - |(c, .., tm), config| Ok((cmd.run(c, config.chain_spec), tm)), - |(c, .., tm), config| Ok((cmd.run(c, config.chain_spec), tm)), - ), - Some(Subcommand::ImportBlocks(cmd)) => async_run( - &cli, - cmd, - |(c, _, iq, tm), _| Ok((cmd.run(c, iq), tm)), - |(c, _, iq, tm), _| Ok((cmd.run(c, iq), tm)), - |(c, _, iq, tm), _| Ok((cmd.run(c, iq), tm)), - ), - Some(Subcommand::PurgeChain(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.sync_run(|config| cmd.run(config.database)) - } - Some(Subcommand::Revert(cmd)) => async_run( - &cli, - cmd, - |(c, b, _, tm), _| { - let aux_revert = Box::new(|client: Arc>, backend, blocks| { - sc_consensus_babe::revert(client.clone(), backend, blocks)?; - grandpa::revert(client, blocks)?; - Ok(()) - }); - Ok((cmd.run(c, b, Some(aux_revert)), tm)) - }, - |(c, b, _, tm), _| { - let aux_revert = Box::new(|client: Arc>, backend, blocks| { - sc_consensus_babe::revert(client.clone(), backend, blocks)?; - grandpa::revert(client, blocks)?; - Ok(()) - }); - Ok((cmd.run(c, b, Some(aux_revert)), tm)) - }, - |(c, b, _, tm), _| { - let aux_revert = Box::new(|client: Arc>, backend, blocks| { - sc_consensus_babe::revert(client.clone(), backend, blocks)?; - grandpa::revert(client, blocks)?; - Ok(()) - }); - Ok((cmd.run(c, b, Some(aux_revert)), tm)) - }, - ), Some(Subcommand::Benchmark(cmd)) => { let runner = cli.create_runner(cmd)?; let network = runner.config().chain_spec.network(); @@ -216,28 +144,24 @@ pub fn run() -> Result<()> { .into()); } - cmd.run::(config) + cmd.run_with_spec::, HostFunctions>(Some( + config.chain_spec, + )) } (BenchmarkCmd::Block(cmd), Network::Other) => { - let FullServiceComponents { client, .. } = - new_partial::( - &mut config, - )?; - cmd.run(client) + let partial_components = + new_partial::(&mut config)?; + cmd.run(partial_components.client) } (BenchmarkCmd::Block(cmd), Network::Testnet) => { - let FullServiceComponents { client, .. } = - new_partial::( - &mut config, - )?; - cmd.run(client) + let partial_components = + new_partial::(&mut config)?; + cmd.run(partial_components.client) } (BenchmarkCmd::Block(cmd), Network::Mainnet) => { - let FullServiceComponents { client, .. } = - new_partial::( - &mut config, - )?; - cmd.run(client) + let partial_components = + new_partial::(&mut config)?; + cmd.run(partial_components.client) } #[cfg(not(feature = "runtime-benchmarks"))] (BenchmarkCmd::Storage(_), Network::Other) => Err( @@ -246,153 +170,174 @@ pub fn run() -> Result<()> { ), #[cfg(feature = "runtime-benchmarks")] (BenchmarkCmd::Storage(cmd), Network::Other) => { - let FullServiceComponents { - client, backend, .. - } = new_partial::( - &mut config, - )?; - let db = backend.expose_db(); - let storage = backend.expose_storage(); + let partial_components = + new_partial::(&mut config)?; + let db = partial_components.backend.expose_db(); + let storage = partial_components.backend.expose_storage(); + let shared_trie_cache = + partial_components.backend.expose_shared_trie_cache(); - cmd.run(config, client, db, storage) + cmd.run( + config, + partial_components.client, + db, + storage, + shared_trie_cache, + ) } #[cfg(feature = "runtime-benchmarks")] (BenchmarkCmd::Storage(cmd), Network::Testnet) => { - let FullServiceComponents { - client, backend, .. - } = new_partial::( - &mut config, - )?; - let db = backend.expose_db(); - let storage = backend.expose_storage(); + let partial_components = + new_partial::(&mut config)?; + let db = partial_components.backend.expose_db(); + let storage = partial_components.backend.expose_storage(); + let shared_trie_cache = + partial_components.backend.expose_shared_trie_cache(); - cmd.run(config, client, db, storage) + cmd.run( + config, + partial_components.client, + db, + storage, + shared_trie_cache, + ) } #[cfg(feature = "runtime-benchmarks")] (BenchmarkCmd::Storage(cmd), Network::Mainnet) => { - let FullServiceComponents { - client, backend, .. - } = new_partial::( - &mut config, - )?; - let db = backend.expose_db(); - let storage = backend.expose_storage(); + let partial_components = + new_partial::(&mut config)?; + let db = partial_components.backend.expose_db(); + let storage = partial_components.backend.expose_storage(); + let shared_trie_cache = + partial_components.backend.expose_shared_trie_cache(); - cmd.run(config, client, db, storage) + cmd.run( + config, + partial_components.client, + db, + storage, + shared_trie_cache, + ) } (BenchmarkCmd::Overhead(cmd), Network::Other) => { - let FullServiceComponents { client, .. } = - new_partial::( - &mut config, - )?; - let ext_builder = RemarkBuilder::< - polymesh_runtime_develop::RuntimeApi, - GeneralExecutor, - >::new(client.clone()); + let partial_components = + new_partial::(&mut config)?; + let ext_builder = + RemarkBuilder::::new( + partial_components.client.clone(), + ); cmd.run( - config, - client, + config.chain_spec.name().into(), + partial_components.client, inherent_benchmark_data()?, Vec::new(), &ext_builder, + false, ) } (BenchmarkCmd::Overhead(cmd), Network::Testnet) => { - let FullServiceComponents { client, .. } = - new_partial::( - &mut config, - )?; - let ext_builder = RemarkBuilder::< - polymesh_runtime_testnet::RuntimeApi, - GeneralExecutor, - >::new(client.clone()); + let partial_components = + new_partial::(&mut config)?; + let ext_builder = + RemarkBuilder::::new( + partial_components.client.clone(), + ); cmd.run( - config, - client, + config.chain_spec.name().into(), + partial_components.client, inherent_benchmark_data()?, Vec::new(), &ext_builder, + false, ) } (BenchmarkCmd::Overhead(cmd), Network::Mainnet) => { - let FullServiceComponents { client, .. } = - new_partial::( - &mut config, - )?; - let ext_builder = RemarkBuilder::< - polymesh_runtime_mainnet::RuntimeApi, - GeneralExecutor, - >::new(client.clone()); + let partial_components = + new_partial::(&mut config)?; + let ext_builder = + RemarkBuilder::::new( + partial_components.client.clone(), + ); cmd.run( - config, - client, + config.chain_spec.name().into(), + partial_components.client, inherent_benchmark_data()?, Vec::new(), &ext_builder, + false, ) } (BenchmarkCmd::Extrinsic(cmd), Network::Other) => { - let FullServiceComponents { client, .. } = - new_partial::( - &mut config, - )?; + let partial_components = + new_partial::(&mut config)?; // Register the *Remark* and *TKA* builders. let ext_factory = ExtrinsicFactory(vec![ - Box::new(RemarkBuilder::< - polymesh_runtime_develop::RuntimeApi, - GeneralExecutor, - >::new(client.clone())), - Box::new(TransferBuilder::< - polymesh_runtime_develop::RuntimeApi, - GeneralExecutor, - >::new( - client.clone(), Sr25519Keyring::Alice.to_account_id(), 1 + Box::new(RemarkBuilder::::new( + partial_components.client.clone(), )), + Box::new( + TransferBuilder::::new( + partial_components.client.clone(), + Sr25519Keyring::Alice.to_account_id(), + 1, + ), + ), ]); - cmd.run(client, inherent_benchmark_data()?, Vec::new(), &ext_factory) + cmd.run( + partial_components.client, + inherent_benchmark_data()?, + Vec::new(), + &ext_factory, + ) } (BenchmarkCmd::Extrinsic(cmd), Network::Testnet) => { - let FullServiceComponents { client, .. } = - new_partial::( - &mut config, - )?; + let partial_components = + new_partial::(&mut config)?; // Register the *Remark* and *TKA* builders. let ext_factory = ExtrinsicFactory(vec![ - Box::new(RemarkBuilder::< - polymesh_runtime_testnet::RuntimeApi, - GeneralExecutor, - >::new(client.clone())), - Box::new(TransferBuilder::< - polymesh_runtime_testnet::RuntimeApi, - GeneralExecutor, - >::new( - client.clone(), Sr25519Keyring::Alice.to_account_id(), 1 + Box::new(RemarkBuilder::::new( + partial_components.client.clone(), )), + Box::new( + TransferBuilder::::new( + partial_components.client.clone(), + Sr25519Keyring::Alice.to_account_id(), + 1, + ), + ), ]); - cmd.run(client, inherent_benchmark_data()?, Vec::new(), &ext_factory) + cmd.run( + partial_components.client, + inherent_benchmark_data()?, + Vec::new(), + &ext_factory, + ) } (BenchmarkCmd::Extrinsic(cmd), Network::Mainnet) => { - let FullServiceComponents { client, .. } = - new_partial::( - &mut config, - )?; + let partial_components = + new_partial::(&mut config)?; // Register the *Remark* and *TKA* builders. let ext_factory = ExtrinsicFactory(vec![ - Box::new(RemarkBuilder::< - polymesh_runtime_mainnet::RuntimeApi, - GeneralExecutor, - >::new(client.clone())), - Box::new(TransferBuilder::< - polymesh_runtime_mainnet::RuntimeApi, - GeneralExecutor, - >::new( - client.clone(), Sr25519Keyring::Alice.to_account_id(), 1 + Box::new(RemarkBuilder::::new( + partial_components.client.clone(), )), + Box::new( + TransferBuilder::::new( + partial_components.client.clone(), + Sr25519Keyring::Alice.to_account_id(), + 1, + ), + ), ]); - cmd.run(client, inherent_benchmark_data()?, Vec::new(), &ext_factory) + cmd.run( + partial_components.client, + inherent_benchmark_data()?, + Vec::new(), + &ext_factory, + ) } (BenchmarkCmd::Machine(cmd), Network::Other) => { cmd.run(&config, SUBSTRATE_REFERENCE_HARDWARE.clone()) @@ -401,6 +346,78 @@ pub fn run() -> Result<()> { } }) } + Some(Subcommand::Key(cmd)) => cmd.run(&cli), + Some(Subcommand::Sign(cmd)) => cmd.run(), + Some(Subcommand::Verify(cmd)) => cmd.run(), + Some(Subcommand::Vanity(cmd)) => cmd.run(), + Some(Subcommand::BuildSpec(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.sync_run(|config| cmd.run(config.chain_spec, config.network)) + } + Some(Subcommand::CheckBlock(cmd)) => async_run( + &cli, + cmd, + |(c, _, iq, tm), _| Ok((cmd.run(c, iq), tm)), + |(c, _, iq, tm), _| Ok((cmd.run(c, iq), tm)), + |(c, _, iq, tm), _| Ok((cmd.run(c, iq), tm)), + ), + Some(Subcommand::ExportBlocks(cmd)) => async_run( + &cli, + cmd, + |(c, .., tm), config| Ok((cmd.run(c, config.database), tm)), + |(c, .., tm), config| Ok((cmd.run(c, config.database), tm)), + |(c, .., tm), config| Ok((cmd.run(c, config.database), tm)), + ), + Some(Subcommand::ExportState(cmd)) => async_run( + &cli, + cmd, + |(c, .., tm), config| Ok((cmd.run(c, config.chain_spec), tm)), + |(c, .., tm), config| Ok((cmd.run(c, config.chain_spec), tm)), + |(c, .., tm), config| Ok((cmd.run(c, config.chain_spec), tm)), + ), + Some(Subcommand::ImportBlocks(cmd)) => async_run( + &cli, + cmd, + |(c, _, iq, tm), _| Ok((cmd.run(c, iq), tm)), + |(c, _, iq, tm), _| Ok((cmd.run(c, iq), tm)), + |(c, _, iq, tm), _| Ok((cmd.run(c, iq), tm)), + ), + Some(Subcommand::PurgeChain(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.sync_run(|config| cmd.run(config.database)) + } + Some(Subcommand::Revert(cmd)) => async_run( + &cli, + cmd, + |(c, b, _, tm), _| { + let aux_revert = Box::new(|client: Arc>, backend, blocks| { + sc_consensus_babe::revert(client.clone(), backend, blocks)?; + sc_consensus_grandpa::revert(client, blocks)?; + Ok(()) + }); + Ok((cmd.run(c, b, Some(aux_revert)), tm)) + }, + |(c, b, _, tm), _| { + let aux_revert = Box::new(|client: Arc>, backend, blocks| { + sc_consensus_babe::revert(client.clone(), backend, blocks)?; + sc_consensus_grandpa::revert(client, blocks)?; + Ok(()) + }); + Ok((cmd.run(c, b, Some(aux_revert)), tm)) + }, + |(c, b, _, tm), _| { + let aux_revert = Box::new(|client: Arc>, backend, blocks| { + sc_consensus_babe::revert(client.clone(), backend, blocks)?; + sc_consensus_grandpa::revert(client, blocks)?; + Ok(()) + }); + Ok((cmd.run(c, b, Some(aux_revert)), tm)) + }, + ), + Some(Subcommand::ChainInfo(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.sync_run(|config| cmd.run::(&config)) + } } } @@ -408,15 +425,15 @@ fn async_run( cli: &impl sc_cli::SubstrateCli, cmd: &impl sc_cli::CliConfiguration, testnet: impl FnOnce( - NewChainOps, + NewChainOps, Configuration, ) -> sc_cli::Result<(F, TaskManager)>, general: impl FnOnce( - NewChainOps, + NewChainOps, Configuration, ) -> sc_cli::Result<(G, TaskManager)>, mainnet: impl FnOnce( - NewChainOps, + NewChainOps, Configuration, ) -> sc_cli::Result<(H, TaskManager)>, ) -> sc_service::Result<(), sc_cli::Error> diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000000..3f8abcdd1e --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,13 @@ +//! Polymesh Node CLI. +#![warn(missing_docs)] + +mod benchmarking; +/// Benchmarking utilities. +pub mod chain_spec; +mod cli; +/// Command line utilities. +pub mod command; +/// Service and service factory. +pub mod service; + +pub(crate) use cli::*; diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index ea5303342c..0000000000 --- a/src/main.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Polymesh Node CLI binary. -#![warn(missing_docs)] - -mod chain_spec; -#[macro_use] -mod service; -mod benchmarking; -mod cli; -mod command; - -fn main() -> sc_cli::Result<()> { - command::run() -} diff --git a/src/service.rs b/src/service.rs index 7748138b03..d9aca446c8 100644 --- a/src/service.rs +++ b/src/service.rs @@ -1,83 +1,75 @@ //! Service and ServiceFactory implementation. Specialized wrapper over substrate service. -use futures::stream::StreamExt; use polymesh_node_rpc as node_rpc; -pub use polymesh_primitives::{AccountId, Block, IdentityId, Index as Nonce, Moment, Ticker}; -pub use polymesh_runtime_develop; -pub use polymesh_runtime_mainnet; -pub use polymesh_runtime_testnet; +use polymesh_primitives::{ + AccountId, Balance, Block, BlockNumber, IdentityId, Moment, Nonce, Ticker, +}; +use polymesh_runtime_develop; +use polymesh_runtime_mainnet; +use polymesh_runtime_testnet; + +use crate::Cli; +use codec::Encode; +use frame_benchmarking_cli::SUBSTRATE_REFERENCE_HARDWARE; +use frame_system_rpc_runtime_api::AccountNonceApi; +use futures::prelude::*; use prometheus_endpoint::Registry; - -use sc_client_api::BlockBackend; - -use sc_consensus_slots::SlotProportion; -use sc_executor::NativeElseWasmExecutor; -pub use sc_executor::NativeExecutionDispatch; -use sc_network::NetworkService; -use sc_network_common::{protocol::event::Event, service::NetworkEventStream}; +use sc_client_api::{Backend, BlockBackend}; +use sc_consensus_babe::{self, SlotProportion}; +use sc_consensus_beefy as beefy; +use sc_consensus_grandpa as grandpa; +use sc_network::{ + event::Event, service::traits::NetworkService, NetworkBackend, NetworkEventStream, +}; +use sc_network_sync::{strategy::warp::WarpSyncConfig, SyncingService}; +use sc_service::ChainSpec; use sc_service::{ - config::Configuration, error::Error as ServiceError, RpcHandlers, TaskManager, WarpSyncParams, + config::{Configuration, PrometheusConfig}, + error::Error as ServiceError, + RpcHandlers, TaskManager, }; -pub use sc_service::{config::PrometheusConfig, ChainSpec, Error}; use sc_telemetry::{Telemetry, TelemetryWorker}; -pub use sp_api::ConstructRuntimeApi; - -pub use sp_runtime::traits::BlakeTwo256; -use sp_runtime::traits::Block as BlockT; -use std::sync::Arc; +use sc_transaction_pool::TransactionPoolHandle; +use sc_transaction_pool_api::OffchainTransactionPoolFactory; +use sp_api::{ConstructRuntimeApi, ProvideRuntimeApi}; +use sp_consensus_babe::inherents::BabeCreateInherentDataProviders; +use sp_consensus_beefy as beefy_primitives; +use sp_core::crypto::Pair; +use sp_runtime::{generic, traits::Block as BlockT, SaturatedConversion}; +use std::{path::Path, sync::Arc}; /// Known networks based on name. pub enum Network { + /// Mainnet network. Mainnet, + /// Testnet network. Testnet, + /// Develop network. Other, } +/// Trait to identify the network from the chain spec. pub trait IsNetwork { + /// Returns the network type. fn network(&self) -> Network; } impl IsNetwork for dyn ChainSpec { fn network(&self) -> Network { - let name = self.name(); - if name.starts_with("Polymesh Mainnet") { - Network::Mainnet - } else if name.starts_with("Polymesh Testnet") { - Network::Testnet - } else { - Network::Other + if self.name().starts_with("Polymesh Mainnet") { + return Network::Mainnet; } - } -} - -macro_rules! native_executor_instance { - ($exec:ident, $module:ident, $ehf:ty) => { - pub struct $exec; - impl NativeExecutionDispatch for $exec { - type ExtendHostFunctions = $ehf; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - $module::api::dispatch(method, data) - } - fn native_version() -> sc_executor::NativeVersion { - $module::native_version() - } + if self.name().starts_with("Polymesh Testnet") { + return Network::Testnet; } - }; -} -#[cfg(feature = "runtime-benchmarks")] -type EHF = ( - frame_benchmarking::benchmarking::HostFunctions, - polymesh_primitives::crypto::native_schnorrkel::HostFunctions, -); -#[cfg(not(feature = "runtime-benchmarks"))] -type EHF = (); + Network::Other + } +} -native_executor_instance!(GeneralExecutor, polymesh_runtime_develop, EHF); -native_executor_instance!(TestnetExecutor, polymesh_runtime_testnet, ()); -native_executor_instance!(MainnetExecutor, polymesh_runtime_mainnet, ()); +/// The Beefy Authority Id type. +pub type BeefyId = beefy_primitives::ecdsa_crypto::AuthorityId; /// A set of APIs that polkadot-like runtimes must implement. pub trait RuntimeApiCollection: @@ -87,12 +79,14 @@ pub trait RuntimeApiCollection: + grandpa::GrandpaApi + sp_block_builder::BlockBuilder + frame_system_rpc_runtime_api::AccountNonceApi + + mmr_rpc::MmrRuntimeApi::Hash, BlockNumber> + + sp_consensus_beefy::BeefyApi + node_rpc_runtime_api::transaction_payment::TransactionPaymentApi + sp_api::Metadata + sp_offchain::OffchainWorkerApi + sp_session::SessionKeys + sp_authority_discovery::AuthorityDiscoveryApi - + pallet_staking_rpc_runtime_api::StakingApi + + pallet_staking_runtime_api::StakingApi + node_rpc_runtime_api::pips::PipsApi + node_rpc_runtime_api::identity::IdentityApi + pallet_protocol_fee_rpc_runtime_api::ProtocolFeeApi @@ -100,89 +94,202 @@ pub trait RuntimeApiCollection: + pallet_group_rpc_runtime_api::GroupApi + node_rpc_runtime_api::nft::NFTApi + node_rpc_runtime_api::settlement::SettlementApi -where - >::StateBackend: sp_api::StateBackend, { } -impl RuntimeApiCollection for Api -where +impl RuntimeApiCollection for Api where Api: sp_transaction_pool::runtime_api::TaggedTransactionQueue + sp_api::ApiExt + sp_consensus_babe::BabeApi + grandpa::GrandpaApi + sp_block_builder::BlockBuilder + frame_system_rpc_runtime_api::AccountNonceApi + + mmr_rpc::MmrRuntimeApi::Hash, BlockNumber> + + sp_consensus_beefy::BeefyApi + node_rpc_runtime_api::transaction_payment::TransactionPaymentApi + sp_api::Metadata + sp_offchain::OffchainWorkerApi + sp_session::SessionKeys + sp_authority_discovery::AuthorityDiscoveryApi - + pallet_staking_rpc_runtime_api::StakingApi + + pallet_staking_runtime_api::StakingApi + node_rpc_runtime_api::pips::PipsApi + node_rpc_runtime_api::identity::IdentityApi + pallet_protocol_fee_rpc_runtime_api::ProtocolFeeApi + node_rpc_runtime_api::asset::AssetApi + pallet_group_rpc_runtime_api::GroupApi + node_rpc_runtime_api::nft::NFTApi - + node_rpc_runtime_api::settlement::SettlementApi, - >::StateBackend: sp_api::StateBackend, + + node_rpc_runtime_api::settlement::SettlementApi { } -// Using prometheus, use a registry with a prefix of `polymesh`. -fn set_prometheus_registry(config: &mut Configuration) -> Result<(), ServiceError> { - if let Some(PrometheusConfig { registry, .. }) = config.prometheus_config.as_mut() { - *registry = Registry::new_custom(Some("polymesh".into()), None)?; - } +/// Host functions available to the runtime. +#[cfg(not(feature = "runtime-benchmarks"))] +pub type HostFunctions = (sp_io::SubstrateHostFunctions,); - Ok(()) -} +/// Host functions available to the runtime. +#[cfg(feature = "runtime-benchmarks")] +pub type HostFunctions = ( + sp_io::SubstrateHostFunctions, + frame_benchmarking::benchmarking::HostFunctions, + polymesh_primitives::crypto::native_schnorrkel::HostFunctions, +); -type BabeLink = sc_consensus_babe::BabeLink; +/// A specialized `WasmExecutor` intended to use across substrate node. It provides all required HostFunctions. +pub type RuntimeExecutor = sc_executor::WasmExecutor; -type FullLinkHalf = grandpa::LinkHalf, FullSelectChain>; -pub type FullClient = sc_service::TFullClient>; +/// The Full client type definition +pub type FullClient = sc_service::TFullClient; type FullBackend = sc_service::TFullBackend; type FullSelectChain = sc_consensus::LongestChain; -type FullGrandpaBlockImport = - grandpa::GrandpaBlockImport, FullSelectChain>; -type FullBabeImportQueue = sc_consensus::DefaultImportQueue>; -type FullStateBackend = sc_client_api::StateBackendFor; -type FullPool = sc_transaction_pool::FullPool>; -pub type FullServiceComponents = sc_service::PartialComponents< - FullClient, +type FullGrandpaBlockImport = + grandpa::GrandpaBlockImport, FullSelectChain>; +type FullBeefyBlockImport = beefy::import::BeefyBlockImport< + Block, FullBackend, - FullSelectChain, - FullBabeImportQueue, - FullPool, - ( - F, - (FullBabeBlockImport, FullLinkHalf, BabeLink), - grandpa::SharedVoterState, - Option, - ), + FullClient, + InnerBlockImport, + beefy_primitives::ecdsa_crypto::AuthorityId, >; -type FullBabeBlockImport = - sc_consensus_babe::BabeBlockImport, FullGrandpaBlockImport>; -pub fn new_partial( +/// The transaction pool type definition. +pub type TransactionPool = sc_transaction_pool::TransactionPoolHandle>; + +/// The minimum period of blocks on which justifications will be +/// imported and generated. +const GRANDPA_JUSTIFICATION_PERIOD: u32 = 512; + +/// Fetch the nonce of the given `account` from the chain state. +/// +/// Note: Should only be used for tests. +pub fn fetch_nonce( + client: &FullClient, + account: sp_core::sr25519::Pair, +) -> u32 { + let best_hash = client.chain_info().best_hash; + client + .runtime_api() + .account_nonce(best_hash, account.public().into()) + .expect("Fetching account nonce works; qed") +} + +/// Create a transaction using the given `call`. +/// +/// The transaction will be signed by `sender`. If `nonce` is `None` it will be fetched from the +/// state of the best block. +/// +/// Note: Should only be used for tests. +pub fn create_extrinsic( + client: &FullClient, + sender: sp_core::sr25519::Pair, + function: impl Into, + nonce: Option, +) -> polymesh_runtime_develop::UncheckedExtrinsic { + let function = function.into(); + let genesis_hash = client + .block_hash(0) + .ok() + .flatten() + .expect("Genesis block exists; qed"); + let best_hash = client.chain_info().best_hash; + let best_block = client.chain_info().best_number; + let nonce = nonce.unwrap_or_else(|| fetch_nonce(client, sender.clone())); + + let period = polymesh_runtime_common::BlockHashCount::get() + .checked_next_power_of_two() + .map(|c| c / 2) + .unwrap_or(2) as u64; + let tx_ext: polymesh_runtime_develop::TxExtension = ( + ( + frame_system::AuthorizeCall::new(), + frame_system::CheckNonZeroSender::new(), + frame_system::CheckSpecVersion::new(), + frame_system::CheckTxVersion::new(), + frame_system::CheckGenesis::new(), + ), + frame_system::CheckEra::from(generic::Era::mortal(period, best_block.saturated_into())), + frame_system::CheckNonce::from(nonce), + frame_system::CheckWeight::new(), + polymesh_transaction_payment::ChargeTransactionPayment::from(0), + pallet_permissions::StoreCallMetadata::new(), + frame_metadata_hash_extension::CheckMetadataHash::new(false), + pallet_revive::evm::tx_extension::SetOrigin::default(), + frame_system::WeightReclaim::new(), + ); + + let raw_payload = polymesh_runtime_develop::runtime::SignedPayload::from_raw( + function.clone(), + tx_ext.clone(), + ( + ( + (), + (), + polymesh_runtime_develop::runtime::VERSION.spec_version, + polymesh_runtime_develop::runtime::VERSION.transaction_version, + genesis_hash, + ), + best_hash, + (), + (), + (), + (), + None, + (), + (), + ), + ); + let signature = raw_payload.using_encoded(|e| sender.sign(e)); + + generic::UncheckedExtrinsic::new_signed( + function, + sp_runtime::AccountId32::from(sender.public()).into(), + polymesh_primitives::Signature::Sr25519(signature), + tx_ext, + ) + .into() +} + +/// Sets the registry with a `polymesh` prefix. +fn set_prometheus_registry(config: &mut Configuration) -> Result<(), ServiceError> { + if let Some(PrometheusConfig { registry, .. }) = config.prometheus_config.as_mut() { + *registry = Registry::new_custom(Some("polymesh".into()), None)?; + } + + Ok(()) +} + +/// Creates a new partial node. +pub fn new_partial( config: &mut Configuration, ) -> Result< - FullServiceComponents< - R, - D, - impl Fn( - sc_rpc::DenyUnsafe, - sc_rpc::SubscriptionTaskExecutor, - ) -> Result, Error>, + sc_service::PartialComponents< + FullClient, + FullBackend, + FullSelectChain, + sc_consensus::DefaultImportQueue, + sc_transaction_pool::TransactionPoolHandle>, + ( + impl Fn(sc_rpc::SubscriptionTaskExecutor) -> Result, ServiceError>, + ( + sc_consensus_babe::BabeBlockImport< + Block, + FullClient, + FullBeefyBlockImport, R>, + BabeCreateInherentDataProviders, + FullSelectChain, + >, + grandpa::LinkHalf, FullSelectChain>, + sc_consensus_babe::BabeLink, + beefy::BeefyVoterLinks, + ), + grandpa::SharedVoterState, + Option, + ), >, - Error, + ServiceError, > where - R: ConstructRuntimeApi> + Send + Sync + 'static, - R::RuntimeApi: RuntimeApiCollection, - D: NativeExecutionDispatch + 'static, + R: ConstructRuntimeApi> + Send + Sync + 'static, + R::RuntimeApi: RuntimeApiCollection, { set_prometheus_registry(config)?; @@ -197,15 +304,10 @@ where }) .transpose()?; - let executor = NativeElseWasmExecutor::::new( - config.wasm_method, - config.default_heap_pages, - config.max_runtime_instances, - config.runtime_cache_size, - ); + let executor = sc_service::new_wasm_executor(&config.executor); let (client, backend, keystore_container, task_manager) = - sc_service::new_full_parts::>( + sc_service::new_full_parts::( config, telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()), executor, @@ -221,101 +323,121 @@ where let select_chain = sc_consensus::LongestChain::new(backend.clone()); - let transaction_pool = sc_transaction_pool::BasicPool::new_full( - config.transaction_pool.clone(), - config.role.is_authority().into(), - config.prometheus_registry(), - task_manager.spawn_essential_handle(), - client.clone(), + let transaction_pool = Arc::from( + sc_transaction_pool::Builder::new( + task_manager.spawn_essential_handle(), + client.clone(), + config.role.is_authority().into(), + ) + .with_options(config.transaction_pool.clone()) + .with_prometheus(config.prometheus_registry()) + .build(), ); let (grandpa_block_import, grandpa_link) = grandpa::block_import( client.clone(), + GRANDPA_JUSTIFICATION_PERIOD, &(client.clone() as Arc<_>), select_chain.clone(), telemetry.as_ref().map(|x| x.handle()), )?; let justification_import = grandpa_block_import.clone(); - let (block_import, babe_link) = sc_consensus_babe::block_import( - sc_consensus_babe::configuration(&*client)?, - grandpa_block_import, - client.clone(), - )?; + let (beefy_block_import, beefy_voter_links, beefy_rpc_links) = + beefy::beefy_block_import_and_links( + grandpa_block_import, + backend.clone(), + client.clone(), + config.prometheus_registry().cloned(), + ); - let slot_duration = babe_link.config().slot_duration(); - let import_queue = sc_consensus_babe::import_queue( - babe_link.clone(), - block_import.clone(), - Some(Box::new(justification_import)), + let babe_config = sc_consensus_babe::configuration(&*client)?; + let slot_duration = babe_config.slot_duration(); + let (block_import, babe_link) = sc_consensus_babe::block_import( + babe_config, + beefy_block_import, client.clone(), - select_chain.clone(), - move |_, ()| async move { + Arc::new(move |_, _| async move { let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - let slot = - sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); - + sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_slot_duration( + *timestamp, + slot_duration, + ); Ok((slot, timestamp)) - }, - &task_manager.spawn_essential_handle(), - config.prometheus_registry(), - telemetry.as_ref().map(|x| x.handle()), + }) as BabeCreateInherentDataProviders, + select_chain.clone(), + OffchainTransactionPoolFactory::new(transaction_pool.clone()), )?; - let import_setup = (block_import, grandpa_link, babe_link); + let (import_queue, babe_worker_handle) = + sc_consensus_babe::import_queue(sc_consensus_babe::ImportQueueParams { + link: babe_link.clone(), + block_import: block_import.clone(), + justification_import: Some(Box::new(justification_import)), + client: client.clone(), + slot_duration, + spawner: &task_manager.spawn_essential_handle(), + registry: config.prometheus_registry(), + telemetry: telemetry.as_ref().map(|x| x.handle()), + })?; + + let import_setup = (block_import, grandpa_link, babe_link, beefy_voter_links); let (rpc_extensions_builder, rpc_setup) = { - let (_, grandpa_link, babe_link) = &import_setup; + let (_, grandpa_link, _, _) = &import_setup; let justification_stream = grandpa_link.justification_stream(); let shared_authority_set = grandpa_link.shared_authority_set().clone(); let shared_voter_state = grandpa::SharedVoterState::empty(); - let rpc_setup = shared_voter_state.clone(); + let shared_voter_state2 = shared_voter_state.clone(); let finality_proof_provider = grandpa::FinalityProofProvider::new_for_service( backend.clone(), Some(shared_authority_set.clone()), ); - let babe_config = babe_link.config().clone(); - let shared_epoch_changes = babe_link.epoch_changes().clone(); - let client = client.clone(); let pool = transaction_pool.clone(); let select_chain = select_chain.clone(); - let keystore = keystore_container.sync_keystore(); + let keystore = keystore_container.keystore(); let chain_spec = config.chain_spec.cloned_box(); let rpc_backend = backend.clone(); - let rpc_extensions_builder = move |deny_unsafe, subscription_executor| { - let deps = node_rpc::FullDeps { - client: client.clone(), - pool: pool.clone(), - select_chain: select_chain.clone(), - chain_spec: chain_spec.cloned_box(), - deny_unsafe, - babe: node_rpc::BabeDeps { - babe_config: babe_config.clone(), - shared_epoch_changes: shared_epoch_changes.clone(), - keystore: keystore.clone(), - }, - grandpa: node_rpc::GrandpaDeps { - shared_voter_state: shared_voter_state.clone(), - shared_authority_set: shared_authority_set.clone(), - justification_stream: justification_stream.clone(), - subscription_executor, - finality_provider: finality_proof_provider.clone(), - }, + let rpc_extensions_builder = + move |subscription_executor: node_rpc::SubscriptionTaskExecutor| { + let deps = node_rpc::FullDeps { + client: client.clone(), + pool: pool.clone(), + select_chain: select_chain.clone(), + chain_spec: chain_spec.cloned_box(), + babe: node_rpc::BabeDeps { + keystore: keystore.clone(), + babe_worker_handle: babe_worker_handle.clone(), + }, + grandpa: node_rpc::GrandpaDeps { + shared_voter_state: shared_voter_state.clone(), + shared_authority_set: shared_authority_set.clone(), + justification_stream: justification_stream.clone(), + subscription_executor: subscription_executor.clone(), + finality_provider: finality_proof_provider.clone(), + }, + beefy: node_rpc::BeefyDeps:: { + beefy_finality_proof_stream: beefy_rpc_links + .from_voter_justif_stream + .clone(), + beefy_best_block_stream: beefy_rpc_links + .from_voter_best_beefy_stream + .clone(), + subscription_executor, + }, + backend: rpc_backend.clone(), + }; + + node_rpc::create_full(deps).map_err(Into::into) }; - node_rpc::create_full(deps, rpc_backend.clone()).map_err(Into::into) - }; - - (rpc_extensions_builder, rpc_setup) + (rpc_extensions_builder, shared_voter_state2) }; Ok(sc_service::PartialComponents { @@ -330,36 +452,66 @@ where }) } -#[allow(dead_code)] -pub struct NewFullBase +/// A structure that exposes the full Polymesh node service. +pub struct NewFullBase where - R: ConstructRuntimeApi> + Send + Sync + 'static, - R::RuntimeApi: RuntimeApiCollection, - D: NativeExecutionDispatch + 'static, + R: ConstructRuntimeApi> + Send + Sync + 'static, + R::RuntimeApi: RuntimeApiCollection, { /// The task manager of the node. pub task_manager: TaskManager, /// The client instance of the node. - pub client: Arc>, + pub client: Arc>, /// The networking service of the node. - pub network: Arc::Hash>>, + pub network: Arc, + /// The syncing service of the node. + pub sync: Arc>, /// The transaction pool of the node. - pub transaction_pool: Arc>, + pub transaction_pool: Arc>>, /// The rpc handlers of the node. pub rpc_handlers: RpcHandlers, } /// Creates a full service from the configuration. -pub fn new_full_base( +pub fn new_full_base( mut config: Configuration, - with_startup_data: F, -) -> Result, ServiceError> + enable_beefy: bool, + disable_hardware_benchmarks: bool, + with_startup_data: impl FnOnce( + &sc_consensus_babe::BabeBlockImport< + Block, + FullClient, + FullBeefyBlockImport, R>, + BabeCreateInherentDataProviders, + FullSelectChain, + >, + &sc_consensus_babe::BabeLink, + ), +) -> Result, ServiceError> where - F: FnOnce(&FullBabeBlockImport, &BabeLink), - R: ConstructRuntimeApi> + Send + Sync + 'static, - R::RuntimeApi: RuntimeApiCollection, - D: NativeExecutionDispatch + 'static, + N: NetworkBackend::Hash>, + R: ConstructRuntimeApi> + Send + Sync + 'static, + R::RuntimeApi: RuntimeApiCollection, { + let is_offchain_indexing_enabled = config.offchain_worker.indexing_enabled; + let role = config.role; + let force_authoring = config.force_authoring; + let backoff_authoring_blocks = + Some(sc_consensus_slots::BackoffAuthoringOnFinalizedHeadLagging::default()); + let name = config.network.node_name.clone(); + let enable_grandpa = !config.disable_grandpa; + let prometheus_registry = config.prometheus_registry().cloned(); + let enable_offchain_worker = config.offchain_worker.enabled; + + let hwbench = (!disable_hardware_benchmarks) + .then(|| { + config.database.path().map(|database_path| { + let _ = std::fs::create_dir_all(&database_path); + sc_sysinfo::gather_hwbench(Some(database_path), &SUBSTRATE_REFERENCE_HARDWARE) + }) + }) + .flatten(); + let sc_service::PartialComponents { client, backend, @@ -371,75 +523,121 @@ where other: (rpc_builder, import_setup, rpc_setup, mut telemetry), } = new_partial(&mut config)?; + let metrics = N::register_notification_metrics( + config.prometheus_config.as_ref().map(|cfg| &cfg.registry), + ); let shared_voter_state = rpc_setup; let auth_disc_publish_non_global_ips = config.network.allow_non_globals_in_dht; - let grandpa_protocol_name = grandpa::protocol_standard_name( - &client - .block_hash(0) - .ok() - .flatten() - .expect("Genesis block exists; qed"), - &config.chain_spec, + let auth_disc_public_addresses = config.network.public_addresses.clone(); + + let mut net_config = sc_network::config::FullNetworkConfiguration::<_, _, N>::new( + &config.network, + config + .prometheus_config + .as_ref() + .map(|cfg| cfg.registry.clone()), ); - config - .network - .extra_sets - .push(grandpa::grandpa_peers_set_config( + let genesis_hash = client + .block_hash(0) + .ok() + .flatten() + .expect("Genesis block exists; qed"); + let peer_store_handle = net_config.peer_store_handle(); + + let grandpa_protocol_name = grandpa::protocol_standard_name(&genesis_hash, &config.chain_spec); + let (grandpa_protocol_config, grandpa_notification_service) = + grandpa::grandpa_peers_set_config::<_, N>( grandpa_protocol_name.clone(), - )); + metrics.clone(), + Arc::clone(&peer_store_handle), + ); + net_config.add_notification_protocol(grandpa_protocol_config); + + let beefy_gossip_proto_name = + beefy::gossip_protocol_name(&genesis_hash, config.chain_spec.fork_id()); + // `beefy_on_demand_justifications_handler` is given to `beefy-gadget` task to be run, + // while `beefy_req_resp_cfg` is added to `config.network.request_response_protocols`. + let (beefy_on_demand_justifications_handler, beefy_req_resp_cfg) = + beefy::communication::request_response::BeefyJustifsRequestHandler::new::<_, N>( + &genesis_hash, + config.chain_spec.fork_id(), + client.clone(), + prometheus_registry.clone(), + ); + + let (beefy_notification_config, beefy_notification_service) = + beefy::communication::beefy_peers_set_config::<_, N>( + beefy_gossip_proto_name.clone(), + metrics.clone(), + Arc::clone(&peer_store_handle), + ); + + if enable_beefy { + net_config.add_notification_protocol(beefy_notification_config); + net_config.add_request_response_protocol(beefy_req_resp_cfg); + } + let warp_sync = Arc::new(grandpa::warp_proof::NetworkProvider::new( backend.clone(), import_setup.1.shared_authority_set().clone(), Vec::default(), )); - let (network, system_rpc_tx, tx_handler_controller, network_starter) = + let (network, system_rpc_tx, tx_handler_controller, sync_service) = sc_service::build_network(sc_service::BuildNetworkParams { config: &config, + net_config, client: client.clone(), transaction_pool: transaction_pool.clone(), spawn_handle: task_manager.spawn_handle(), import_queue, block_announce_validator_builder: None, - warp_sync_params: Some(WarpSyncParams::WithProvider(warp_sync)), + warp_sync_config: Some(WarpSyncConfig::WithProvider(warp_sync)), + block_relay: None, + metrics, })?; - if config.offchain_worker.enabled { - sc_service::build_offchain_workers( - &config, - task_manager.spawn_handle(), - client.clone(), - network.clone(), - ); - } - - let role = config.role.clone(); - let force_authoring = config.force_authoring; - let backoff_authoring_blocks = if false { - Some(sc_consensus_slots::BackoffAuthoringOnFinalizedHeadLagging::default()) - } else { - None - }; - let name = config.network.node_name.clone(); - let enable_grandpa = !config.disable_grandpa; - let prometheus_registry = config.prometheus_registry().cloned(); - + let net_config_path = config.network.net_config_path.clone(); let rpc_handlers = sc_service::spawn_tasks(sc_service::SpawnTasksParams { config, - backend, + backend: backend.clone(), client: client.clone(), - keystore: keystore_container.sync_keystore(), + keystore: keystore_container.keystore(), network: network.clone(), rpc_builder: Box::new(rpc_builder), transaction_pool: transaction_pool.clone(), task_manager: &mut task_manager, system_rpc_tx, tx_handler_controller, + sync_service: sync_service.clone(), telemetry: telemetry.as_mut(), + tracing_execute_block: None, })?; - let (block_import, grandpa_link, babe_link) = import_setup; + if let Some(hwbench) = hwbench { + sc_sysinfo::print_hwbench(&hwbench); + match SUBSTRATE_REFERENCE_HARDWARE.check_hardware(&hwbench, false) { + Err(err) if role.is_authority() => { + log::warn!( + "⚠️ The hardware does not meet the minimal requirements {} for role 'Authority'.", + err + ); + } + _ => {} + } + + if let Some(ref mut telemetry) = telemetry { + let telemetry_handle = telemetry.handle(); + task_manager.spawn_handle().spawn( + "telemetry_hwbench", + None, + sc_sysinfo::initialize_hwbench_telemetry(telemetry_handle, hwbench), + ); + } + } + + let (block_import, grandpa_link, babe_link, beefy_links) = import_setup; (with_startup_data)(&block_import, &babe_link); @@ -455,13 +653,13 @@ where let client_clone = client.clone(); let slot_duration = babe_link.config().slot_duration(); let babe_config = sc_consensus_babe::BabeParams { - keystore: keystore_container.sync_keystore(), + keystore: keystore_container.keystore(), client: client.clone(), select_chain, env: proposer, block_import, - sync_oracle: network.clone(), - justification_sync_link: network.clone(), + sync_oracle: sync_service.clone(), + justification_sync_link: sync_service.clone(), create_inherent_data_providers: move |parent, ()| { let client_clone = client_clone.clone(); async move { @@ -515,13 +713,16 @@ where sc_authority_discovery::new_worker_and_service_with_config( sc_authority_discovery::WorkerConfig { publish_non_global_ips: auth_disc_publish_non_global_ips, + public_addresses: auth_disc_public_addresses, + persisted_cache_directory: net_config_path, ..Default::default() }, client.clone(), - network.clone(), + Arc::new(network.clone()), Box::pin(dht_event_stream), authority_discovery_role, prometheus_registry.clone(), + task_manager.spawn_handle(), ); task_manager.spawn_handle().spawn( @@ -534,19 +735,63 @@ where // if the node isn't actively participating in consensus then it doesn't // need a keystore, regardless of which protocol we use below. let keystore = if role.is_authority() { - Some(keystore_container.sync_keystore()) + Some(keystore_container.keystore()) } else { None }; - let config = grandpa::Config { + if enable_beefy { + // beefy is enabled if its notification service exists + let network_params = beefy::BeefyNetworkParams { + network: Arc::new(network.clone()), + sync: sync_service.clone(), + gossip_protocol_name: beefy_gossip_proto_name, + justifications_protocol_name: beefy_on_demand_justifications_handler.protocol_name(), + notification_service: beefy_notification_service, + _phantom: core::marker::PhantomData::, + }; + let beefy_params = beefy::BeefyParams { + client: client.clone(), + backend: backend.clone(), + payload_provider: sp_consensus_beefy::mmr::MmrRootProvider::new(client.clone()), + runtime: client.clone(), + key_store: keystore.clone(), + network_params, + min_block_delta: 8, + prometheus_registry: prometheus_registry.clone(), + links: beefy_links, + on_demand_justifications_handler: beefy_on_demand_justifications_handler, + is_authority: role.is_authority(), + }; + + let beefy_gadget = beefy::start_beefy_gadget::<_, _, _, _, _, _, _, _>(beefy_params); + // BEEFY is part of consensus, if it fails we'll bring the node down with it to make sure it + // is noticed. + task_manager + .spawn_essential_handle() + .spawn_blocking("beefy-gadget", None, beefy_gadget); + // When offchain indexing is enabled, MMR gadget should also run. + if is_offchain_indexing_enabled { + task_manager.spawn_essential_handle().spawn_blocking( + "mmr-gadget", + None, + mmr_gadget::MmrGadget::start( + client.clone(), + backend.clone(), + sp_mmr_primitives::INDEXING_PREFIX.to_vec(), + ), + ); + } + } + + let grandpa_config = grandpa::Config { // FIXME #1578 make this available through chainspec gossip_duration: std::time::Duration::from_millis(333), - justification_period: 512, + justification_generation_period: GRANDPA_JUSTIFICATION_PERIOD, name: Some(name), observer_enabled: false, keystore, - local_role: role, + local_role: role.clone(), telemetry: telemetry.as_ref().map(|x| x.handle()), protocol_name: grandpa_protocol_name, }; @@ -558,14 +803,17 @@ where // and vote data availability than the observer. The observer has not // been tested extensively yet and having most nodes in a network run it // could lead to finality stalls. - let grandpa_config = grandpa::GrandpaParams { - config, + let grandpa_params = grandpa::GrandpaParams { + config: grandpa_config, link: grandpa_link, network: network.clone(), + sync: Arc::new(sync_service.clone()), + notification_service: grandpa_notification_service, telemetry: telemetry.as_ref().map(|x| x.handle()), voting_rule: grandpa::VotingRulesBuilder::default().build(), - prometheus_registry, + prometheus_registry: prometheus_registry.clone(), shared_voter_state, + offchain_tx_pool_factory: OffchainTransactionPoolFactory::new(transaction_pool.clone()), }; // the GRANDPA voter task is considered infallible, i.e. @@ -573,15 +821,39 @@ where task_manager.spawn_essential_handle().spawn_blocking( "grandpa-voter", None, - grandpa::run_grandpa_voter(grandpa_config)?, + grandpa::run_grandpa_voter(grandpa_params)?, + ); + } + + if enable_offchain_worker { + let offchain_workers = + sc_offchain::OffchainWorkers::new(sc_offchain::OffchainWorkerOptions { + runtime_api_provider: client.clone(), + keystore: Some(keystore_container.keystore()), + offchain_db: backend.offchain_storage(), + transaction_pool: Some(OffchainTransactionPoolFactory::new( + transaction_pool.clone(), + )), + network_provider: Arc::new(network.clone()), + is_validator: role.is_authority(), + enable_http_requests: true, + custom_extensions: move |_| vec![], + })?; + + task_manager.spawn_handle().spawn( + "offchain-workers-runner", + "offchain-work", + offchain_workers + .run(client.clone(), task_manager.spawn_handle()) + .boxed(), ); } - network_starter.start_network(); Ok(NewFullBase { task_manager, client, network, + sync: sync_service, transaction_pool, rpc_handlers, }) @@ -589,63 +861,116 @@ where type TaskResult = Result; -/// Create a new Testnet service for a full node. -pub fn testnet_new_full(config: Configuration) -> TaskResult { - new_full_base::(config, |_, _| ()) - .map(|data| data.task_manager) -} +/// Create a new service for a full node, based on the network specified in the chain spec. +pub fn new_full(config: Configuration, cli: Cli) -> TaskResult { + let enable_beefy = !cli.no_beefy; + let database_path = config.database.path().map(Path::to_path_buf); + + let task_manager = match config.network.network_backend { + sc_network::config::NetworkBackendType::Libp2p => { + network_new_full_base::>( + config, + enable_beefy, + cli.no_hardware_benchmarks, + )? + } + sc_network::config::NetworkBackendType::Litep2p => { + network_new_full_base::( + config, + enable_beefy, + cli.no_hardware_benchmarks, + )? + } + }; + + if let Some(database_path) = database_path { + sc_storage_monitor::StorageMonitorService::try_spawn( + cli.storage_monitor, + database_path, + &task_manager.spawn_essential_handle(), + ) + .map_err(|e| ServiceError::Application(e.into()))?; + } -/// Create a new General node service for a full node. -pub fn general_new_full(config: Configuration) -> TaskResult { - new_full_base::(config, |_, _| ()) - .map(|data| data.task_manager) + Ok(task_manager) } -/// Create a new Mainnet service for a full node. -pub fn mainnet_new_full(config: Configuration) -> TaskResult { - new_full_base::(config, |_, _| ()) - .map(|data| data.task_manager) +/// Create a new service for a full node, based on the network specified in the chain spec. +fn network_new_full_base( + config: Configuration, + enable_beefy: bool, + disable_hardware_benchmarks: bool, +) -> TaskResult +where + N: sc_network::NetworkBackend::Hash>, +{ + let network = config.chain_spec.network(); + match network { + // Run full node for Testnet + Network::Testnet => new_full_base::( + config, + enable_beefy, + disable_hardware_benchmarks, + |_, _| (), + ) + .map(|data| data.task_manager), + // Run full node for Mainnet + Network::Mainnet => new_full_base::( + config, + enable_beefy, + disable_hardware_benchmarks, + |_, _| (), + ) + .map(|data| data.task_manager), + // Run full node for develop/general networks + Network::Other => new_full_base::( + config, + enable_beefy, + disable_hardware_benchmarks, + |_, _| (), + ) + .map(|data| data.task_manager), + } } -pub type NewChainOps = ( - Arc>, +pub(crate) type NewChainOps = ( + Arc>, Arc, - FullBabeImportQueue, + sc_consensus::DefaultImportQueue, TaskManager, ); /// Builds a new object suitable for chain operations. -pub fn chain_ops(config: &mut Configuration) -> Result, ServiceError> +pub(crate) fn chain_ops(config: &mut Configuration) -> Result, ServiceError> where - R: ConstructRuntimeApi> + Send + Sync + 'static, - R::RuntimeApi: RuntimeApiCollection, - D: NativeExecutionDispatch + 'static, + R: ConstructRuntimeApi> + Send + Sync + 'static, + R::RuntimeApi: RuntimeApiCollection, { - config.keystore = sc_service::config::KeystoreConfig::InMemory; - let FullServiceComponents { + let sc_service::PartialComponents { client, backend, import_queue, task_manager, .. - } = new_partial::(config)?; + } = new_partial::(config)?; + Ok((client, backend, import_queue, task_manager)) } -pub fn testnet_chain_ops( +pub(crate) fn testnet_chain_ops( config: &mut Configuration, -) -> Result, ServiceError> { - chain_ops::<_, _>(config) +) -> Result, ServiceError> { + chain_ops::<_>(config) } -pub fn general_chain_ops( +pub(crate) fn general_chain_ops( config: &mut Configuration, -) -> Result, ServiceError> { - chain_ops::<_, _>(config) +) -> Result, ServiceError> { + chain_ops::<_>(config) } -pub fn mainnet_chain_ops( +pub(crate) fn mainnet_chain_ops( config: &mut Configuration, -) -> Result, ServiceError> { - chain_ops::<_, _>(config) +) -> Result, ServiceError> { + chain_ops::<_>(config) }